Linux内核新旧工作队列机制的剖析和比较(2)
1.3新工作队列机制的改进
1)由内核根据处理需求,控制工作者线程的创建和销毁,避免创建过多的内核线程。在工作队列空闲时,新机制中的线程数大致为( N + 1 ) * 2,工作队列数量与内核线程数基本无关(除非工作队列设置WQ_RESCUER标志,见1.4节)。这个改进大大减少内核资源的消耗。
2)同一CPU上一个工作队列中的工作可以并发的处理。这种并发处理方式相比旧机制的严格串行,提高了处理效率。在每个CPU上,一个工作队列中可并发处理的工作数目是有限制的(见1.4节max_active参数),当达到限制时,将不再唤醒新的工作者线程。
3)创建工作队列时可以指定工作队列的属性。用户可以根据工作性质的不同创建不同的工作队列,如高优先级的(WQ_HIGHPRI)、未绑定的(WQ_UNBOUND)、不可重入的(WQ_NON_REENTRANT)、带救援者线程的(WQ_RESCUER)[3][5]等。在图1中,gcwq的worklist链表中的工作分为高优先级的工作和普通优先级的工作两类,高优先级的工作排在链表头部,普通优先级的工作排在链表尾部,同一类别的工作之间按照提交的顺序排列。而在旧工作队列机制中则没有这些属性,工作按照提交的顺序被执行。
图1 gcwq的worklist链表中的工作分布
4)新工作队列机制提供4个预定义工作队列,方便用户使用工作队列。这四个预定义的工作队列分别为events、events_long、events_nrt、events_unbound。其中events是普通工作队列,要求其中的工作执行时间尽量短;需要长时间处理的工作可以提交到events_long队列中;events_nrt是不可重入工作队列,其中的工作将不会在多个CPU上并发执行;events_unbound队列就是设置了WQ_UNBOUND标志的队列,只要处理的工作数量未达到限制,其中的工作就可以立即被处理。用户可以根据需要使用这4个预定义工作队列,当然也可以自己创建工作队列。
1.4 创建工作队列
调用下面的宏创建一个工作队列:alloc_workqueue(name, flags, max_active)。
参数name:指定工作队列的名称。
参数flags:标志位,指明工作队列的属性,摘要解释如下:
WQ_NON_REENTRANT:默认时,工作队列中的多个同一种类的工作,在一个CPU上不可重入,但是允许在不同CPU上重入(即允许在不同CPU上并发的处理)。如果设置此标志,则工作队列中的多个同一种类的工作在不同CPU上也不可重入。此时工作可能需要从响应中断的CPU迁移到另一个CPU上:当中断产生工作时,如果以前产生的同类工作正在另一个CPU上处理,则将该工作提交到这个CPU上。
WQ_UNBOUND:如果设置此标志,则内核将为工作队列设置WQ_HIGHPRI标志,其上的工作都将插入到unbound_global_cwq的worklist链表上。unbound_global_cwq中工作将按照提交的顺序被处理。通常,为了更好地利用CPU缓存,工作在所提交的CPU上处理,而unbound_global_cwq中的工作者线程未与特定的CPU绑定,其中的工作可能运行在任意一个CPU上,因此无法有效利用CPU缓存。此标志是为需要大量CPU周期的工作设置的,此时各个CPU的负载均衡更为重要,所以此类工作最好由调度器决定在哪一个CPU上运行。
WQ_RESCUER:如果设置此标志,则为工作队列专门创建一个救援者线程(Rescure Thread)。创建救援者线程的目的是避免长时间的等待或死锁。由于内核创建工作者线程时使用GFP_KERNEL标志来分配内存,可能导致创建过程长时间阻塞,因此在创建时,内核设置一个定时器mayday_timer。如果定时器超时,但线程仍未创建成功,那么内核就唤醒各个工作队列中的救援者线程,执行rescuer_thread函数处理的剩余工作。所有在处理时可能与内存回收执行路径重叠的工作队列,必须设置这个标志。
WQ_HIGHPRI:如果设置此标志,则该工作队列中的工作都是高优先级的,其中的工作将被插入到目标gcwq的工作列表worklist的最后一个高优先级工作后面,即高优先级的工作排在worklist队列头,且依据提交的顺序被处理。只要资源可用,总是尽可能快地处理高优先级工作。
参数max_active:一个工作队列在每个CPU上可能并发执行的最大工作数目。对绑定的工作队列,max_active最大值512;默认值为0,此时max_active为256;对于未绑定的工作队列,max_active的最大值为max(512, 4 * num_possible_cpus())。建议内核开发者使用默认值。
2 实验设计和结果
通过两个实验来对比新旧工作队列机制的资源消耗和工作效率,实验环境如表1所示。
表1 实验环境
2.1新旧工作队列机制中可创建的最大工作队列数
表2 最大工作队列数
在本实验中,测试机器的pid_max设置为32768。由表2可以看出,在旧工作队列机制中,可创建的工作队列数目随着CPU数目的增加而减少,主要受限于内核可创建的线程数;在新工作队列机制中,可创建的工作队列数目随着内存的增加而增加,与系统可创建的最大线程数无关。新工作队列机制中的最大工作队列数主要受限于内核可分配的percpu空间。这是因为每创建一个工作队列都需要分配一定大小且地址对齐的percpu空间,随着创建的工作队列数的增加,内核中将没有可用的percpu空间,从而导致创建工作队列失败。
2.2在新旧工作队列机制中,同一CPU上一个工作队列中10个工作的执行效率的比较
实验所用的工作队列不带任何标志位,每个工作分别有三种休眠时间0s、1s或5s,用来模拟处理的时间。新工作队列机制的并发工作数有1、5、256三种情况。实验结果见表3。
表3 同一CPU上一个工作队列中10个工作的处理时间
如果所有工作都不休眠或者max_active等于1,则新旧工作队列机制下10个工作的处理时间基本相同。当工作有休眠且max_active大于1时,一旦处理工作的线程休眠,则内核立即唤醒新的线程执行后继的工作,直到正在执行的工作数等于max_active。实验结果表明,新工作队列机制可以显著提高处理的效率。
3 结束语
旧工作队列机制应用于大规模多处理器硬件平台会耗费大量的内核资源,工作的处理效率也很低。以往的补救方法是使用专用线程工具。Linux2.6.36内核开发受控并发工作队列,由内核“按需分配”工作者线程,大大减少内核资源的耗费;同时,工作可以并发处理,提高了处理效率。新机制提供的通用的线程池有望替代内核中专用线程池,成为中断驱动程序设计的强有力的工具。
新工作队列机制的设计也存在一些缺陷。首先,优先级只分为高优先级和普通优先级,略显粗糙,无法区分一个工作队列中不同工作之间的差别。其次,工作队列的优先级与内核线程的优先级无关,在资源比较紧张时,可能无法满足硬实时任务的需要。再有,max_active参数的设置不是针对一个工作队列,而是针对一个CPU上所有工作队列,也不够灵活。如果这些问题得到改进,新机制将能更方便地应用于实时系统。
参考文献:
[1] Tejun Heo .backing-dev: replace private thread pool with workqueue.txt [EB/OL]. [2010-09].http://lwn.net/Articles/403653.
[2] 陈学松.深入Linux设备驱动程序内核机制[M].北京:电子工业出版社,2012:214-230.
[3] Tejun Heo.workqueue.txt [EB/OL]. [2010-09].http://lxr.linux.no/linux+v-2.6.36.4/Documentation/workqueue.txt.
[4] Jonathan Corbet .Concurrency-managed workqueues [EB/OL]. [2010-09].http://lwn.net/Articles/355700.
[5] Jonathan Corbet .Working on workqueues [EB/OL]. [2010-09].http://lwn.net/Articles/403891.
期刊库(http://www.zgqkk.com),是一个专门从事期刊推广、投稿辅导的网站。
本站提供如何投稿辅导,寻求投稿辅导合作,快速投稿辅导,投稿辅导格式指导等解决方案:省级投稿辅导/国家级投稿辅导/核心期刊投稿辅导//职称投稿辅导。
【免责声明】本文仅代表作者本人观点,与投稿辅导_期刊发表_中国期刊库专业期刊网站无关。投稿辅导_期刊发表_中国期刊库专业期刊网站站对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。请读者仅作参考,并请自行承担全部责任。
投稿辅导服务咨询与期刊合作加盟
陆老师联系QQ: 913775405(普刊)
蒋老师联系QQ: 867306987(核心)
刘老师联系QQ: 271374912(核心)
联系电话:18015016272
17327192284
投稿辅导投稿邮箱:zgqkk365@126.com
期刊推荐
- 《课程教育研究》 旬刊 国家级
- 《网络空间安全》(信息安全与技术)月刊 国
- 《价值工程》旬刊 国家级 科技统计源期刊
- 《高教论坛》 月刊 省级
- 《法制与社会》旬刊 省级
- 《中国教育学刊》月刊 14版北大核心
- 《语文建设》 旬刊 14版北大核心
- 《中国绿色画报》 月刊 国家级
- 《社科纵横》季刊 社科类优秀期刊
- 《求索》月刊 14版北大核心期刊
- 《财会月刊》旬刊 14版北大核心
- 《艺术品鉴》 月刊 省级
- 《中华建设》月刊 国家级 建设类优秀期刊
- 《教学与管理》旬刊 北大核心
- 《当代经济》 旬刊 省级
- 《新课程研究》旬刊 省级 教育类优秀学术期
- 《文教资料》 旬刊 省级
- 《学术界》 月刊 双核心
- 《吉林教育》旬刊 省级 教育类学术期刊
- 《中国农业资源与区划》 月刊 14版北大核心
- 《继续教育研究》月刊 北大核心期刊
- 《财经界(学术版)》半月刊 国家级
- 《电影评介》半月刊 14版北大核心
- 《公路交通科技》 月刊 北大核心
- 《新闻传播》月刊 省级 新闻类优秀期刊