Classic Shell Scripting 讀書筆記 (七)
進程
程式 (program) 的一個實例 (instance),由 fork()
與 execve()
等系統調用所起始、執行、直到下達 exit()
系統調用為止
UNIX 支援多進程,由文本切換實現(context switch),進程本身不管文本切換,也沒有必要在程式裡撰寫撤回控制權給操作系統的處理
系統內核的調度器(scheduler)負責管理進程的執行,並參考進程的優先權決定順序
平均負載(load average)
在任何瞬間,等待執行的進程平均數,當平均負載持續地超出可用 CPU 的承載時,表示系統已經超載
由於會一直變化,uptime
指令分別回報最後一分鐘、五分鐘、十五分鐘的估值
建立進程
UNIX 最大的貢獻,就是能輕易建立進程
很多進程由 Shell 啟動——每個命令行的第一個單詞代表要執行哪個程序,且保證具備以下事項:
- 內核本文(kernel context),存在內核的數據結構,紀錄進程的資訊,方便管理與控制進程
- 一個私有的(private)、被保護的(protected)的虛擬位址空間,確保進程間不互相干擾。其可以是主機的可定址空間,可能受限於 Swap 、其他執行中工作的大小、系統調校參數的設置等
- 三個皆以開啟的文件描述代碼(標準輸入、標準輸出、標準錯誤輸出)
- 起始於交談模式 Shell 的進程,會有一個控制終端(controlling terminal),扮演三個標準文件數據流的默認來源與目的地
- Shell 展開命令行中的參數,省去程序的負擔且提供統一性
- 記憶體中的一個環境變量區域(environment space)會存在,透過函式庫調用取得
進程編號
編號為 0 的進程稱為 kernel、sched 或 swapper,可能不會顯示在 ps
列表中
進程的形式是樹狀的,除了 kernel 以外,每個進程都有父進程,及零至多個子進程
編號為 1 的進程稱為 init,對於父進程過早消失(die)的進程,其父進程會重新被指派給 init
系統在正常關機時,進程的刪除是編號由大到小依次執行的,直到剩下 init 為止,當 init 結束,系統終止