国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Linux】探索Linux進(jìn)程狀態(tài) | 僵尸進(jìn)程 | 孤兒進(jìn)程

這篇具有很好參考價(jià)值的文章主要介紹了【Linux】探索Linux進(jìn)程狀態(tài) | 僵尸進(jìn)程 | 孤兒進(jìn)程。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

最近,我發(fā)現(xiàn)了一個(gè)超級(jí)強(qiáng)大的人工智能學(xué)習(xí)網(wǎng)站。它以通俗易懂的方式呈現(xiàn)復(fù)雜的概念,而且內(nèi)容風(fēng)趣幽默。我覺(jué)得它對(duì)大家可能會(huì)有所幫助,所以我在此分享。點(diǎn)擊這里跳轉(zhuǎn)到網(wǎng)站。

【Linux】探索Linux進(jìn)程狀態(tài) | 僵尸進(jìn)程 | 孤兒進(jìn)程,Linux入門(mén)到精通,linux,redis,運(yùn)維,服務(wù)器
【Linux】探索Linux進(jìn)程狀態(tài) | 僵尸進(jìn)程 | 孤兒進(jìn)程,Linux入門(mén)到精通,linux,redis,運(yùn)維,服務(wù)器

??博客主頁(yè):小智_x0___0x_

??歡迎關(guān)注:??點(diǎn)贊??收藏??留言

??系列專欄:Linux入門(mén)到精通

??代碼倉(cāng)庫(kù):小智的代碼倉(cāng)庫(kù)


一、進(jìn)程狀態(tài)

進(jìn)程狀態(tài)在操作系統(tǒng)中可以分為五大狀態(tài),分別是:

  • 新建狀態(tài):一個(gè)進(jìn)程剛被創(chuàng)建,把PCB和對(duì)應(yīng)的代碼和數(shù)據(jù)剛申請(qǐng)出來(lái),尚未進(jìn)入就緒隊(duì)列
  • 就緒狀態(tài):進(jìn)程已經(jīng)分配到除CPU以外的所有必要資源,只要再獲得CPU,便可立即執(zhí)行,進(jìn)程這時(shí)的狀態(tài)稱為就緒狀態(tài)
  • 阻塞狀態(tài):也稱為等待或睡眠狀態(tài),一個(gè)進(jìn)程正在等待某一事件發(fā)生(例如請(qǐng)求I/O而等待I/O完成等)而暫時(shí)停止運(yùn)行,這時(shí)即使把處理機(jī)分配給進(jìn)程也無(wú)法運(yùn)行,故稱該進(jìn)程處于阻塞狀態(tài)1。處于阻塞狀態(tài)的進(jìn)程也可能有多個(gè),通常將它們排成一個(gè)隊(duì)列,稱為阻塞隊(duì)列
  • 運(yùn)行狀態(tài):進(jìn)程占有處理器正在運(yùn)行的狀態(tài)。進(jìn)程已獲得CPU,其程序正在執(zhí)行1
  • 終止?fàn)顟B(tài):指進(jìn)程完成任務(wù)到達(dá)正常結(jié)束點(diǎn),或出現(xiàn)無(wú)法克服的錯(cuò)誤而異常終止,或被操作系統(tǒng)及有終止權(quán)的進(jìn)程所終止時(shí)所處的狀態(tài)

1.1運(yùn)行狀態(tài)

當(dāng)多個(gè)進(jìn)程需要運(yùn)行時(shí),它們會(huì)競(jìng)爭(zhēng)CPU資源。在極端情況下,如果只有一個(gè)CPU,那么眾多進(jìn)程就必須通過(guò)調(diào)度器來(lái)合理使用CPU資源,確保資源的均衡使用。為了管理這些進(jìn)程,每個(gè)CPU都會(huì)維護(hù)一個(gè)自己的運(yùn)行隊(duì)列struct runqueue。這個(gè)運(yùn)行隊(duì)列是一個(gè)重要的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)當(dāng)前CPU上待運(yùn)行的進(jìn)程。

每個(gè)進(jìn)程都有一個(gè)對(duì)應(yīng)的task_struct結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體包含了進(jìn)程的各種屬性。而運(yùn)行隊(duì)列中最重要的屬性是head和tail指針,它們分別指向隊(duì)列的頭部和尾部。這意味著排隊(duì)的不是進(jìn)程的代碼,而是進(jìn)程的PCB在排隊(duì)。

