热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Linux2.6内核在嵌入式应用上的突破

文章标题:Linux2.6内核在嵌入式应用上的突破。Linux是中国IT实验室的一个技术频道。包含桌面应用,Linux系统管理,内核研究,嵌入式系统和开源等一些基本分类

  众所周知,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)。这个新功能会检查用户的空间,查看是否会有等待的情况出现,并且只有在线程需要等待时才进行系统调用。而当等待不需要时,就会避免不必要的系统调用以节约时间。该功能也使用优先级调度,以便在出现竞争时决定哪一个线程可以被执行。
  
  共享内存的改进
  嵌入式系统有时也是一个有很多处理器的设备,比如在电信网络或大型存储系统中就是如此。而不论是均衡或是松散连接的多处理器,一般都是共享内存的。均衡多进程的设计是所有的处理器都有对内存有均等使用权,而限制使用内存的决定性因素是进程的效率。Linux 2.6为多程序提供了一种不同的途径,即所谓的NUMA(Non Uniform Memory Access)。这种方法中,内存和处理器是相互连接的,但是对于每一个处理器,一些内存是“关闭”的,而有的内存则是“更远”的。这就意味着当内存竞争出现时,“更近”的处理器对就近的内存有更高的使用权。2.6内核提供了一套功能来定义内存和处理器之间的拓扑关系。调度程序可以利用这些信息来为任务分配本地内存。这减少了内存竞争造成的瓶颈,因而提高了吞吐量。
  
  POSIX线程、信号和计时器
  POSIX标准描述的是一套用于创建和管理POSIX线程的功能。这些经过精心定义的系统功能在以前的Linux版本中就可以用了,不过在2.6内核中,它得到了很大的改进。相比较而言,NPTL(Native POSIX Thread Library)的改进更为明显,甚至都已经超过了现在一些补丁中可用的高性能选择方案。
  
  与POSIX线程一起,2.6把POSIX信号和POSIX高精度计时器作为了主流内核的一个组成部分。POSIX信号比以前Linux版本中使用的Unix模式的信号有了很大的改进。新的POSIX信号不能被丢失,并且可以携带信息作为参数。此外,POSIX信号也可以从一个POSIX线程传送至另外一个线程,而不是像Unix信号一样,只能从一个进程至另外一个进程。
  
  嵌入式系统通常要求硬件能够在固定的时间安排下来运行任务。POSIX计时器可以轻松地让任何一个任务都可以周期性地得到预定安排的时间。计时器的时钟可以达到很高的精度,从而可以让软件工程师更加精确地控制任务的调度。
  
  支持通用设计
  嵌入式世界里的硬件设计通常都要经过定制,以满足特定的应用程序。因此,设计人员经常需要使用原始的方式来解决设计上的问题。比如,为特定目的制造的主板可能使用不同的IRQ管理器而不是使用类似的设计。为了能在一块新的主板上运行,Linux就要进行更改(迁移)以支持新的硬件。如果操作系统是由独立的组件组成的,那么这种更改应该说是比较简单的,因为只需要更改那些需要更改的代码。在2.6内核中,就引入了一个名为子框架的概念。在新的定义中,各组件被清晰地分开,并且可以独立进行更改或替换,而不会对其它的组件或软件包造成影响,或者影响非常小。
  
  设备、总线和I/O
  现在Linux正在变成行业用户的第一选择。2.6内核包含了ALSA(Advanced Linux Sound Architecture),该体系结构可以安全地使用USB和MIDI设备。通过使用ALSA,系统可以同时播放和记录音频。
  
  用于支持视频的Video4Linux系统,在2.6中也焕然一新。虽然其不能向后兼容,但却可用于最新的广播、电视、数码相机和其它的多媒体。
  
  Linux 2.6使用的是USB 2.0,它要比一般的USB快40倍。可以预见,在不久的将来,高速设备将非常普及,而在对USB 2.0支持方面,Linux可以说是一个先行者。
  
  对64位处理器的支持
  在一些嵌入式系统中,计算机要提供非常多的资源,比如很大的内存和高吞吐量的多处理器。这些大型系统有数量众多的嵌入式应用程序,比如大规模存储系统和特殊计算引擎。
  
  使用2.6内核,对于那些需要大量内存的嵌入式Linux开发人员就可以选择64位的处理器。Intel安腾64位处理器在以前的Linux版本中就已经被支持,而在新版本中,更是包含了AMD64体系结构,开始提供对AMD Opteron处理器的支持。当然PowerPC也没有被忽略,现在PPC64也已经获得了支持。很显然,Linux社区对于大容量总线、大容量内存计算的创新问题充满了激情。
  
  支持微控制器
  现在主流的Linux 2.6内核中,也提供了对微处理控制器的支持。以前,大多数情况下Linux都需要一个包含内存管理的全功能微处理器。然而,在嵌入式市场领域,更简单的微控制器更适于低价和简单的应用。
  
  Linux的微控制项目成为了一个Linux应用于小型系统中非常重要的分支。这个名为uClinux的分支已经受到了小型处理器开发人员的广泛关注。2.6版本中把uClinux中一个非常重要的部分整合到
推荐阅读
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 本文详细介绍了相机防抖的设置方法和使用技巧,包括索尼防抖设置、VR和Stabilizer档位的选择、机身菜单设置等。同时解释了相机防抖的原理,包括电子防抖和光学防抖的区别,以及它们对画质细节的影响。此外,还提到了一些运动相机的防抖方法,如大疆的Osmo Action的Rock Steady技术。通过本文,你将更好地理解相机防抖的重要性和使用技巧,提高拍摄体验。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了2019年上半年内蒙古计算机软考考试的报名通知和考试时间。考试报名时间为3月1日至3月23日,考试时间为2019年5月25日。考试分为高级、中级和初级三个级别,涵盖了多个专业资格。报名采取网上报名和网上缴费的方式进行,报考人员可登录内蒙古人事考试信息网进行报名。详细内容请点击查看。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 从高级程序员到CTO的4次能力跃迁!如何选择适合的技术负责人?
    本文讲解了从高级程序员到CTO的4次能力跃迁,以及如何选择适合的技术负责人。在初创期、发展期、成熟期的每个阶段,创业公司需要不同级别的技术负责人来实现复杂功能、解决技术难题、提高交付效率和质量。高级程序员的职责是实现复杂功能、编写核心代码、处理线上bug、解决技术难题。而技术经理则需要提高交付效率和质量。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
author-avatar
Karson2012
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有