進程組與會話

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

那什麼是進程組呢?顧名思義,進程組就是一些進程的組合。這些進程並不是孤立的,他們彼此之間或者存在父子、兄弟關係,或者在功能上有相近的聯繫。

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

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

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

 

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

sys_setsid()調用能創建一個會話。必須注意的是,只有當前進程不是進程組的組長時,才能創建一個新的會話。調用setsid 之後,該進程成爲新會話的leader。

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