1. 程式人生 > >Linux2.6核心--中斷下半部實現方法 工作佇列

Linux2.6核心--中斷下半部實現方法 工作佇列

      工作佇列子系統是一個用於建立核心執行緒的介面,通過它建立的程序負責執行由核心其他部分排到佇列裡的任務。它建立的這些核心執行緒稱作工作者執行緒。工作佇列可以讓你的驅動程式建立一個專門的工作者執行緒來處理需要退後的工作。不過,工作佇列子系統提供了一個預設的工作者執行緒來處理這些工作。因此,工作佇列最基本的表現形式,就轉變成了一個把需要退後執行的任務交給特定的通用執行緒的這樣一種介面。

      預設的工作者執行緒叫做 events/n ,這裡 n 是處理器的編號;每個處理器對應一個執行緒。預設的工作者執行緒會從多個地方得到被推後的工作。許多核心驅動程式都把它們的下半部交給預設工作者執行緒去處理。除非一個驅動程式或者子系統必須建立一個屬於它自己的核心執行緒,否則最好使用預設執行緒。

      說到這裡,就需要分析下這種執行下半部的特點了。

      它是唯一能在程序上下文中執行的下半部實現機制,也只有它才可以睡眠。這意味著你需要獲得大量的記憶體時,在你需要獲取訊號量時,在你需要執行阻塞式的 IO 操作時,它都會非常有用。

      下面首先給出一張圖解釋工作者執行緒的層次:


      由這張圖可以看出,工作者執行緒位於最高的一層。系統中允許有多種型別的工作者執行緒存在。對於指定的一個型別,系統的每個 CPU 上都有一個該類的工作者執行緒。

      工作位於最底層,這些表示的就是你的驅動程式建立的這些需要退後執行的工作。

      大部分驅動程式都使用的是現存的預設工作者執行緒。它們使用起來簡單方便。可是,在有些要求嚴格的情況下,驅動程式需要自己的工作者執行緒,這時,就需要驅動程式建立一個屬於自己的工作者執行緒。

      下面,我們來看下工作者執行緒的執行函式 run_workqueue():

while(!list_empty(&cwq-worklist))
{
	struct work_struct *work;
	work_fun_t f;
	void *data;
	
	work = list_entry(cwq->worklist.next, struct work_struct, entry);
	f = work->func;
	list_del_init(cwq->worklist.next);
	work_clear_pending(work);
	f(work);
}

      該函式迴圈遍歷連結串列上每個待處理的工作,執行連結串列每個節點上的 workqueue_struct 中的 func 成員函式:

      1.當連結串列不為空時,選取下一個節點物件

      2.獲取我們希望執行的函式 func 及其引數 data 

      3.把該節點從連結串列上解下來,將待處理標誌位 pending 清零

      4.呼叫函式

      5.重複執行

相關推薦

Linux2.6核心--中斷半部實現方法 工作佇列

      工作佇列子系統是一個用於建立核心執行緒的介面,通過它建立的程序負責執行由核心其他部分排到佇列裡的任務。它建立的這些核心執行緒稱作工作者執行緒。工作佇列可以讓你的驅動程式建立一個專門的工作者執

linux 觸控式螢幕驅動中斷半部實現-工作佇列

工作佇列(work queue)是Linux kernel中將工作推後執行的一種機制。這種機制和BH或Tasklets不同之處在於工作佇列是把推後的工作交由一個核心執行緒去執行,因此工作佇列的優勢就在於它允許重新排程甚至睡眠。工作佇列可以把工作推後,交由一個核心執行緒去執

中斷半部機制之工作佇列詳解

工作佇列的使用方法和tasklet 非常相似,下面的程式碼用於定義一個工作佇列和一個底半部執行函式。 struct work_struct my_wq; /*定義一個工作佇列*/ void my_wq_func(unsigned long); /*定義一個處理函式*/ 通過INIT_W

《Linux內核設計與實現》讀書筆記(八)- 中斷半部的處理

sym dmesg 重新編譯 warn dad style lsp 之前 res 在前一章也提到過,之所以中斷會分成上下兩部分,是由於中斷對時限的要求非常高,需要盡快的響應硬件。 主要內容: 中斷下半部處理 實現中斷下半部的機制 總結中斷下半部的實現 中斷實現

中斷半部的妙用

中斷下半部 中斷處理程式是核心中很重要的一部分,但是由於本身存在著一些限制,所以他只能完成整個中斷處理程式中的上半部分。 具體侷限如下: 中斷處理程式是以非同步方式執行,並且他有可能會打斷其他重要的程式碼(甚至有可能是其他的中斷程式)的執行,因此為了避免被打斷的程式碼停止時間過

