linux系統之進程相關概念小結

1、進程環境

(1)export命令查看環境變量

(2)進程環境表介紹

每一個進程中都有一份所有環境變量構成的一個表格,也就是說我們當前進程中可以直接使用這些環境變量。進程環境表其實是一個字符串數組,用environ變量指向它。

(3)程序中通過environ全局變量使用環境變量實例

#include <stdio.h>

int main(void)
{
	extern char **environ; //定義一個二重指針,指向字符串數組,environ是一個全局變量,聲明就能使用
	int i = 0;
	
	while(NULL != environ[i])
	{	
		printf("%s \n",environ[i]);
		i++;	
	}
	 
	return 0;
}

 

2、進程運行的虛擬地址空間的意義:進程隔離,提供多線程同時運行

 

3、什麼是進程

(1)動態過程而不是靜態實物。

(2)進程就是程序的一次運行過程,一個靜態的可執行程序a.out的一次運行過程(./a.out開始運行到結束)就是一個進程。

(3)進程控制塊PCB(process control block),內核中專門用來管理一個進程的數據結構。

 

4、多進程調度原理

(1)操作系統同時運行多個進程

(2)宏觀上的並行和微觀上的串行

(3)實際上現代操作系統最小的調度單元是線程而不是進程

 

5、爲什麼要創建子進程

(1)每一次程序的運行都需要一個進程

(2)多進程實現宏觀上的並行

 

6、進程的分裂生長模式

(1)如果操作系統需要一個新進程來運行一個程序,那麼操作系統會用一個現有的進程來複制生成一個新進程。老進程叫父進程,複製生成的新進程叫子進程。

(2)fork函數可以創建子進程,該函數調用一次會返回2次,返回值等於0的就是子進程,而返回值大於0的就是父進程。

(3)典型的使用fork的方法:使用fork後然後用if判斷返回值,並且返回值大於0時就是父進程,等於0時就是子進程。

 

7、關於子進程

(1)子進程和父進程的關係

(2)子進程有自己獨立的PCB

(3)子進程被內核同等調度

(4)父進程在沒有fork之前自己做的事情對子進程有很大影響,但是父進程fork之後在自己的if裏做的事情就對子進程沒有影響了。本質原因就是因爲fork內部實際上已經複製父進程的PCB生成了一個新的子進程,並且fork返回時子進程已經完全和父進程脫離並且獨立被OS調度執行。

(5)子進程最終目的是要獨立運行另外的程序

 

8、進程的消亡

(1)正常終止和異常終止。

(2)進程在運行時需要消耗系統資源(內存、IO),進程終止時理應完全釋放這些資源(如果進程消亡後仍然沒有釋放相應資源,則這些資源就丟失了)。

(3)linux系統設計時規定:每一個進程退出時,操作系統會自動回收這些進程涉及到的所有資源(譬如malloc申請的內存沒有free時,當前進程結束時這個內存會被釋放,譬如open打開的文件沒有close的,在程序終止時也會被關閉)。但是操作系統只是回收了這個進程工作時消耗的內存和IO,而並沒有回收這個進程本身佔用的內存(主要是task_struct和棧內存)。

(4)因爲進程本身的內存,操作系統不能回收,需要別人來輔助回收,因此我們每個進程都需要一個幫助它收屍的人,這個人就是這個進程的父進程。

 

9、殭屍進程

(1)子進程先於父進程結束。

子進程結束後父進程此時並不一定立即就能幫子進程“收屍”,在這一段期間(子進程已經結束且父進程尚未幫其收屍)子進程就被稱爲殭屍進程。

(2)子進程除task_struct和棧外其餘內存管理皆已清理。

(3)父進程可以使用wait或waitpid以顯式回收子進程的剩餘待回收內存資源並且獲取子進程退出狀態。

(4)父進程也可以不使用wait或者waitpid回收子進程,此時父進程結束時一樣會回收子進程的剩餘待回收內存資源。(這樣設計是爲了防止父進程忘記顯式調用wait/waitpid回收子進程,從而造成內存泄漏)

 

10、孤兒進程

(1)父進程先於子進程結束,子進程成爲一個孤兒進程。

(2)linux系統規定:所有孤兒進程都自動成爲一個特殊進程(進程1,也就是init進程)的子進程。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章