一、什麼是進程
從使用者的角度來看進程是程式的一次執行過程。
從作業系統的核心來看,進程是作業系統分配的記憶體、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));
參考:《APUE》