當(dāng)CPU需要運(yùn)行某個(gè)進(jìn)程時(shí),它會(huì)從運(yùn)行隊(duì)列中挑選一個(gè)進(jìn)程來(lái)執(zhí)行。挑選的過(guò)程是由調(diào)度器完成的,它會(huì)根據(jù)一定的算法從隊(duì)列中選擇一個(gè)合適的進(jìn)程。一旦選定了進(jìn)程,調(diào)度器就會(huì)將該進(jìn)程從隊(duì)列中移除,并將其放到CPU上運(yùn)行。
【Linux】探索Linux進(jìn)程狀態(tài) | 僵尸進(jìn)程 | 孤兒進(jìn)程,Linux入門(mén)到精通,linux,redis,運(yùn)維,服務(wù)器
當(dāng)多個(gè)進(jìn)程處于運(yùn)行隊(duì)列中時(shí),它們所處的狀態(tài)被稱為運(yùn)行狀態(tài)(r狀態(tài))。這意味著這些進(jìn)程已經(jīng)準(zhǔn)備好,可以隨時(shí)被調(diào)度執(zhí)行。當(dāng)一個(gè)進(jìn)程開(kāi)始運(yùn)行時(shí),它將自己置于CPU上并執(zhí)行。然而,一個(gè)進(jìn)程并不需要一直執(zhí)行到完成才讓出CPU。例如,如果有一個(gè)進(jìn)程陷入了一個(gè)無(wú)限循環(huán)中,它可能會(huì)一直占用CPU,導(dǎo)致其他進(jìn)程無(wú)法得到調(diào)度和執(zhí)行。

為了防止這種情況的發(fā)生,操作系統(tǒng)引入了時(shí)間片的概念。每個(gè)進(jìn)程都被分配了一個(gè)時(shí)間片,它定義了該進(jìn)程在CPU上的最大執(zhí)行時(shí)間。一旦一個(gè)進(jìn)程的執(zhí)行時(shí)間超過(guò)了它的時(shí)間片,操作系統(tǒng)會(huì)強(qiáng)制將其從CPU上移除,并將其放回運(yùn)行隊(duì)列的尾部等待再次調(diào)度。

時(shí)間片的引入確保了每個(gè)進(jìn)程都有機(jī)會(huì)在一段時(shí)間內(nèi)得到執(zhí)行,從而實(shí)現(xiàn)了多個(gè)進(jìn)程的并發(fā)執(zhí)行。并發(fā)執(zhí)行是指在同一時(shí)間段內(nèi),多個(gè)進(jìn)程的代碼都會(huì)被執(zhí)行。通過(guò)合理分配時(shí)間片,操作系統(tǒng)可以確保所有進(jìn)程都得到公平調(diào)度和執(zhí)行,從而提高了系統(tǒng)的整體效率和響應(yīng)速度。

1.2阻塞狀態(tài)

我們每個(gè)外設(shè)都有一個(gè)等待隊(duì)列,每個(gè)使用設(shè)備的進(jìn)程,如果想要使用某個(gè)設(shè)備,就需要等待該設(shè)備變?yōu)榫途w狀態(tài)。如果設(shè)備當(dāng)前不可用,即處于不可讀狀態(tài),那么進(jìn)程會(huì)自動(dòng)將其PCB(進(jìn)程控制塊)加入到該設(shè)備的等待隊(duì)列中。一旦設(shè)備變?yōu)榭捎脿顟B(tài),即處于可讀狀態(tài),進(jìn)程就可以從等待隊(duì)列中取出PCB,進(jìn)入就緒狀態(tài),等待CPU調(diào)度。如果設(shè)備仍然沒(méi)有準(zhǔn)備好,進(jìn)程就會(huì)在等待隊(duì)列中等待,這時(shí)我們稱進(jìn)程處于阻塞狀態(tài)。因此,當(dāng)我們說(shuō)讓進(jìn)程去某個(gè)資源中等待時(shí),實(shí)際上是將進(jìn)程加入到該資源的等待隊(duì)列中,也就是讓進(jìn)程進(jìn)入阻塞狀態(tài)。
【Linux】探索Linux進(jìn)程狀態(tài) | 僵尸進(jìn)程 | 孤兒進(jìn)程,Linux入門(mén)到精通,linux,redis,運(yùn)維,服務(wù)器
系統(tǒng)中可能有很多阻塞的進(jìn)程,每個(gè)都在等待資源或設(shè)備。進(jìn)程間也可能互相等待。如果只有一個(gè)CPU,那同一時(shí)間只能運(yùn)行一個(gè)進(jìn)程,其他的都得等著。

1.3掛起狀態(tài)

