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

1、進程服務器

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

2、進程組session

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

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

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

   進程一定屬於一個進程組,也只能屬於一個進程組 一個進程組中能夠包含多個進程。 進程組的生命週期從被建立開始,到其內全部進程終止或離開該組。unix

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

3、做業生命週期

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

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

4、會話

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

  一個會話能夠有一個控制終端。這一般是登錄到其上的終端設備(在終端登錄狀況下)或僞終端設備(在網絡登錄狀況下)。創建與控制終端鏈接的會話首進程被稱爲控制進程。一個會話中的幾個進程組可被分爲一個前臺進程組以及一個或多個後臺進程組。因此一個會話中,應該包括控制進程(會話首進程),一個前臺進程組和任意後臺進程組。 

  一次登陸造成一個會話

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

5、控制終端

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

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

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

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

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

 

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

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

 

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

   當咱們打開多個終端窗口時,實際上就建立了多個終端會話。每一個會話都會有本身的前臺工做和後臺工做

相關文章
相關標籤/搜索