總體來講,對於作業系統而言,處理機在任意時刻只能執行乙個程序。linux系統的排程基於分時(time sharing)技術:多個程序以「時間多路復用」方式執行,cpu的時間被分成「片(slice)」,每個可執行程序可以分配一片。
在linux中,與程序相關的引數用資料結構task_struct來描述。在有關排程的問題時,傳統意義上把程序分為「i/o受限」和「cpu受限」(也可以稱作i/o密集型和處理機密集型)。顧名思義前者頻繁使用i/o裝置,並花費很多時間等待i/o的操作;而後者則需要大量的cpu時間。另一種分類法把程序區分為三類:
- 互動式程序:互動式程序與大部分時間用於與使用者的互動,因此它需要保證較高的響應時間。典型的互動式程式是shell命令、文字程式設計程式和圖形應用程式。
- 批處理程序:批處理程序不必與使用者互動,這樣的程序對響應時間的要求不高。典型的批處理程序是c語言編譯程式、資料庫搜尋引擎和科學計算。
- 實時程序:實時程序有很強的排程需要,而且絕對不會被低優先順序的程序阻塞。
- 活動和過期程序:當乙個程序用完它的時間片時,它應該被還沒有用完時間的低優先順序程序所搶占–>為了實現這種機制,排程程式維護了兩個不相交的可執行程序的集合。
- -
- 排程程式所使用的使用的資料結構:runqueue:系統中的每個cpu都有自己的執行佇列,所有的runqueue結構存放在runqueues「每cpu變數中。
每cpu變數(per-cpu-variable)是核心中一種重要的同步機制。顧名思義,每cpu變數就是為每個cpu構造乙個變數的副本,這樣多個cpu相互操作各自的副本,互不干涉。比如我們標識當前程序的變數current_task就被宣告為每cpu變數。
系統中的每個可執行程序只屬於乙個執行佇列,只要可執行程序保持在同乙個執行佇列總,它就只可能在擁有該執行佇列的cpu上執行。注意可執行程序可以從乙個執行佇列遷移到另乙個執行佇列。runqueue結構中的active欄位指向上述的活動程序集合;而expired欄位指向上述的過期程序集合。
程序描述符–》task_struct 包括幾個與排程相關的字段
當乙個程序建立子程序時,copy_process呼叫sched_fork()函式,設定time_slice欄位,從而父程序的時鐘節拍數被劃分成兩等分:乙個給父程序curren本身,乙個給子程序p。
p->time_slice = (curren->time_slice) + 1 >> 1;
current->time_slice >>= 1;
time_slice:程序時間片中還剩餘的時鐘節拍數。
排程程式所使用的函式:依賴以下函式來完成排程操作。
scheduler_tick():維持當前最新的time_slice計數器。
try_to_wake_up():喚醒睡眠程序。
recalc_task_prio():更新程序的動態優先順序。
schedule():選擇要被執行的新程序。
load_balance():維持多處理器系統中的執行佇列的平衡。
第八章 程序控制
1 fork是核心建立新程序的唯一方法 除了交換程序,init和頁精靈程序 2 子程序獲得父程序的資料空間,堆,棧。子程序的這些空間是父程序的拷貝,並不共享。子程序也會複製父程序的io快取 程式8.1的例子 但是很多實現並不做父程序資料段和堆的完全拷貝,有的使用了 寫時複製 的技術。3 從下面的例子...
第八章 程序控制
1.程序標示符pid id為1 的通常是 init 程序。在自舉過程中被核心呼叫。該程序的程式檔案時 sbin init。此程序負責在自舉核心後啟動乙個unix系統。讀與系統相關的初始化檔案 etc rc 或 etc inittab 以及 etc init.d中的檔案 並引導系統到乙個狀態 如多使用...
第八章 程序控制 waitpid函式
waitpid 等待子程序中斷或結束 表頭檔案 include include 定義函式 pid t waitpid pid t pid,int status,int options 函式說明 waitpid 會暫時停止目前程序的執行,直到有訊號來到或子程序結束。如果在呼叫 wait 時子程序已經結...