如果有很多進(jìn)程都在等一個(gè)設(shè)備,比如磁盤(pán),但磁盤(pán)一直沒(méi)準(zhǔn)備好,這些進(jìn)程就只能在內(nèi)存里等著,也不占用CPU。但有時(shí)候,操作系統(tǒng)的內(nèi)存可能會(huì)不夠用,因?yàn)槊總€(gè)進(jìn)程都需要占用一些內(nèi)存。如果一個(gè)進(jìn)程只是等著,沒(méi)有被CPU調(diào)度,那它的代碼和數(shù)據(jù)其實(shí)在內(nèi)存里是空閑的。為了解決這個(gè)問(wèn)題,操作系統(tǒng)可以把等待進(jìn)程的代碼和數(shù)據(jù)移到磁盤(pán)里去,只留下一個(gè)PCB在內(nèi)存里排隊(duì)。這樣,當(dāng)設(shè)備準(zhǔn)備好了,再把代碼和數(shù)據(jù)從磁盤(pán)移回內(nèi)存。這個(gè)過(guò)程叫做換出和換入。當(dāng)代碼和數(shù)據(jù)不在內(nèi)存里時(shí),我們稱這個(gè)進(jìn)程為掛起狀態(tài)。這樣操作系統(tǒng)就可以空出一些內(nèi)存給其他進(jìn)程用。這個(gè)掛起狀態(tài)適用于所有等待的進(jìn)程。
【Linux】探索Linux進(jìn)程狀態(tài) | 僵尸進(jìn)程 | 孤兒進(jìn)程,Linux入門(mén)到精通,linux,redis,運(yùn)維,服務(wù)器
掛起狀態(tài)對(duì)用戶是不可見(jiàn)的,這是操作系統(tǒng)的一種行為。

上面介紹的這些屬于操作系統(tǒng)學(xué)科的理論知識(shí),不同的操作系統(tǒng)可能會(huì)有不同的實(shí)現(xiàn)方案,下面我們來(lái)深入研究研究具體的 Linux 操作系統(tǒng)中有哪些進(jìn)程狀態(tài)。

二、具體Linux中的進(jìn)程狀態(tài)

2.1看看Linux內(nèi)核源代碼怎么說(shuō)

  • 為了弄明白正在運(yùn)行的進(jìn)程是什么意思,我們需要知道進(jìn)程的不同狀態(tài)。一個(gè)進(jìn)程可以有幾個(gè)狀態(tài)(在Linux內(nèi)核里,進(jìn)程有時(shí)候也叫做任務(wù))。

下面的狀態(tài)在kernel源代碼里定義:

/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
	"R (running)", /* 0 */
	"S (sleeping)", /* 1 */
	"D (disk sleep)", /* 2 */
	"T (stopped)", /* 4 */
	"t (tracing stop)", /* 8 */
	"X (dead)", /* 16 */
	"Z (zombie)", /* 32 */
};
  • R運(yùn)行狀態(tài)(running): 并不意味著進(jìn)程一定在運(yùn)行中,它表明進(jìn)程要么是在運(yùn)行中要么在運(yùn)行隊(duì)列里。
  • S睡眠狀態(tài)(sleeping): 意味著進(jìn)程在等待事件完成(這里的睡眠有時(shí)候也叫做可中斷睡眠(interruptible sleep))。
  • D磁盤(pán)休眠狀態(tài)(Disk sleep)有時(shí)候也叫不可中斷睡眠狀態(tài)(uninterruptible sleep),在這個(gè)狀態(tài)的進(jìn)程通常會(huì)等待IO的結(jié)束。
  • T停止?fàn)顟B(tài)(stopped): 可以通過(guò)發(fā)送 SIGSTOP 信號(hào)給進(jìn)程來(lái)停止(T)進(jìn)程。這個(gè)被暫停的進(jìn)程可以通過(guò)發(fā)送 SIGCONT 信號(hào)讓進(jìn)程繼續(xù)運(yùn)行。
  • X死亡狀態(tài)(dead):這個(gè)狀態(tài)只是一個(gè)返回狀態(tài),你不會(huì)在任務(wù)列表里看到這個(gè)狀態(tài)。

2.2進(jìn)程狀態(tài)查看

我們先來(lái)寫(xiě)一段代碼觀察效果:

int main()
{
    while(1)
    {
        printf("hello linux\n");
    }
    return 0;
}

【Linux】探索Linux進(jìn)程狀態(tài) | 僵尸進(jìn)程 | 孤兒進(jìn)程,Linux入門(mén)到精通,linux,redis,運(yùn)維,服務(wù)器
可以看到這里并不是R狀態(tài),而是S狀態(tài),這是因?yàn)楫?dāng)程序瘋狂地進(jìn)行打印操作時(shí),你的設(shè)備可能并不處于可以直接寫(xiě)入的狀態(tài)。因此,你的進(jìn)程有很大可能性一直處于等待狀態(tài)。你可能認(rèn)為你的進(jìn)程正在直接向設(shè)備寫(xiě)入數(shù)據(jù),但事實(shí)上,操作系統(tǒng)內(nèi)部,你的進(jìn)程可能大部分時(shí)間都在等待I/O設(shè)備(如顯示器)就緒。因此,你的進(jìn)程狀態(tài)一直顯示為S狀態(tài),這個(gè)S狀態(tài)實(shí)際上對(duì)應(yīng)著我們操作系統(tǒng)原理中的阻塞狀態(tài)。

