1买决、tasklet可以動(dòng)態(tài)分配契沫,也可以靜態(tài)分配带猴,數(shù)量不限。
2懈万、同一種 tasklet 在多個(gè)cpu上也不會(huì)并行執(zhí)行拴清,這使得程序員在撰寫(xiě) tasklet function 的時(shí)候比較方便靶病,減少了對(duì)并發(fā)的考慮(當(dāng)然損失了性能)。
3口予、tasklet 在軟件中斷上下文中運(yùn)行娄周,所以 tasklet 代碼必須是原子的。而工作隊(duì)列函數(shù)在一個(gè)特殊內(nèi)核進(jìn)程上下文運(yùn)行沪停,有更多的靈活性煤辨,且能夠休眠。
4木张、tasklet 執(zhí)行的很快, 短時(shí)期, 并且在原子態(tài),除了中斷top half可以搶占其執(zhí)行众辨,其他的進(jìn)程上下文(無(wú)論該進(jìn)程的優(yōu)先級(jí)多么的高)是不會(huì)影響其執(zhí)行的。
tasklet 提供了許多有趣的特色:
一個(gè) tasklet 能夠被禁止并且之后被重新使能; 它不會(huì)執(zhí)行直到它被使能與被禁止相同的的次數(shù).
如同定時(shí)器, 一個(gè) tasklet 可以注冊(cè)它自己.
一個(gè) tasklet 能被調(diào)度來(lái)執(zhí)行以正常的優(yōu)先級(jí)或者高優(yōu)先級(jí). 后一組一直是首先執(zhí)行.
taslet 可能立刻運(yùn)行, 如果系統(tǒng)不在重載下, 但是從不會(huì)晚于下一個(gè)時(shí)鐘嘀噠.
一個(gè) tasklet 可能和其他 tasklet 并發(fā), 但是對(duì)它自己是嚴(yán)格地串行的 -- 同樣的 tasklet 從不同時(shí)運(yùn)行在超過(guò)一個(gè)處理器上. 同樣, 如已經(jīng)提到的, 一個(gè) tasklet 常常在調(diào)度它的同一個(gè) CPU 上運(yùn)行.
tasklet 使用:
Tasklet 的使用比較簡(jiǎn)單舷礼,只需要定義tasklet及其處理函數(shù)并將兩者關(guān)聯(lián)
例子:
Void my_tasklet_func(unsigned long)
靜態(tài)創(chuàng)建:static DECLARE_TASKLET(my_tasklet,my_tasklet_func,data)
動(dòng)態(tài)創(chuàng)建:void tasklet_init(struct tasklet_struct t,
void (func)(unsigned long), unsigned long data)
代碼 DECLARE_TASKLET 實(shí)現(xiàn)了定義名稱(chēng)為 my_tasklet 的 tasklet 并將其與 my_tasklet_func 這個(gè)函數(shù)綁定鹃彻,而傳入這個(gè)函數(shù)的參數(shù)為data。
需要調(diào)度 tasklet 的時(shí)候引用一個(gè) tasklet_schedule() 函數(shù)就能使系統(tǒng)在適當(dāng)?shù)臅r(shí)候進(jìn)行調(diào)度妻献,如下所示
Tasklet_schedule(&my_tasklet
tasklet_schedule:將tasklet加入到調(diào)度鏈表里面蛛株,tasklet就能得到執(zhí)行,每調(diào)用這個(gè)函數(shù)一次育拨,tasklet只能執(zhí)行一次泳挥,要再次執(zhí)行需要重新調(diào)用這個(gè)函數(shù)。
tasklet_hi_schedule:比tasklet_schedule優(yōu)先級(jí)更高至朗,可以得到更快處理屉符。
tasklet_hi_schedule_first:和tasklet_hi_schedule差不多,只是更安全锹引。
tasklet_disable:禁止tasklet矗钟,即使tasklet_schedule已經(jīng)把tasklet調(diào)度鏈表里,也得不到執(zhí)行嫌变,必須要用tasklet_enable使能才可以吨艇。如果當(dāng)前tasklet正在運(yùn)行,tasklet_disable會(huì)等待執(zhí)行完腾啥,然后禁止东涡,返回。
tasklet_disable_nosync:和tasklet_disable一樣倘待,如果當(dāng)前tasklet在運(yùn)行疮跑,這個(gè)函數(shù)不會(huì)等待完成就先返回,當(dāng)tasklet完成退出后凸舵,再禁止祖娘。
tasklet_enable:使能tasklet,和tasklet_disable要成對(duì)使用啊奄。
tasklet_kill:設(shè)備關(guān)閉和模塊卸載的時(shí)候渐苏,調(diào)用來(lái)殺死tasklet掀潮。如果當(dāng)前tasklet在運(yùn)行,會(huì)等待完成后琼富,再殺死仪吧。
tasklet_init:初始化tasklet。