2011-02-06 72 views
15

這可能是一個愚蠢的問題,但sleep()wait(),pause()函數如何工作?sleep()如何工作?

+13

取決於語言和操作系統。 – 2011-02-06 05:19:22

+1

它涉及睡帽 – kelloti 2011-02-06 05:32:10

+2

不是一個愚蠢的問題! – 2011-02-06 05:33:25

回答

20

從更抽象的角度我們可以看到睡眠操作:它是一種讓您等待事件的操作。
當調用sleep的時間超過睡眠參數時觸發相關事件。

當進程是活動的(即:它擁有一個CPU),它可以在主動等待一個事件或被動的方式:

  • 有源等待是當一個進程積極/明確地等待該事件:

    sleep(t): 
        while not [event: elapsedTime > t ]: 
         NOP // no operatior - do nothing 
    

    這是一個簡單的算法,並可以實現隨時隨地的便攜方式,但,雖然你的進程正在積極地等待它仍擁有CPU,浪費它(因爲你的過程中沒有按問題真的不需要CPU,而其他任務可能需要它)。

    通常這隻能由那些不能被動等待的過程完成(參見下面的要點)。

  • 被動等待,而不是被要求到別的喚醒你當事件發生時的東西,並且暫停自己乾的(即:釋放CPU):

    sleep(t): 
        system.wakeMeUpWhen([event: elapsedTime > t ]) 
        release CPU 
    

    爲了實現被動等待你需要一些外部的支持:你必須能夠釋放你的CPU,並要求別人在事件發生時喚醒你。

    在單任務設備(如許多嵌入式設備)上,這是不可能的,除非硬件提供了操作,因爲沒有人可以釋放CPU或要求喚醒。

    x86處理器(以及大多數其他處理器)提供了一個HLT操作,使CPU可以休眠,直到觸發外部中斷爲止。通過這種方式,操作系統內核也可以進入睡眠狀態以保持CPU的冷卻。

1

這些是系統調用。在Linux或Open BSD中查找開源代碼中的實現。

4

現代操作系統是多任務處理,這意味着它似乎同時運行多個程序。實際上,只有您的計算機(傳統上至少)只有一個CPU,因此它只能同時從一個程序執行一條指令。

操作系統使得看起來多個東西(你正在瀏覽網頁,聽音樂和下載文件)出現的方式是通過執行每個任務很短的時間(比如10毫秒)。這種快速切換使得事情似乎在所有事實上都是按順序發生的情況下同時發生。 (對於多核系統有明顯的區別)。

至於問題的答案:睡眠或等待或同步IO,程序基本上告訴操作系統執行其他任務,並且不要再運行我,直到:Xms已過,事件已發信號,或數據已準備就緒。