linux進程(一)概述和進程描述符
一 進程概述:
(1)進程和線程區別:
*進程是資源分配的基本單位,也是調度運行的基本單位;線程是調度的基本單位。
*進程有獨立的虛擬地址空間。父子進程共享文件表,但不共享用戶地址空間。
*優點:一個進程崩潰後不會對其他進程產生影響。
*缺點:進程間共享數據變得困難,必須使用顯式的IPC機制。
*進程虛擬地址空間包括:代碼段、堆棧段(臨時數據:如函數參數、返回地址和局部變量)、數據段(包括全局變量)、堆(動態分配的內存)等等。
*線程運行在進程的上下文中,所有運行在一個進程內的線程共享該進程的整個虛擬地址空間:代碼、數據、堆、共享庫和打開文件。
*每個線程有自己的線程上下文:一個線程ID、棧、棧指針、程序計數器、通用目的的寄存器和條件嗎。
*創建、切換和終止開銷小:線程的上下文比進程的上下文小很多,所以線程的創建、上下文切換和終止要比進程快很多。
*線程間共享數據容易,因為多個線程共享進程地址空間,但需要同步。
(2)進程和程序區別:
*程序本身不是進程,程序只是被動實體,如存儲在磁盤上的一系列指令的文件內容(常被成為可執行文件)。
*進程是活動實體,它有一個程序計數器來表示下一個要執行的命令和相關資源集合。
*當一個可執行文件被裝入內存時,一個程序才成為進程。
*雖然多個進程可以與統一程序相關,但是它們被當做兩個獨立的執行序列,都是獨立的進程,雖然文本段相同,但是數據段、堆、堆棧段都不同。
(3)進程組成部分:
*進程控制塊:由os創建和管理,包含os需要的所有關於進程的信息,主要包含:進程標識信息、處理器狀態信息和進程控制信息。
*程序段:即文本段,是進程的組成部分之一。
*數據段:和程序段相關的數據集。
(4)進程的虛擬地址空間:進程的地址空間被分成為各種內存區或叫做段。
*text:代碼段,存放程序的可執行命令。
*data:存放已初始化數據。
*BSS:存放未初始化數據。
*堆:用於擴展進程的線性地址空間。
*棧:包含所有已分配內存的局部變量,用作函數調用。
(5)和進程上下文(context)和上下文切換:
*進程上下文:包括程序計數器、寄存器(狀態寄存器等)、用戶棧、內核棧和各種內核數據結構。
*上下文切換:保存當前進程上下文,恢復新進程上下文,然後將控制權交給新進程。
(6)內核態和用戶態:
*進程在生命周期內,或者執行自己的代碼或者執行內核代碼。內核代碼是在系統調用被執行時、異常發生時或者中斷到來時(中斷執行程序中)執行的代碼。
*進程執行的不是內核代碼,則進程正運行在用戶態;如果進程執行內核代碼,則進程處於內核態。
*處理器通常使用某個控制器中的一個模式位來提供這種功能,該寄存器描述了當前進程享有的特權。當設置了模式位時,進程就運行在內核模式中。
*內核態的進程可以執行指令集中的任何指令,並且訪問系統中任何存儲器的位置;用戶態的進程不允許執行特權指令,比如:停止處理器、改變模式位、或者發起一個IO操作,也不允許用戶態進程直接引用地址空間中內核區的代碼和數據,用戶程序必須通過系統調用接口間接的訪問內核代碼和數據。
(7)用戶棧和內核棧:
*內核在創建進程時,在創建task_struct的同時為進程創建相應堆棧,每個進程會有兩個棧,一個用戶棧存在於用戶空間;一個內核棧存在於內核空間。
二 進程描述符:
(1)綜述:
*在內核中,進程描述符是一個名為task_struct的結構體,該結構體定義於/usr/src/linux/include/linux/sched.h中,用於存放進程的屬性和信息,與進程相關的所有內核信息都存儲在這個結構體中。
*內核采用循環雙向鏈表task_list來存放所有進程描述符,並借助全局變量current來存放當前運行進程的task_struct的引用。
*進程可能由一個或多個線程組成,每個線程都對應於一個task_struct,在一般進程,線程共享相同的內存地址空間。
(3)進程屬性相關字段:
*state:記錄進程的狀態,可能值為TASK_RUNNING、TASK_INTERRUPTIBLE、TASK_UNINTERRUPTIBLE、TASK_ZOMBIE、TASK_STOPPED和TASK_DEAD.
*pid:每個進程都有唯一的進程標識符pid。pid_t類型是short int,pid默認最大值為32768。