歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux內核

Linux內核學習筆記:進程

進程是多道程序設計的操作系統的基本概念。進程是程序運行的實體。他是描述程序已經執行到了何種程度的數據結構的匯集,也是操作系統分配系統資源(cpu時間,內存,磁盤)的實例。

一. 進程描述符

進程是比較抽象的概念,linux下描述進程的數據結構為進程描述符。進程描述符代表了一個進程所有的數據結構,文件,以及運行上下文。進程描述符是這麼的復雜,在linux中大約占用1.7K個字節,完全讀懂他還是有一定難度的。但是總的劃分為幾部分:

(1)thread_info 指針,指像進程的基本信息,這個結構非常重要,他與進程的內核棧存放在一起。一般占用8K個字節,兩個頁。這個結構體裡包含如進程的狀態,內核搶占標志,本地CPU號等一些重要的信息。

(2)mm_struct 指針,指向內存描述符指針,內存描述符描述了進程的基本內存信息,包括內存地址空間等。

(3)tty_struct 與進程相關的tty

(4)fs_struct 當前目錄

(5)files_struct 指向文件描述符的指針

(6)signal_struct 所接收的信號

thread_info 數據結構描述了進程基本信息,又叫線程描述符。他與進程的內核態棧存放在一起,一般占用8K的內存空間,他的首地址是8K的整數倍。所以只要或得了內核棧指針就可以方便的找到當前進程的線程描述符。從而找到當前進程的進程描述符。current宏就是通過進程的內核棧來找到當前進程的進程描述符。

linux下所有的進程描述符都鏈接在以init_task進程為首的進程雙向鏈表中,可運行進程還鏈接在可運行鏈表中,等待進程鏈接在不同的等待隊列中。這樣方便管理。

二. 進程的狀態

進程像一個生命一樣經歷著生老病死。所以進程的狀態包括了這個過程。進程包括了七種狀態:可運行狀態,可中斷的等待狀態,不可中斷的等待狀態,暫停狀態,跟蹤狀態,僵死狀態,僵死撤銷狀態。

(1) 可運行狀態,進程從建立之初起就是本著運行去的,所以可運行狀態是進程的最好的狀態,當然可運行不代表這就一定在運行,這種狀態代表進程隨時准備運行,在CPU的可運行隊列裡

(2) 可中斷的等待狀態,進程因為等待一些資源或者磁盤IO而不具備運行的條件。這中狀態叫進程的等待狀態,可中斷的等待狀態是,進程可以對信號進行相應而結束等待狀態。而不可中斷等待狀態與其相反。

(3) 暫停狀態,進程也不能運行,這種狀態是進程收到了一些暫停的信號造成的。

(4) 跟蹤狀態,一個進程可以跟蹤另外一個進程的運行,當跟蹤發生時,他就處於跟蹤狀態。

(5) 僵死狀態,進程已經退出,釋放了所有的資源,不能夠再運行了。但是進程描述符還沒有被回收,這時進程處於僵死的狀態。

(6) 僵死退出狀態,父進程對僵死的進程發出wait4系統調用,回收了進程的描述符,進程就徹底死亡了。

三  標識一個進程與進程關系

linux采用進程標識符來標識一個進程,就是一種編碼。linux下進程標識符的上限為32767,用pidmap_array位圖來表示當前已經分配的PID號和閒置的PID號。每使用一個進程,linux就在這個位圖中空閒位置1來表示進程號已用。進程之間是有關系的,每一個進程都有父進程,然後從屬於一個父繼承的進程還是兄弟進程,進程描述符中有專門的域來表示進程的這種關系。

四. 由PID到進程描述符

在一些情況下,內核必須由PID導出進程描述符的指針。例如,利用KILL系統調用時。這時必須建立起PID與進程描述符的關系。為了提高效率,linux建立了四個散列表來表示這種映射關系。,之所以采用散列表的原因是linux上限進程數量為32768項,但是系統實際的進程數量卻遠遠少於這個數值,所以如果建立32768個表項的話是一種資源的浪費,所以通過散列表的方式來達到空間的節省。但是散列表不能避免沖突,這裡采用鏈表的方式避免沖突。

Copyright © Linux教程網 All Rights Reserved