在操作系統,進程是很重要的概念!!!!
進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。在早期面向進程設計的計算機結構中,進程是程序的基本執行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體。
引入進程的目的,在多道程序系統出現後,爲了刻畫系統內部出現的動態情況,描述系統內部各道程序的活動規律引進的一個概念,所有多道程序設計操作系統都建立在進程的基礎上。
進程的特性:
動態性:進程的實質是程序在多道程序系統中的一次執行過程,進程是動態產生,動態消亡的。
併發性:任何進程都可以同其他進程一起併發執行
獨立性:進程是一個能獨立運行的基本單位,同時也是系統分配資源和調度的獨立單位;
異步性:由於進程間的相互制約,使進程具有執行的間斷性,即進程按各自獨立的、不可預知的速度向前推進
今天主要是學習進程的調度算法:
(1)先進先出算法(FIFO)
算法總是把處理機分配給最先進入就緒隊列的進程,一個進程一旦分得處理機,便一直執行下去,直到該進程完成或阻塞時,才釋放處理機。
例如,有三個進程P1、P2和P3先後進入就緒隊列,它們的執行期分別是21、6和3個單位時間,
執行情況如下圖:
對於P1、P2、P3的週轉時間爲21、27、30,平均週轉時間爲26。
可見,FIFO算法服務質量不佳,容易引起作業用戶不滿,常作爲一種輔助調度算法。
(2)短進程優先
最短CPU運行期優先調度算法(SCBF--Shortest CPU Burst First)
該算法從就緒隊列中選出下一個“CPU執行期最短”的進程,爲之分配處理機。
例如,在就緒隊列中有四個進程P1、P2、P3和P4,它們的下一個執行 期分別是16、12、4和3個單位時間,執行情況如下圖:
P1、P2、P3和P4的週轉時間分別爲35、19、7、3,平均週轉時間爲16。
該算法雖可獲得較好的調度性能,但難以準確地知道下一個CPU執行期,而只能根據每一個進程的執行歷史來預測。
(3)輪轉法
前幾種算法主要用於批處理系統中,不能作爲分時系統中的主調度算法,在分時系統中,都採用時間片輪轉法。
簡單輪轉法:系統將所有就緒進程按FIFO規則排隊,按一定的時間間隔把處理機分配給隊列中的進程。這樣,就緒隊列中所有進程均可獲得一個時間片的處理機而運行。
多級隊列方法:將系統中所有進程分成若干類,每類爲一級。
(4)多級反饋隊列
多級反饋隊列方式是在系統中設置多個就緒隊列,並賦予各隊列以不同的優先權。
下面主要談到Linux中的進程調度方法
Linux 下的調度方法類似於上述算法:
1,SCHED_OTHER 分時調度策略,
2,SCHED_FIFO實時調度策略,先到先服務
3,SCHED_RR實時調度策略,時間片輪轉
SHCED_RR和SCHED_FIFO的不同:
當採用SHCED_RR策略的進程的時間片用完,系統將重新分配時間片,並置於就緒隊列尾。放在隊列尾保證了所有具有相同優先級的RR任務的調度公平。
SCHED_FIFO一旦佔用cpu則一直運行。一直運行直到有更高優先級任務到達或自己放棄。
如果有相同優先級的實時進程(根據優先級計算的調度權值是一樣的)已經準備好,FIFO時必須等待該進程主動放棄後纔可以運行這個優先級相同的任務。而RR可以讓每個任務都執行一段時間。
相同點:
RR和FIFO都只用於實時任務。
創建時優先級大於0(1-99)。
按照可搶佔優先級調度算法進行。
就緒態的實時任務立即搶佔非實時任務。
所有任務都採用linux分時調度策略時。
1,創建任務指定採用分時調度策略,並指定優先級nice值(-20~19)。
2,將根據每個任務的nice值確定在cpu上的執行時間(counter)。
3,如果沒有等待資源,則將該任務加入到就緒隊列中。
4,調度程序遍歷就緒隊列中的任務,通過對每個任務動態優先級的計算(counter+20-nice)結果,選擇計算結果最大的一個去運行,當這個時間片用完後(counter減至0)或者主動放棄cpu時,該任務將被放在就緒隊列末尾(時間片用完)或等待隊列(因等待資源而放棄cpu)中。
5,此時調度程序重複上面計算過程,轉到第4步。
6,當調度程序發現所有就緒任務計算所得的權值都爲不大於0時,重複第2步。
所有任務都採用FIFO時,
1,創建進程時指定採用FIFO,並設置實時優先級rt_priority(1-99)。
2,如果沒有等待資源,則將該任務加入到就緒隊列中。
3,調度程序遍歷就緒隊列,根據實時優先級計算調度權值(1000+rt_priority),選擇權值最高的任務使用cpu,該FIFO任務將一直佔有cpu直到有優先級更高的任務就緒(即使優先級相同也不行)或者主動放棄(等待資源)。
4,調度程序發現有優先級更高的任務到達(高優先級任務可能被中斷或定時器任務喚醒,再或被當前運行的任務喚醒,等等),則調度程序立即在當前任務堆棧中保存當前cpu寄存器的所有數據,重新從高優先級任務的堆棧中加載寄存器數據到cpu,此時高優先級的任務開始運行。重複第3步。
5,如果當前任務因等待資源而主動放棄cpu使用權,則該任務將從就緒隊列中刪除,加入等待隊列,此時重複第3步。
所有任務都採用RR調度策略時
1,創建任務時指定調度參數爲RR,並設置任務的實時優先級和nice值(nice值將會轉換爲該任務的時間片的長度)。
2,如果沒有等待資源,則將該任務加入到就緒隊列中。
3,調度程序遍歷就緒隊列,根據實時優先級計算調度權值(1000+rt_priority),選擇權值最高的任務使用cpu。
4,如果就緒隊列中的RR任務時間片爲0,則會根據nice值設置該任務的時間片,同時將該任務放入就緒隊列的末尾。重複步驟3。
5,當前任務由於等待資源而主動退出cpu,則其加入等待隊列中。重複步驟3。
系統中既有分時調度,又有時間片輪轉調度和先進先出調度
1,RR調度和FIFO調度的進程屬於實時進程,以分時調度的進程是非實時進程。
2,當實時進程準備就緒後,如果當前cpu正在運行非實時進程,則實時進程立即搶佔非實時進程。
3,RR進程和FIFO進程都採用實時優先級做爲調度的權值標準,RR是FIFO的一個延伸。FIFO時,如果兩個進程的優先級一樣,則這兩個優先級一樣的進程具體執行哪一個是由其在隊列中的未知決定的,這樣導致一些不公正性(優先級是一樣的,不知道那個先運行),如果將兩個優先級一樣的任務的調度策略都設爲RR,則保證了這兩個任務可以循環執行,保證了公平。