進程組

Linux-進程、進程組、作業、會話、控制終端詳解

一、進程

  傳統上,Unix操作系統下運行的應用程序、 服務器以及其他程序都被稱爲進程,而Linux也繼承了來自unix進程的概念。必須要理解下,程序是指的存儲在存儲設備上(如磁盤)包含了可執行機器指 令(二進制代碼)和數據的靜態實體;而進程可以認爲是已經被OS從磁盤加載到內存上的、動態的、可運行的指令與數據的集合,是在運行的動態實體。這裏指的 指令和數據的集合可以理解爲Linux上ELF文件格式中的.text .data數據段。

二、進程組

  每個進程除了有一個進程ID之外,還屬於一個進程組,那什麼是進程組呢?

  顧名思義,進程組就是一個或多個進程的集合。這些進程並不是孤立的,他們彼此之間或者存在父子、兄弟關係,或者在功能上有相近的聯繫。每個進程都有父進程,而所有的進程以init進程爲根,形成一個樹狀結構

  那爲啥Linux裏要有進程組呢?其實,提供進程組就是爲了方便對進程進行管理。假設要完成一個任務,需要同時併發100個進程。當用戶處於某種原因要終止 這個任務時,要是沒有進程組,就需要手動的一個個去殺死這100個進程,並且必須要嚴格按照進程間父子兄弟關係順序,否則會擾亂進程樹。有了進程組,就可以將這100個進程設置爲一個進程組,它們共有1個組號(pgrp),並且有選取一個進程作爲組長(通常是“輩分”最高的那個,通常該進程的ID也就作爲進程組的ID)。現在就可以通過殺死整個進程組,來關閉這100個進程,並且是嚴格有序的。組長進程可以創建一個進程組,創建該組中的進程,然後終止。只要在某個進程組中一個進程存在,則該進程組就存在,這與其組長進程是否終止無關。

   進程必定屬於一個進程組,也只能屬於一個進程組。 一個進程組中可以包含多個進程。 進程組的生命週期從被創建開始,到其內所有進程終止或離開該組。

  內核中,sys_getpgrp()系統調用用來獲取當前進程所在進程組號;sys_setpgid(int pid, int pgid)調用用來設置置頂進程pid的進程組號爲pgid。

三、作業

  Shell分前後臺來控制的不是進程而是作業(Job)或者進程組(Process Group)。一個前臺作業可以由多個進程組成,一個後臺也可以由多個進程組成,Shell可以運行一個前臺作業任意多個後臺作業,這稱爲作業控制。

  作業與進程組的區別:如果作業中的某個進程又創建了子進程,則子進程不屬於作業。一旦作業運行結束,Shell就把自己提到前臺,如果原來的前臺進程還存在(如果這個子進程還沒終止),它自動變爲後臺進程組。

四、會話

  再看下會話。由於Linux是多用戶多任務的分時系統,所以必須要支持多個用戶同時使用一個操作系統。當一個用戶登錄一次系統就形成一次會話 。一個會話可包含多個進程組,但只能有一個前臺進程組。每個會話都有一個會話首領(leader),即創建會話的進程。 sys_setsid()調用能創建一個會話。必須注意的是,只有當前進程不是進程組的組長時,才能創建一個新的會話。調用setsid 之後,該進程成爲新會話的leader。

  一個會話可以有一個控制終端。這通常是登陸到其上的終端設備(在終端登陸情況下)或僞終端設備(在網絡登陸情況下)。建立與控制終端連接的會話首進程被稱爲控制進程。一個會話中的幾個進程組可被分爲一個前臺進程組以及一個或多個後臺進程組。所以一個會話中,應該包括控制進程(會話首進程),一個前臺進程組和任意後臺進程組。 

  一次登錄形成一個會話

  一個會話可包含多個進程組,但只能有一個前臺進程組

五、控制終端

  會話的領頭進程打開一個終端之後, 該終端就成爲該會話的控制終端 (SVR4/Linux)  

  與控制終端建立連接的會話領頭進程稱爲控制進程 (session leader) 

  一個會話只能有一個控制終端 

  產生在控制終端上的輸入和信號將發送給會話的前臺進程組中的所有進程 

  終端上的連接斷開時 (比如網絡斷開或 Modem 斷開), 掛起信號將發送到控制進程(session leader)

 

  進程屬於一個進程組,進程組屬於一個會話,會話可能有也可能沒有控制終端。一般而言,當用戶在某個終端上登錄時,一個新的會話就開始了。進程組由組中的領頭進程標識,領頭進程的進程標識符就是進程組的組標識符。類似地,每個會話也對應有一個領頭進程。

  同一會話中的進程通過該會話的領頭進程和一個終端相連,該終端作爲這個會話的控制終端。一個會話只能有一個控制終端,而一個控制終端只能控制一個會話。用戶通過控制終端,可以向該控制終端所控制的會話中的進程發送鍵盤信號。

 

   同一會話中只能有一個前臺進程組,屬於前臺進程組的進程可從控制終端獲得輸入,而其他進程均是後臺進程,可能分屬於不同的後臺進程組。

   當我們打開多個終端窗口時,實際上就創建了多個終端會話。每個會話都會有自己的前臺工作和後臺工作。

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