【Linux】PCB中的task_struct結構體

task_struct結構體

task_struct是進程控制塊PCB中的一個結構體,用來存儲進程的各種屬性信息

這裏面有進程狀態,進程調度,進程標識符,進程通信,進程鏈接,時間和定時器,文件系統,虛擬內存信息以及頁面管理信息,對稱多處理機信息,上下文信息等

結構體內部信息介紹

1、進程狀態

linux中的進程有多種狀態,在進程的運行過程中,進程會隨着調度在多種狀態進行轉換

進程的狀態信息是進程進行調度的對換的依據


2、進程調度信息

進程調度則是用這部分信息來決定進程調度的優先次序,結合着進程狀態信息來保證進程合理有序的運行


進程有多種調度信息,如先來先服務調度方式,時間片輪轉調度方式,最近訪問優先等調度方式


3、標識符

每一個進程都有進程標識符,用戶標識符,組標識符

進程標識符PID就是用來標示不同的進程的,因爲每一個進程都有唯一的標識符,就和學生擁有唯一的學號,一個人擁有唯一的身份證號碼是一樣的。內核就是通過這個標識符來識別不同的進程。


4、進程通信有關信息

如果多個進程在一個任務上執行協作,那麼就需要這些進程可以互相訪問對方的資源,互相通信

linux中的主要進程通信方式有:管道、信號量,共享內存,信號,和消息隊列


5、進程鏈接信息

進程的創建是具有繼承關係的。一個進程可以創建多個進程,這些子進程之間具有兄弟關係。

linux中,除了init進程,其他進程都有唯一一個父進程。

創建子進程可以通過fork()函數或者clone()函數。

除了PID外,子進程的task_struct結構體的大部分信息都是從父進程中拷貝過來的。系統有必要記錄這些親屬關係,從而使進程之間的協作變得更加方便。

每個進程的task_struct結構有許多的指針,這些指針讓系統中所有進程的task_struct結構構成了一顆進程樹,這個進程樹的根就是初始化進程init的task_struct結構體。


6、時間和定時器信息

一個進程從創建到終止叫做該進程的生存期(lifetime)。進程在其生存期內使用CPU的時間,內核都要進行記錄,以便進行統計、計費等有關操作。進程耗費CPU的時間由兩部分組成:一是在用戶模式(或稱爲用戶態)下耗費的時間、一是在系統模式(或稱爲系統態)下耗費的時間。每個時鐘滴答,也就是每個時鐘中斷,內核都要更新當前進程耗費CPU的時間信息。



7、文件系統信息

進程可以打開或關閉文件,文件屬於系統資源,Linux內核要對進程使用文件的情況進行記錄。task_struct結構中有兩個數據結構用於描述進程與文件相關的信息。其中,fs_struct中描述了兩個VFS索引節點(VFS inode),這兩個索引節點叫做root和pwd,分別指向進程的可執行映象所對應的根目錄(home directory)和當前目錄或工作目錄。file_struct結構用來記錄了進程打開的文件的描述符


8、虛擬內存信息

除了內核線程之外,每個進程都擁有自己的地址空間(也叫虛擬空間),用mm_struct來描述。另外Linux2.4還引入了另外一個域active_mm,這是爲內核線程而引入。因爲內核線程沒有自己的地址空間,爲了讓內核線程與普通進程具有統一的上下文切換方式,當內核線程進行上下文切換時,讓切換進來的線程的active_mm 指向剛被調度出去的進程的active_mm


9、頁面管理信息

當物理內存不足時,linux內存管理系統需要將內存的部分頁面轉到外存,其交換是以頁爲單位的


10、對稱多處理機信息


11、上下文信息

這裏要特別注意標題:和“處理器”相關的環境信息。進程作爲一個執行環境的綜合,當系統調度某個進程執行,即爲該進程建立完整的環境時,處理器(processor)的寄存器、堆棧等是必不可少的。因爲不同的處理器對內部寄存器和堆棧的定義不盡相同,所以叫做“和處理器相關的環境”,也叫做“處理機狀態”。當進程暫時停止運行時,處理機狀態必須保存在進程的task_struct結構中,當進程被調度重新運行時再從中恢復這些環境,也就是恢復這些寄存器和堆棧的值。


12、其他

(1)  struct wait_queue *wait_chldexit

在進程結束時,或發出系統調用wait4時,爲了等待子進程的結束,而將自己(父進程)睡眠在該等待隊列上,設置狀態標誌爲TASK_INTERRUPTIBLE,並且把控制權轉給調度程序。

(2)Struct rlimit rlim[RLIM_NLIMITS];

每一個進程可以通過系統調用setlimit和getlimit來限制它資源的使用。

(3)Int exit_code exit_signal;

程序的返回代碼以及程序異常終止產生的信號,這些數據由父進程(子進程完成後)輪流查詢。

(4)Char comm[16]

這個域存儲進程執行的程序的名字,這個名字用在調試中。

(5)Unsigned long personality;

 Linux可以運行X86平臺上其它Unix操作系統生成的符合iBCS2標準的程序, personality進一步描述進程執行的程序屬於何種Unix平臺的“個性”信息。通常有PER_Linux,PER_Linux_32BIT,PER_Linux_EM86,PER_SVR4,PER_SVR3,PER_SCOSVR3,PER_WYSEV386,PER_ISCR4,PER_BSD,PER_XENIX和PER_MASK等,參見include/Linux/personality.h>。

(6) int did_exec:1;

按POSIX要求設計的布爾量,區分進程正在執行老程序代碼,還是用系統調用execve()裝入一個新的程序。

(7)struct linux_binfmt *binfmt

指向進程所屬的全局執行文件格式結構,共有a.out、script、elf、java等四種。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章