【操作系統】進程調度(3):RR(輪轉) 算法 原理與實踐

0 前言

接上一篇文章:進程調度(2b):STCF(最短完成時間優先) 算法 原理與實踐

1 前提鋪墊

除了與上一篇相同的,這里介紹新的基礎知識。

1.1 三種類型的程序

  • 計算密集型(CPU導向)
  • 輸入輸出密集型(I/O導向)
  • 中間型

所謂計算密集型程序,就是大量時間都在占用CPU做運算,例如科學計算。而輸入輸出密集型程序,則大量時間都在進行輸入輸出,你很熟悉它,例如人機交互,我們每時每刻都在用計算機干這個事情。中間型就是二者都有,占比差不多。

那么介紹這個有什么用?

當我們的目標不同的時候,性能指標的評價標準也不同,對于計算密集型程序,我們可能更關注它的Turnaround Time,而對于(交互型的)輸入輸出密集型程序,我們可能更關注它的Response Time。后續我們會對算法進行性能評價,設計目標很重要不是嗎?

1.2 響應時間(Response Time)

這是一個新的性能指標

Response Time: the time a job spends waiting after arrival before first running.

所謂響應時間,就是從任務到達后,到第一次被執行的等待時間。這個概念在分時操作系統誕生后變得尤為重要,用戶是“獨占”計算機的,并且是交互式界面,所以對用戶來說,響應時間非常重要,用戶必須等待很短的時間就能看到一部分結果。

試想一個場景,你敲擊了鍵盤的字母Z,然后在10s之后,才看見屏幕顯示了Z……這真的令人抓狂不是嗎?

我們需要做的,就是讓用戶快速看到自己的成果,此時,并不需要將程序執行完成,將程序運行一點點先給用戶顯示出來,這對于用戶來說是很棒的!

那么應該如何做到這一點?答案就是充分使用上下文切換。還記得上一篇我們的搶占式調度嗎?它第一次打破了進程順序執行,實現了簡易的進程(上下文)切換,現在,我們要充分利用上下文切換,來讓用戶因為快速響應而得到滿足了!

但是要警惕!沒有必要太快!上下文切換也是需要系統開銷的,它的占比應該盡可能小,我們后續會深入談。現在,你只需要知道,響應時間是1s還是0.1s,對用戶來說是沒有什么區別的,因此我們選擇1s即可,這樣將上下文切換的數量降低了10倍。

1.3 上下文切換(Context Switch)

好吧……上面說了這么多上下文切換,它到底是個啥?第一篇我提到了底層機制 + 上層策略,當時只是提了一句,現在,我們再進一步說一說。

  • 底層機制:上下文切換
  • 上層策略:FIFO,SJF,STCF,RR……

在解釋這個之前,我們先來談談刀吧。對的,就是刀!

你知道的,刀可以削水果,可以切菜,也可以雕刻……但是歸根結底,都是在刀足夠鋒利的前提下,這些事情才能完成,我們分析一下:

  • 底層機制:刀足夠鋒利
  • 上層策略:削水果,切菜,雕刻……

也就是說,在刀鋒利這個底層機制滿足的前提下,我們才能切菜削水果。

好吧現在我們回來,對于進程調度算法而言,也是一樣的,我們在能夠實現上下文切換(進程切換)的前提下,才能使用各種各樣的方法進行進程調度

你要問我Context Switch是什么樣的?我來畫張圖。
在這里插入圖片描述
我想你明白了,只是切換而已。如果說更關鍵的,可能是

  • 保存現場和恢復現場是如何實現的?
  • 上下文切換的系統開銷是多少?

我們先不回答這個問題,你只需要知道,每次上下文切換的時間 / 每個時間片的時間 這個比例應該小一點!(時間片下面就會談)

2 RR原理

RR(Round - Robin)輪轉,輪轉算法下,多個進程不再是順序執行,而是切換式執行,這樣對于交互式程序來說,用戶就能快速感受到自己執行的操作得到了響應,響應時間短。

2.1 算法

舉個例子

  • A:20s
  • B:20s
  • C:20s

