日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux工作队列

發(fā)布時(shí)間:2023/12/20 linux 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux工作队列 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這里對(duì)Linux的工作隊(duì)列(work_queue)不做深層次的挖掘,只對(duì)如何使用它以及一些簡(jiǎn)單的結(jié)構(gòu)做簡(jiǎn)單地介紹。

Linux源代碼(3.0.8)中和工作隊(duì)列(work_queue)相關(guān)的結(jié)構(gòu)主要在

include/linux/workqueue.h

這個(gè)頭文件中,這里就不摘抄了。這里就直接給出例子代碼,在結(jié)合稍作解釋:

#include <linux/module.h> #include <linux/init.h> #include <linux/workqueue.h>

static struct work_struct work;

static void work_handler(struct work_struct *data)
{
printk(“just a demo for work queue.\n”);
}

static int __init workqueue_init(void)
{
printk(“init work queue demo.\n”);
INIT_WORK(&work, work_handler);
schedule_work(&work);
return 0;
}

static void __exit workqueue_exit(void)
{
printk(“exit work queue demo.\n”);
}
MODULE_LICENSE(“GPL”);
MODULE_AUTHOR(“zhuqinggooogle@gmail.com”);
module_init(workqueue_init);
module_exit(workqueue_exit);

一個(gè)簡(jiǎn)單的工作隊(duì)列(work_queue)的演示就完成了。我們來(lái)編譯后,insmod到系統(tǒng)看看:

/mnt/3520d $ insmod hi_work_queue.ko
init work queue demo
just a demo for work queue.

從系統(tǒng)中rmmod看一下:

/mnt/3520d $ rmmod hi_work_queue
exit work queue demo.

如果你對(duì)Linux的工作隊(duì)列(work_queue)有稍微的了解,你看到這里會(huì)提問(wèn),“我們的工作隊(duì)列項(xiàng)提交到了哪個(gè)工作隊(duì)列線程上面呢?”,這就得從

schedule_work

函數(shù)入手。看一下其/**
* schedule_work - put work task in global workqueue
* @work: job to be done
*
* Returns zero if @work was already on the kernel-global workqueue and
* non-zero otherwise.
*
* This puts a job in the kernel-global workqueue if it was not already
* queued and leaves it in the same position on the kernel-global
* workqueue otherwise.
*/
int schedule_work(struct work_struct *work)
{
return queue_work(system_wq, work);
}
扯到

system_wq

這個(gè)全局變量,我們來(lái)看看他到底是什么。在

kernel/workqueue.c

這個(gè)文件的底部給出了定義:

system_wq = alloc_workqueue(“events”, 0, 0);

看到這就清楚了,剛才是把工作隊(duì)列項(xiàng)提交了默認(rèn)的工作線程events上的。那我們自己可以創(chuàng)建一個(gè)工作隊(duì)列線程嗎?可以把自己的工作隊(duì)列項(xiàng)提交到上面嗎?當(dāng)然,可以。下面給出一個(gè)demo代碼:

#include <linux/module.h> #include <linux/init.h> #include <linux/workqueue.h> static struct workqueue_struct *queue = NULL; static struct work_struct work; static void work_handler(struct work_struct *data) { printk("just a demo for work queue.\n"); } static int __init workqueue_init(void) { queue = create_singlethread_workqueue("workqueue demo");if (!queue) return -1; printk("init work queue demo.\n");INIT_WORK(&work, work_handler); queue_work("queue", &work); return 0; } static void __exit workqueue_exit(void) { printk("exit work queue demo.\n");destroy_workqueue(queue); } MODULE_LICENSE("GPL"); MODULE_AUTHOR("zhuqinggooogle@gmail.com"); module_init(workqueue_init); module_exit(workqueue_exit);

我們來(lái)insmod看一下:

/mnt/3520d insmodhiworkqueue.koinitworkqueuedemo.justademoforworkqueue./mnt/3520d
/mnt/3520d $ ps | grep “workqueue demo”
728 root 0 SW< [workqueue demo]

你會(huì)發(fā)現(xiàn)多了一個(gè)內(nèi)核線程workqueue demo,這就是我們代碼中自己創(chuàng)建的。

總結(jié)

以上是生活随笔為你收集整理的linux工作队列的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。