進(jìn)程是運(yùn)行在linux中的程序的一個(gè)實(shí)例,是管理事務(wù)的基本單元;進(jìn)程擁有自己獨(dú)立的處理環(huán)境和系統(tǒng)資源。進(jìn)程的狀態(tài)是變化的,其包括進(jìn)程的創(chuàng)建、調(diào)度和消亡。
本教程操作環(huán)境:linux5.9.8系統(tǒng)、Dell G3電腦。
進(jìn)程是運(yùn)行在 Linux 中的程序的一個(gè)實(shí)例。
在?Linux?系統(tǒng)中,操作系統(tǒng)是通過進(jìn)程去完成一個(gè)一個(gè)的任務(wù),進(jìn)程是管理事務(wù)的基本單元。進(jìn)程擁有自己獨(dú)立的處理環(huán)境(如:當(dāng)前需要用到哪些環(huán)境變量,程序運(yùn)行的目錄在哪,當(dāng)前是哪個(gè)用戶在運(yùn)行此程序等)和系統(tǒng)資源(如:處理器 CPU 占用率、存儲(chǔ)器、I/O設(shè)備、數(shù)據(jù)、程序)。
當(dāng)你在 Linux 系統(tǒng)中執(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)程。比如,當(dāng)你嘗試運(yùn)行命令“l(fā)s -l”來列出目錄的內(nèi)容時(shí),你就啟動(dòng)了一個(gè)進(jìn)程。如果有兩個(gè)終端窗口顯示在屏幕上,那么你可能運(yùn)行了兩次同樣的終端程序,這時(shí)會(huì)有兩個(gè)終端進(jìn)程。
每個(gè)終端窗口可能都運(yùn)行了一個(gè) Shell,每個(gè)運(yùn)行的 Shell 都分別是一個(gè)進(jìn)程。當(dāng)你從 Shell 調(diào)用一個(gè)命令時(shí),對(duì)應(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。
現(xiàn)在我們通過一個(gè)實(shí)例來了解 Linux 中的進(jìn)程。我們?cè)?Shell 命令行下執(zhí)行如下命令:
$?sleep?10?& [1]?3324
因?yàn)槌绦驎?huì)等待 10 秒,所以我們快速地在當(dāng)前 Shell 上查找任何進(jìn)程名為 sleep 的進(jìn)程:
$?ps?-ef?|?grep?sleep mozhiyan??3324??5712??cons1??17:11:46??/usr/bin/sleep
我們看到進(jìn)程名為 /usr/bin/sleep 的進(jìn)程正運(yùn)行在系統(tǒng)中(其 PID 與我們?cè)谏弦幻钪械玫降?PID 相同)。
現(xiàn)在,我們嘗試并行地從 3 個(gè)不同的終端窗口運(yùn)行上述的 sleep 命令,上述命令的輸出將類似如下所示:
$?ps?-ef?|?grep?sleep mozhiyan??896???5712??cons1??17:16:51??/usr/bin/sleep mozhiyan??5924??5712??cons1??17:16:52??/usr/bin/sleep mozhiyan??2424??5712??cons1??17:16:50??/usr/bin/sleep
我們看到 sleep 程序的每一個(gè)實(shí)例都創(chuàng)建了一個(gè)單獨(dú)的進(jìn)程。
每個(gè) Linux 進(jìn)程還有另一個(gè) ID 號(hào)碼,即父進(jìn)程的 ID(ppid)。系統(tǒng)中的每一個(gè)用戶進(jìn)程都有一個(gè)父進(jìn)程。
命令“ps -f”就會(huì)列出進(jìn)程的 PID 和 PPID。此命令的輸出類似如下所示:
$?ps?-f ???UID?????PID???PPID????TTY???????STIME??????COMMAND mozhiyan??4124???228????cons0????21:37:09???/usr/bin/ps mozhiyan???228???1??????cons0????21:32:23???/usr/bin/bash
你在 Shell 命令行提示符下運(yùn)行的命令都把當(dāng)前 Shell 的進(jìn)程作為父進(jìn)程。例如,你在 Shell 命令行提示符下輸入 ls 命令,Shell 將執(zhí)行 ls 命令,此時(shí) Linux 內(nèi)核會(huì)復(fù)制 Shell 的內(nèi)存頁(yè),然后執(zhí)行 ls 命令。
在 Unix 中,每一個(gè)進(jìn)程是使用 fork 和 exec 方法創(chuàng)建的。然而,這種方法會(huì)導(dǎo)致系統(tǒng)資源的損耗。
在 Linux 中,fork 方法是使用寫時(shí)拷貝內(nèi)存頁(yè)實(shí)現(xiàn)的,所以它導(dǎo)致的僅是時(shí)間和復(fù)制父進(jìn)程的內(nèi)存頁(yè)表所需的內(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)存頁(yè),然后子進(jìn)程使用寫時(shí)拷貝技術(shù)執(zhí)行 ls 命令。
進(jìn)程的狀態(tài)
每個(gè) Linux 進(jìn)程都有它自己的生命周期,比如,創(chuàng)建、執(zhí)行、結(jié)束和清除。每個(gè)進(jìn)程也都有各自的狀態(tài),顯示進(jìn)程中當(dāng)前正發(fā)生什么。進(jìn)程的狀態(tài)是變化的,其包括進(jìn)程的創(chuàng)建、調(diào)度和消亡。
進(jìn)程可以有如下幾種狀態(tài):
-
D(不可中斷休眠狀態(tài))——進(jìn)程正在休眠并且不能恢復(fù),直到一個(gè)事件發(fā)生為止。
-
R(運(yùn)行狀態(tài))——進(jìn)程正在運(yùn)行。
-
S(休眠狀態(tài))——進(jìn)程沒有在運(yùn)行,而在等待一個(gè)事件或是信號(hào)。
-
T(停止?fàn)顟B(tài))——進(jìn)程被信號(hào)停止,比如,信號(hào) SIGINT 或 SIGSTOP。
-
Z(僵死狀態(tài))——標(biāo)記為
的進(jìn)程是僵死的進(jìn)程,它們之所以殘留是因?yàn)樗鼈兊母高M(jìn)程適當(dāng)?shù)劁N毀它們。如果父進(jìn)程退出,這些進(jìn)程將被 init 進(jìn)程銷毀。
若要查看指定進(jìn)程的狀態(tài),可以使用如下命令:
ps?-C?processName?-o?pid=,cmd,stat
例如:
$?ps?-C?sleep?-o?pid=,cmd,stat ??????CMD???????STAT 9434?sleep?20????S
相關(guān)推薦:《Linux視頻教程》