text: 計算機程式進入不活躍狀態並持續一段時間，稱為“睡眠”。當引發程式睡眠的程式碼所設定的內部計時器歸零，或是此程式收到喚醒訊號或中斷時，程式將恢復執行。睡眠中的程式也有可能不經喚醒而直接被終止。用法.睡眠指令通常需要輸入一個引數，以說明程式睡眠至少多長時間後才恢復執行。這一時間引數的單位#重定向Windows.Windows 作業系統中，codice_1函式僅有一個引數，即以毫秒計的睡眠時間。codice_1函式包含於 kernel32.dll 中，但是原生作業系統的批處理檔案卻並不支援這一指令。安裝諸如Windows 2003 Resource Kit等執行環境後，使用者便可使用這一指令。Unix.在類Unix作業系統中，codice_3函式使用以秒做單位的無符號整數作為輸入引數。如果需要更精確的控制睡眠時間，可以使用 codice_4函式。C語言樣例.Windows 作業系統中：Sleep(2*1000); // 睡眠2秒類Unix作業系統中：sleep(2); // 睡眠2秒底層功能.睡眠使得執行緒或程序讓出他們佔用的剩餘時間片，並在 “不在執行”狀態等待一段時間。雖然這段程式在睡眠前被設定了最短睡眠時長，可這並不意味著這段時間結束後此程式能夠立即恢復運作——這取決於 排程程式 的分配、等待喚醒的程式的優先順序和其他一些因素。在 POSIX 系統中， "nanosleep" 及其他類似的系統指令會被中斷訊號中斷，相應程式也會停止睡眠。而 "sleep" 庫函式卻不盡相同，在一些老一點的作業系統中，它是透過呼叫 "alarm" 系統指令實現的，因而必須透過送訊號的方式才能運作。在Windows中，由於除了終止執行訊號外沒有專門的訊號可以用於打斷，睡眠函式是不可中斷的。不過，Windows提供了 SleepEX 函式來實現透過 APC 呼叫控制睡眠程序的喚醒。嚴格說來，一個執行緒也可以由於其他執行緒終止執行或丟擲異常被喚醒。使用場景.一些系統程式在事件輪詢過程中從不被終止，只是在每個週期開始前進入睡眠狀態，等待著某些事件的發生喚醒它們。當收到事件之後，它們就被喚醒去處理這些事件，然後進入下一個週期的等待。還有一些程式週期性的從睡眠中恢復執行並收集事件。當執行恢復，程式拉取事件列表和狀態變更情況，然後針對睡眠時發生的事件做相應處理，完成後再次進入睡眠，等待下一個時隙。這類事件被稱作心跳事件，或“持久連線”訊號，可由上述型別的週期性程式傳送。codice_3函式還在程式執行節奏需要放緩的時候被呼叫。例如長時間高負荷執行程式時應有包含睡眠函式的程式碼來減輕硬體過熱帶來的麻煩，或是解決遺留程式碼中不為人知的奇妙程式錯誤。相比於使用模擬器實現的週期平衡的程式，睡眠-執行週期發生的程式的缺點在於如果切換速度不夠快，互動式程式就會有明顯的延遲，如果太快，喚醒時間就太短以至於無法完成全部工作。不可中斷睡眠.不可中斷睡眠指的是在此狀態的程式無法對外界訊號做出任何立即的響應，只有在為它提供足夠的正在等待的資源或是睡眠時間結束它才會開始執行。這類睡眠常見於硬體驅動程式等待磁碟或網路輸入輸出結束。當程序處於不可中斷睡眠狀態，睡眠期間的訊號會不斷堆積到佇列裡面去。在類Unix作業系統中，使用指令codice_6可以列出當前終端的全部程序，其中標識程序狀態的列使用程式碼 D 表示不可中斷睡眠。這類程序連codice_7這樣的無條件終止都沒辦法結束程序，結束他們最簡單的方法就是重新啟動系統。
metadata: erhwenkuo/wikipedia-zhtw
metadata: 睡眠 (系統呼叫)
metadata: https://zh.wikipedia.org/wiki?curid=6632853