'create_workqueue()'是否会创建一个新的工作线程?

时间:2017-01-18 03:32:06

标签: linux-kernel irq

我想使用create_workqueue()

创建新的工作队列

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

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

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

运行结果: running result

thread details

#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);

和Makefile

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

1 个答案:

答案 0 :(得分:1)

最初实现多线程(MT)Workqueue浪费了大量资源,提供的并发级别不尽如人意。

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

请阅读this了解工作队列的最新实施情况。

相关问题