我們?cè)賮?lái)把代碼修改一下去掉printf:

int main()
{
    while(1);
    return 0;

}

【Linux】探索Linux進(jìn)程狀態(tài) | 僵尸進(jìn)程 | 孤兒進(jìn)程,Linux入門(mén)到精通,linux,redis,運(yùn)維,服務(wù)器
當(dāng)去掉printf語(yǔ)句后,程序就不再涉及I/O操作,而是純粹地運(yùn)行計(jì)算任務(wù)。在這種情況下,進(jìn)程的狀態(tài)會(huì)變成R狀態(tài),也就是運(yùn)行狀態(tài)。這是因?yàn)闆](méi)有I/O等待,進(jìn)程可以一直占用CPU進(jìn)行計(jì)算,直到任務(wù)完成。所以,當(dāng)沒(méi)有I/O操作時(shí),進(jìn)程就處于運(yùn)行狀態(tài),也就是R狀態(tài)。

查詢結(jié)果中顯示的+表示該進(jìn)程在前臺(tái)運(yùn)行,這意味我們此時(shí)在 bash 命令行輸指令是不會(huì)有任何反應(yīng)的,可以在輸入指令的后面加上&,此時(shí)表示讓該進(jìn)程在后臺(tái)運(yùn)行,要終止掉該進(jìn)程只能通過(guò)指令kill -9 PID給進(jìn)程發(fā)送終止信號(hào)。

D磁盤(pán)休眠狀態(tài)(Disk sleep)

如果一個(gè)進(jìn)程處于D狀態(tài),我們也稱之為disk sleep,在Linux系統(tǒng)中它也是一種阻塞狀態(tài),只不過(guò)這種狀態(tài)在操作系統(tǒng)層面被稱為深度睡眠。相對(duì)應(yīng)的,我們之前提到的S狀態(tài)可以被稱為淺度睡眠。就像人們睡覺(jué)時(shí)有深淺之分,淺度睡眠可以被直接喚醒,比如被程序員或其他進(jìn)程喚醒。

我們?cè)賮?lái)通過(guò)一個(gè)有趣的故事來(lái)了解D狀態(tài):

