- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
改善Linux内核实时性方法的研究与实现.doc
改善Linux内核实时性方法的研究与实现
0 引言
由于Linux具有功能强大、源代码开放、支持多种硬件平台、模块化的设计方案以及丰富的开发工具支持等特点,在实际系统中,得到了广泛的应用。但由于其最初的设计目标为通用分时操作系统,对于实时系统而言,Linux仍然存在核心不可抢占、关中断、时钟粒度
粗糙等缺陷。为了使其应用于嵌入式系统,实时控制等领域,越来越多的厂家和研究机构热衷于改善其实时性,构建基于Linux的实时操作系统。
在Linux 2.4和以前的版本,内核是不可抢占的,也就是说,如果当前任务运行在内核态,即使当前有更紧急的任务需要运行,当前任务也不能被抢占。因此那个紧急任务必须等到当前任务执行完内核态的操作返回用户态后或当前任务因需要等待某些条件满足而主动让出CPU才能被考虑执行,这很明显严重影响抢占延迟。在Linux 2.6中,内核已经可以
抢占,因而实时性得到了加强。但是内核中仍有大量的不可抢占区域, 如由自旋锁spinlock保护的临界区,以及一些失效抢占的临界区。另一个影响Linux实时性的因素就是关中断,同步操作中使用的关中断指令增大了中断延迟,这样很多由中断驱动的实时任务得不到及时的执行,系统的实时性能得不到保障。因此提高Linux的可抢占性,改进其中断机制有利于改善内核的实时性。
本文详细阐述了这些措施的原理并基于标准Linux2.6内核加以实现,最后通过测试,验证了此改进方法的效果。
1 中断线程化
1.1 Linux中断对内核实时性的影响
中断处理是由内核执行的最敏感的任务之一,当内核正打算去做一些别的事情时,中
断随时会到来,中断当前的任务进而执行中断处理程序。因此内核的目标就是让中断尽可能快的处理完,尽其所能把更多的处理工作向后推迟。为此Linux把中断的处理分成上半部分和下半部分。上半部分立即执行,下半部分将唤醒相应的和中断处理相关的进程稍后执行。虽然这种机制使得中断处理变得更加高效和易于维护,但是对于系统如果有严重的网络负载或其他I/O负载时,中断将非常频繁,内核当前的实时任务会被不停中断,这对于Linux的实时应用来说是不可接受的。
另外,Linux为了使内核同步而采用了关中断,在内核的关中断区域,中断是被屏蔽的。即使此时有通过中断驱动的实时任务也得不到响应,增加了实时任务的中断延迟。实时化后的Linux中,自旋锁被互斥锁取代,而中断处理代码中大量运用了自旋锁,中断处理代码就有可能因为得不到锁而需要被挂到该锁的等待队列上去。但是只有可调度的进程才可这么做,如果中断处理代码仍然使用原来的自旋锁,那么互斥锁取代自旋锁改进内核实时性的努力将大打折扣。
线程化的中断管理可以有效的解决这些问题。中断线程化后,中断将作为内核线程运行而且赋予不同的实时优先级,实时任务可以有比中断线程更高的优先级,这样,实时任务就可以作为最高优先级的执行单元来运行,即使在严重负载下仍有实时性保证。另一方面中断处理线程也可以因为在内核同步中得不到锁而挂载到锁的等待队列中。很多关中断就不必真正的禁止硬件中断了,而是禁止内核进程抢占,这样就可以减小中断延迟。
1.2 设计与实现
Linux提供了kthread_create创建内核线程,该内核线程在内核空间执行,因此在调度时没有用户空间和内核空间切换,使得其运行更为高效。中断线程化要做的工作是创建中断线程以及中断的处理。中断线程是在系统初始化或者调用requestirq函数时通过kthread_create函数创建的。其过程等同于如下功能代码:
for (i = 0; i lt; NR_IRQS; i++) {
irq_desc_t *desc = irq_desc + i;
if (desc-gt;action !(desc-gt;status IRQ_NODELAY))
desc-gt;thread = kthread_create();
}
对于非紧急中断,kthread_create为其创建一个内核线程,并且根据中断号为其赋予一定的静态实时优先级和设置其调度策略。中断到来后,内核并不是直接进入中断服务函数,而是通过设置调度标志告知内核,内核调度程序比较该中断线程的优先级和当前运行任务的优先级,作出调度决策。因此当前正在运行的高优先级的实时任务不会受中断的太大的影响,保证了实时任务运行的可靠性和准确性,中断线程将会其他合适的时刻被调度执行,而且Linux2.6内核的O(1)调度机制也不会因为内核线程数的增加在调度时间上额外增加调度开销。对于紧急的中断(比如时钟中断),内核保持原来
文档评论(0)