天天看點

UNIX環境進階程式設計——程序基本概述

一、什麼是程序

從使用者的角度來看程序是程式的一次執行過程。

從作業系統的核心來看,程序是作業系統配置設定的記憶體、CPU時間片等資源的基本機關。

程序是資源配置設定的最小機關。

每一個程序都有自己獨立的位址空間與執行狀态。

像UNIX這樣的多任務作業系統能夠讓許多程式同時運作,每一個運作着的程式就構成了一個程序。

二、程序資料結構

程序的靜态描述:由三部分組成:PCB、有關程式段和該程式段對其進行操作的資料結構集。

程序控制塊:用于描述程序情況及控制程序運作所需的全部資訊。

代碼段:是程序中能被程序排程程式在CPU上執行的程式代碼段。

資料段:一個程序的資料段,可以是程序對應的程式加工處理的原始資料,也可以是程式執行後産生的中間或最終資料

堆棧段:程式運作時需要在這裡做資料運算,存儲臨時資料,開辟函數棧等。在Linux下,棧是高位址往低位址增長的。

三、程序與程式

程序是動态的,程式是靜态的。

程序的生命周期是相對短暫的,而程式是永久的。

程序資料結構PCB。

一個程序隻能對應一個程式,一個程式可以對應多個程序。

四、程序狀态變遷

運作狀态(TASK_RUNNING)

可中斷睡眠狀态(TASK_INTERRUPTIBLE)

不可中斷睡眠狀态(TASK_UNINTERRUPTIBLE)

暫停狀态(TASK_STOPPED)

僵死狀态(TASK_ZOMBIE)

UNIX環境進階程式設計——程式基本概述

五、程序控制塊

程序描述資訊

程序辨別符用于唯一的辨別一個程序。

程序控制資訊

程序目前狀态

程序優先級

程式開始位址

各種計時資訊

通信資訊

資源資訊

占用記憶體大小及管理用資料結構指針

交換區相關資訊

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。

UNIX環境進階程式設計——程式基本概述

atexit可以注冊終止處理程式,ANSI C規定最多可以注冊32個終止處理程式。終止處理程式的調用與注冊次序相反

int atexit(void (*function)(void));

繼續閱讀