在順序執行下,上述3個進程按照A、B、C的順序依次執行,如下圖:
在這里插入圖片描述
這樣一來,響應時間分別是

  • A:0s
  • B:20s
  • C:40s

對于執行C程序的用戶來說,他可能會非常崩潰……響應太慢總是讓人發瘋的,不是嗎?

如果我們采用輪轉算法,假定一個時間片為10s,結果就不一樣了,所謂時間片,就是指某進程在CPU執行10s,就要被中斷,然后讓其他進程執行(也就是每隔10s就進行上下文切換)。

我們看看會發生什么:
在這里插入圖片描述
這樣一來,響應時間分別為

  • A:0s
  • B:10s
  • C:20s

響應時間縮短很多了,但是好像還是慢,如果時間片設置為1s呢?響應時間就是0s,1s和2s,這就很棒了!

2.1.1 思考1:時間片可以無限小下去嗎?

我們的用戶當然想要更快獲得響應,但是對于用戶來說,1s和0.1s可能沒什么差別,所以我們完全可以選擇1s,那么,選擇更大值的理由是什么?不選0.1s的理由是什么?

答案就是切換上下文需要系統開銷,切換上下文的時候,要保存當前程序的狀態,我們切換越頻繁,系統的額外開銷就越多,要之前,順序執行的時候我們根本不需要這樣做,所以,切換上下文帶來的開銷應該盡可能小一點。

例如,時間片是10ms,切換上下文需要1ms,那么我們需要浪費10%的時間去切換上下文,如果時間片是100ms,就占1%,這還可以接受,物極必反的道理就在于此了。

  • 擴展:可以思考下奔騰4的失敗,CPU的流水線深度越深性能就越好嗎?奔騰4使用了31級流水線,性能反而下降了,現代CPU的流水線也不過十幾級,例如i7是14級。
  • 推薦閱讀:面向流水線的指令設計:奔騰4是怎么失敗的?

所以說,時間片是不能無限小下去,它的占比應該小一點,小到什么程度那就與具體需求和實現有關了。

假設切換上下文1s,時間片10s,上面的例子就成了這樣:
在這里插入圖片描述
相關分析請讀者自行完成。

2.1.2 思考2:時間片的設置可以是任意的嗎?

對于上下文切換這個底層機制的實現,是由軟硬件協同完成的,這里有一個重要的概念時鐘中斷,時鐘每隔一段時間,就會中斷程序,把控制權從正在執行的程序交還給OS。

因此說,我們的時間片應該是時鐘中斷周期的整倍數,這樣,我們就能保證每個時間片在執行的時候不會被時鐘中斷所打斷(被程序本身的系統調用打斷就是另一回事了……)

2.2 缺點:大鍋飯式分配 & 增長的周轉時間

RR算法下,對所有就緒進程都是一視同仁的,不管你是誰,都會被執行,切斷,切換,恢復,再執行,就像大鍋飯一樣,不管你干活多少,吃的飯都一樣。

但是我們知道,不同的程序,重要程度和緊急程度是不一樣的,但是RR全忽略了,這顯然不合理。

另外,響應時間確實是改進了,但是此時程序周轉時間表現不佳,這是顯而易見的。

因此我們的算法仍需要進一步改進。

3 RR實踐

我們來進行幾個模擬,體會上一小節的幾個觀點吧。

我們先試一下SJF,3個進程都是100s,同時到達

./scheduler.py -p SJF -l 100,100,100 -c

得到的結果是

Average -- Response: 100.00  Turnaround 200.00  Wait 100.00

再試試RR,3進程都是100s,時間片是1s,忽略上下文切換時間

./scheduler.py -p RR -q 1 -l 100,100,100 -c

得到的結果是

Average -- Response: 1.00  Turnaround 299.00  Wait 199.00

你可以充分體會到,SJF的響應時間是RR是100倍,RR的周轉時間是SJF是1.5倍,而在更極端的情況下,差距可能會更大。

4 核心思想

目前我們接觸到的都是計算密集型程序,而且是100%占用CPU,我們關注了兩大性能指標,周轉時間和響應時間

  • 關注周轉時間的算法:FIFO,SJF和STCF
  • 關注響應時間的算法:RR