外部中斷和內部中斷中斷中斷 中斷半部

重要宣告: 以下程式碼有貼上 擷取他人勞動成果的成分 如有雷同 不勝榮幸 如您不能容忍 請不要獨自忍受@weChat:iisssssssssii 聯絡小民 主動刪除     中斷含義:  { 中斷是CPU處理外部突發事件的一個重要技術。它能使CPU在執行過程中對外部事件發

中斷半部_工作佇列(work queue)

1>work_queue:<linux/workqueue.h> __3.0.4 2>description: 中斷下半部,在核心執行緒的程序上下文中執行推後的工作. 它是唯一能在程序上下文執行的中斷下半部實現機制,也只有它才可以睡眠. 3>建

中斷半部-軟中斷

1 軟中斷概述 軟中斷是實現中斷下半部的一種手段,與2.5以前版本的BH機制不同。軟中斷可以同時執行在不同的CPU上。 1.1 軟中斷的表示 核心中用結構體softirq_action表示一個軟中斷。軟中斷是一組靜態定義的介面,有32個。但是核心(2.

Linux2.6 核心的 Initrd 機制解析

initrd 的英文含義是 boot loader initialized RAM disk,就是由 boot loader 初始化的記憶體盤。在 linux核心啟動前, boot loader 會將儲存介質中的 initrd 檔案載入到記憶體,核心啟動時會在訪問真正的根檔

softirq(軟中斷)半部中tasklet與workqueue的區別,整合

一、中斷處理的tasklet(小任務)機制 中斷服務程式一般都是在中斷請求關閉的條件下執行的,以避免巢狀而使中斷控制複雜化。但是,中斷是一個隨機事件,它隨時會到來,如果關中斷的時間太長,CPU就不能及

linux裝置驅動歸納總結(六):3.中斷半部之tasklet

linux裝置驅動歸納總結(六):3.中斷的上半部和下半部——tasklet xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 一、什麼是下半部 中斷是一個很霸道的東西,處理

Linux核心多執行緒實現方法

參考:http://blog.csdn.net/sharecode/article/details/40076951 1.建立執行緒方法1 kthread_create:       建立執行緒;改函式建立執行緒後,不會馬上執行

10. 中斷半部---工作佇列

————————————————– 方法一 四部走 0. strunt work_queue{ //定義工作佇列物件 struct workqueue_struct *mywq; s

主要的中斷半部及其區別

中斷下半部主要有:軟中斷,tasklet,工作佇列 區別 1. 軟中斷和tasket是不可以睡眠的,任務佇列在程序上下問執行是可以睡眠的。 2.相同的軟中斷可以在不同的cpu上同時執行,型別相同的tasklet不可以同時執行,不同型別的軟中斷可以在不同的cpu同時執行

(六)3中斷半部工作佇列

1、工作佇列的使用 按慣例,在介紹工作佇列如何實現之前,先說說如何使用工作佇列實現下半部。 步驟一、定義並初始化工作佇列: 建立工作佇列函式: struct workqueue_struct *create_workqueue(const char *nam

Linux2.6核心(CentOS)中編譯核心模組的一個例子

使用的簡單測試記憶體原始檔hello.c: ------------------------------------------------------------------------- #include <linux/module.h>      /* Needed by all mod

5.Linux核心設計與實現 P39---linux2.6 CFS排程演算法分析(轉)

1.概述      CFS(completely fair schedule)是最終被核心採納的排程器。它從RSDL/SD中吸取了完全公平的思想,不再跟蹤程序的睡眠時間,也不再企圖區分互動式程序。它將所有的程序都統一對待,這就是公平的含義。CFS的演算法和實現都相當簡單,眾多的測試表明其效能也非常優越。   

iscsitarget 在Linux2.6.32核心上編譯 若干編譯錯誤與解決方法(備忘)

#make make -C usr make[1]: Entering directory `/work/iscsitarget-0.4.16/usr' cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include 

Linuxc實現域名轉IP的方法封裝

rrd dbv mvm com inf adk lan fad bho 蝕古戮一爸下戀墩諂棧鐘啥材諭http://jz.docin.com/kjr58937 囪弛探刻煌俺厴嘲蹤以洶趴敵柿http://www.docin.com/app/user/userinfo?useri

dede織夢調用頂級二級欄目及三級欄目方法(數據庫實現)

很多 limit -- str 名稱 list 自帶 如果 效果 上次有說道能調用織夢的二級欄目今天來說道說道調用三級,乃至無限極 ①:通過dede調用二級欄目大家都會調用,但要調用三級欄目,就有點麻煩了,如下樣式的三級欄目dede如何調用呢?如下: --------