国产成人精品三级麻豆,色综合天天综合高清网,亚洲精品夜夜夜,国产成人综合在线女婷五月99播放,色婷婷色综合激情国产日韩


Linux下的進(jìn)程結(jié)構(gòu)

分享到:
           

    進(jìn)程不但包括程序的指令和數(shù)據(jù),而且包括程序計(jì)數(shù)器和處理器的所有寄存器及存儲(chǔ)臨時(shí)數(shù)據(jù)的進(jìn)程堆棧,因此正在執(zhí)行的進(jìn)程包括處理器當(dāng)前的一切活動(dòng)。

    因?yàn)長(zhǎng)inux是一個(gè)多進(jìn)程的操作系統(tǒng),所以其他的進(jìn)程必須等到系統(tǒng)將處理器使用權(quán)分配給自己之后才能運(yùn)行。當(dāng)正在運(yùn)行的進(jìn)程等待其他的系統(tǒng)資源時(shí),Linux內(nèi)核將取得處理器的控制權(quán),并將處理器分配給其他正在等待的進(jìn)程,它按照內(nèi)核中的調(diào)度算法決定將處理器分配給哪一個(gè)進(jìn)程。

    內(nèi)核將所有進(jìn)程存放在雙向循環(huán)鏈表(進(jìn)程鏈表)中,其中鏈表的頭是init_task描述符。鏈表的每一項(xiàng)都是類型為task_struct,稱為進(jìn)程描述符的結(jié)構(gòu),該結(jié)構(gòu)包含了與一個(gè)進(jìn)程相關(guān)的所有信息,定義在<include/linux/sched.h>文件中。task_struct內(nèi)核結(jié)構(gòu)比較大,它能完整地描述一個(gè)進(jìn)程,如進(jìn)程的狀態(tài)、進(jìn)程的基本信息、進(jìn)程標(biāo)識(shí)符、內(nèi)存相關(guān)信息、父進(jìn)程相關(guān)信息、與進(jìn)程相關(guān)的終端信息、當(dāng)前工作目錄、打開(kāi)的文件信息、所接收的信號(hào)信息等。

    下面詳細(xì)講解task_struct結(jié)構(gòu)中為重要的兩個(gè)域:state(進(jìn)程狀態(tài))和pid(進(jìn)程標(biāo)識(shí)符)。

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

    Linux中的進(jìn)程有以下幾種狀態(tài)。
    ● 運(yùn)行狀態(tài)(TASK_RUNNING):進(jìn)程當(dāng)前正在運(yùn)行,或者正在運(yùn)行隊(duì)列中等待調(diào)度。
    ● 可中斷的阻塞狀態(tài)(TASK_INTERUPTIBLE):進(jìn)程處于阻塞(睡眠)狀態(tài),正在等待某些事件發(fā)生或能夠占用某些資源。處在這種狀態(tài)下的進(jìn)程可以被信號(hào)中斷。接收到信號(hào)或被顯式的喚醒呼叫(如調(diào)用wake_up系列宏:wake_up、wake_up_interruptible等)喚醒之后,進(jìn)程將轉(zhuǎn)變?yōu)門(mén)ASK_RUNNING 狀態(tài)。
    ● 不可中斷的阻塞狀態(tài)(TASK_UNINTERUPTIBLE):此進(jìn)程狀態(tài)類似于可中斷的阻塞狀態(tài)(TASK_INTERRUPTIBLE),只是它不會(huì)處理信號(hào),把信號(hào)傳遞到這種狀態(tài)下的進(jìn)程不能改變它的狀態(tài)。在一些特定的情況下(進(jìn)程必須等待,直到某些不能被中斷的事件發(fā)生),這種狀態(tài)是很有用的。只有在它所等待的事件發(fā)生時(shí),進(jìn)程才被顯式的喚醒呼叫喚醒。
    ● 可終止的阻塞狀態(tài)(TASK_KILLABLE):Linux內(nèi)核 2.6.25 引入了一種新的進(jìn)程狀態(tài),名為 TASK_KILLABLE。該狀態(tài)的運(yùn)行機(jī)制類似于 TASK_UNINTERRUPTIBLE,只不過(guò)處在該狀態(tài)下的進(jìn)程可以響應(yīng)致命信號(hào)。它可以替代有效但可能無(wú)法終止的不可中斷的阻塞狀態(tài)(TASK_UNINTERRUPTIBLE),以及易于喚醒但安全性欠佳的可中斷的阻塞狀態(tài)(TASK_INTERRUPTIBLE)。
    ● 暫停狀態(tài)(TASK_STOPPED):進(jìn)程的執(zhí)行被暫停,當(dāng)進(jìn)程收到SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU等信號(hào)時(shí),就會(huì)進(jìn)入暫停狀態(tài)。
    ● 跟蹤狀態(tài)(TASK_TRACED):進(jìn)程的執(zhí)行被調(diào)試器暫停。當(dāng)一個(gè)進(jìn)程被另一個(gè)進(jìn)程監(jiān)控時(shí)(如調(diào)試器使用ptrace()系統(tǒng)調(diào)用監(jiān)控測(cè)試程序),任何信號(hào)都可以把這個(gè)進(jìn)程置于跟蹤狀態(tài)。
    ● 僵尸狀態(tài)(EXIT_ZOMBIE):進(jìn)程運(yùn)行結(jié)束,父進(jìn)程尚未使用wait函數(shù)族(如使用waitpid()函數(shù))等系統(tǒng)調(diào)用來(lái)“收尸”,即等待父進(jìn)程銷毀它。處在該狀態(tài)下的進(jìn)程“尸體”已經(jīng)放棄了幾乎所有的內(nèi)存空間,沒(méi)有任何可執(zhí)行代碼,也不能被調(diào)度,僅僅在進(jìn)程列表中保留一個(gè)位置,記載該進(jìn)程的退出狀態(tài)等信息供其他進(jìn)程收集。
    ● 僵尸撤銷狀態(tài)(EXIT_DEAD):這是終狀態(tài),父進(jìn)程調(diào)用wait函數(shù)族“收尸”后,進(jìn)程徹底由系統(tǒng)刪除。

    它們之間的轉(zhuǎn)換關(guān)系如圖3.2所示。


