首页 | Linux 基础 | 资讯动态 | Linux 应用 | Linux 服务器 | Linux 开发 | Linux 安全 | 专题 | 联盟论坛
  当前位置:主页>Linux 开发>linux 内核>文章内容
剖析Linux 2.6内核在嵌入式上的应用
来源:www.unix5.com 作者:riechelr_hl 发布时间:2007-05-26  

众所周知,Linux在嵌入式系统中的应用已经非常普遍。为了进一步促进这方面的应用,在Linux 2.6中,引入了很多非常有利于嵌入式应用的功能。这些新功能包括实时性能的增强、更方便的移植性、对大容量内存的支持、支持微控制器和I/O系统的改进等。

嵌入式计算通常涉及到各种尺寸的计算机,其中包括从小型手持设备(比如手表、照相机)到包含成千上万个节点的分布式系统(比如通信交换机)。嵌入式系统可能简单得只需要一个小的微控制器,也可能使用的是大量的并行处理器和海量的内存。Linux 2.6的改进,则对这一系列需求提供了支持。

响应时间的改进

嵌入式系统通常需要稳定的时间限制。虽然Linux 2.6还不是一个真正的实时操作系统,但说到其改进后的响应能力更加适合于这一领域的需求。

在2.6内核以前,要想让Linux获得更好的响应能力,就需要一些特殊的补丁。通常情况下,需要用户从厂商处购买补丁来改进中断性能和调度反应时间。如今,2.6内核把这些改进加入到了主流的内核当中,因此无需再对其进行特殊的配置。

Linux 2.6提供了一些功能,可以改进整体响应能力。其中两个改变更值得注意,首先现在使用的是抢占式内核,其次使用的调度算法也更加高效。

抢占式内核

和其它大多数通用操作系统一样,当一个进程被系统调用并处于运行状态时,以前版本的Linux是不允许进程进行调度的。这就意味着一旦系统调用中有某个任务正在执行,那么该任务就会控制处理器,直到系统调用结束,而不管其使用处理器时间的长短。这种设计显然要简单得多,但是在很多时候这会导致一些更重要的任务在等待系统调用完成的过程中被耽搁。

现在,内核在一定程度上使用了可抢占的模式。因此,在一些时效性比较强的事件中,Linux 2.6要比2.4具有更好的响应能力。当然了,它实际上并不是一个真正的RTOS,但是与以前的内核相比较,“停顿”的感觉要少得多。在Linux 2.6内核中,代码被设置了抢占点,这就意味着调度程序会中止现在正在运行的进程而来执行优先级更高的进程。在系统调用过程中,Linux 2.6会定时地检查抢占点,以避免不合理的延迟发生。而在检查过程中,调度进程很可能就会中止当前的进程来让另外一个进程运行。

有执行时间限制的软件和虚拟内存请求页面调度是不兼容的,因为这种方法处理页面慢的缺点会破坏程序的响应能力。而2.6内核可以被编译成没有虚拟内存的系统来消除这个问题。当然,这就要求软件设计人员必须考虑要有足够的实内存来运行应用程序。

图1和图2显示了2.4.1内核和2.6内核在平均情况下和最坏情况下任务的响应时间。数据来自通过一台PⅢ 1.0GHz处理器采集的310万个样本。测试使用的是带有超过5个中断的LynuxWorks的实时测试设备。系统处在由持续地磁盘数据传送、网络通信、控制台输入、图像处理和一个定时卡组成的高负载下运行。

 

 
图1 平均响应时间

 

 

 

图2 最差响应时间

高效的调度程序

在2.6版本中,进程调度经过重新编写,去掉了以前版本中效率不高的算法。以前,为了决定下一步要运行哪一个任务,进程调度程序要查看每一个准备好的任务,并且经过计算来决定哪一个任务相对来说更为重要。所有的计算完成之后,得分最高的任务把被选中。因为这种算法中大量的任务需要的时间一般都不相同,一些复杂的多任务应用程序往往得不到及时的调度。

在2.6内核中,调度程序每次不再扫描所有的任务,而是在一个任务变成就绪状态时把其放到一个名为“当前队列”的队列之中。当进程调度程序运行时,它只选择队列中最有利的任务来执行。这样,调度就可以在一个恒定的时间里完成。当任务执行时,它就会得到一个时间段,或在其转到另外一个线程之前得到一段时间的处理器使用权。当它的时间段用完之后,任务就会被移到另外一个名为“过期”的队列中。而在该队列中,任务会根据其优先级进行排序。

从某种意义上讲,所有位于当前队列的任务都把被执行并且都把被移到“过期”队列之中。当这种事情发生时,情况就会有所变化,队列就会被进行切换,原来的“过期”队列成为当前队列,而空的当前队列也就变成了过期队列。由于在新的当前队列中的任务已经被排列好了,调度程序现在也可以使用简单的队列算法,即总是取当前队列的第一个任务进行执行。不管任务是多是少,这个新的过程实际上要比老的过程快得多。

新的同步措施

多进程应用程序有时需要共享一些资源,比如共享内存或设备。为了避免竞争的出现,程序员会使用一个名为互斥的功能来确保同一时刻只有一个任务在使用资源。到目前为止,Linux还是通过一个包含在内核中的系统调用来完成互斥的实现,并由该系统调用来决定一个线程是等待还是继续执行。但当决定继续执行时,这个耗时的系统调用就不需要了。Linux 2.6内核支持所谓的FUSM(Fast User-Space Mutex)。这个新功能会检查用户的空间,查看是否会有等待的情况出现,并且只有在线程需要等待时才进行系统调用。而当等待不需要时,就会避免不必要的系统调用以节约时间。该功能也使用优先级调度,以便在出现竞争时决定哪一个线程可以被执行。

共2页: 上一页 1 [2] 下一页
 
如果您对本文有任何疑问或者建议,请到论坛讨论区发表您的意见: >> 论坛入口
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
  热点文章
·使用 Linux 系统调用的内核命令
·Linux 2.6.11内核文件IO系统调用
·Linux操作系统的源代码目录树结
·Linux用户态与内核态的交互讲解
·Linux内核对I/O端口的管理实现(
·深入分析 Linux操作系统的内核链
·Linux内核可装载模块对设备驱动
·概述Linux系统的驱动框架及驱动
·详解Linux 2.6内核新文件系统变
·Linux系统可卸载内核模块完全指
·FreeBSD手册讲解(一)--配置FreeB
·编译Linux操作系统的内核讲解
  相关文章
·Linux操作系统内核启动参数详细
·详细解析Linux操作系统的内核空
·Linux内核可装载模块对设备驱动
·走向Linux系统高手之路 编译内核
·深入分析 Linux操作系统的内核链
·Linux内核入侵检测安全增强实现
·Linux内核入侵检测安全增强实现
·Linux操作系统的源代码目录树结
·使用 Linux 系统调用的内核命令
·Linux内核对I/O端口的管理实现(
·Linux内核对I/O端口的管理实现(
·内核设计篇

本站信息源至:互联网络,均为学习,交流所用,如有版权问题,请联系我们.
站长QQ:397422079 E_mail:riechelr_hl@unix5.com
转载本站内容请注明原作者名.谢谢!