對於多道程式設計的系統,就會有多個程序或者執行緒在同時競爭cpu。對於單核系統,排程問題,就是選擇下乙個要執行的程序或者執行緒是哪乙個。
執行緒的排程與程序類似,對於按核心級別的排程,與執行緒所屬的程序基本沒有關係。
程序切換的代價是比較大的,包括使用者態到核心態的切換、儲存當前程序的狀態、記憶體映像的改變、排程程式以及載入新程序的狀態;另外,會導致快取記憶體的失效。
排程程式要考慮的要素:
(1)程序是cpu密集型還是i/o密集型。i/o密集型可能會需要盡快執行,並且很快就阻塞。cpu密集型可能會長期占用cpu。
(2)何時排程。建立程序、程序退出、程序阻塞以及i/o中斷發生。
(3)是否支援搶占。支援搶占的排程,可以不必等待當前程序執行完或阻塞,直接上cpu執行。
一、排程演算法的分類。
不同的環境需要不同的排程演算法,也有不同的考量指標:
(1)批處理。批處理系統下,不需要特別快的響應速度,所以可以考慮非搶占以及每個程序都有長時間的搶占演算法。指標主要是:吞吐量、周轉時間以及cpu利用率。
(2)互動式。互動式系統下,搶占是必須的,因為操作者會希望比較快的得到響應。考慮的指標主要是最小響應時間、均衡性。
(3)實時。實時系統下,最重要的是滿足截止時間要求,即在一定的時間內完成任務。
二、批處理系統中的排程
1、先來先服務(first-come-first-serve)。最簡單的方式,非搶占式的先來先服務,從字面意思就可以看出,把任務作為乙個佇列,先來先服務。缺點是,無法體現任務的輕重緩急,達不到理想的指標效能。
2、最短作業優先。非搶占式下,即當乙個任務完成時,從任務佇列中挑選最短的乙個作業執行。相對於先來先服務,提高了一些效能。執行時間必須提前掌握。
3、最短剩餘時間優先。即最短作業優先的搶占版本。排程程式總是選擇剩餘執行時間最短的作業執行。每當乙個新的作業到達,如果執行時間比當前程序的剩餘執行時間短,就掛起當前程序並切換到新的程序。
三、互動式系統中的排程
1、輪轉排程。最簡單且最公平的方法,給每個程序分配乙個時間片。時間片耗盡時,程序會下cpu並加入到就緒佇列的末尾。問題的關鍵是選擇合適的時間片。
2、優先順序排程。程序有輕重緩急,於是給程序設定不同的優先順序,每次排程優先順序最高的程序執行。當然,這樣可能會導致低優先順序程序飢餓。解決方案是,實行獎懲機制,高優先順序程序耗盡時間片時會降低它的優先順序。
3、多級佇列。給不同優先順序的程序佇列,設定不同單位的時間片。同時,也實行獎懲機制,耗盡時間片會改變程序的佇列級別。
四、執行緒的排程
執行緒的排程,取決於支援的是核心級執行緒還是使用者級執行緒。
對於使用者級執行緒,核心不知道執行緒的存在,就給了程序很大的自主權。核心只是排程程序,程序中的排程程式選擇哪個執行緒來執行。
對於核心級執行緒,執行緒的排程就交給了系統完成。
五、linux中的程序與執行緒排程
首先明確乙個概念,linux系統中甚至沒有真正的執行緒。不過,可以認為linux是系統的執行緒是核心執行緒,所以排程是基於執行緒的。
乙個程序由於其執行空間的不同, 從而有核心執行緒和使用者程序的區分, 核心執行緒執行在核心空間, 之所以稱之為執行緒是因為它沒有虛擬位址空間, 只能訪問核心的**和資料, 而使用者程序則執行在使用者空間, 但是可以通過中斷, 系統呼叫等方式從使用者態陷入核心態。
使用者程序執行在使用者空間上, 而一些通過共享資源實現的一組程序我們稱之為執行緒組, linux下核心其實本質上沒有執行緒的概念, linux下執行緒其實上是與其他程序共享某些資源的程序而已。但是我們習慣上還是稱他們為執行緒或者輕量級程序。
因此, linux上程序分3種,核心執行緒(或者叫核心程序)、使用者程序、使用者執行緒, 當然如果更嚴謹的,也可以認為使用者程序和使用者執行緒都是使用者程序。
linux中,程序和執行緒都被維護為乙個task_struct結構,執行緒和程序被同等對待來進行排程。
linux將執行緒區分為3類:
(1)實時先入先出。
(2)實時輪轉。
(3)分時。
實時先入先出有最高的優先順序,不會被其他執行緒搶占,除非是另外乙個剛剛準備好的且優先順序更高的實時先入先出線程。
實時輪轉執行緒與實時先入先出類似,不過有乙個輪轉體系,即分配乙個時間片,時間到了就可以被搶占。時間片消耗完就進入實時輪轉執行緒列表的末尾。其實,這兩種都不是真的實時,因為執行的最後期限無法確定,只是比分時執行緒有更高的優先順序。
實時執行緒的優先順序從0-99,0是實時執行緒的最高優先順序,99是實時執行緒的最低優先順序。
傳統的非實時執行緒,優先順序從100-139。linux系統根據非實時執行緒的優先順序分配時間量。
linux使用乙個重要的結構,排程佇列。每個cpu有自己的排程佇列,包括兩個陣列:活動的和過期失效的。每個陣列包括了140個煉表頭,對應140個優先順序的鍊錶。
排程器從正在活動陣列中選擇乙個優先順序最高的任務,如果時間片耗盡失效,就加入到過期失效陣列中。如果程序在時間片內被阻塞,那麼在時間片失效之前,等待的事件發生就可以繼續執行,放回到正在活動的陣列中。如果活動陣列沒有任務了,排程器交換指標,使得活動陣列和失效陣列調換。
不同的優先順序被賦予不同的時間片長度,優先順序越高的程序,時間片越長。
linux採用靜態優先順序與動態優先順序結合的方式。linux採用了獎懲機制,目的在於獎勵互動程序以及懲罰占用cpu的程序。乙個程序初始被賦予了乙個優先順序,耗盡和阻塞會改變nice值,活動與過期程序轉換時,動態改變程序優先順序。
另外,對於多核處理器,執行佇列資料結構與某乙個處理器相對應,排程器盡量進行親和排程,即將之前在某個處理器上執行過的任務再次調入該處理器。
排程器只考慮可以執行的任務,不可執行的任務和正在等待各種i/o操作的或核心事件的任務被放入等待佇列中。每一種等待某種事件的任務組成乙個等待佇列。等待佇列的頭部包含乙個指向任務鍊錶的指標及乙個自旋鎖。
作業系統學習筆記(三) 程序和執行緒的排程
對於多道程式設計的系統,就會有多個程序或者執行緒在同時競爭cpu。對於單核系統,排程問題,就是選擇下乙個要執行的程序或者執行緒是哪乙個。執行緒的排程與程序類似,對於按核心級別的排程,與執行緒所屬的程序基本沒有關係。程序切換的代價是比較大的,包括使用者態到核心態的切換 儲存當前程序的狀態 記憶體映像的...
作業系統學習筆記(三) 程序
一 程序環境 c程式儲存空間布局 正文段 唯讀 存放cpu執行的機器指令,可共享 資料段 也叫初始化資料段。包含程式中需要明確賦值的變數,如 int max 99 bss段 也叫未初始化的資料段,在程式開始執行前,核心將此段中資料初始化為0或空指標,如long sum 100 棧 存放自動變數 即區...
作業系統學習筆記 程序通訊
程序通訊是指程序之間的資訊交換。交換的資訊量包括乙個狀態或數值 訊號量,低階通訊 或上千個位元組 高階通訊 低階通訊 程序的互斥和同步 交換的資訊量 即訊號量 較少 高階通訊 指使用者可直接利用os提供的一組通訊命令 不需要自己編寫命令 高效地傳送大量資料的一種通訊方式。對使用者透明。使用者不需要考...