2012-09-21 186 views
3

我很困擾sleep(),阻止調用,搶佔概念。根據我的理解,搶先完全由調度程序完成,而不管過程在做什麼。除了進程處於關鍵部分或執行原子指令時,調度程序可以基於調度算法搶佔進程並將其放入等待進程列表中。睡眠()vs阻止進程

另一方面,sleep()調用調度程序在指定的時間間隔內將其阻塞;作爲參數傳遞給sleep()。

阻塞調用就像是等待操作完成如I/O操作,如磁盤讀/寫,從其他設備信號等

能有人給我解釋一下我的這些工作更全面的方式或指向我一些堅實的資源? 謝謝。

+0

你說的都是對的。你還想知道什麼? – qdii

+0

當進程執行阻塞調用時,它將等待操作完成。所以當這個操作完成時,阻塞的進程會立即開始運行,還是調度程序在它被阻塞並根據自己的願望進行計劃後才能控制它? – Nike

回答

5

當進程進行阻塞調用時,它等待完成操作到 。

我不完全相信你對此理解正確。假設你的程序發出一個I/O命令,例如read()。您的進程不會等待操作完成:在I/O操作完成之前,它不保存處理器。當調用read()時,處理器的控制權交給OS,這將提示I/O操作。這些操作與CPU速度相比非常慢,並且它們由專用硬件執行,這意味着CPU可以自由地執行其他操作,直到硬件發出完成信號(由於硬件中斷,實例)。

從運行read()的程序的角度來看,它只知道read()已被調用:指向當前指令的寄存器沒有改變,其虛擬內存與以前相同。該過程被「阻止」。這並不意味着CPU沒有運行。

從操作系統的角度來看,程序處於等待模式,直到硬件發出信號表示已完成任務。與此同時,調度程序喚醒了另一個進程,恢復了它的上下文(即CPU寄存器的值已經設置爲它在睡覺之前的狀態,等等),並開始執行它的代碼。

硬件完成後,會發生中斷,操作系統通過將進程標記爲可執行文件來確認它。根據調度程序策略,它可以恢復進程上下文並立即開始執行,或者在切換上下文之前等待當前進程完成其時間片。

要詳細瞭解linux調度程序的實現:Understanding the linux kernel is a very good book

+0

現在我得到一個更好的圖片..謝謝。 – Nike