一、什麼是進程
從用戶的角度來看進程是程序的一次執行過程。
從操作系統的核心來看,進程是操作系統分配的內存、CPU時間片等資源的基本單位。
進程是資源分配的最小單位。
每一個進程都有自己獨立的地址空間與執行狀態。
像UNIX這樣的多任務操作系統能夠讓許多程序同時運行,每一個運行著的程序就構成了一個進程。
二、進程數據結構
進程的靜態描述:由三部分組成:PCB、有關程序段和該程序段對其進行操作的數據結構集。
進程控制塊:用於描述進程情況及控制進程運行所需的全部信息。
代碼段:是進程中能被進程調度程序在CPU上執行的程序代碼段。
數據段:一個進程的數據段,可以是進程對應的程序加工處理的原始數據,也可以是程序執行後產生的中間或最終數據
堆棧段:程序運行時需要在這裡做數據運算,存儲臨時數據,開辟函數棧等。在Linux下,棧是高地址往低地址增長的。
三、進程與程序
進程是動態的,程序是靜態的。
進程的生命周期是相對短暫的,而程序是永久的。
進程數據結構PCB。
一個進程只能對應一個程序,一個程序可以對應多個進程。
四、進程狀態變遷
運行狀態(TASK_RUNNING)
可中斷睡眠狀態(TASK_INTERRUPTIBLE)
不可中斷睡眠狀態(TASK_UNINTERRUPTIBLE)
暫停狀態(TASK_STOPPED)
僵死狀態(TASK_ZOMBIE)
五、進程控制塊
進程描述信息
進程標識符用於唯一的標識一個進程。
進程控制信息
進程當前狀態
進程優先級
程序開始地址
各種計時信息
通信信息
資源信息
占用內存大小及管理用數據結構指針
交換區相關信息
I/O設備號、緩沖、設備相關的數結構
文件系統相關指針
現場保護信息
寄存器
PC
程序狀態字PSW
棧指針
六、進程標識
每個進程都會分配到一個獨一無二的數字編號,我們稱之為“進程標識”(process identifier),或者就直接叫它PID.
是一個正整數,取值范圍從2到32768
當一個進程被啟動時,它會順序挑選下一個未使用的編號數字做為自己的PID
數字1一般為特殊進程init保留的
七、進程的創建
不同的操作系統所提供的進程創建原語的名稱和格式不盡相同,但執行創建進程原語後,操作系統所做的工作卻大致相同,都包括以下幾點:
給新創建的進程分配一個內部標識,在內核中建立進程結構。
復制父進程的環境
為進程分配資源, 包括進程映像所需要的所有元素(程序、數據、用戶棧等),
復制父進程地址空間的內容到該進程地址空間中。
置該進程的狀態為就緒,插入就緒隊列。
八、進程的銷毀
進程終止時操作系統做以下工作:
關閉軟中斷:因為進程即將終止而不再處理任何信號;
回收資源:釋放進程分配的所有資源,如關閉所有已打開文件,釋放進程相應的數據結構等;
寫記帳信息:將進程在運行過程中所產生的記帳數據(其中包括進程運行時的各種統計信息)記錄到一個全局記帳文件中;
置該進程為僵死狀態:向父進程發送子進程死的信號(SIGCHLD),將終止信息status送到指定的存儲單元中;
轉進程調度:因為此時CPU已經被釋放,需要由進程調度進行CPU再分配。
九、終止進程的5種方法
從main函數return返回
調用exit(C庫函數)
調用_exit(系統調用)
調用abort(產生SIGABRT信號,異常終止)
由信號終止(如ctrl+c 產生的 SIGINT信號)
需要注意的是main函數返回會調用exit;exit會調用_exit; exit會調用fflush,但_exit不會調用fflush。
atexit可以注冊終止處理程序,ANSI C規定最多可以注冊32個終止處理程序。終止處理程序的調用與注冊次序相反
int atexit(void (*function)(void));