1、程序生命週期:
某個程序通過系統呼叫fork,建立乙個用於執行程式的程序。生成此程序的程序稱為父程序,被生成的程序稱為子程序。子程序通過複製父程序的資料得以建立;
父程序執行系統呼叫wait,等待子程序結束;
子程序通過系統呼叫exec將程式讀取到記憶體並開始執行;
當程式執行完畢後,子程序通過系統呼叫exit結束自身的執行並進入殭屍狀態;
父程序得到子程序的執行結果後清理子程序。
2、建立程序:
程序的複製:通過將父程序的資料複製到子程序,以此建立新的程序,被複製的資料有:proc陣列元素、複製資料段
系統呼叫fork:使用者程式在執行fork時會首先呼叫c語言的庫函式fork(),在此庫函式中再執行sys fork來訪問系統呼叫fork()
子程序的處理:在核心的fork() 處理中,子程序從newproc()返回處開始執行;newproc()是實際建立程序的函式,他負責將proc中代表執行程序的元素和執行程序的資料段複製到子程序中,**段不屬於複製物件,子程序和執行程序共享相同的**段
3、切換執行程序:
中斷執行程序:執行程序在執行核心函式sleep() 後進入休眠並中斷當前處理,此後,由於swtch()被呼叫,執行程序發生切換
核心函式sleep()一般在下述情況下被呼叫:使用者程式訪問了系統呼叫wait、等待周邊裝置處理完畢、等待使用中的資源被釋放
處於可執行狀態(srun)
擁有最高的執行優先順序(proc.p_pri的值最小)
setpri()函式用來隨時調整各程序的執行優先順序
上下文切換:執行程序被中斷時,將當前執行狀態儲存於user結構體中。當被中斷的程序再次執行時,通過user結構體恢復以前的執行狀態,這個處理被稱作上下文切換
系統呼叫wait:wait具有以下兩個功能:終端當前程序等待子程序執行結束,以及清理執行結束的子程序
sleep() :sleep()接受兩個引數:chan和pri。chan為任意變數的位址,其值將被賦給執行程序的proc.p_wchan。wchan代表waiting channel,表示此程序正在等待proc.p_wchan所指向的資源
wakeup()將程序從休眠狀態喚醒至可執行狀態;系統利用sleep()和wakeup()實現多個程序等待同一資源時的同步處理;
setrun()將由引數指定的程序設定為可執行狀態
系統呼叫exec用於執行程式執行檔案的讀入處理和分配記憶體的處理,它不會改變已開啟檔案和當前目錄的資料。父程序的資料按原狀保留。
執行檔案的格式:程式執行檔案從檔案頭開始依次由下述部分構成:檔案頭、**、資料、符號表、重定位位元
系統呼叫exec:使用者程式呼叫exec後將執行下述處理:
5、程序的終止
系統呼叫exit的主要功能如下所示:
在程序的最後階段執行swtch()切換執行程序
6、資料區域的擴充套件
系統呼叫break用來擴充套件或縮小資料段中資料區域的長度,供使用者程式呼叫的c語言庫函式malloc()等使用break實現對堆區域的擴充套件等操作
7、管理記憶體和交換空間
map結構體:核心利用map結構體對物理記憶體和交換空間的未使用區域進行管理
coremap用來管理物理記憶體,swapmap用來管理交換空間
mfree()用來釋放物理記憶體和交換空間
Linux核心 程序管理
注 對linux系統來說,執行緒只是一種特殊的程序,linux不區分執行緒和程序 程序 處於執行期的程式 包含的資源 一 程序描述符及任務結構 程序存放在任務佇列 task list 的雙向迴圈鍊錶中 鍊錶中每一項型別均為task struct 程序描述符,也可表示為task t 該結構定義在inc...
Linux核心之程序管理
linux核心之程序管理 支援執行緒的計算機系統裡面,程序作為資源分配的基本單位而存在,執行緒作為排程的基本單位而存在.執行緒僅擁有必不可少的一些資源,如 一組暫存器,堆疊資訊等等和其他執行緒共享同乙個程序的所有資源.所以,在同乙個程序的執行緒切換時不需要大量的儲存和恢復工作,同時由於共享同乙個儲存...
linux核心如何管理程序
程序 有諸多的定義,在許多的教材資料上,其定義是乙個程式的執行例項,這不無道理,也有的人認為它是程式處理所描述的所有資料結構的集合。這裡不深究其定義,如果換個角度而言,程序就好像我們人類,他們被產生,它們有自己的生命週期,儘管生命週期的長短不一,從幾毫秒至幾秒,甚至幾個月,幾年。與人類的真正區別就在...