複製鏈接
請複製以下鏈接發送給好友

等待隊列

鎖定
等待隊列,是指linux系統中進程所組成的隊列,就是需要其他事件的發生才會自己本身被喚醒的進程,也就是説這些進程本身是在等待其他某些進程為他 們提供進程發生的條件。他們是屬於消費者的,但是他們要消耗的東西還沒有產生,這些就是處於等待狀態的進程,組成了等待隊列。等待隊列很容易使用, 儘管它的設計很是微妙, 但不需要知道它的內部細節。 [1] 
中文名
等待隊列
特    點
進程所組成的隊列
系    統
linux系統
條    件
需要其他事件的發生

等待隊列操作方法

linux中的進程在系統執行的過程中會根據環境的不同而分成不同的狀態。 根據各個進程狀態的不同,從而分成了不同的隊列,包括等待隊列,就緒隊列等。等待隊列和就緒隊列的用途都很大。 [1] 
進程的狀態主要有以下幾種,Running---進程處 於運行(它是系統的當前進程)或者準備運行狀態(它在等待系統將CPU分配給它)。Waiting---進程在等待一個事件或者資源。 Stopped---進程被停止,通常是通過接收一個信號。正在被調試的進程可能處於停止狀態。Zombie(defunct)---僵死狀態。 [1] 

等待隊列使用案例

編寫Linux驅動程序的一個問題是"到底如何使用等待隊列呢" [1] 
處理等待隊列的最佳方式就是依照如下操作: [1] 
1. 聲明一個struct wait_queue * 變量. 你需要為每一個可以讓進程睡眠的事件預備這樣一個變量. 這就是我建議你放在描述硬件特性數據結構中的數據項. [1] 
2. 將該變量的指針作為參數傳遞給不同的sleep_on和wake_up函數. [1] 
這相當容易. 例如, 讓我們想象一下, 當進程讀你的設備時, 你要讓這個進程睡眠, 然後在某人向設備寫數據後喚醒這個進程. 下面的代碼就可以完成這些工作: [1] 
struct wait_queue *wq= NULL;
read_write_t sleepy_read(struct inode *inode, struct file *flip, char *buf, count_t count)
{
printk(KERN_DEBUG "process %i (%s) going to sleep\n", current->pid, current->comm);
interruptible_sleep_on(&wq);
printk(KERN_DEBUG "awoken %i (%s)\n", current->pid, current->comm);
return 0;
}
read_write_t sleepy_write(struct inode *inode, struct file *flip, char *buf, count_t count)
{
printk(KERN_DEBUG "process %i (%s) awakening the readers\n", current->pid, current->comm);
wake_up_interruptible(&wq);
return count;
} [1] 
參考資料
  • 1.    賀炎.Linux的進程調度策略.電子科技[M],2004年,第5期