當(dāng)前位置:首頁 > 學(xué)習(xí)資源 > 講師博文 > 一文搞懂Linux進(jìn)程的睡眠和喚醒
一文搞懂Linux進(jìn)程的睡眠和喚醒
時間:2024-10-18 來源:華清遠(yuǎn)見
一、常見的進(jìn)程狀態(tài)與理解
在操作系統(tǒng)內(nèi)部,有專門用來管理進(jìn)程的結(jié)構(gòu)體,叫做struct task_struct,也稱作進(jìn)程控制塊(PCB),主要包含描述進(jìn)程的相關(guān)信息,如進(jìn)程用戶、進(jìn)程狀態(tài)、進(jìn)程優(yōu)先級、文件描述符(記錄當(dāng)前進(jìn)程打開的文件)、主要進(jìn)程標(biāo)識的進(jìn)程號和父進(jìn)程號:
進(jìn)程號(PID: Process Identity Number):唯一的標(biāo)識一個進(jìn)程,用于區(qū)分系統(tǒng)中的各個進(jìn)程并方便操作系統(tǒng)進(jìn)行管理;
父進(jìn)程號:(PPID:Parent Process ID):用于描述一個進(jìn)程的直接父進(jìn)程的標(biāo)識符,每個進(jìn)程在創(chuàng)建時都會由一個已有的進(jìn)程(即父進(jìn)程)生成,這樣就形成了進(jìn)程的層級結(jié)構(gòu)。通過PPID,可以追蹤進(jìn)程的來源,并了解進(jìn)程之間的關(guān)系。
在PCB中記錄的進(jìn)程狀態(tài),不過是一些整數(shù),這個整數(shù)是多少就代表進(jìn)程此時處于什么狀態(tài)。在CPU執(zhí)行進(jìn)程時,通過找到進(jìn)程的PCB,從而找到進(jìn)程的代碼和數(shù)據(jù),進(jìn)而去執(zhí)行這個進(jìn)程。下面列舉了一些進(jìn)程狀態(tài):

注意:沒有+時,默認(rèn)是后臺進(jìn)程
進(jìn)程調(diào)度(進(jìn)程狀態(tài)切換)

進(jìn)程創(chuàng)建后,進(jìn)程進(jìn)入就緒態(tài),當(dāng)CPU調(diào)度到此進(jìn)程時進(jìn)入運行態(tài),當(dāng)時間片用完時,此進(jìn)程會進(jìn)入就緒態(tài),如果此進(jìn)程正在執(zhí)行一些IO操作(阻塞操作)會進(jìn)入阻塞態(tài),完成IO操作(阻塞結(jié)束)后又可進(jìn)入就緒態(tài),等待CPU的調(diào)度,當(dāng)進(jìn)程運行結(jié)束即進(jìn)入結(jié)束態(tài)。
一、睡眠機(jī)制與喚醒機(jī)制
睡眠機(jī)制:
1)主動睡眠(Blocking Sleep): 進(jìn)程自愿進(jìn)入睡眠狀態(tài),通常是通過系統(tǒng)調(diào)用如sleep()、wait()等。
2)被動睡眠(Interruptible Sleep): 進(jìn)程在等待某個條件滿足(如I/O操作),可以被信號喚醒。
Linux通過內(nèi)核提供的系統(tǒng)調(diào)用來控制進(jìn)程的睡眠。常用的系統(tǒng)調(diào)用有:
sleep(): 使進(jìn)程暫停指定的秒數(shù)。
usleep(): 使進(jìn)程暫停指定的微秒數(shù)。
nanosleep(): 使進(jìn)程暫停指定的納秒數(shù)。
Tips:睡眠機(jī)制幫助節(jié)省CPU資源,尤其是在I/O密集型任務(wù)中;在可中斷睡眠狀態(tài)下,進(jìn)程在收到信號時會被喚醒并處理信號。
喚醒機(jī)制
1)信號(Signal): 進(jìn)程可以通過接受特定信號被喚醒。
2)條件變量(Condition Variable): 多線程編程中用于同步多個線程的工具,可以讓一個線程在某些條件下睡眠并等待被喚醒。
Tips:喚醒機(jī)制可以通過信號、I/O事件和線程同步原語(如條件變量)來有效管理進(jìn)程和線程的狀態(tài),更好地利用系統(tǒng)資源,提高程序的響應(yīng)性與性能。
一、用法實例
1.進(jìn)程睡眠示例:
使用 sleep() 函數(shù)讓進(jìn)程暫停執(zhí)行一段時間

使用 usleep() 函數(shù),使進(jìn)程睡眠0.5秒,精確度更高

使用 nanosleep(),使進(jìn)程睡眠1.5秒,可以精細(xì)控制時間

2.進(jìn)程喚醒實例:
使用信號喚醒進(jìn)程,進(jìn)程直到接收到 SIGUSR1 信號被喚醒。
使用 select() 函數(shù)等待I/O,如果在5秒內(nèi)沒有輸入,select() 會返回,以便進(jìn)程被喚醒。若有輸入,則進(jìn)程也會被喚醒。

使用條件變量喚醒線程,子線程在條件變量上等待,直到主線程調(diào)用 pthread_cond_signal() 喚醒它。主線程在等待2秒后,設(shè)置條件并喚醒子線程。(已經(jīng)描述到這里,線程一并提及一下)

如何利用機(jī)器學(xué)習(xí)構(gòu)建個性化推薦系統(tǒng)
嵌入式系統(tǒng)從上電到操作系統(tǒng)運行的完整啟動流程
如何在不同工作場景下優(yōu)化嵌入式系統(tǒng)的電源消耗
硬件抽象層(HAL)的設(shè)計如何提高代碼的可移植性
批量歸一化在深度學(xué)習(xí)訓(xùn)練中的作用和實現(xiàn)方法
物聯(lián)網(wǎng)項目中設(shè)計嵌入式系統(tǒng)時的關(guān)鍵技術(shù)和考慮因素
通過自然語言處理技術(shù)理解文本的深層含義
如何基于RISC-V架構(gòu)設(shè)計高效能的嵌入式系統(tǒng)
LSTM和GRU在時間序列預(yù)測中的應(yīng)用
JTAG和SWD的調(diào)試技術(shù)及應(yīng)用