目前來說,我們還

  • 沒有同時兼顧周轉時間和響應時間的算法
  • 沒有考慮包含輸入輸出的程序的算法

這也是接下來我們要改進的。

5 預告:進程調度(4):I/O、不可預測的運行時間

接下來,我們初步為程序引入I/O,并且談談最初的一個假設運行時間已知是否現實。

鏈接:進程調度(4):I/O、不可預測的運行時間

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384673.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384673.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384673.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【操作系統】進程調度(4):I/O、不可預測的運行時間

0 前言 上一篇文章:進程調度(3):RR(輪轉) 算法 原理與實踐 1 前提鋪墊 與上一篇同。 2 引入I/O操作 之前我們一直提及的是計算密集型程序,現在我們的程序可以進行I/O交互了,它會…

堅定不移地加速,并且不斷解決新問題

想要更快更高效地做事,一定會帶來問題,我們要做的是 保證事情一定要做對堅定不移地解決問題,尋找方法,而不是回歸慢速 這里有幾個典型的例子 從單周期CPU,到多周期CPU,是為了提速,我們不必再…

運行bat批處理文件不出現黑框

if "%1""hide" goto CmdBegin start mshta vbscript:createobject("wscript.shell").run("""%~0"" hide",0)(window.close)&&exit :CmdBegin echo off java -jar logisim118.exe exit 只需要添加上述代…

【操作系統】使用循環創建線程,一個手殘導致的bug

讓我們先看看這個手殘的程序…… 這是一個簡單的生產者消費者問題。 #include <assert.h> #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <unistd.h> #include <pthread.h> #include <sys/types.h> #incl…

【計算機系統設計】重點 · 學習筆記(0)

HDL等硬件描述語言&#xff0c;例如Verilog&#xff0c;是并行的&#xff0c;而不像軟件一樣的順序執行的&#xff0c;例如很多的always塊&#xff0c;initial塊&#xff0c;都是并行的&#xff0c;他們會轉換為硬件電路&#xff0c;而在仿真的時候&#xff0c;他們也是并發執行…

【計算機系統設計】學習筆記(1)03,04

疑問&#xff1a;sw和lw指令&#xff0c;獲取的地址不是4的整倍數&#xff08;字節不對齊&#xff09;的時候&#xff0c;應該如何處理&#xff1f; 東南大學MOCC 計算機系統綜合設計 03 03-1 寄存器 介紹了MIPS寄存器&#xff0c;32個寄存器的基本功能和使用&#xff0c;注…

【期末考試】計算機網絡、網絡及其計算 考試重點

個人簡介&#xff1a;Java領域新星創作者&#xff1b;阿里云技術博主、星級博主、專家博主&#xff1b;正在Java學習的路上摸爬滾打&#xff0c;記錄學習的過程~ 個人主頁&#xff1a;.29.的博客 學習社區&#xff1a;進去逛一逛~ 計算機網絡及其計算 期末考點 &#x1f680;數…

【計算機系統設計】學習筆記(2)

5.1 對于CPU與外界的讀寫&#xff0c;只有load和store指令能夠做&#xff0c;所以很多情況下&#xff0c;直接通過bypass跳過去了&#xff0c;或者閑置&#xff0c;尤其對于流水線&#xff0c;更應該直接跳過而不是閑置&#xff08;如何設計?&#xff09;。 另一方面&#xf…

【計算機系統設計】重點 · 學習筆記(1)(資源消耗)

這一點先淺顯理解&#xff0c;就好比我要造一個樓 我是用現成的材料造節省?還是需要用XX材料&#xff0c;但是XX材料還需要現成材料造呢&#xff1f; 這也不一定&#xff0c;但是基本來說&#xff0c;如果使用現有資源&#xff0c;能夠直接用&#xff0c;那其實是最好不過的…

【計算機系統設計】重點 · 學習筆記(0)(數據通路設計思想)

重點1&#xff1a;05.1 設計思想 設計思想至關重要&#xff0c;這決定了你能不能自己根據ISA設計出來CPU架構&#xff0c;而不是只是抄別人的&#xff0c;也決定你能不能完成自己的設計更優化的架構。 描述方式約定 6 數據通路 ≠ Verilog代碼 我們構建的數據通路&#…

【計算機系統設計】實踐筆記(1)數據通路構建:取指部件分析

0 核心思想 根據指令功能&#xff0c;分析出需求&#xff0c;從而得出需要的部件、控制信號以及其他設計。 1. 針對的指令 取指階段&#xff0c;針對所有指令&#xff0c;任何指令都需要進行取指。 2 功能&#xff08;需求&#xff09;分析 CPU的內部采用的是字節編址&…

【計算機系統設計】實踐筆記(2)數據通路構建:第一類R型指令分析(1)

0 回顧 上一次實踐筆記&#xff08;0&#xff09;我們實現了一個最簡單的&#xff0c;能夠每個上升沿4的PC。 我們最需要關注的就是器件功能的獨立性&#xff0c;避免內外功能混雜&#xff0c;同時一定要注意腦中有電路&#xff08;RTL級描述的抽象電路而不是實際的門級電路&…

接口的抽象與實現(概述)

概述 我們先建立一個整體的接口格局觀&#xff0c;建立知識地圖&#xff0c;了解接口的大概面貌。 整體來說&#xff0c;就這點事兒&#xff0c;4個箭頭代表了所有&#xff01; 三個器件4個箭頭 把這幾個都想明白&#xff0c;就完事兒了。 第一層&#xff08;頂層&#xf…

從功能層次,闡述CPU、接口和外設之間的交互

我們從功能抽象層次&#xff0c;闡述一下CPU、接口芯片和外設之間的交互情況&#xff1a; 三個器件4個箭頭 我們依次將其描述清楚。 數據 箭頭①和③ CPU給接口可以發送數據&#xff0c;然后接口暫存數據&#xff0c;之后再發給外設&#xff0c;這就是數據緩沖。 發送的數…

【接口技術】8086的IN和OUT指令

x86采用獨立編址的方式&#xff0c;IO端口地址和存儲器地址是分開的。 對于IO存儲器訪問&#xff0c;需要使用獨立的IO指令&#xff0c;也就是IN和OUT 兩類地址 地址空間大小在8位以下地址空間大小在16位以下 兩種格式 對于兩類不同的地址&#xff0c;IO指令的格式不一樣。…

Vivado工程文件分類

只需要在創建的時候&#xff0c;選擇自定義路徑即可&#xff0c;最好在原有的new文件夾下新建文件夾。 至于路徑的匹配&#xff0c;可以自己試試&#xff0c;在原有默認new下創建文件夾&#xff0c;選中新的文件夾后&#xff0c;內部的Verilog文件可以訪問外部new文件夾的文件&…

【微機原理與接口技術】具體芯片(1)并行接口8255A(1):全局觀

并行接口8255A 首先&#xff0c;它是傳輸并行數據的&#xff0c;與CPU一樣&#xff0c;然后&#xff0c;它是可編程的&#xff0c;也是多功能的&#xff0c;CPU可以對其進行一些控制。 管腳 先從最宏觀層面分類 一部分引腳與外設相連一部分引腳與CPU相連GND和Vcc 注意&…

【微機原理與接口技術】多功能可編程芯片 與 多功能電飯煲

多功能可編程芯片&#xff0c;就像你的多功能電飯煲&#xff0c;你點了不同的按鍵&#xff0c;就啟動了不同的工作方式&#xff0c;是熬粥還是做米飯&#xff0c;之后你又得選擇壓力和時間。 而在芯片上&#xff0c;你得先設置控制字&#xff0c;也就是 先選擇工作方式&#…

什么是地址譯碼 理解二進制編碼

我們知道存儲器都是有多個芯片組合而成的&#xff0c;必然涉及到片選&#xff0c;因此我們將地址分開看 前面的一部分&#xff0c;是片選&#xff0c;也就是選中某個芯片&#xff08;使用譯碼器&#xff0c;2-4譯碼器就是2位地址可以選擇4個芯片&#xff09;后面的部分&#x…