97色伦色在线综合视频,无玛专区,18videosex性欧美黑色,日韩黄色电影免费在线观看,国产精品伦理一区二区三区,在线视频欧美日韩,亚洲欧美在线中文字幕不卡

網(wǎng)站后臺管理員密碼建筑模擬3中文版下載

鶴壁市浩天電氣有限公司 2026/01/22 08:22:20
網(wǎng)站后臺管理員密碼,建筑模擬3中文版下載,wordpress.conf,wordpress相似的nodejs上一篇#xff0c;我們從內(nèi)核視角揭開了進(jìn)程的神秘面紗#xff0c;知道了它的本質(zhì)是 PCB 代碼與數(shù)據(jù)。今天#xff0c;我們將深入探討進(jìn)程的生命周期#xff1a;一個進(jìn)程是如何從誕生走向消亡的#xff1f;它會經(jīng)歷哪些狀態(tài)#xff1f;fork() 如何像細(xì)胞分裂一樣創(chuàng)造新生…上一篇我們從內(nèi)核視角揭開了進(jìn)程的神秘面紗知道了它的本質(zhì)是PCB 代碼與數(shù)據(jù)。今天我們將深入探討進(jìn)程的生命周期一個進(jìn)程是如何從誕生走向消亡的它會經(jīng)歷哪些狀態(tài)fork()如何像細(xì)胞分裂一樣創(chuàng)造新生命以及為何有些進(jìn)程會變成令人頭疼的 “僵尸” 或無奈的 “孤兒”這篇文章將帶你用場景化的方式、可復(fù)現(xiàn)的示例和更底層的視角一次性理清這些 Linux 進(jìn)程管理中的核心概念。文章目錄一、進(jìn)程的 7 種核心狀態(tài)從誕生到消亡的旅程1.1 內(nèi)核如何定義狀態(tài)1.2 常見狀態(tài)詳解與復(fù)現(xiàn)**R (Running) - 運(yùn)行態(tài)/就緒態(tài)****S (Sleeping) - 可中斷睡眠****D (Disk Sleep) - 不可中斷睡眠****T (Stopped) - 停止態(tài)****Z (Zombie) - 僵尸態(tài)****其他狀態(tài)**1.3 狀態(tài)總結(jié)二、進(jìn)程創(chuàng)建fork() 的魔法2.1 fork() 的基本用法2.2 為什么 fork() 有兩個返回值2.3 父子進(jìn)程的資源關(guān)系共享與獨(dú)立三、特殊進(jìn)程僵尸與孤兒3.1 僵尸進(jìn)程Zombie- 誰來為我收尸3.2 孤兒進(jìn)程Orphan- 我被過繼給了init四、總結(jié)一、進(jìn)程的 7 種核心狀態(tài)從誕生到消亡的旅程教科書常將進(jìn)程狀態(tài)簡化為 “運(yùn)行、就緒、阻塞”但這在 Linux 內(nèi)核中過于籠統(tǒng)。實(shí)際上Linux 定義了 7 種精確的狀態(tài)每一種都對應(yīng)著進(jìn)程生命周期中的一個特定階段。我們可以通過ps命令直觀地看到它們。1.1 內(nèi)核如何定義狀態(tài)在內(nèi)核源碼中這些狀態(tài)被定義在一個名為task_state_array的數(shù)組里這正是ps命令中狀態(tài)字符如R、S、Z的來源。// Linux 內(nèi)核源碼中的狀態(tài)定義簡化版staticconstchar*consttask_state_array[]{R (running),// 運(yùn)行態(tài)或就緒態(tài)S (sleeping),// 可中斷的睡眠態(tài)D (disk sleep),// 不可中斷的睡眠態(tài)T (stopped),// 停止態(tài)t (tracing stop),// 跟蹤停止態(tài)X (dead),// 死亡態(tài)瞬時Z (zombie),// 僵尸態(tài)};接下來我們逐一剖析這些狀態(tài)重點(diǎn)關(guān)注那些我們能親手復(fù)現(xiàn)和觀察的。1.2 常見狀態(tài)詳解與復(fù)現(xiàn)R (Running) - 運(yùn)行態(tài)/就緒態(tài)含義進(jìn)程要么正在 CPU 上執(zhí)行要么位于就緒隊(duì)列中隨時準(zhǔn)備被調(diào)度。它代表 “可運(yùn)行” 的狀態(tài)而非 “正在運(yùn)行”。誤區(qū)ps看到R并不意味著進(jìn)程一定在消耗 CPU。在一個 4 核系統(tǒng)上最多只有 4 個進(jìn)程能同時處于真正的 “運(yùn)行” 狀態(tài)但可能有幾十個R態(tài)進(jìn)程在排隊(duì)等待。復(fù)現(xiàn)編寫一個純計(jì)算的死循環(huán)程序。// test_r.c#includestdio.hintmain(){while(1){/* I am busy! */}return0;}編譯運(yùn)行g(shù)cc test_r.c -o test_r ./test_r在另一個終端查看會看到R狀態(tài)表示前臺運(yùn)行。S (Sleeping) - 可中斷睡眠含義進(jìn)程正在等待某個可被中斷的事件完成例如等待鍵盤輸入、網(wǎng)絡(luò)數(shù)據(jù)到達(dá)或sleep()超時。此時進(jìn)程位于等待隊(duì)列中。特性可以被信號如CtrlC喚醒或終止。復(fù)現(xiàn)一個包含sleep()的程序是典型的S態(tài)。// test_s.c#includeunistd.hintmain(){while(1){sleep(10);}return0;}運(yùn)行后查看其狀態(tài)為S。大部分時間它都在 “睡眠”等待sleep的定時器事件。D (Disk Sleep) - 不可中斷睡眠含義進(jìn)程正在等待不可中斷的 I/O 操作通常是與硬件如磁盤的直接交互。這是為了保護(hù)數(shù)據(jù)一致性防止在關(guān)鍵 I/O 過程中被信號中斷。特性無法被kill -9殺死只能等待 I/O 完成或系統(tǒng)重啟。這是系統(tǒng)中的一種 “高危” 狀態(tài)。場景當(dāng)系統(tǒng)因?yàn)榇疟P故障或 NFS 問題而響應(yīng)緩慢時ps命令可能會顯示有進(jìn)程處于D態(tài)。正常情況下D態(tài)是瞬時的難以捕捉。注意D狀態(tài)出現(xiàn)很短一般是看不到的如果捕捉到長時間的D狀態(tài)那么你的系統(tǒng)可能存在致命風(fēng)險了隨時可能發(fā)生故障T (Stopped) - 停止態(tài)含義進(jìn)程被暫停不再被調(diào)度。通常是由于收到了SIGSTOP信號如CtrlZ?;謴?fù)可以通過SIGCONT信號讓進(jìn)程恢復(fù)運(yùn)行。復(fù)現(xiàn)運(yùn)行一個前臺程序如./test_s。按下CtrlZ程序被掛起狀態(tài)變?yōu)門。使用kill -SIGCONT PID或fg命令可使其恢復(fù)。Z (Zombie) - 僵尸態(tài)含義子進(jìn)程已終止但其父進(jìn)程尚未通過wait()或waitpid()來讀取其退出狀態(tài)導(dǎo)致子進(jìn)程的 PCBtask_struct仍保留在內(nèi)核中。危害僵尸進(jìn)程本身不占用 CPU 或內(nèi)存但它占用一個 PID 和內(nèi)核中的 PCB 空間。如果大量積累會導(dǎo)致 PID 耗盡系統(tǒng)無法創(chuàng)建新進(jìn)程。特性無法被kill -9殺死因?yàn)樗呀?jīng) “死” 了唯一的解決辦法是殺死其父進(jìn)程讓它成為孤兒由initPID 1進(jìn)程接管并回收。其他狀態(tài)t (tracing stop)與T態(tài)類似但特指在被調(diào)試器如 gdb跟蹤時暫停的狀態(tài)。X (dead)進(jìn)程徹底消亡前的瞬時狀態(tài)資源已完全釋放幾乎不可能被觀察到。1.3 狀態(tài)總結(jié)狀態(tài)名稱核心場景能否被信號中斷如何解決/恢復(fù)R運(yùn)行/就緒正在計(jì)算或等待 CPU否-S可中斷睡眠等待事件網(wǎng)絡(luò)、鍵盤、sleep是事件完成或信號喚醒D不可中斷睡眠等待硬件 I/O如磁盤否等待 I/O 完成或重啟T停止態(tài)CtrlZ或SIGSTOP是SIGCONT或fg命令Z僵尸態(tài)子進(jìn)程退出父進(jìn)程未回收否殺死父進(jìn)程或修改父進(jìn)程代碼二、進(jìn)程創(chuàng)建fork()的魔法在 Linux 中fork()是創(chuàng)建新進(jìn)程的主要方式。它的行為非常獨(dú)特調(diào)用一次返回兩次。2.1fork()的基本用法fork()會創(chuàng)建一個與父進(jìn)程幾乎一模一樣的子進(jìn)程。它的神奇之處在于返回值在父進(jìn)程中fork()返回新創(chuàng)建子進(jìn)程的 PID。在子進(jìn)程中fork()返回0。如果創(chuàng)建失敗返回-1。// test_fork.c#includestdio.h#includeunistd.hintmain(){pid_tpidfork();if(pid0){perror(fork failed);return1;}elseif(pid0){// 子進(jìn)程的世界printf(I am the child, PID: %d, my parent is: %d ,getpid(),getppid());}else{// 父進(jìn)程的世界printf(I am the parent, PID: %d, my child is: %d ,getpid(),pid);sleep(1);// 確保子進(jìn)程有機(jī)會執(zhí)行}return0;}2.2 為什么fork()有兩個返回值這并非函數(shù)本身返回兩次而是內(nèi)核在fork()調(diào)用后將一個進(jìn)程分裂成了兩個獨(dú)立的執(zhí)行流。父子進(jìn)程都從fork()的返回點(diǎn)繼續(xù)執(zhí)行但它們各自的pid變量被賦予了不同的值從而能夠區(qū)分彼此。父進(jìn)程需要子進(jìn)程的 PID來管理它如等待它結(jié)束。子進(jìn)程返回 0是一個約定表示 “我是一個子進(jìn)程”。它可以通過getppid()隨時獲取父進(jìn)程的 PID。2.3 父子進(jìn)程的資源關(guān)系共享與獨(dú)立fork()創(chuàng)建的子進(jìn)程并非完全獨(dú)立它與父進(jìn)程共享某些資源以提高效率。代碼段完全共享。代碼是只讀的父子進(jìn)程共享同一份內(nèi)存中的代碼節(jié)省了大量空間。數(shù)據(jù)段寫時復(fù)制Copy-on-Write, COW。fork()后父子進(jìn)程的虛擬地址空間是獨(dú)立的但它們最初指向相同的物理內(nèi)存頁。只有當(dāng)其中一方嘗試寫入數(shù)據(jù)時內(nèi)核才會為該進(jìn)程復(fù)制一份新的物理內(nèi)存頁讓它獨(dú)立修改。這極大地加快了fork()的速度。寫時復(fù)制示例// test_cow.c#includestdio.h#includeunistd.hintg_val100;intmain(){pid_tpidfork();if(pid0){// 子進(jìn)程修改全局變量g_val200;printf(Child: g_val %d, addr %p ,g_val,g_val);}else{sleep(1);// 等待子進(jìn)程修改printf(Parent: g_val %d, addr %p ,g_val,g_val);}return0;}你會發(fā)現(xiàn)父子進(jìn)程打印出的g_val地址是相同的但值卻不同。這是因?yàn)樗鼈兛吹降亩际翘摂M地址而寫時復(fù)制機(jī)制使得這些相同的虛擬地址最終映射到了不同的物理內(nèi)存頁上。三、特殊進(jìn)程僵尸與孤兒理解了進(jìn)程狀態(tài)和創(chuàng)建我們就能輕松搞定僵尸進(jìn)程和孤兒進(jìn)程這兩個高頻面試題。3.1 僵尸進(jìn)程Zombie- 誰來為我收尸成因子進(jìn)程先于父進(jìn)程退出而父進(jìn)程沒有調(diào)用wait()或waitpid()來獲取子進(jìn)程的退出狀態(tài)。復(fù)現(xiàn)// test_zombie.c#includestdio.h#includestdlib.h#includeunistd.hintmain(){pid_tpidfork();if(pid0){printf(Child exiting... );exit(0);// 子進(jìn)程立即退出}else{printf(Parent sleeping... );sleep(30);// 父進(jìn)程長時間睡眠不回收子進(jìn)程// wait(NULL); // 加上這句就能解決僵尸問題}return0;}運(yùn)行后立即用ps axj | grep test_zombie查看會看到一個狀態(tài)為Z的僵尸進(jìn)程其名稱后帶有defunct標(biāo)記。解決方案根本修改父進(jìn)程代碼確保調(diào)用wait()或waitpid()來回收子進(jìn)程。臨時殺死父進(jìn)程。父進(jìn)程死后其所有子進(jìn)程包括僵尸進(jìn)程都會被initPID 1進(jìn)程收養(yǎng)init進(jìn)程會定期回收所有它收養(yǎng)的僵尸子進(jìn)程。3.2 孤兒進(jìn)程Orphan- 我被過繼給了init成因父進(jìn)程先于子進(jìn)程退出子進(jìn)程仍在運(yùn)行。結(jié)果該子進(jìn)程會立即被**initPID 1進(jìn)程收養(yǎng)**。當(dāng)這個子進(jìn)程最終退出時init會負(fù)責(zé)回收它因此孤兒進(jìn)程不會變成僵尸進(jìn)程。復(fù)現(xiàn)// test_orphan.c#includestdio.h#includeunistd.hintmain(){pid_tpidfork();if(pid0){printf(Child: My parent was %d ,getppid());sleep(5);printf(Child: Now my parent is %d ,getppid());}else{printf(Parent exiting... );sleep(1);// 確保子進(jìn)程先打印初始父PID}return0;}運(yùn)行后你會看到子進(jìn)程的父 PID 從其原始父進(jìn)程的 PID 變成了 1。意義孤兒進(jìn)程機(jī)制是 Linux 內(nèi)核的一種健壯性設(shè)計(jì)確保了即使父進(jìn)程異常退出其子進(jìn)程也不會無人管理從而避免了系統(tǒng)資源的泄漏。四、總結(jié)進(jìn)程狀態(tài)是其生命周期的快照R、S、D、T、Z是最常見的幾種分別對應(yīng)運(yùn)行/就緒、睡眠、I/O 等待、暫停和僵尸。fork()通過寫時復(fù)制COW機(jī)制高效地創(chuàng)建子進(jìn)程并通過不同的返回值來區(qū)分父子執(zhí)行流。僵尸進(jìn)程是 “管理失職” 的結(jié)果父進(jìn)程未回收需要通過修改父進(jìn)程代碼或殺死父進(jìn)程來解決。孤兒進(jìn)程是內(nèi)核的 “托底” 機(jī)制會被init進(jìn)程自動收養(yǎng)和回收通常無害。理解了這些你就掌握了 Linux 進(jìn)程管理的半壁江山。下一篇我們將探討進(jìn)程調(diào)度、優(yōu)先級以及資源回收的細(xì)節(jié)wait與waitpid敬請期待
版權(quán)聲明: 本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請聯(lián)系我們進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

