[筆記]Linux的process和signal
Linux的process和signal機制算是OS課本的基礎知識,書本或網路已經有很好的整理了,這邊是自己複習時候的筆記。較完整的論述,可以參考一下兩份文件:
- https://www.win.tue.nl/~aeb/linux/lk/lk-10.html (部份程式碼out of date)
- http://epaper.gotop.com.tw/PDFSample/AXP015900.pdf
Session和process group
process是OS邏輯排程執行的基本單位。為了管理process,OS會將process分組管理,session和process group (PG)就是process群組的單位。一個session可包含多個process group,一個process group可以包含多個process。session/PG有以下性質:
- 每個session/PG都會有一個leader,通常是該群集中第一個process
- 每個session/PG都會有一個id,由該群集中第一個process的PID決定
- 每個session可以配給一個terminal
- 一個session中,terminal會被attach到其中一個process group
- 被attach terminal的process group給名詞叫foreground process group
- 其他的對應為background process group
Shell如何配置session和process group
在shell中,每次登入都會由shell process開一個session。每行指令都會是一個process group。
在shell中,foreground/backend process group可以用bg/fg/jobs指令管理切換。
以下節錄一個shell執行命令的概念圖:
下圖用htop實際觀察session/process group/process階層關係:
圖中的前六個column是這邊特別要觀察的,分別是session id, tty號碼, foreground PGID, process group id, parent process id, process id。
可以看到“deamon” process還是有session的,只是這個session沒有配給TTY。
另外TTY是raw data,需要decode才能變ptty號碼 https://github.com/hishamhm/htop/issues/316
Signals
訊號/信號是Unix、類Unix以及其他POSIX相容的作業系統中行程間通訊的一種有限制的方式。它是一種異步的通知機制,用來提醒行程一個事件已經發生。當一個訊號傳送給一個行程,作業系統中斷了行程正常的控制流程,此時,任何非原子操作都將被中斷。
Linux所有訊號列表可以參考man page。
Signal是OS控制程序執行的媒介,例如用戶要終止某一執行中的應用程式,OS就要將用戶的這個意圖,利用訊號正確地傳遞到指定的應用程序。這類要求process結束的訊號稱為termination signals。glibc的文件列出了所有終止訊號,其中通常我們比較關注會的是 SIGHUP、SIGTERM和SIGINT。
應用程序可能是multiprocessing架構,要終止此應用需kill這個應用程序所有的process。在這個例子,我們需要發送一個終止訊號給此應用程序所有process所屬的process group以終止應用。在Linux實際上就是這樣運作的,當用戶按下ctrl+C,SIGINT會送給foreground process group,也就是其中每個process,包含parent和childern都會收到此訊號。
在上面的例子可以看到signal的傳播與process群集管理的息息相關。另一個例子是user logout。當用戶登出系統,shell會發送SIGHUP給此shell發起的session中的所有process,在預設狀況下這些process就會終止。
Summary
本篇整理OS的signal機制和session/process group。termination signals機制用來通知process結束,process group讓signal可以傳遞給特定一群的process。
這篇還沒講的就是process如何處理收到的signal。
As a programmer,工作是讓app合宜處理收到的signal。例如當收到termination singal時,正確釋放資源,graceful的shutdown,或是daemonlize,讓程序可以長期持續執行,不受用戶操作或登出影響。
下一篇就來講應用程序應對terminate singal的幾種處理pattern, to be continue~