当前的嵌入式环境下,多核是显著的发展趋势之一,英特尔、飞思卡尔及瑞萨等公司均先后推出满足该趋势的多核产品。
QNX作为软件供应商,在多核环境下关注的核心在于:现在的应用能否在多核环境下运行,同时,当应用从单核移植到多核时,除可以运行外,还应保证实时性,并令性能有所提高,这样移植才有意义。
那么如何利用操作系统和开发环境完成现有应用的移植?通常会碰到的问题之一即线程之间的同步。当前,很多嵌入式应用中,常把线程A得到的结果传给B,然后线程B将继续进行,这在单CPU环境下不存在问题,但如果移植到多核环境下,线程A和B同时运行,则会导致问题出现。其他问题还包括,如,可重用性及线程的安全性问题等。
因此从单CPU移植到多核环境时,应考虑涉及的应用、库、中间件、实时操作系统(RTOS)及调试、优化工具等是否支持多核环境。
多核RTOS(实时操作系统)
多核RTOS包括3种不同的运行模式:首先是AMP(非对称的多重处理模式),如图1所示,系统内有2个不同的核,每个核对应不同的操作系统,这样的模式在运行多重处理时,设计阶段必须决定哪些应用应在第一个核上运行,哪些应在第二个核上运行,而这些均属于静态配置。在系统设计好并出售给客户后,若客户需要增加内核数量时,必须将系统返回,重新设计才能完成升级、满足客户需求。这即是AMP存在的主要问题。
图1 AMP——非对称的多重处理模式(略)
其次是,SMP(对称式多重处理模式),如图2所示,该模式下只有1个操作系统,它在两个不同的核上运行。这极大地简化了设计,只需应用是多线程的,从而由操作系统根据应用分配内核资源,当CPU空闲时,操作系统即把线程调配到该CPU上运行。该模式的问题可能在于,如果程序本身忽略了并发性问题,则多核系统可能将无法正确运行。
图2 SMP——对称式多重处理模式(略)
第三,BMP(限定性多重处理模式),该模式是QNX针对AMP及SMP的现有问题而提倡的新概念,限定性多重处理环境下,仍只有一个操作系统,因为看起来类似于SMP,不过除此之外,BMP还可绑定应用究竟在哪个CPU上运行,如图3所示,可将A1、A2绑定给第1个核,A4、A5绑定给第2个核,而A3不进行绑定,可以自由运行。这样的模式融合了AMP和SMP的优点。
图3 BMP——限定性多重处理模式(略)
图4 系统追踪示意(略)
多核开发工具
当应用从单核移植到多核环境时,首先应确定应用是必须在一个核上运行还是可以在多核环境下运行,此时开发工具即可帮助用户了解,该应用可否在多个自由的核上浮动还是需要绑定。此外,开发工具应支持多核环境的调试。
QNX的开发工具提供了优化选项即系统追踪工具,可以令用户在开发环境下检测瓶颈、进程间的通讯及不同核间的通讯等。实现该功能,是因为QNX的内核中添加了事件的收集,可收集库中的线程、线程的创建、系统的调用及中断等信息,并最终通过开发工具为用户显示出相关信息。
QNX的开发工具提供了应用分析器,它可以获知哪个函数运行耗费最多的时间,由此决定该函数应分为不同的线程还是应由单一线程运行。
函数旨在将数组填满,如图5所示。当数组较大时,耗费时间则相应较长,对于多核环境,可以进行如下优化:如果将该函数移植到多核(4核)CPU上,则可以选择以4个不同的线程同时填充数组。各线程同步填充,为了防止并发性问题,此处需引入同步机制,如:明确有可能相互冲突的线程,令不相冲突的线程同步运行,并根据时序顺序依次运行相互冲突的进程,从而避免问题的发生。
QNX内核的软处理器亲和性,进一步优化了性能。其原理即当线程在某CPU上运行后,内核尽量让该线程在同一CPU上运行,当线程需和另外的线程进行通讯时,内核也会尽量让另外的线程在同一CPU上运行,其主要目的是尽量避免线程移植,因为移植时会浪费缓存的资源。这也就是QNX开发工具基于BMP模式的线程绑定功能。
图5 函数及数组(略)
综上所述,QNX操作系统支持三种不同的多重处理模式,支持单核到多核环境的移植,而开发工具则能令用户观测移植的状 态,查看移植中的同步问题,线程在不同 核 上的迁移问题、线程间的通讯情况等。优良的嵌入式操作系统及开发工 具必将为多核环境 提 供越来越完 善的支持。 |