亚洲精品一二区_国产黄色片网站_99久久久成人国产精品_蜜臀网_国产精品一区二区三区免费_成人av中文字幕_91精品国产欧美一区二区成人


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

分享到:
           

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

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

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

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

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

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

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

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

    當(dāng)系統(tǒng)啟動后,內(nèi)核通常作為某一個進(jìn)程的代表。一個指向task_struct的宏current用來記錄正在運行的進(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)程時,則調(diào)用for_each_process()宏,這將比系統(tǒng)搜索數(shù)組的速度要快得多。

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

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

   熱點鏈接:

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

更多新聞>> 

主站蜘蛛池模板: 美女视频黄频a免费 | 久久久99精品免费观看 | 国产日韩免费视频 | 午夜欧美日韩 | 欧美日韩在线视频观看 | 亚洲成人三级 | 欧美日韩三级 | 久草新免费 | 99久久国产综合精品麻豆 | 欧美黑人bbbbbbbbb | 日韩亚洲成a人片在线观看 日韩亚洲国产综合久久久 日韩亚洲精品不卡在线 | 国产亚洲精品国产福利在线观看 | 久久亚洲精品国产精品777777 | 国产日批视频 | 亚洲精品午夜 | www.日本| 亚洲精品第二页 | 天天干夜夜玩 | 亚洲综合网在线观看首页 | 久久精品一区二区国产 | 秋霞在线欧美成人影院 | 天天干天天色天天干 | 久久亚洲伊人成综合人影院 | 好吊妞在线成人免费 | 天天操天天摸天天曰天天干天天弄天天干 | 久久精品一区二区 | 99久久精品免费看国产免费 | 亚洲haose在线观看 | 日本黄色网址免费 | 秋霞在线欧美成人影院 | 亚洲精品456人成在线 | 色秀视频在线观看全部 | 国产精品高清视亚洲精品 | 免费观看黄色毛片 | 免费三级网站 | 日韩欧美亚洲精品 | 久久综合九色综合国产 | 日本一区二区三区在线观看 | 97人人在线视频 | 在线a视频 | 免费一级特黄特色黄大任片 |