程序
描述和管理程式的“運作過程”-------程序
程序概念
定義:程序是程式在某個資料集合上的一次運作活動
程序的特征
- 動态性
程序是程式的一次執行過程,動态産生消亡
- 并發性
程序可以同其他程式一起向前推進
- 異步性
程序按各自的速度向前推進
- 獨立性
程序是系統配置設定資源和排程CPU的機關
程序的狀态
-
運作狀态
程序已經占有CPU,在CPU上運作
-
就緒狀态
具備運作條件但由于無CPU,暫時不能運作
-
阻塞狀态
應為等待某項服務完成或信号來到而不能運作的狀态
例如等待:系統調用,I/O操作,合作程序的服務或信号
程序狀态的變遷
程序的挂起和解挂操作
挂起:使用者或OS将程序有意暫停
解挂:将挂起的程序繼續
阻塞:禁止阻塞(阻塞時挂起)和活動阻塞(正常阻塞)
就緒:禁止就緒(就緒時挂起)和活動就緒(正常就緒)
Linux程序狀态
-
可運作态:TASK_RUNNING
1.就緒:在就緒隊列中等待排程
2.運作:正在運作
-
阻塞(等待)态:
1.淺度阻塞:TASK_INTERRUPTIBLE
可被其他程序的信号或時鐘中斷喚醒
2.深度阻塞:TASK_UNINTERRUPTIBLE
不可被其他程序通過信号或時鐘中斷喚醒
-
僵死态:TASK_ZOMBIE
程序終止執行,釋放大部分記憶體
-
挂起态:TASK_STOPPED
程序被挂起
程序的描述
程序控制塊(PCB)
1.描述程序狀态、資源、和相關程序關系的一中資料結構
2.PCB是程序的标志
3.建立程序時建立PCB;程序撤銷後PCB同時撤銷
程序=程式+PCB
Linux的程序控制塊PCB:task_struct
Linux 程序的辨別:
PID
PPID:父程序ID
PGID:程序組ID
Linux程序的使用者辨別:
UID:使用者ID
GID:使用者組ID
STAT:程序狀态
符号 | 含義 |
R | 運作或準備運作 |
S | 睡眠狀态 |
I | 空閑 |
Z | 僵屍 |
D | 不間斷睡眠 |
W | 程序沒有駐留頁 |
T | 停止或跟蹤 |
程序控制
四個典型控制為:
- 建立程序
- 撤銷程序
- 阻塞程序
- 喚醒程序
建立程序的過程
建立一個空白PCB
賦予程序辨別符ID
為程序配置設定空間
初始化PCB(預設值)
插入相應的程序隊列(新程序插入就緒隊列)
程序撤銷過程
在PCB隊列中檢索出PCB
擷取該程序狀态
- 若在運作态,立即終止該程序
-
遞歸檢查是否有子程序,先撤銷子程序
釋放程序占有的資源
将程序從PCB隊列中移除
程序阻塞時機和過程
時機;
- 請求系統服務
- 啟動某種操作
- 新資料尚未到達
- 無新工作可做
停止運作
将PCB“運作态”改為“阻塞态”
插入相應原因的阻塞隊列
轉排程程式
程序喚醒
系統服務由不滿足到滿足
I/O完成
新資料到達
程序提出新請求
程序控制原語:
- 建立原語
- 撤銷原語
- 阻塞原語
- 喚醒原語
Linux程序控制
建立程序fork
fork執行流程:
- 配置設定task_struct結構
- 為新程序堆棧配置設定實體頁
- 拷貝父程序内容
- 正文段、使用者資料段及系統資料段task_struct的大部分内容,并對子程式中有别于父程序的項進行初始化
- 把新程序的task_struct結構位址儲存在task指針數組中
- 子程序由fork建立後,通常屬于就緒狀态
init程序:
在linux系統初啟時,生成init程序(1号程序)
其他程序有目前程序通過系統調用fork建立
子程序執行自己的功能
exce函數族
功能:
- 裝入一個指定的可執行程式運作
- 使子程序具有和父程序完全不同的新功能
步驟:
- 根據檔案名找到相應的可執行檔案
- 可執行檔案的内容填入子程式的位址空間
- exce調用成功就會進入新程序且不再傳回
- 調用失敗傳回-1,繼續在克隆來的位址空間中從調用點向下執行
程序阻塞 wait
程序立即阻塞自己,如果它找到一個已經成為僵屍的子程序,wait就會收集這個子程序的資訊,并把它徹底銷毀後傳回
程序終結exit
程序釋放自己占用的資源并彙報給父程序
調用exit後變為僵屍态,幾乎所有的記憶體空間,儲存PCB資訊供wait收集
程序的休眠sleep
Windows程序
程序是被加載到記憶體的,正在運作的應用程式執行個體
程序由核心對象和位址空間所組成
- 核心對象PCB
-
位址空間
包括代碼、資料、堆、棧、堆上動态配置設定的空間
windows建立程序creatProcess
過程:
- 建立程序核心對象,建立虛拟位址空間
- 裝載exe和、或dll的代碼和資料到位址空間中
- 建立主線程和線程核心對象
- 啟動主線程,進入主函數 有一個非常有趣的例子,見我另一篇部落格
Windows結束程序
主函數傳回
ExitProcess
TerminateProcess
補充:守護程序daemon
pid = fork(); //建立子程序
if(pid>0)
eixt(0); //退出父程序
setsid(); //讓程序脫離控制終端
chdir("/"); //避免原工作目錄不能被解除安裝
umake(0); //檔案權限掩碼設定0
for(int i = 0;i<MAXFILE;i++)
close(i); //關閉繼承自父程序的檔案