驅動學習之延時機制(tasklet與工作佇列)

2021-10-09 12:50:12 字數 2238 閱讀 6344

tasklet是softirq的一種,根據優先順序的不同,核心將tasklet分為兩種,在softirq中對應tasklet_softirq和hi_softirq,後者優先順序高於前者。

說起來tasklet的機制,不知道從何說起,這裡我簡單說一下我的總體理解:

首先tasklet是執行在中斷上下文的,所以不能有睡眠的操作。這裡可能剛開始接觸會有疑問,不是延遲機制嗎?為什麼不能睡眠,那還有啥用?這裡說一下,中斷處理的時候,由於要關閉中斷,時間太長可能會對系統造成影響,所以頂半部會很快的處理完然後開啟中斷,這個時候進入底半部也就是tasklet部分的話,這個時候雖然中斷開啟了,但是還是在中斷上下文中執行tasklet的執行函式,所以如果有睡眠等操作,會被排程器排程出去。由於是中斷上下文,排程器無法找到,所以不能有睡眠等。(不知道這裡理解對不對)

tasklet在核心中實現的辦法就是初始化的時候,中斷型別為tasklet_softirq和hi_softirq都會初始化乙個自己對應的鍊錶,當我們呼叫tasklet_schedule提交乙個我們在驅動程式中定義的tasklet的時候,我們的tasklet會作為乙個節點加入到tasklet_softirq所對應的的鍊錶中,然後當中斷到來的時候,執行到底半部的時候,如果中斷型別為tasklet_softirq對應的鍊錶中有我們提交的未被執行的節點的時候,就會執行我們提交的節點中的成員函式。

通過tasklet機制,我們可以把我們不著急的**都放在tasklet執行函式中,掛載到鍊錶中,等待執行。這就是延時;

上面說了下機制,但是可能只是我自己能看懂,這裡不追求完美了,直接列出驅動中實現吧:

1.分配物件

struct tasklet_struct

;2.初始化物件

void tasklet_init(struct tasklet_struct *t,void (*func)(unsigned long), unsigned long data)

3.呼叫tasklet處理函式執行

tasklet_schedule(struct tasklet_struct *t)

工作佇列是另外一種實現延時的方法。這裡簡單分析一下原理及驅動中實現的方法。

驅動中使用的辦法:

1.分配物件

declare_work(n, f)

struct work_struct

struct work_struct work;

2.初始化

init_work(&work, _func)

3.建立乙個工作佇列

create_workqueue(struct workqueue wq)

4.將工作節點加入到隊裡中

queue_work(struct workqueue wq,work_struct work)

queue_delayed_work(struct workqueue wq,work_struct work,unsigned long delay)//等待delay時間之後,才提交等到佇列。

int schedule_work(struct work_struct *work)(將工作節點直接新增到系統自己的工作佇列中)

5.驅動解除安裝時釋放資源

destroy_workqueue(struct workqueue w)

實現機制:

上面的圖描述了工作佇列的實現框架,我們可以看到,工作隊裡裡面包含了很多東西。我這裡大概描述一下機制,對它有個大概的了解:

首先我們需要建立乙個工作佇列(linux系統初始化的時候,會建立乙個keventd_eq的工作佇列,我們也可以使用)。

生成乙個執行緒worker_thread,linux核心中所謂的執行緒其實是乙個程序,並將新的程序加入到系統的執行佇列中,這樣就可以被排程,同時會先把改程序睡眠在該工作佇列的等待佇列頭上。

然後我們通過queue_work(schedule_work向核心自己的工作佇列中新增)將我們自己建立的工作節點work,新增到工作佇列中的worklist鍊錶中。

worker_thread會迴圈檢測,一旦發現我們將新的work提交到worklist,就會醒來呼叫這個work節點中的func函式。處理完之後除非再次被提交,否則不會再次出現在工作佇列中了。

當驅動解除安裝是,我們應該從記憶體中刪除用到的等待佇列。

等待佇列不需要依賴於中斷執行,隨時可以執行。

等待佇列因為是單獨的程序裡面執行延遲的函式,所以允許睡眠等操作。這是跟tasklet的本質上的不同。

RabbitMQ延時機制

延遲佇列 延遲佇列 訊息進入到佇列之後,延遲指定的時間才能被消費者消費 amqp協議和rabbitmq佇列本身是不支援延遲佇列功能的,但是可以通過ttl time to live 特性模擬延遲佇列的功能 ttl就是訊息的存活時間。rabbitmq可以分別對佇列和訊息設定存活時間 使用延遲佇列實現訂單...

Linux定時延時機制

1 at time time為具體時間,表示在某個時間執行某個任務 at now 表示在距離現在 時間後,執行某個任務 按ctrl d 表示儲存退出互動模式 2 at命令引數詳解 at l at q 檢視當前待執行任務 root localhost at l 6 tue oct 31 19 02 0...

Linux系統延時和定時機制

背景 人不可能時時刻刻在電腦面前,有時候也存在資源占用問題,因此如果可以延時操作或者定時操作,那將方便許多,今天就來介紹這兩種方法 一 系統延時 1 at命令 1 at 具體時間表示在將來的特定時間執行你的操作 1 我們可以先在 下建立乙個add檔案 用watch n 1 ls l add 監控 2...