有一個(gè)進(jìn)程要完成I/O操作,此時(shí)進(jìn)程呢他那朝著遠(yuǎn)端的磁盤(pán)大喊了一聲磁盤(pán)啊,我這有1GB的數(shù)據(jù)我把數(shù)據(jù)存到你存到磁盤(pán)的某個(gè)位置上,你幫我做一下吧然后呢,當(dāng)磁盤(pán)聽(tīng)到這句話,磁盤(pán)慢慢悠悠的探出來(lái)個(gè)腦袋,就給進(jìn)程說(shuō)好的,那你把數(shù)據(jù)給我吧,我去幫你寫(xiě),于是磁盤(pán)就抱著進(jìn)程的數(shù)據(jù)去做寫(xiě)入了,磁盤(pán)進(jìn)行寫(xiě)入時(shí),這個(gè)進(jìn)程它翹著二郎腿,悠哉悠哉的在這里等待,此時(shí)操作系統(tǒng)它從旁邊路過(guò),操作系統(tǒng)現(xiàn)在壓力很大,不知道什么原因,反正整個(gè)計(jì)算機(jī)里,進(jìn)程變得非常多了,而且每一個(gè)地方都特別吃資源,內(nèi)存資源嚴(yán)重不足,當(dāng)前操作系統(tǒng)火急火燎的在想辦法,當(dāng)他從這個(gè)進(jìn)程旁邊路過(guò)的時(shí)候,他瞥了一眼這個(gè)進(jìn)程,覺(jué)得他很不爽,他把他能做的全做了,包括進(jìn)程所對(duì)應(yīng)的代碼和數(shù)據(jù)能置換全置換了,所以操作系統(tǒng)一氣之下啊,就對(duì)著這個(gè)進(jìn)程說(shuō),你這個(gè)進(jìn)程這么沒(méi)眼色,你沒(méi)看到當(dāng)前內(nèi)存已經(jīng)被撐得快爆了嗎?我已經(jīng)馬上快掛掉了,你還在這里翹著二郎腿,你還在等著呢,不要等了,所以操作系統(tǒng)直接把這個(gè)進(jìn)程干掉了,如果系統(tǒng)壓力已經(jīng)在內(nèi)存輾轉(zhuǎn)騰挪已經(jīng)解決不了時(shí)操作系統(tǒng)就要開(kāi)始動(dòng)手殺進(jìn)程了,所以操作系統(tǒng)是會(huì)殺掉處于某一些他自己判定不太重要的進(jìn)程 刪掉了之后,此時(shí)這個(gè)剛剛在寫(xiě)入數(shù)據(jù)的磁盤(pán)也遇到了問(wèn)題,當(dāng)前他在寫(xiě)入時(shí)發(fā)現(xiàn)寫(xiě)到一半時(shí)突然發(fā)現(xiàn)磁盤(pán)空間不夠了,這個(gè)磁盤(pán)就轉(zhuǎn)過(guò)頭,探出腦袋就對(duì)這個(gè)進(jìn)程說(shuō)進(jìn)程啊,不好意思,我寫(xiě)入失敗了,唉,進(jìn)程呢,進(jìn)程怎么不見(jiàn)了?那我數(shù)據(jù)沒(méi)有寫(xiě)成功該怎么辦呢我到底是再嘗試一次呢還是我再等一等,我該怎么做決策呢,(有的硬件直接丟掉的有的給你再試著寫(xiě)一下,大部分都是掉直接丟掉),此時(shí)數(shù)據(jù)就被丟失了,丟失的數(shù)據(jù)非常重要。于是呢,法官就把操作系統(tǒng),進(jìn)程和磁盤(pán)一并帶上了法庭,法官先審問(wèn)操作系統(tǒng)說(shuō)你怎么能殺掉進(jìn)程呢?操作系統(tǒng)卻說(shuō):“請(qǐng)問(wèn)用戶有沒(méi)有賦予我管理他軟件資源的權(quán)利?請(qǐng)問(wèn)我殺掉進(jìn)程是不是在特別極端的情況下殺掉了?請(qǐng)問(wèn)我有沒(méi)有履行我操作系統(tǒng)的職責(zé)?我的職責(zé)是保證系統(tǒng)不掛數(shù)據(jù)丟失和我有什么關(guān)系,我就是在做我操作系統(tǒng)該做的事情,如果你判我有罪了,那么請(qǐng)問(wèn)下次如果再碰到這樣的極端情況,那到底我還做不做,我如果不殺最后導(dǎo)致操作系統(tǒng)掛掉,第一,它的數(shù)據(jù)該丟還是會(huì)丟,第二,可能還會(huì)影響其他進(jìn)程,那么這個(gè)責(zé)任誰(shuí)來(lái)承擔(dān)。”法官說(shuō):“唉,這話說(shuō)的還挺有道理啊,是的,他只是履行了他的義務(wù),而且他確實(shí)是在極端情況下做的這個(gè)事情”于是法官又把目光轉(zhuǎn)移到了磁盤(pán)身上,對(duì)磁盤(pán)說(shuō):“你怎么能把人家數(shù)據(jù)丟掉呢?”此時(shí)磁盤(pán)就說(shuō):“法官大人不要怪我,在這件事情上我就是個(gè)跑腿的人家讓我干啥就干啥我在寫(xiě)入的時(shí)候就已經(jīng)告訴了對(duì)方,我可能會(huì)失敗,我讓他去等的我要給他結(jié)果的,我的工作模式從來(lái)向來(lái)都是這樣,從我出生的時(shí)候就是這樣,其他磁盤(pán)也是這樣,如果你認(rèn)為我有罪的話,那是不是我的兄弟磁盤(pán),我的朋友磁盤(pán)也有問(wèn)題,那是不是我們把儲(chǔ)存的邏輯全部都改下,我就是個(gè)跑腿的,我怎么能決定這個(gè)數(shù)據(jù)寫(xiě)入失敗該怎么辦,數(shù)據(jù)被丟失是因?yàn)槲疫€有其他事情要做,因?yàn)橛衅渌M(jìn)程也要讓我寫(xiě)入”,法官聽(tīng)了之后覺(jué)得也有道理,那么就把視角轉(zhuǎn)向了受害人進(jìn)程的身上,反正操作系統(tǒng)沒(méi)錯(cuò),磁盤(pán)也沒(méi)錯(cuò),那就是你的問(wèn)題了,在法官剛看向進(jìn)程的時(shí)候,進(jìn)程撲通一下就跪下來(lái)了對(duì)法官說(shuō):“法官我可是受害人啊,我是被殺掉的,我就是靜靜的坐在那里,人在家中坐,鍋從天上來(lái),我是被殺掉的,我怎么能有錯(cuò)呢啊”。法官此時(shí)一想,唉,他們?nèi)齻€(gè)好像說(shuō)的都挺有道理,難道是我錯(cuò)了嗎? 凡是有爭(zhēng)議的地方,那么一定是因?yàn)橹贫仍O(shè)計(jì)不合理 法官最后說(shuō)算了算了,你們?nèi)齻€(gè)都回去吧,我完了去改改操作系統(tǒng),法官就把進(jìn)程的狀態(tài)加了一個(gè)狀態(tài),那么這個(gè)狀態(tài)就是只要這個(gè)進(jìn)程當(dāng)前正在有寫(xiě)入任務(wù)交給了磁盤(pán),如果磁盤(pán)沒(méi)有辦法立馬響應(yīng)的話,需要進(jìn)程等待這個(gè)進(jìn)程絕對(duì)不能以淺度睡眠的方式運(yùn)行即S狀態(tài),必須把自己設(shè)為D狀態(tài),從我們的源代碼方式規(guī)定,D狀態(tài)進(jìn)程任何人都不能殺掉,包括操作系統(tǒng) 所以故事又來(lái)了,這個(gè)進(jìn)程呢,又喊出來(lái)磁盤(pán)啊,磁盤(pán)說(shuō)怎么又是你,進(jìn)程說(shuō)沒(méi)關(guān)系,這次寫(xiě)吧,這次我不怪你了,所以呢,磁盤(pán)抱著數(shù)據(jù)就去進(jìn)行寫(xiě)入了,那么當(dāng)前這個(gè)進(jìn)程翹著二郎腿在這里啊,嗑著瓜子,在這里等,一個(gè)操作系統(tǒng)路過(guò)了操作系統(tǒng)說(shuō)你這個(gè)進(jìn)程話還沒(méi)說(shuō)完,進(jìn)程就亮出了一個(gè)免死金牌,一邊看去,不要影響我,我還忙著呢,你現(xiàn)在是沒(méi)資格殺我啊,所以操作系統(tǒng)一看行啊,有這回事就行反正我盡力了,人家不讓殺他就不讓殺我去那么去殺別的進(jìn)程,反正對(duì)我來(lái)我做了我的工作,你沒(méi)有被殺死那后果自己承擔(dān),所以當(dāng)前進(jìn)程的此時(shí)就處了一個(gè)狀態(tài)叫D狀態(tài),當(dāng)它進(jìn)行等待時(shí)進(jìn)程不可被殺死,這樣的話就不會(huì)存在剛剛我們的這種問(wèn)題了所以當(dāng)磁盤(pán)把數(shù)據(jù)寫(xiě)完之后,返回來(lái)時(shí)告訴進(jìn)程進(jìn)程啊,你的數(shù)據(jù)寫(xiě)完了這個(gè)時(shí)候得到了結(jié)果之后,進(jìn)程再把自己的狀態(tài)由D狀態(tài)恢復(fù)成R狀態(tài)。

