操作系统对多处理器的支持实现[文献综述][转发]
关键词:FreeBSD Linux POSIX 多核 操作系统 内核
摘要
在最新的计算机技术中,多处理器(Multi Processor)技术方兴未艾。作为计算机系统软件的最基本部分,操作系统(Operation System)对多处理器的支持,是非常重要的。本文对从设计实现角度出发,对主流的类UNIX操作系统支持多处理器的实现进行了初步分析和综述。
目前,类Unix操作系统对多处理器支持较好的,主要有Linux和FreeBSD。下面主要针对这两种操作系统进行阐述。
1.1. 主流类UNIX操作系统对多处理器支持的现状
1.1.1 多处理器系统概述
多处理器系统(Multi-processor System)源起于20世纪50年代的超级计算机。从1999年开始,随着Intel XEON处理器的推出,多处理器系统逐渐在基于x86体系结构的计算机中被使用。但是,当时的主流桌面操作系统对多处理器的支持尚不完善,因此并不能充分发挥多处理器的性能。
在计算机处理器主频进入GHz时代的今天,几何级数增长的计算需求与算术级数增长的处理器主频之间的矛盾,已经日益凸显。由于主频的上升,在同样的半导体工艺下,为了使得数字信号的波形上升沿和下降沿更加锋利,需要提升处理器核心电压以保证稳定。由于数字电路的功耗正比于电压的平方,且随时钟频率线性增加,因此,如果单一地使用提升主频的方法来提升处理器性能,功耗和散热将是严重的瓶颈。在这样的背景下,多核处理器就是处理器厂商克服功耗瓶颈,解决这一矛盾的方案。
操作系统作为体系结构/总线/输入输出硬件之上,对于软件提供系统服务接口的抽象层,对多核处理器的支持,从根本上决定了多核处理器能否发挥出最高效率。
1.1.2 Linux对多处理器的支持
Linux从2.0版本开始支持对称多处理器SMP(Symmetric Multi-Processing),但仅仅是用一个锁来让各处理器串行地访问系统资源,并不能充分发挥多处理器的并行性能。直到Linux 2.6版本,才引入了实用的SMP系统下任务调度算法,其时间复杂度为常数O(1)。[1]
为了提高调度效率,Linux可以将某个进程或线程绑定在特定的处理器上,也可以将中断定向至某个特定的处理器上。后者需要特定硬件的支持。[2]
1.1.3 FreeBSD对多处理器的支持
FreeBSD从3.x版本开始,类似Linux地,使用一个巨型锁(Giant Lock),来防止多个处理器同时进入内核。从FreeBSD 5.3开始,在内核的网络协议栈部分,支持无互锁地多处理器并行。FreeBSD从6.0开始支持多处理器安全(MP-Safe)的虚拟文件系统(VFS)。在FreeBSD 7.0新增的特性SMPng中,几乎完全去除了Giant Lock,这使得8个以上处理器的SMP系统,其性能几乎与处理器数目线性正相关。[3][4]
1.2 操作系统支持多处理器的软件接口
为了支持多处理器,操作系统需要提供一系列的接口供上层软件使用。这些接口包括以下几类:
1.2.1 原子操作
在并行编程中,如果一个操作是不可中断的,瞬间完成的,那么,它被称为原子操作[5]。类Unix系统提供的原子操作接口应当符合POSIX规约。
GNU提供了一系列原子操作,如以下的取-操作系列原语:
__sync_fetch_and_add ()
__sync_fetch_and_sub ()
__sync_fetch_and_or ()
__sync_fetch_and_and ()
__sync_fetch_and_xor ()
__sync_fetch_and_nand ()
这些原语虽然在GLIBC等链接库或头文件中以inline函数的方式实现,但是,它们仍然是操作系统并发同步机制的不可或缺的部分。[6]
1.2.2 内存屏障
除原子操作外,内存屏障也是一个很重要的为并行编程提供的特性。为了提升执行性能,有的时候CPU会将指令打乱顺序执行,即所谓的乱序执行。对于并发编程中的一些情况,这种乱序执行可能会导致不期望的后果。为了避免这种情况的发生,内存屏障就是一个解决方案。
内存屏障的作用一言以蔽之:保证内存屏障之后的指令,一定在内存屏障之前的指令执行完毕后再执行。[7]
1.2.3 锁
锁(Lock)和互斥(Mutex)是防止多核同时访问临界资源的机制。Mutex会引起线程/进程睡眠,而Lock不会引起睡眠。POSIX规约中,Lock有以下几种:
自旋锁(Spin Lock);读写锁(RWlock);单次锁(TryLock);
另外有的操作系统还实现了排队锁(Queue Lock),可以避免在最坏的情况下,某个处理器一直获取不到锁的情况。[8]
1.3. 操作系统支持多处理器所必需的硬件指令
传统的处理器指令中,虽然有inc这样的自加指令,但是,它并非一个“原子”指令。因为,如果是两个处理器同时执行这样的指令,那么,将产生一个竞争条件,不能保证两个或多个处理器并非同时访问一个地址。因此,在支持多处理器的CPU体系结构中,均引入了一系列硬件指令,来保证操作的原子性。
1.3.1 IA-32/IA-64架构
IA (Intel Architecture)中,有两类原子操作指令。一类是在指令前面加lock前缀。可以加Lock前缀的指令有:bt, bts, btr, btc; xchg, xadd; add, or, adc, sbb; and, sub, xor; not, neg, inc, dec这些指令。使用这个前缀可以使处理器暂时地锁定总线,使得其他处理器不能访问锁定的总线地址,直到指令执行完毕。另一类是特殊的指令,如cmpxchg,将比较和交换放在同一条指令中执行。特别地,这条指令用于实现自旋原子锁(spinlock)。[9]
1.3.2 MIPS
MIPS的原子操作指令,是通过sc和ll指令配对来实现的。对于MIPS64,还有scd和lld处理8字节数(双字)。另外,在RMI的XLR多核处理器中也支持cmpxchg(比较后交换)指令。[10]
1.3.3 PowerPC
PowerPC体系结构的原子操作,类似MIPS,通过条件加载/存储指令实现。如lwarx和stwcx的配对。[11]
1.4 操作系统支持多处理器的实现
1.4.1 Linux
Linux对多处理器支持的实现在以下几个文件中:
kernel/smp.c
kernel/cpu.c
kernel/spinlock.c
其中,spinlock.c是用以实现线程互锁的,另外两个文件实现了任务在多处理器之间的相互调度。原子操作在gnu编译器自带的.h和GLIBC中实现。
1.4.2 FreeBSD
FreeBSD对多处理器支持的实现在以下几个文件中:
kern/kern_rwlock.c 实现读写锁
kern/kern_cpu.c 实现多处理器的初始化
另外源代码的根目录下,有各自体系结构下实现原子操作/自旋锁的功能的代码。
1.5. 小结
主流操作系统对多处理器的支持是一个逐渐完善的过程,也是以后发展的趋势。它的发展方向必然是想方设法减小多核协作的开销,将加速比尽量提升到与处理器数目一致。
参考文献:
[1] M.Tim.Jones, Linux and symmetric multiprocessing, [EB/OL].
http://www.ibm.com/developerworks/library/l-linux-smp/ .
[2] Robort Love 著;陈莉君,康华,张波 译. Linux内核设计与实现:第二版 [M]. 北京:机械工业出版社,2006:265.
[3] About FreeBSD's Technological Advances, [EB/OL] http://www.freebsd.org/features.html
[4] M.K.McKusick; George V.Nevile-Neil 著;张辉 译. FreeBSD操作系统设计与实现 [M]. 北京:人民邮电出版社,2006:177-178
[5] Linearizability [EB/OL]. http://en.wikipedia.org/wiki/Atomic_operation .
[6] Atomic [R]. http://gcc.gnu.org/wiki/Atomic .
[7] Simon C. Steely, Jr., Madhumitra Sharma, Kourosh Gharachorloo, Stephen R. Van Doren, Mechanism for Reducing Latency of Memory Barrier Operations on A Multiprocessor System. [P] 美国专利:6088771, 2000-07-11.
[8] 赵昊翔,Linux 的 Spinlock 在 MIPS 多核处理器中的设计与实现. [EB/OL] http://www.ibm.com/developerworks/cn/linux/l-cn-spinlock_mips/index.html
[9] Intel co.ltd Intel 64 and IA-32 Architectures Software Developer’s Manual [R]
[10] Dominic Sweetman, See MIPS Run (Second Edition), [M]. San Francisco, California: Morgan Kaufmann Publishers, Inc, 1999. 210-211.
[11] POWER ISA Manual, Version 2.06 [R] IBM co.ltd
- droplet's blog
- Add new comment
- 518 reads


Comments
有篇An Analysis of Linux
有篇An Analysis of Linux Scalability to Many Cores,也值得看一看。