等待佇列

等待佇列

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

基本介紹

  • 中文名:等待佇列
  • 特點:進程所組成的佇列
  • 系統: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;
}

相關詞條

熱門詞條

聯絡我們