本文共 1406 字,大约阅读时间需要 4 分钟。
工作队列 实际上就是 一个 内核线程维护了 一个 工作包队列, 这个线程叫做工作者线程然后 其他的内核线程或者中断处理程序 只需要创建 工作包, 然后 插入到工作包队列中, 并唤醒 工作者 线程此时 工作者线程就是一股脑的 开始 把工作包 队列 中 的 工作包 全部给 干完,干完就睡觉例如 你扔进去 一个 包 : 包名叫做 写一个 linux 内核, 然后 工作者醒了之后,就开始 写 linux 内核, 写完了之后就开始睡觉.当然写linux内核期间也是可以小憩的(工作者线程被调度出去).
//TODOLinux中的Workqueue机制就是为了简化内核线程的创建。通过调用workqueue的接口就能创建内核线程。并且可以根据当前系统CPU的个数创建线程的数量,使得线程处理的事务能够并行化。workqueue是内核中实现简单而有效的机制,他显然简化了内核daemon的创建,方便了用户的编程.工作队列(workqueue)是另外一种将工作推后执行的形式.工作队列可以把工作推后,交由一个内核线程去执行,也就是说,这个下半部分可以在进程上下文中执行。最重要的就是工作队列允许被重新调度甚至是睡眠
//TODO
工作队列运行在 内核空间, 不涉及任何用户空间的事情
内核线程 kthread_create调度 wake_up_process
一般工作队列机制会被用作 中断的底半部
工作队列中的线程是 普通线程create_workqueue alloc_workqueue __alloc_workqueue_key rescuer->task = kthread_create(rescuer_thread, rescuer, "%s", wq->name);中断线程化中的线程是 实时线程,优先级是 50request_threaded_irq __setup_irq struct task_struct *t; static const struct sched_param param = { .sched_priority = MAX_USER_RT_PRIO/2, }; t = kthread_create(irq_thread, new, "irq/%d-%s", irq, new->name); sched_setscheduler_nocheck(t, SCHED_FIFO, ¶m); 工作者线程 和 中断线程化的线程 都是在 进程上下文中,因为他们都由 task_struct 结构体表示
init_workqueues 中创建的 工作者线程 system_wq = alloc_workqueue("events", 0, 0);
转载地址:http://waigi.baihongyu.com/