一、什麼是程序
從使用者的角度來看程序是程式的一次執行過程。
從作業系統的核心來看,程序是作業系統配置設定的記憶體、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));