程序的睡眠是通過呼叫sleep_on函式,該函式修改了程序的狀態並且通過schedule函式切換到其他程序執行,從而實現程序的掛起,task_uninterruptible狀態的程序只能被wake_up函式喚醒。task_interruptible狀態的程序可以被wake_up和訊號喚醒。喚醒的時候也是通過修改程序的狀態為可執行,然後等待下一次程序排程,被喚醒的程序不一定馬上得到執行。
}
// 當前程序掛載到睡眠佇列p中,p指向佇列頭指標的位址
void
sleep_on
(struct task_struct *
*p)void
interruptible_sleep_on
(struct task_struct *
*p)// 類似sleep_on的原理
*p=null;if
(tmp)
tmp->state=0;
}// 喚醒佇列中的第乙個節點,並清空鍊錶,因為第乙個節點會向後喚醒其他節點
void
wake_up
(struct task_struct *
*p)}
Linux 0 11中程序睡眠和喚醒機制思考
在linux 0.11中,當程序嘗試訪問乙個邊界資料時,有可能由於資源已經被占用而進入睡眠狀態。當資源被釋放後,就需要把睡眠的程序喚醒。我們先來看乙個包括睡眠和喚醒步驟的實際情況 1.程序a在訪問硬碟某區塊bh時發現這一塊並不在告訴快取中,進而發起請求讀取硬碟 此時不一定會立即排程 2.隨後程序排程...
linux0 11程序排程分析
10ms時鐘中斷 時鐘中斷函式timer interrupt,將jiffier加1 呼叫do timer函式,將當前程序counter計數減1,如果 counter大於0,則返回繼續執行該任務,否則 呼叫schedule函式,如下 void schedule void if p signal blo...
程序喚醒與睡眠
使用睡眠與喚醒避免忙等待 在前一節如何避免多程序 執行緒 因競爭條件引發的錯誤?我們提出了集中能保證多個程序互斥訪問臨界區,我們所提出的解決方案均使用忙等待策略,即在程序等待進入臨界區時,其持續檢查,直到能夠進入臨界區為止 我們能否在程序未滿足下一步工作條件時進入休眠狀態,當程序滿足下一步工作條件時...