圖3.2 進(jìn)程狀態(tài)轉(zhuǎn)換關(guān)系圖

    內(nèi)核可以使用set_task_state和set_current_state宏來(lái)改變指定進(jìn)程的狀態(tài)和當(dāng)前執(zhí)行進(jìn)程的狀態(tài)。

    2)進(jìn)程標(biāo)識(shí)符

    Linux內(nèi)核通過(guò)唯一的進(jìn)程標(biāo)識(shí)符PID來(lái)標(biāo)識(shí)每個(gè)進(jìn)程。PID存放在進(jìn)程描述符的pid字段中,新創(chuàng)建的PID通常是前一個(gè)進(jìn)程的PID加1,不過(guò)PID的值有上限(大值 = PID_MAX_DEFAULT – 1,通常為32767),讀者可以查看/proc/sys/kernel/pid_max來(lái)確定該系統(tǒng)的進(jìn)程數(shù)上限。

    當(dāng)系統(tǒng)啟動(dòng)后,內(nèi)核通常作為某一個(gè)進(jìn)程的代表。一個(gè)指向task_struct的宏current用來(lái)記錄正在運(yùn)行的進(jìn)程。current經(jīng)常作為進(jìn)程描述符結(jié)構(gòu)指針的形式出現(xiàn)在內(nèi)核代碼中,例如,current->pid表示處理器正在執(zhí)行的進(jìn)程的PID。當(dāng)系統(tǒng)需要查看所有的進(jìn)程時(shí),則調(diào)用for_each_process()宏,這將比系統(tǒng)搜索數(shù)組的速度要快得多。

    在Linux中獲得當(dāng)前進(jìn)程的進(jìn)程號(hào)(PID)和父進(jìn)程號(hào)(PPID)的系統(tǒng)調(diào)用函數(shù)分別為getpid()和getppid()。

    本文選自華清遠(yuǎn)見(jiàn)嵌入式培訓(xùn)教材《從實(shí)踐中學(xué)嵌入式Linux應(yīng)用程序開(kāi)發(fā)》

   熱點(diǎn)鏈接:

   1、Linux下多任務(wù)系統(tǒng)之進(jìn)程的基本概念
   2、Linux下多任務(wù)系統(tǒng)之任務(wù)介紹
   3、實(shí)驗(yàn):Linux下多路復(fù)用式串口操作
   4、實(shí)驗(yàn):linux文件讀/寫(xiě)及上鎖
   5、標(biāo)準(zhǔn)I/O操作函數(shù)詳解

更多新聞>>