linux核心等待佇列方法

2021-06-24 11:23:32 字數 2210 閱讀 4875

當你在使用者空間需要讀寫一大片資料的時候,這個就用上了。

以下來自:

假設我們在 kernel 裡產生乙個 buffer,user 可以經由 read,write 等 system call 來讀取或寫資料到這個 buffer 裡。如果有乙個 user 寫資料到 buffer 時,此時 buffer 已經滿了。那請問你要如何去處理這種情形呢 ? 第一種,傳給 user 乙個錯誤訊息,說 buffer 已經滿了,不能再寫入。第二種,將 user 的要求 block 住, 等有人將 buffer 內容讀走,留出空位時,再讓 user 寫入資料。但問題來了,你要怎麼將 user 的要求 block 住。難道你要用

while ( is_full );

write_to_buffer;

這樣的程式**嗎? 想想看,如果你這樣做會發生什麼事? 第一,kernel會一直在這個 while 裡執行。第二個,如果 kernel 一直在這個 while 裡執行,表示它沒有辦法去 maintain系統的運作。那此時系統就相當於當掉了。在這裡 is_full 是乙個變數,當然,你可以讓 is_full 是乙個 function,在這個 function裡會去做別的事讓 kernel 可以運作,那系統就不會當。這是乙個方式。還有,你說可以在while裡面把buffer裡的內容讀走,再把is_full的值改了,但是我們會可能把重 要的資料在我們不想被讀的時候被讀走了,那是比較麻煩的,而且很不靈活.如果我們使用 wait_queue 的話, 那程式看起來會比較漂亮,而且也比較讓人了解,如下所示:

struct wait_queue_head_t wq; /* global variable */

declare_wait_queue_head (wq);

while ( is_full ) write_to_buffer();

interruptible_sleep_on( &wq ) 是用來將目前的 process,也就是要求寫資料到buffer 的 process放到 wq 這個 wait_queue 裡。在 interruptible_sleep_on 裡,則是最後會呼叫 schedule() 來做 schedule 的動作,誰呼叫了schedule誰就趴下,讓別人去執行,醒來就原地起來,執行schedule()後的**。那那個呼叫了schedule的傢伙什麼 醒過來呢?這時候就需要用到另乙個函式了wake_up_interruptible()了。

以下來自:

linux中最簡單的休眠方式是下面的巨集, 

wait_event(queue, condition)  

/* 程序將被置於非中斷休眠(uninterruptible sleep)*/

wait_event_interruptible(queue, condition) 

/*程序可被訊號中斷休眠,返回非0值表示休眠被訊號中斷*/

wait_event_timeout(queue, condition, timeout)    /*等待限定時間jiffy,condition滿足其一返回0*/

wait_event_interruptible_timeout(queue, condition, timeout)

queue是等待佇列頭,傳值方式

condition是任意乙個布林表示式,在休眠前後多次對condition求值,為真則喚醒

喚醒程序的基本函式是wake_up

void wake_up(wait_queue_head_t *queue); 

/*喚醒等待在給定queue上的所有程序*/

void wake_up_interruptible(wait_queue_head_t *queue); 

實踐中,一般是wait_event和

wake_up,

wait_event_interruptible和

wake_up_interruptible

成對使用。

【補充】其實看了那麼多,他們也沒有給個立即可用的步驟,寫blog嘛,就是分享心得。我基於2.6.24總結一下,希望對大家有幫助:

1、定義:wait_queue_head_t my_queue;

2、初始化init_waitqueue_head(&my_queue);

3、在乙個函式裡面等待:wait_event(queue, condition) ;(別在中斷裡面搞)

4、在另乙個函式裡面喚醒:wake_up(wait_queue_head_t *queue); (這個可以在中斷呼叫,去喚醒別的程序,特別是dma操作類的)

有好幾個等待和喚醒函式,大家可以慢慢試。

Linux核心等待佇列

在linux驅動程式設計中,可以使用等待佇列來實現程序的阻塞,等待佇列可看作儲存程序的容器,在阻塞程序時,將程序放入等待佇列,當喚醒程序時,從等待等列中取出程序。linux 2.6核心提供了如下關於等待佇列的操作 1 定義等待佇列 wait queue head t my queue 2 初始化等待...

Linux 核心等待佇列解析

在閱讀tun驅動時看到,有一些類似 add wait queue 的函式,這些函式正是執行等待佇列的相關操作,要說等待佇列還得從核心程序排程說起,核心排程系統內程序,分配時間片,但是有些程序如從網絡卡中讀資料,在網絡卡有資料到達之前程序處於阻塞狀態,如果此時給相應程序分配時間片做排程,無疑是浪費系統...

Linux 裝置驅動 核心等待佇列

在 linux 驅動程式設計中,可以使用等待佇列來實現程序的阻塞.等待佇列可以看作儲存程序的容器,在阻塞程序時,將程序放入等待佇列 當喚醒程序時,從等待佇列中取出程序.linux 2.6 核心提供了如下關於等待佇列的操作 wait queue head t my queue init waitque...