2014-09-28 2 views
0

Пожалуйста, может ли один помочь мне, чтобы понять разницу между указанным ниже API, в ядре Linux:WorkQueue реализация в Linux Kernel

struct workqueue_struct *create_workqueue(const char *name); 
struct workqueue_struct *create_singlethread_workqueue(const char *name); 

Я написал модули образца, когда я пытаюсь увидеть их с помощью «PS -aef» , оба создали рабочий вопрос, но я не мог видеть никакой разницы.

я говорил http://www.makelinux.net/ldd3/chp-7-sect-6, и в соответствии с LDD3:

Если вы используете create_workqueue, вы получите workqueue, который имеет выделенный поток для каждого процессора в системе. Во многих случаях все эти потоки просто излишни; если одного рабочего потока будет достаточно, создайте вместо этого workqueue с create_singlethread_workqueue.

Но я не смог увидеть несколько рабочих потоков (каждый для процессора).

ответ

1

Рабочие места изменились с тех пор, как была написана LDD3.

Эти две функции фактически являются макросами:

#define create_workqueue(name)           \ 
     alloc_workqueue("%s", WQ_MEM_RECLAIM, 1, (name)) 
#define create_singlethread_workqueue(name)        \ 
     alloc_workqueue("%s", WQ_UNBOUND | WQ_MEM_RECLAIM, 1, (name)) 

Документация alloc_workqueue говорит:

Выделяют workqueue с заданными параметрами. Подробную информацию о флажках WQ_ * см. В Documentation/workqueue.txt.

Этот файл слишком большой, чтобы процитировать полностью, но он говорит:

alloc_workqueue() выделяет WQ. Оригинальные функции create_*workqueue() устарели и назначены для удаления.
[...]
Wq больше не управляет ресурсами исполнения, но служит в качестве домена для атрибутов прогресса вперед, флеша и рабочих элементов.

-1
if(singlethread){ 

    cwq = init_cpu_workqueue(wq, singlethread_cpu); 
    err = create_workqueue_thread(cwq, singlethread_cpu); 
    start_workqueue_thread(cwq, -1); 

}else{ 

    list_add(&wq->list, &workqueues); 
    for_each_possible_cpu(cpu) {  
       cwq = init_cpu_workqueue(wq, cpu); 
       err = create_workqueue_thread(cwq, cpu); 
       start_workqueue_thread(cwq, cpu); 
    } 
} 
+6

Хотя этот код может ответить на вопрос, обеспечивая дополнительный контекст относительно того, почему и/или, как этот код отвечает на вопрос улучшает долгосрочную ценность. – kayess