當(dāng)進(jìn)程等待資源或者事件時(shí),就進(jìn)入睡眠狀態(tài)。有兩種睡眠態(tài),不可中斷睡眠態(tài)(TASK_UNINTERRUPTIBLE)和可中斷睡眠態(tài)(TASK_INTERRUPTIBLE)。處于可中斷睡眠態(tài)的進(jìn)程不光可以由wake_up直接喚醒,還可以由信號(hào)喚醒。在schedule()函數(shù)中,會(huì)把處于可中斷睡眠態(tài)并且收到信號(hào)的進(jìn)程變成運(yùn)行態(tài),使他參與調(diào)度選擇。Linux0.11中進(jìn)入可中斷睡眠狀態(tài)的方法有3中調(diào)用i" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Linux0.11內(nèi)核--進(jìn)程的調(diào)度(運(yùn)行態(tài)(就緒態(tài))和睡

系統(tǒng) 4326 0

<!-- p { margin-bottom: 0.08in; } -->

當(dāng)進(jìn)程等待資源或者事件時(shí),就進(jìn)入睡眠狀態(tài)。有兩種睡眠態(tài),不可中斷睡眠態(tài)( TASK_UNINTERRUPTIBLE )和可中斷睡眠態(tài)( TASK_INTERRUPTIBLE )。

處于可中斷睡眠態(tài)的進(jìn)程不光可以由 wake_up 直接喚醒,還可以由信號(hào)喚醒。在 schedule() 函數(shù)中,會(huì)把處于可中斷睡眠態(tài)并且收到信號(hào)的進(jìn)程變成運(yùn)行態(tài),使他參與調(diào)度選擇。 Linux0.11 中進(jìn)入可中斷睡眠狀態(tài)的方法有 3

  1. 調(diào)用 interruptible_sleep_on() 函數(shù)

  2. 調(diào)用 sys_pause() 函數(shù)

  3. 調(diào)用 sys_waitpid() 函數(shù)。

第一種情況用于等待外設(shè)資源時(shí)(如等待 I/O 設(shè)備),這時(shí)當(dāng)前進(jìn)程會(huì)掛在對(duì)應(yīng)的等待隊(duì)列上。第二第三種情況用于事件,即等待信號(hào)。

進(jìn)程要進(jìn)入不可中斷睡眠態(tài),只能通過 sleep_on() 函數(shù)。要使處于不可中斷睡眠態(tài)的進(jìn)程進(jìn)入運(yùn)行態(tài),只能由其他進(jìn)程調(diào)用 wake_up() 將它喚醒。當(dāng)進(jìn)程等待系統(tǒng)資源(比如高速緩沖塊,文件 i 節(jié)點(diǎn)或者文件系統(tǒng)的超級(jí)塊)時(shí),會(huì)調(diào)用 sleep_on() 函數(shù),使當(dāng)前進(jìn)程掛起在相關(guān)資源的等待隊(duì)列上。

這部分代碼很短,一共三個(gè)函數(shù) sleep_on() wake_up() interruptible_sleep_on() 。在 sched.c 中。但是代碼比較難理解,因?yàn)闃?gòu)造的等待隊(duì)列是一個(gè)隱式隊(duì)列,利用進(jìn)程地址空間的獨(dú)立性隱式地連接成一個(gè)隊(duì)列。這個(gè)想法很奇妙。

<!-- p { margin-bottom: 0.08in; } -->

sleep_on()

<!-- p { margin-bottom: 0.08in; } -->

這個(gè)函數(shù)牽涉到 3 個(gè)指針, p tmp current

p 是指向指針的指針,實(shí)際上 *p 指向的是等待隊(duì)列頭。系統(tǒng)資源(高速緩沖塊,文件 i 節(jié)點(diǎn)或者文件系統(tǒng)的超級(jí)塊)的數(shù)據(jù)結(jié)構(gòu)中都一個(gè) struct task_struct * 類型的指針,指向的就是等待該資源的進(jìn)程隊(duì)列頭。比如 i 節(jié)點(diǎn)中的 i_wait ,高速緩沖塊中的 b_wait ,超級(jí)塊中的 s_wait *p 對(duì)于等待隊(duì)列上的所有進(jìn)程都是一樣的。

current 指向的是當(dāng)前進(jìn)程指針,是全局變量。