asp網(wǎng)站首頁模板treeson wordpress

asp網(wǎng)站首頁模板,treeson wordpress,公眾號排版,企業(yè)建設(shè)網(wǎng)站軟件一、核心基石#xff1a;完整兼容MongoDB 通信協(xié)議 FerretDB的核心設(shè)計(jì)理念就是“協(xié)議兼容優(yōu)先”#x

2026/01/21 16:13:01

蚌埠的網(wǎng)站建設(shè)seo優(yōu)化培訓(xùn)學(xué)校

蚌埠的網(wǎng)站建設(shè),seo優(yōu)化培訓(xùn)學(xué)校,做pc端網(wǎng)站好么,坪山附近公司做網(wǎng)站建設(shè)哪家技術(shù)好第一章#xff1a;Open-AutoGLM系統(tǒng)提示詞優(yōu)化的核心價值在大語言模型驅(qū)動的智能系統(tǒng)中#xff0c;提示

2026/01/21 19:35:01

域名注冊哪個網(wǎng)站好什么叫微網(wǎng)站

域名注冊哪個網(wǎng)站好,什么叫微網(wǎng)站,如何做像淘寶一樣的網(wǎng)站,電影網(wǎng)站建設(shè)模板2026 元旦快到#xff0c;還在愁繪畫、手抄報素材#xff1f;這份元旦主題素材包超實(shí)用#xff01;涵蓋童趣卡通、傳統(tǒng)國

2026/01/21 19:40:01

做網(wǎng)站生意越來越差網(wǎng)站公司企業(yè)網(wǎng)站

做網(wǎng)站生意越來越差,網(wǎng)站公司企業(yè)網(wǎng)站,織夢cms發(fā)布侵權(quán)網(wǎng)站清單,珠海門戶網(wǎng)站建設(shè)哪家好未來10年#xff0c;什么領(lǐng)域的職業(yè)發(fā)展?jié)摿ψ畲?xff1f;答案只有一個#xff1a;人工智能。今年找工作彷

2026/01/21 19:06:01