2017-01-18 6 views
3

Я хочу создать новую рабочую очередь с помощью create_workqueue()Создает ли новый рабочий поток? Create_workqueue()?

Автора книги я читал о разработке ядра говорит: «Эта функция создает все рабочие потоки (по одному для каждого процессора в системе) и подготавливает их к обрабатывать ».

Мой код, показанный в конце этого вопроса, создает ядро ​​и планирует работать в двух очередях. Один из них - это рабочий вопрос по умолчанию, а другой - настраиваемый рабочий вопрос. Они должны обрабатываться различными рабочими потоками.

Однако, я вижу, что в результатах (показаны ниже) оба обрабатываются одним и тем же процессом (PID 42501), который является нитью kworker2 на моей виртуальной машине.

результат Run: 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 

ответ

0

Первоначально реализовано на несколько нити (MT) Workqueue впустую много ресурсов, уровень параллелизма при условии, был неудовлетворительный.

Новый дизайн ввел, чтобы получить высокий уровень параллелизма. Функции «create_ * workqueue()» устарели и запланированы для удаления.

Пожалуйста, ознакомьтесь с this за последнюю реализацию рабочего времени.

Смежные вопросы