我想使用 create_workqueue() 创建一个新的工作队列

我正在阅读的关于内核开发的书的作者说“这个函数创建所有的工作线程(一个用于系统中的每个处理器)并准备它们来处理工作。”

我的代码显示在这个问题的末尾,创建了一个内核并安排了两个队列的工作。一个是默认工作队列,另一个使用自定义工作队列。它们应该由不同的工作线程处理。

但是,我在结果中看到(如下所示)两者都由同一个进程(PID 42501)处理,这是我虚拟机中的线程 kworker2

运行结果:

#include <linux/workqueue.h> 
#include "kn_common.h" 
#include <linux/sched.h> 
 
MODULE_LICENSE("Dual BSD/GPL"); 
 
static void my_work_func(struct work_struct *work){ 
    long ID; 
    printk(KERN_ALERT"=============\n"); 
    print_current_time(0); 
    ID = current->pid; 
    printk(KERN_ALERT"my workqueue function is called!.... pid = %ld\n", ID); 
    printk(KERN_ALERT"=============\n"); 
} 
 
static void my_work_custom_func(struct work_struct *work){ 
    long ID; 
    printk(KERN_ALERT"=============\n"); 
    print_current_time(0); 
    ID = current->pid; 
    printk(KERN_ALERT"my customize workqueue is called!... pid = %ld\n", ID); 
    printk(KERN_ALERT"=============\n"); 
} 
 
DECLARE_WORK(mywork, my_work_func); 
 
static int testworkqueue_init(void){ 
    struct workqueue_struct *myworkqueue = create_workqueue("myworkqueue"); 
 
    // init a work_struct dynamically use pointer 
    struct work_struct *mywork2; 
    mywork2 = kmalloc(sizeof(struct work_struct), GFP_KERNEL); 
    INIT_WORK(mywork2, my_work_custom_func); 
 
    flush_scheduled_work(); 
 
    // schedule work 
    schedule_work(&mywork); 
 
    // flush customized workqueue 
    flush_workqueue(myworkqueue); 
    queue_work(myworkqueue, mywork2); 
 
    return 0; 
} 
 
static void testworkqueue_exit(void){ 
    printk(KERN_ALERT"*************\n"); 
    print_current_time(0); 
    printk(KERN_ALERT"testworkqueu exit\n"); 
    printk(KERN_ALERT"*************\n"); 
} 
 
module_init(testworkqueue_init); 
module_exit(testworkqueue_exit); 

和生成文件

obj-m += myworkqueue.o 
myworkqueue-objs := testworkqueue.o kn_common.o 
 
 
CURRENT_PATH := $(shell pwd) 
 
LINUX_KERNEL := $(shell uname -r) 
# you may change this to your own kernel src path 
LINUX_KERNEL_PATH := /lib/modules/$(LINUX_KERNEL)/build 
 
all: 
    make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules 
    rm -rf modules.order Module.symvers .*.cmd *.o *.mod.c .tmp_versions *.unsigned 
 
clean: 
    rm -rf modules.order Module.symvers .*.cmd *.o *.mod.c *.ko .tmp_versions *.unsigned 

请您参考如下方法:

最初实现的Multi thread(MT) Workqueue浪费了很多资源,提供的并发水平也不尽如人意。

引入了新设计以获得高并发度。函数“create_*workqueue()”已弃用并计划删除。

请阅读this工作队列的最新实现。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!