tmp 位于當(dāng)前進(jìn)程的地址空間內(nèi),是局部變量。不同的進(jìn)程有不同 tmp 變量。等待隊(duì)列就是利用這個(gè)變量把所有等待同一個(gè)資源的進(jìn)程連接起來。具體的說,所有等待在隊(duì)列上的進(jìn)程,都是在 sleep_on() schedule() 中被切換出去的,這些進(jìn)程還停留在 sleep_on() 函數(shù)中,在函數(shù)的堆棧空間里面,存放了局部變量 tmp

假如當(dāng)前進(jìn)程要進(jìn)入某個(gè)高速緩沖塊的等待隊(duì)列,而且該等待隊(duì)列上已經(jīng)有另外兩個(gè)進(jìn)程 task1 task2 先后進(jìn)入。形成的隊(duì)列如圖。等待隊(duì)列是堆棧式的,先進(jìn)入隊(duì)列的進(jìn)程排在最后。

Linux0.11內(nèi)核--進(jìn)程的調(diào)度(運(yùn)行態(tài)(就緒態(tài))和睡眠態(tài)之間的轉(zhuǎn)換)

<!-- p { margin-bottom: 0.08in; } -->

在調(diào)用了 sleep_on() 的地方,我們可以發(fā)現(xiàn) sleep_on() 往往是放在一個(gè)循環(huán)中的(比如 wait_on_buffer() wait_on_inode() lock_inode() lock_super() wait_on_super() 等函數(shù))。當(dāng)進(jìn)程從 sleep_on() 返回時(shí),并不能保證當(dāng)前進(jìn)程取得了資源使用權(quán),因?yàn)檎{(diào)用 wake_up() 進(jìn)程切換到從 sleep_on() 中蘇醒的過程中,發(fā)生了進(jìn)程調(diào)度,中間很可能有別的進(jìn)程取得了資源。

wake_up()

<!-- p { margin-bottom: 0.08in; } --> <!-- p { margin-bottom: 0.08in; } -->

下面分析 sleep_on() wait_up() 配合使用的情況

情況一 游離隊(duì)列的產(chǎn)生

先分析一下 sleep_on() wake_up() 在通常情況下的工作原理。考慮一個(gè)非常簡(jiǎn)單的情況,假設(shè)目前系統(tǒng)只有 3 個(gè)進(jìn)程,且都等在隊(duì)列上,隊(duì)列的頭指針設(shè)為 wait

<!-- p { margin-bottom: 0.08in; } -->

然后系統(tǒng)資源得到釋放,當(dāng)前進(jìn)程調(diào)用 wake_up(wait) 。這時(shí) Task C 變成了運(yùn)行態(tài)。

<!-- p { margin-bottom: 0.08in; } -->

之后進(jìn)程調(diào)度發(fā)生, Task C 被選中,開始運(yùn)行。 Task C 是從 sheep_on() 中的 schedule() 的后一條語(yǔ)句開始運(yùn)行,它把 Task B 的狀態(tài)變成運(yùn)行態(tài)。隨后 Task C 退出 sheep_on() 函數(shù),堆棧中的局部變量 tmp 消失,這樣再?zèng)]有指向 Task B 的指針, Task B 開頭的隊(duì)列游離了。

Linux0.11內(nèi)核--進(jìn)程的調(diào)度(運(yùn)行態(tài)(就緒態(tài))和睡眠態(tài)之間的轉(zhuǎn)換)

<!-- p { margin-bottom: 0.08in; } -->

情況 1-1

這時(shí)對(duì)同一個(gè)資源有兩個(gè)進(jìn)程是可運(yùn)行狀態(tài),但是當(dāng)前進(jìn)程是 Task C ,只要它不調(diào)用 schedule ,它是不會(huì)被搶斷的。因此 Task C 繼續(xù)運(yùn)行,取得了它想要的資源,這時(shí) Task C 可以完成它的任務(wù)了。當(dāng)進(jìn)程調(diào)度再次發(fā)生時(shí), Task B 會(huì)被選中,同樣, Task B 會(huì)把 Task A 變成可運(yùn)行態(tài),而它自己得到了資源。最終 Task A 也會(huì)得到執(zhí)行。這樣,等待在一個(gè)資源上的三個(gè)任務(wù)最終都得到運(yùn)行。

情況 1-2