我們最后再來(lái)總結(jié)一下這個(gè)小故事:
在這個(gè)故事中,一個(gè)進(jìn)程請(qǐng)求磁盤(pán)保存1GB數(shù)據(jù)。磁盤(pán)接受了任務(wù),進(jìn)程則等待。由于系統(tǒng)內(nèi)存緊張,操作系統(tǒng)決定殺掉該進(jìn)程以釋放資源。磁盤(pán)在寫(xiě)入過(guò)程中發(fā)現(xiàn)空間不足,但進(jìn)程已被殺死,數(shù)據(jù)丟失。法官審問(wèn)后,決定給進(jìn)程增加D狀態(tài),保證正在進(jìn)行I/O操作的進(jìn)程不會(huì)被殺死。這樣,即使操作系統(tǒng)再次路過(guò),也無(wú)法殺掉處于D狀態(tài)的進(jìn)程,避免了數(shù)據(jù)丟失。

D狀態(tài)也是阻塞狀態(tài)的一種

T停止?fàn)顟B(tài)(stopped)

T狀態(tài)稱之為暫停狀態(tài)也叫做stop狀態(tài),我們來(lái)舉一個(gè)例子:

int main()
{
    while(1)
    {
        printf("hello linux\n");
        sleep(1);
    }
    return 0;

}

