等待隊列
等待隊列
等待隊列,是指linux系統中進程所組成的隊列,就是需要其他事件的發生才會自己本身被喚醒的進程,也就是說這些進程本身是在等待其他某些進程為他 們提供進程發生的條件。他們是屬於消費者的,但是現在他們要消耗的東西還沒有產生,這些就是處於等待狀態的進程,組成了等待隊列。等待隊列很容易使用,儘管它的設計很是微妙,但不需要知道它的內部細節。
linux中的進程在系統執行的過程中會根據環境的不同而分成不同的狀態。根據各個進程狀態的不同,從而分成了不同的隊列,包括等待隊列,就緒隊列等。等待隊列和就緒隊列的用途都很大。
進程的狀態主要有以下幾種,Running---進程處 於運行(它是系統的當前進程)或者準備運行狀態(它在等待系統將CPU分配給它)。Waiting---進程在等待一個事件或者資源。 Stopped---進程被停止,通常是通過接收一個信號。正在被調試的進程可能處於停止狀態。Zombie(defunct)---僵死狀態。
編寫Linux驅動程序的一個問題是" 到底如何使用等待隊列呢"
處理等待隊列的最佳方式就是依照如下操作:
1. 聲明一個struct wait_queue * 變數. 你需要為每一個可以讓進程睡眠的事件預備這樣一個變數. 這就是我建議你放在描述硬體特性數據結構中的數據項.
2. 將該變數的指針作為參數傳遞給不同的sleep_on和wake_up函數.
這相當容易. 例如, 讓我們想象一下, 當進程讀你的設備時, 你要讓這個進程睡眠, 然後在某人向設備寫數據后喚醒這個進程. 下面的代碼就可以完成這些工作:
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;
}