Linux的排程程式

2021-06-20 08:40:08 字數 3788 閱讀 1769

linux

的排程程式

是乙個叫

schedule

的函式,由它來決定是否要進行程序的切換。

而所謂的排程時機則是在什麼情況下執行

排程程式? 1

、程序狀態轉換

的時刻程序終止、程序睡眠

2、當前程序的

時間片用完時

(current-counter0)3

裝置驅動程式首席執行官而重複的任務

4、程序從

中斷、異常及系統呼叫返回到使用者態

時機1

程序要呼叫

sleep

或exit

等函式進行狀態轉換,這些函式會主動呼叫

排程程式

進行程序排程

時機2

由於程序的時間片是由時鐘中斷來更新的,因此這種情況和時機

4是一樣的。

時機3

當裝置驅動程式首席執行官而重複的任務時直接呼叫

排程程式

。在每次反覆迴圈中驅動程式都檢查

need_resched

的 值,如果必要則呼叫

排程程式

schedule

主動放棄

cpu。

時機4

如前所述不管是從中斷、異常還是

系統呼叫返回,

最終都呼叫

ret_from_sys_call

由這個函式進行排程標誌的檢

測,如果必要,則呼叫

排程程式。

那麼為什麼從系統呼叫返回時要呼叫

排程程式呢?

這當然是從效率考慮。

從系統呼叫返回意味著要離開核心態而返回到使用者態,而狀態的轉換要花費一定的時間,因此在返回到使用者態前系統把在核心態該處理的事全部做完。

下面簡單看一下每個時鐘中斷發生時核心要做的工作:

每個時鐘中斷(

timerinterrupt

)發生時,由三個函式協同工作,共同完成程序的選擇和切換。

它們是schedule

do_timer

ret_form_sys_call

schedule

程序排程函式。由它來完成程序的選擇排程

do_timer

暫且稱之為時鐘函式。該函式在時鐘中斷服務程式中被呼叫,是時鐘中斷服務程式的主要組成部分。該函式

被呼叫的頻率就是時鐘中斷的頻率,即每秒鐘

100次簡稱

100赫茲或

100hz

ret_from_sys_call

系統呼叫返回函式。當乙個系統呼叫或中斷完成時,該函式被呼叫。用於處理一些收尾工作。例

如訊號處理、核心任務等等。

這三個函式是如何協調工作的呢?

例:時鐘中斷(最頻繁的排程時機) 1

時鐘中斷是乙個

中斷服務程式,它的主要組成部分就是時鐘函式

do_timer

。由這個函式完成系統時間的更新、程序時間片的更新等工作。更新後的程序時間片

counter

作為排程的主要依據。 2

、在時鐘中斷返回時要呼叫函式

ret_from_sys_call

,在這個函式中

need_resched

標誌如果此標誌為

0

,那麼就轉到

reschedule

處呼叫排程程式

(schedule

)進行程序的選擇。

排程程式(

schedule

)會根據具體的標準在執行佇列中

選擇下乙個

應該執行的程序。

3、當從

排程程式

返回時,如果發現又有排程標誌被設定,則又

呼叫排程程式

直到排程標誌為

0。這時從

排程程式

返回時由

restore_all

恢復被選定程序的環境,返回到被選定程序的使用者空間使之得到執行。

系統呼叫返回函式(

ret_from_sys_call

)是從系統呼叫

異常

中斷返回函式

通常要呼叫的函式,但並不是非得呼叫。對於那些要

經常被響應

的和要被盡快處理

的中斷請求訊號,為了

減少系統開銷,

處理完成後並不呼叫

ret_from_sys_call

因為很顯然的從這些中斷處理程式返回到的使用者空間肯定是那個被中斷的程序,無需重新選擇,並且它們做的工作要盡可能少,因為響應的頻率太高了。

linux

排程程式

和其他的

unix

排程程式

不同。尤其是在

nicelevel

優先順序的處理上,與優先權排程

priority

高的程序最先執行不同。

linux

用的是時間片輪轉排程

(roundrobing

),但同時又保證了高優先順序的程序執行的既快、時間又長(

bothsooner and longer)。

而標準的

unix

排程程式

都用到了多級程序佇列。大多數的實現都用到了二級優先佇列乙個標準佇列和乙個實時

realtime

佇列。一般情況下如果實時佇列中的程序未被阻塞,它們都要在標準佇列中的程序之前被執行並且每個佇列中

nicelevel

高的程序先被執行。

總體上linux

排程序程在

互動性方面

表現很出色當然了這是以

犧牲一部分吞吐量為代價的

。linux排程程式分類:

->長期排程程式(作業排程程式)控制多道程式設計的程度(記憶體中程序的數量)

->中期排程程式:用於交換即將程序從記憶體(或cpu競爭)中移出,從而降低多道程式設計程度。而後程序被重新裝入記憶體,並從中斷處繼續執行。

->短期排程程式(cpu排程程式)頻繁的為cpu選擇新程序

程序需要搭配合理,即cpu為主和i/o為主的程序數量協調,即不使cpu空閒,又不使i/o無事可做。

I O排程程式

如果簡單地以核心產生請求的次序直接將請求發向塊裝置的話,效能肯定讓人難以接受。磁碟定址是整個計算機中最慢的操作之一,每一次定址 定位硬碟磁頭到特定塊上的某個位置 需要花費不少時間。所以盡量縮短定址時間無疑是提高系統效能的關鍵。為了優化定址操作,核心既不會簡單的按請求接收次序,也不會立即將其提交給磁碟...

I O排程程式

如果簡單地以核心產生請求的次序直接將請求發向塊裝置的話,效能肯定讓人難以接受。磁碟定址是整個計算機中最慢的操作之一,每一次定址 定位硬碟磁頭到特定塊上的某個位置 需要花費不少時間。所以盡量縮短定址時間無疑是提高系統效能的關鍵。為了優化定址操作,核心既不會簡單的按請求接收次序,也不會立即將其提交給磁碟...

oracle 排程程式學習

oracle中scheduler的管理主要是通過dbms scheduler來執行。開始前的工作 建立乙個使用者 create user sched identified by oracle grant create session to sched grant scheduler admin to...