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結構中,當進程被調度重新運行時再從中恢復這些環境,也就是恢復這些寄存器和堆棧的值。