歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

linux系統編程之進程(一) 進程概述

一、什麼是進程

從用戶的角度來看進程是程序的一次執行過程。

從操作系統的核心來看,進程是操作系統分配的內存、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));

Copyright © Linux教程網 All Rights Reserved