進程
前言:進程指的是執(zhí)行中程序的一個實例。新進程由 fork() 與 execve() 等系統(tǒng)調(diào)用所起始,然后執(zhí)行,知道他們下達 exit() 系統(tǒng)調(diào)用為止。
linux 系統(tǒng)都支持多進程。雖然計算機看起來像是一次做了很多事,但除非是他擁有多個 CPU,否則一次做了好多事只是個錯覺。事實上,每個進程僅容許在一個極短的期間執(zhí)行,我們稱為時間片段,之后進程會先暫時擱置,讓其他等待中進程執(zhí)行。時間片段極短,通常只有幾微妙,所以人們很少感覺到進程將控制權(quán)交回內(nèi)核,再交給另一個進程的這種文本切換。進程本身不會管理文本切換這件事,也沒有必要在程序里撰寫撤回控制權(quán)予 OS 的處理。
操作系統(tǒng)內(nèi)核里,稱為調(diào)度器的部分負責管理進程的執(zhí)行。當出現(xiàn)多 CPU 時,調(diào)度器會試著使用所有 CPU 處理工作負載。用戶除了覺得響應速度的改善之外,多半不會察覺有何不同。
進程會被指定優(yōu)先級,這么一來,有時間考慮的進程便能比不重要的進程先執(zhí)行。nice 與 renice 命令即用于調(diào)整進程的優(yōu)先級。
在任何瞬間,等待執(zhí)行之進程的平均數(shù),被稱為平均負載,最簡單的 uptime 命令便能顯示:
$uptime
20:30:35 up 45 min, 2 users, load average:0.05,0.11,0.05```
分析:顯示開機至今的時間,用戶數(shù),以及平均負載。
由于平均負載會一直變化,`uptime` 會回報三個平均時間估算值,分別為最后一分鐘,五分鐘,以及十分鐘的估算值。當平均負載持續(xù)的超出可用 CPU 的承載時,表示系統(tǒng)工作已超出它所能負荷的了,此時響應可能會陷入停滯不前的狀態(tài)。
**進程建立**
很多程序都有 shell 啟動:每個命令行里的第一個單詞是識別要執(zhí)行的程序。一個命令 shell 所起始每個進程,都會以下列保證事項啟動:
1. 進程具有一個內(nèi)核本文:在內(nèi)核里的數(shù)據(jù)結(jié)構(gòu),會記錄與進程相關(guān)的信息,讓內(nèi)核便于管理與控制進程的執(zhí)行。
2. 進程擁有一個私有的,被保護的虛擬地址空間,它可能就像機器可定址空間那么大. 不過,其他資源的限制,像是實例內(nèi)存與外部存儲設備上的 swap 空間所組合的大小,其他執(zhí)行中工作的大小,或是系統(tǒng)調(diào)校參數(shù)的本地端設置,都會加諸進程執(zhí)行上的限制。
3. 三個文件描述符 (標準輸入,標準輸出,標準錯誤輸出) 都已開啟,且立即可用。
4. 起始于交談模式 shell 的進程,會擁有一個控制終端機,其扮演三個標準文件數(shù)據(jù)流而定默認來源處與目的地??刂平K端機是讓用戶可將信號傳送給進程。
5. 命令行參數(shù)里的通配字符會被展開
6. 內(nèi)存的一個環(huán)境變量區(qū)域會存在,包含具有鍵與值指定的字符串,可通過程序庫調(diào)用取得。
這些保證沒有任何差別待遇; 所有執(zhí)行于相同優(yōu)先級層級的進程都一視同仁,且進程可以由任何程序?qū)懗?。私有地址空間可確保進程不受其他程序不瘦其他進城或內(nèi)核干擾。未提供這樣保障的操作系統(tǒng)很容易出錯。這三個已開啟的文件,對大部分的程序來說已經(jīng)足夠,可以使用他們而無需煩惱文件開啟與關(guān)閉的操作,也不需要知道任何文件名語法或文件系統(tǒng)。由 shell 展開的通配符字符串會免除程序的很多負擔,也提供了統(tǒng)一性的命令行處理。環(huán)境空間使出了命令與輸入文件之外,可提供信息給進程的另一種方式。