3、進程的兩個基本元素:
1)程序代碼(可能被執行相同程序的其他進程共享)。
2)代碼相關的數據集
進程是一種動態描述,但是並不代表所有的進程都在運行。
tast_struct的內容如下:
標識符:描述本進程的唯一標識符,用來區別其他進程。
狀態:任務狀態,退出代碼,提出信號等。
優先級:相對於其他進程的優先級。
程序計數器:程序中即將被執行的下一條指令的地址。
內存指針:包括程序代碼和程序相關數據的指針,還有和其他進程共享的內存塊的指針。
上下文數據:進程執行時處理器的寄存器中的數據。
I/O狀態信息:包括顯示的I/O請求,分配給進程的I/O設備和被進程使用的文件列表。
記賬信息:可能包括處理器時間總和,使用的時鐘數總和,時間限制,記賬號等。
所有運行在系統的進程都以tast_struct鏈表的形式存在內核裡。
3、進程的內存映像 ----- > 內核在內存中如何存放可執行程序文件。在程序轉化為進程的過程中,操作系統將可執行程序從硬盤復制到內存中。
如下程序對此進行分析:
運行結果如下:
{
"R(running)",/*0*/
"S(sleeping)",/*1*/ //可喚醒狀態的睡眠狀態
"D(disk sleep)",/*2*/ //不可中斷的睡眠狀態,深度睡眠,不要輕易刪除D進程,只有關機重啟可以喚醒
"T(stopped)",/*4*/ //暫停狀態
"t(tracing stop)",/*8*/ //暫停狀態
"X(dead)",/*16*/
"Z(zombie)",/*32*/ //僵死狀態 ,進程掛掉,進程信息等待其他進程查看退出信息,最後又init回收資源
};
僵死狀態是一個比較特殊的狀態。當進程退出並且父進程(使用wait()系統調用)沒有讀取到的子進程退出的返回代碼時就會產生僵死進程。僵死進程會以終止狀態保持在進程表中,並且會一直在等待父進程讀取退出狀態代碼。也就是進程結束(退出)後資源沒有立刻被釋放,等另一個進程來讀取回收資源,沒有釋放會內存釋放。
創建一個維持30秒的僵死進程例子:
父進程睡眠了30秒,子進程處於30秒的僵死狀態,在30秒後退出程序
進程的創建以及優先級問題,可查看本人下一篇博文。
fock()函數通過系統調用創建一個與原來進程幾乎完全相同的進程,也就是兩個進程可以做完全相同的事,但如果初始參數或者傳入的變量不同,兩個進程也可以做不同的事。