向多核平台移植操作系统的研究

时间:2022-08-13 06:37:06

向多核平台移植操作系统的研究

摘 要:随着硬件技术的飞速发展,双核乃至多核的计算机的普及,操作系统向多核平台移植的需要也越来越迫切。详细分析操作系统在向多CPU支持的平台移植时可能遇见的伪共享问题及优先级错置问题的产生原因,针对不同情况提出了按规范修改代码、增加内核调度监控线程及将特定程序绑定在单CPU运行等不同对策,并给出了实现方法。

关键词:多核平台;伪共享;线程优先级;操作系统

中图分类号:TP311文献标识码:A

文章编号:1004-373X(2010)05-182-03

Research on Transplanting of Operating System to Multi-core Environment

CAI Mian,TIAN Jiansheng

(College of Electronic Information and Control Engineering,Beijing University of Technology,Beijing,100124,China)

Abstract:With the fast development of hardware and computers with mutli-core technology,the operating system is transplanted to mutli-core environment urgently.The false sharing and thread priority questions maybe found within the migrate process are analysed,for different conditions,different methods such as modifying the source code,adding a kernel thread to control priority and running special program on single CPU are proposed.

Keywords:mutli-core environment;false sharing;thread priority;operating system

随着硬件技术的飞速发展,双核乃至多核的计算机的普及,运用硬件资源为应用程序提供运行平台的操作系统也要有相应的调整。现在绝大多数操作系统都支持多核平台以及多线程及超线程技术。而对于安全有特殊需要的Linux安全操作系统,在多核平台上运行多线程的应用程序时可能会出现一些新的情况,而在特定条件下,它们会对系统的安全和稳定构成威胁。这些问题主要体现在存储缓存(Memory Caching)和线程优先级(Thread Priority)方面。

1 在内存/缓存方面,在临时存储器共享的多核运算平台上可能出现伪共享问题

现在的主流个人计算机多核计算平台中的每个执行核都拥有自己的L1 Cache而共享L2 Cache,多核工作站也一般是每个执行核拥有自己的Cache而共享内存。由于CPU的处理速度远远高于内存,总线等工作单元的存取,传输速度,为了更有效地利用CPU资源,一般把多个数据段组合在Cache的同一行中传送给处理器,于是,在某个时间点上,一个处理器核上的L1 Cache与另一个处理器核上的L1 Cache可能会出现同步方面问题。

假设有两个线程分别运行在双核处理器的两个执行核上,它们同时对邻近的存储器单元进行读写操作。由于操作系统对这两个线程的管理是全局的,而Cache存储器是基于局部性原理工作的,故不同的数据可能存放在Cache的同一行中。于是,即使某个线程所需的位于某个Cache块中的数据尚未使用过,操作系统还是可能会因为另一个处在其他执行核上的线程使用了此Cache行中其他块而将此行标记为无效,要求其下一级的存储单元重新读入这行数据。如果两个线程都要对这个Cache块进行连续多次的写操作(比如循环语句中的循环次数计数变量),使得这个块要不断的在两个CPU间传递,从而极大的影响系统运行速度。这就是常见的伪共享(False Sharing)问题,如图1所示。

图1 共享L2 Cache的双核系统中的

False Sharing问题

这会导致一些在单核平台上运行很稳定的程序在多核平台上却不能正常工作。对于此问题,文献[1]给出了详细说明。

而在安全操作系统中,由于有对隐通道进行分析审计的安全功能模块存在,在处理器进行此严重异常操作的情况下应该会进行报警并执行相应的安全措施,从而使系统无法正常运行。

事实上,伪共享问题早在十几年前安装有多个单芯片处理器的大规模并行处理机出现时就已经浮出水面,十几年来,国内外对其进行了大量的研究,取得了诸多进展,但由于此问题起源于硬件架构,所以一直没能找到一个完美的解决办法。

现在一般的处理技术有:在编程、编译时将非共享的数据分放到不同的Cache行;将全局变量复制到一个函数内的局部变量,在函数结束前再把它复制回去;在进程中,将数据结构集中处理并使每个数据元素(可以是确认不会引起伪共享的几个变量,以避免因在Cache行中填充大量空白而浪费太多系统资源)占有一个Cache行;将引发了伪共享的线程移动到一个执行核上。

应该注意到,上面提到的前三种方法都要对源代码进行分析和改写,这对整个操作系统以及其下运行的大量应该程序来说工作量太过巨大,而最后一个方法虽然可以实时的处理伪共享问题,可它要对Cache进行不断的监控,其造成的额外系统资源开销过大,而且,如果是在讲求所有操作行为都应该是可预期的可信计算系统中,多出这样一个具有最高权限的进程很可能会与已有的TSP安全策略(TCB Security Policy)产生冲突,影响到系统的平稳运行。

综上,作为以安全稳定为重点的操作系统,在升级至多核平台后应以牺牲部分性能为代价对未经改写的源代码进行兼容处理,即对其的编译执行提供兼容模式,令其只在一个执行核上运行。

2 在多核平台上,采用与单核平台相同的进程优先级策略可能会产生异常的程序行为

在单核平台上,因为操作系统不会在高优先级线程执行时为低优先级线程分配CPU资源,高优先级线程可以一直占有系统资源而不会被低优先级线程干扰。

例如,Linux内核的进程调度采用抢占式优先权调度算法(又称可剥夺调度,Preemptive Scheduling) 该算法的本质就是系统中当前运行的进程永远是可运行进程中优先权最高的那个。 在这种方式下,系统把处理器分配给优先权最高的进程,使之执行。但是只要一出现了另一个优先权更高的进程时,调度程序就暂停原最高优先权进程的执行,而将处理器分配给新出现的优先权最高的进程,即剥夺当前进程的运行。因此,在采用这种调度算法时,每当出现一新的可运行进程,就将它和当前运行进程进行优先权比较,如果高于当前进程,将触发进程调度。

而在多核平台上,由于有两个或更多的CPU,线程可以在同一时间运行,于是,低优先级线程完全有可能会影响到高优先级线程的工作。

考虑以下情况:在操作系统中,一条安全策略为:当用户要求运行某程序时,先对该程序进行安全性、完整性和有效性进行检查,通过后则进行运行。以上步骤由两个线程A,B实现。线程A负责对存储器内某一可执行程序中数据的安全性、完整性、有效性进行检查分析,线程B执行这个程序。线程A为实时线程,具有最高优先级,并且其thread_info描述符中的preempt_count字段大于0,禁止其他线程抢占。 B为普通线程。在单核平台,由于一定是高优先级线程A执行结束后才会执行B,该程序可以正常有效的运行。可在多核平台,由于A和B可以运行在不同的CPU上,很可能在线程A正在进行检测时,线程B便开始运行了。显然,该情况将会对系统的安全稳定构成严重威胁。

上一篇:通信维护作业移动信息化解决方案 下一篇:浅谈柱塞式超短液压制动主缸