假設(shè) Task C 在得到資源后,又主動(dòng)調(diào)用了 schedule() ,進(jìn)程調(diào)度程序這時(shí)選中了 Task B Task B 從上次中斷的地方開始運(yùn)行,即從 sleep_on() schedule() 后面的語(yǔ)句開始運(yùn)行。它會(huì)把 Task A 也變成可運(yùn)行狀態(tài)。然后退出 sleep_on() tmp 變量消失。但是不幸的是它發(fā)現(xiàn)資源仍然被占用,所以再次進(jìn)入睡眠,又連接到 wait 隊(duì)列上了。

Linux0.11內(nèi)核--進(jìn)程的調(diào)度(運(yùn)行態(tài)(就緒態(tài))和睡眠態(tài)之間的轉(zhuǎn)換)

<!-- p { margin-bottom: 0.08in; } -->

從這個(gè)情況可以看到,雖然系統(tǒng)運(yùn)行過程中,可能會(huì)把等待隊(duì)列切分成很多游離隊(duì)列,但是這些隊(duì)列頭上的進(jìn)程都是運(yùn)行態(tài),這保證 schedule() 函數(shù)最終還是會(huì)找到它。

情況二 游離隊(duì)列的合并

假設(shè)目前進(jìn)程等待資源的情況如下,某個(gè)進(jìn)程占用資源不放,導(dǎo)致有 7 個(gè)進(jìn)程等待該資源。產(chǎn)生 3 個(gè)隊(duì)列,其中兩個(gè)游離。

Linux0.11內(nèi)核--進(jìn)程的調(diào)度(運(yùn)行態(tài)(就緒態(tài))和睡眠態(tài)之間的轉(zhuǎn)換)

<!-- p { margin-bottom: 0.08in; } -->

這時(shí)調(diào)度函數(shù)選中 Task E 執(zhí)行, Task E 先喚醒 Task D 但發(fā)現(xiàn)資源不能用,再次睡眠,把自己移到 wait 隊(duì)列,脫離了游離隊(duì)列。調(diào)度再次發(fā)生。

Linux0.11內(nèi)核--進(jìn)程的調(diào)度(運(yùn)行態(tài)(就緒態(tài))和睡眠態(tài)之間的轉(zhuǎn)換)

<!-- p { margin-bottom: 0.08in; } -->

假如這時(shí) Task B 得到運(yùn)行,同樣 Task B 也只能喚醒 Task A ,而把自己移動(dòng)到等待隊(duì)列

Linux0.11內(nèi)核--進(jìn)程的調(diào)度(運(yùn)行態(tài)(就緒態(tài))和睡眠態(tài)之間的轉(zhuǎn)換)

p { margin-bottom: 0.08in; }

這樣,只要游離隊(duì)列頭上的進(jìn)程是運(yùn)行態(tài),游離隊(duì)列可以再次合并到原先的等待隊(duì)列上。

p { margin-bottom: 0.08in; }

interruptible_sleep_on()

Linux0.11內(nèi)核--進(jìn)程的調(diào)度(運(yùn)行態(tài)(就緒態(tài))和睡眠態(tài)之間的轉(zhuǎn)換)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 国产精品小视频在线观看 | 高清在线亚洲精品国产二区 | 亚洲最新在线视频 | 日日操夜夜操免费视频 | 久久96精品国产 | 久草免费精品视频 | 爱爱免费播放视频在线观看 | 亚洲精品中文字幕乱码三区一二 | 国内精品手机在线观看视频 | 97夜夜操| 久久国产毛片 | 亚洲va欧美va国产va天堂影 | 久久天天躁综合夜夜黑人鲁色 | 免费a级毛片大学生免费观看 | 日本欧美高清全视频 | 久久综合色之久久综合 | 日韩一区二区久久久久久 | 色噜噜狠狠狠狠色综合久一 | 欧美男人天堂网 | 免费网站日本永久免费观看 | 狠狠操天天操夜夜操 | 国产成人丝袜网站在线看 | 久久久久久久一线毛片 | 国产性生活视频 | 午夜时刻免费实验区观看 | 四虎国产成人永久精品免费 | 成人小视频在线 | 亚洲欧美日韩国产精品26u | 国产一区二区三区不卡免费观看 | 在线久 | 国产麻豆精品高清在线播放 | 国产三级做爰高清视频a | 国产www在线播放 | 五月激激激综合网色播免费 | 熟妇毛茸茸xxxoo | 日韩一区二区三区在线视频 | 国产色综合天天综合网 | 成人观看视频 | 久久99国产精品久久99 | 91精品国产亚一区二区三区 | 日本不卡免费新一区二区三区 |