softirq(中断下半部机制,比如tasklet)有一个共同的缺点,就是在中断上下文里执行,因此,它们都不能睡眠,而工作队列可以允许在进程上下文,它是驱动程序可以使用的另一种延迟执行的机制。
一、工作队列的层次
工作队列在总体上分工作者线性、工作队列和工作项3个层次:
1)工作者线程
是一系列被组织在线程池中的内核线程,其数量可以根据需要动态增减。每个逻辑CPU有二个工作者线程池,其中一个为普通优先级工作者线程池,另一个为高优先级工作者线程池,除此之外另有一个不跟特定CPU关联的全局工作者线程池。
每个工作者线程池用一个struct worker_pool描述。
/*工作者线程的初始量为2*N+1个,其中N为逻辑CPU个数,意味着每个线程池中的初始数量为1,它们具有
如下形式的名字:
kworker/n:x -- 普通的每个CPU工作者线程,n表示CPU编号,x表示线程编号。