【Linux】探索Linux進(jìn)程狀態(tài) | 僵尸進(jìn)程 | 孤兒進(jìn)程,Linux入門(mén)到精通,linux,redis,運(yùn)維,服務(wù)器
此時(shí)我們的進(jìn)程還是S狀態(tài).
【Linux】探索Linux進(jìn)程狀態(tài) | 僵尸進(jìn)程 | 孤兒進(jìn)程,Linux入門(mén)到精通,linux,redis,運(yùn)維,服務(wù)器
接下來(lái)我們給進(jìn)程發(fā)送信號(hào)來(lái)暫停進(jìn)程kill -19 759:
【Linux】探索Linux進(jìn)程狀態(tài) | 僵尸進(jìn)程 | 孤兒進(jìn)程,Linux入門(mén)到精通,linux,redis,運(yùn)維,服務(wù)器
可以看到我們的進(jìn)程被stop了,我們?cè)賮?lái)查一下進(jìn)程狀態(tài)
【Linux】探索Linux進(jìn)程狀態(tài) | 僵尸進(jìn)程 | 孤兒進(jìn)程,Linux入門(mén)到精通,linux,redis,運(yùn)維,服務(wù)器
此時(shí)進(jìn)程就變成了T狀態(tài),我們想讓進(jìn)程再次跑起來(lái),可以給進(jìn)程發(fā)送18號(hào)信號(hào)kill -18 759:
【Linux】探索Linux進(jìn)程狀態(tài) | 僵尸進(jìn)程 | 孤兒進(jìn)程,Linux入門(mén)到精通,linux,redis,運(yùn)維,服務(wù)器
可以看到程序又正常跑了起來(lái),再來(lái)查看進(jìn)程狀態(tài):
【Linux】探索Linux進(jìn)程狀態(tài) | 僵尸進(jìn)程 | 孤兒進(jìn)程,Linux入門(mén)到精通,linux,redis,運(yùn)維,服務(wù)器
這里又變成了S狀態(tài),但是卻少了+這是因?yàn)槲覀儗⑦M(jìn)程暫停啟動(dòng)之后進(jìn)程就會(huì)變成后臺(tái)進(jìn)程。此時(shí)我們想要?dú)⒌暨@個(gè)進(jìn)程就只能使用kill -9來(lái)殺死進(jìn)程。

當(dāng)一個(gè)進(jìn)程處于T狀態(tài)一般是不會(huì)接受信號(hào),除了特殊信號(hào),我們使用gdb調(diào)試工具調(diào)試的時(shí)候,設(shè)置斷點(diǎn),程序遇到斷點(diǎn)停止時(shí)候就會(huì)處于t狀態(tài)。
【Linux】探索Linux進(jìn)程狀態(tài) | 僵尸進(jìn)程 | 孤兒進(jìn)程,Linux入門(mén)到精通,linux,redis,運(yùn)維,服務(wù)器
Tt的區(qū)別:
在進(jìn)程狀態(tài)中,“T”代表停止?fàn)顟B(tài)或常規(guī)暫停,而“t”代表追蹤停止。二者的主要區(qū)別在于,“T”狀態(tài)通??梢酝ㄟ^(guò)發(fā)送SIGSTOP信號(hào)給進(jìn)程來(lái)使其停止,而這個(gè)被暫停的進(jìn)程可以通過(guò)發(fā)送SIGCONT信號(hào)來(lái)繼續(xù)運(yùn)行?!皌”狀態(tài)主要發(fā)生在進(jìn)程被調(diào)試過(guò)程中遇到斷點(diǎn)時(shí),此時(shí)進(jìn)程會(huì)進(jìn)入追蹤停止?fàn)顟B(tài)。

三、僵尸進(jìn)程

如果今天我們有父和子兩個(gè)進(jìn)程,父進(jìn)程一直在運(yùn)行,并且父進(jìn)程不關(guān)心對(duì)應(yīng)的子進(jìn)程,而子進(jìn)程直接退出之時(shí),他并不是退出之后立馬要將自己的所有資源全部釋放,因?yàn)楦高M(jìn)程沒(méi)有還沒(méi)有來(lái)關(guān)心他,那么此時(shí)操作系統(tǒng)就必須把子進(jìn)程的狀態(tài)一直給我維持著,直到我的父進(jìn)程開(kāi)始關(guān)心他,那么其中我們把這種已經(jīng)死掉的,但是當(dāng)前需要由父進(jìn)程來(lái)關(guān)心,此時(shí)這個(gè)進(jìn)程所維持的這種狀態(tài),我們稱之為Z狀態(tài)。

下面我們?cè)賮?lái)寫(xiě)一段代碼驗(yàn)證一下:
【Linux】探索Linux進(jìn)程狀態(tài) | 僵尸進(jìn)程 | 孤兒進(jìn)程,Linux入門(mén)到精通,linux,redis,運(yùn)維,服務(wù)器
子進(jìn)程執(zhí)行完5次打印后就處于 Z 狀態(tài),等待父進(jìn)程來(lái)回收它的資源。處于 Z 狀態(tài)的進(jìn)程的相關(guān)資源尤其是 task_struct 結(jié)構(gòu)體不能被釋放。只有當(dāng)父進(jìn)程把子進(jìn)程的相關(guān)資源回收后,子進(jìn)程才能變成 X死亡狀態(tài)。我們將這種處于 Z 狀態(tài)的進(jìn)程就叫做僵尸進(jìn)程,如果父進(jìn)程一直不來(lái)回收,那這種進(jìn)程會(huì)長(zhǎng)時(shí)間占用內(nèi)存資源,造成內(nèi)存泄漏。后面我們會(huì)介紹解決這種問(wèn)題的方法(waitpid())感興趣的老鐵可以期待后續(xù)更新!

