歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> 【Linux】進程概念與編程

【Linux】進程概念與編程

日期:2017/3/3 11:50:31   编辑:Linux技術

一、進程的概念

1、操作系統(OS)角度:程序的一個執行實例;正在執行的程序;能分配處理器並由處理器執行的實體。2、內核觀點:擔當分配系統資源(cpu時間,內存)的實體。

3、進程的兩個基本元素:

1)程序代碼(可能被執行相同程序的其他進程共享)。

2)代碼相關的數據集

進程是一種動態描述,但是並不代表所有的進程都在運行。

二、進程的描述

每個進程在內核中都有一個進程控制塊(pcb)來維護進程的信息,Linux內核的進程控制塊是task_struct結構體。它會被裝載到RAM(隨機訪問存儲器,即Random-Access Memory)裡並且包含著進程的信息。每個進程都把它的信息放在tast_struct這個數據結構裡。進程的標識符:進程id(PID),父進程id(PPID)

tast_struct的內容如下:

標識符:描述本進程的唯一標識符,用來區別其他進程。

狀態:任務狀態,退出代碼,提出信號等。

優先級:相對於其他進程的優先級。

程序計數器:程序中即將被執行的下一條指令的地址。

內存指針:包括程序代碼和程序相關數據的指針,還有和其他進程共享的內存塊的指針。

上下文數據:進程執行時處理器的寄存器中的數據。

I/O狀態信息:包括顯示的I/O請求,分配給進程的I/O設備和被進程使用的文件列表。

記賬信息:可能包括處理器時間總和,使用的時鐘數總和,時間限制,記賬號等。

所有運行在系統的進程都以tast_struct鏈表的形式存在內核裡。

三、進程的位置

1、進程將程序讀入內存,為程序分配內存空間。2、內核為該進程保存pid及相應的狀態信息,把進程放到運行隊列中等待執行。

3、進程的內存映像 ----- > 內核在內存中如何存放可執行程序文件。在程序轉化為進程的過程中,操作系統將可執行程序從硬盤復制到內存中。

如下程序對此進行分析:

運行結果如下:

四.進程狀態

static const char* const task_state_array[] =

{

"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()函數通過系統調用創建一個與原來進程幾乎完全相同的進程,也就是兩個進程可以做完全相同的事,但如果初始參數或者傳入的變量不同,兩個進程也可以做不同的事。



Copyright © Linux教程網 All Rights Reserved