Linux核心 程序管理

2021-08-20 22:32:55 字數 1775 閱讀 9801

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核心如何管理程序

程序 有諸多的定義,在許多的教材資料上,其定義是乙個程式的執行例項,這不無道理,也有的人認為它是程式處理所描述的所有資料結構的集合。這裡不深究其定義,如果換個角度而言,程序就好像我們人類,他們被產生,它們有自己的生命週期,儘管生命週期的長短不一,從幾毫秒至幾秒,甚至幾個月,幾年。與人類的真正區別就在...