3.1僵尸進(jìn)程危害

  • 進(jìn)程的退出狀態(tài)必須被維持下去,因?yàn)樗嬖V關(guān)心它的進(jìn)程(父進(jìn)程),你交給我的任務(wù),我辦的怎么樣了??筛高M(jìn)程如果一直不讀取,那子進(jìn)程就一直處于Z狀態(tài)。
  • 維護(hù)退出狀態(tài)本身就是要用數(shù)據(jù)維護(hù),也屬于進(jìn)程基本信息,所以保存在task_struct(PCB)中,換句話說(shuō),Z狀態(tài)一直不退出,PCB一直都要維護(hù)。
  • 那一個(gè)父進(jìn)程創(chuàng)建了很多子進(jìn)程,就是不回收,就會(huì)造成內(nèi)存資源的浪費(fèi)!因?yàn)閿?shù)據(jù)結(jié)構(gòu)對(duì)象本身就要占用內(nèi)存,想想C中定義一個(gè)結(jié)構(gòu)體變量(對(duì)象),是要在內(nèi)存的某個(gè)位置進(jìn)行開(kāi)辟空間!
  • 內(nèi)存泄漏

四、孤兒進(jìn)程

上面的例子中我們是讓子進(jìn)程先退出,父進(jìn)程一直運(yùn)行,接下來(lái)我們讓父進(jìn)程先退出,子進(jìn)程一直運(yùn)行,我們?cè)賮?lái)看看會(huì)有什么結(jié)果。

#include <iostream>
#include <unistd.h>
#include <cstdlib>
using namespace std;
int main()
{
    pid_t id=fork();

    if(id==0)
    {
        int cnt =500;
        while(cnt)
        {
            printf("i an child,pid:%d,ppid:%d,cnt:%d\n",getpid(),getppid(),cnt);
            cnt--;
            sleep(1);
        }
        printf("child quit!\n");
        exit(0);
    }
    else
    {
        int cnt=5;
        while(cnt)
        {
            printf("i am parent,pid:%d,ppid:%d,cnt:%d\n",getpid(),getppid(),cnt);
            sleep(1);
            cnt--;
        }
        printf("parent quit!\n");
    }
    return 0;

}

【Linux】探索Linux進(jìn)程狀態(tài) | 僵尸進(jìn)程 | 孤兒進(jìn)程,Linux入門(mén)到精通,linux,redis,運(yùn)維,服務(wù)器
我們可以看到父進(jìn)程在執(zhí)行結(jié)束后就只剩下子進(jìn)程,為什么父進(jìn)程不會(huì)處在 Z僵尸狀態(tài)呢?答案是父進(jìn)程也是 bash 的子進(jìn)程,父進(jìn)程在執(zhí)行結(jié)束后,它的父進(jìn)程 bash 會(huì)將其回收掉,并且過(guò)程非??欤晕覀兾覀儧](méi)有看到父進(jìn)程處在 Z僵尸狀態(tài)。其次我們發(fā)現(xiàn),當(dāng)父進(jìn)程結(jié)束后,它的子進(jìn)程的父進(jìn)程會(huì)變成1號(hào)進(jìn)程,即操作系統(tǒng)。我們將父進(jìn)程是1號(hào)進(jìn)程的進(jìn)程叫做孤兒進(jìn)程,該進(jìn)程被系統(tǒng)領(lǐng)養(yǎng)。因?yàn)楣聝哼M(jìn)程未來(lái)也會(huì)退出,也要被釋放。

??小結(jié)??

今天我們學(xué)習(xí)了"【Linux】探索Linux進(jìn)程狀態(tài) | 僵尸進(jìn)程 | 孤兒進(jìn)程"相信大家看完有一定的收獲。種一棵樹(shù)的最好時(shí)間是十年前,其次是現(xiàn)在! 把握好當(dāng)下,合理利用時(shí)間努力奮斗,相信大家一定會(huì)實(shí)現(xiàn)自己的目標(biāo)!加油!創(chuàng)作不易,辛苦各位小伙伴們動(dòng)動(dòng)小手,三連一波????~~~,本文中也有不足之處,歡迎各位隨時(shí)私信點(diǎn)評(píng)指正!
【Linux】探索Linux進(jìn)程狀態(tài) | 僵尸進(jìn)程 | 孤兒進(jìn)程,Linux入門(mén)到精通,linux,redis,運(yùn)維,服務(wù)器文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-751809.html

到了這里,關(guān)于【Linux】探索Linux進(jìn)程狀態(tài) | 僵尸進(jìn)程 | 孤兒進(jìn)程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包