進(jìn)程是運(yùn)行在 Linux 中的程序的一個(gè)實(shí)例。當(dāng)我們在 Linux 中執(zhí)行一個(gè)程序時(shí)戒悠,系統(tǒng)會(huì)為這個(gè)程序創(chuàng)建特定的環(huán)境熬荆。這個(gè)環(huán)境包含系統(tǒng)運(yùn)行這個(gè)程序所需的任何東西。
每當(dāng)我們在 Linux 中執(zhí)行一個(gè)命令绸狐,它都會(huì)創(chuàng)建或啟動(dòng)一個(gè)新的進(jìn)程卤恳。每個(gè)終端窗口可能都運(yùn)行了一個(gè) Shell,每個(gè)運(yùn)行的 Shell 都分別是一個(gè)進(jìn)程六孵。當(dāng)你從 Shell 調(diào)用一個(gè)命令時(shí),對應(yīng)的程序就會(huì)在一個(gè)新進(jìn)程中執(zhí)行幅骄,當(dāng)這個(gè)程序的進(jìn)程執(zhí)行完成后劫窒,Shell 的進(jìn)程將恢復(fù)運(yùn)行。
操作符系統(tǒng)通過被稱為 PID 或進(jìn)程 ID 的數(shù)字編碼來追蹤進(jìn)程拆座。系統(tǒng)中的每一個(gè)進(jìn)程都有一個(gè)唯一的 PID主巍。
每個(gè) Linux 進(jìn)程還有另一個(gè) ID 號(hào)碼,即父進(jìn)程的 ID(ppid)挪凑。系統(tǒng)中的每一個(gè)用戶進(jìn)程都有一個(gè)父進(jìn)程孕索。
命令 “ps -f” 可以列出進(jìn)程的 PID 和 PPID。此命令的輸出類似如下所示:
我們在 Shell 命令行提示符下運(yùn)行的命令都把當(dāng)前 Shell 的進(jìn)程作為父進(jìn)程躏碳。
在 Unix 中搞旭,每一個(gè)進(jìn)程是使用 fork 和 exec 方法創(chuàng)建的。然而菇绵,這種方法會(huì)導(dǎo)致系統(tǒng)資源的損耗肄渗。
在 Linux 中,fork 方法是使用寫時(shí)拷貝內(nèi)存頁實(shí)現(xiàn)的咬最,所以它導(dǎo)致的僅是時(shí)間和復(fù)制父進(jìn)程的內(nèi)存頁表所需的內(nèi)存的損失翎嫡,并且會(huì)為子進(jìn)程創(chuàng)建一個(gè)唯一的任務(wù)結(jié)構(gòu)。寫時(shí)拷貝模式在創(chuàng)建新進(jìn)程時(shí)避免了創(chuàng)建不必要的結(jié)構(gòu)拷貝永乌。例如惑申,用戶在 Shell 命令行提示符下輸出 ls 命令具伍,Linux 內(nèi)核將會(huì)創(chuàng)建一個(gè) Shell 的子進(jìn)程,即 Shell 的進(jìn)程是父進(jìn)程圈驼,而 ls 命令的進(jìn)程是子進(jìn)程人芽,ls 命令的進(jìn)程會(huì)指向與此 Shell 相同的內(nèi)存頁,然后子進(jìn)程使用寫時(shí)拷貝技術(shù)執(zhí)行 ls 命令碗脊。
本文參考自 《Linux Shell命令行及腳本編程實(shí)例詳解 》