操作系统哲学原理(20)多核原理-多核结构和内存

本文从哲学角度探讨了多核处理器的发展,包括对称多处理器(SMP)、超线程(HyperThreading)、多核结构及其优缺点。重点讲述了多核环境下操作系统面临的挑战,如内存访问一致性、处理器间通信和启动过程,并对比了多处理器、超线程和多核在资源共享和性能提升方面的差异。此外,还介绍了不同内存访问模式(UMA、NUMA、COMA、NORMA)及其特点。
摘要由CSDN通过智能技术生成

说明:该系类文章更多的是从从哲学视角看 操作系统 这门学科。同时也是 操作系统的学习笔记总结。因为博主 这些年主要是以研究安卓系统和 嵌入式Linux为主,因此这个系类文章也是这两个领域不可或缺的基石之一,尤其是对操作系统感兴趣的伙伴可特别关注。


20 多核结构和内存

每一次CPU能力的提升带来知识人们更大的贪欲,而且CPU的主频达到4GHz以后很难再向上提升,这个时候唯一的办法就是采取多核策略。

20.1 以量取胜

  • 多处理器:在一个体系结构上放置多个CPU。
  • 多核:在同一块芯片(CPU)上放里多个核(core),即执行单元。
  • 多处理器和多核的区别:多核结构更加紧凑.成本在同等执行单元数相同的情况下更便宜、功耗更低。为简单起见,人们现在将多处理器和多核结构统称为多核结构。
  • 多核计算机的出现,打破了单核环境下的许多操作系统设计的正确性或可靠性。(例如,我们在锁的实现中以中断启用和禁止来实现锁的做法,在多核环境下将不能工作;事实上本书前面两大部分讲述的进程和内存管理的许多策略和机制针对的均是单CPU或单核的环境:这些策略和机制在多核环境下要么是不能正确运行,要么是效率太低,当然也有可能是二者兼而有之;因此,为了适应多核环境所提出的新要求,也为了更好地利用多核技术提供的新方便,操作系统需要作出相应调整)

20.2 多核基本概念

多核的一些基本概念:

在x86体系结构下,多处理功能芯片经过了4个演变阶段,如下所示:

  1. 对称多处理器结构(SMP,Architecture)
  2. 超线程结构(Hyper Threading )
  3. 多核结构(Multi-core Architecture)
  4. 多核超线程结构(Multi-core Hyper Threading Architecture)

20.2.1 多处理器结构

多处理器结构:一条总线上挂载多个处理器。在传统的体系里,一台电脑只有一个CPU;而在多处理器系统里,一台电脑可以有多个CPU,如图所示:

在多CPU的情况下,以CPU之间的关系不同又可以分为对称和非对称多处理器结构。

  • 在对称结构下,多个CPU的角色功能平等,没有主从之分,这种多CPU结构称为对称多处理器结构(Symmeric Multi-Processor Architecture,简称SMP)
  • 在非对称多处理器结构下,不同CPU的角色地位不同,有所谓的主从CPU之分,这种多CPU结构称为非对称多处理器结构(Asymmeric Multi-Processor Architecture,简称AMP)

当然现在SMP结构远比AMP结构普遍。

20.2.2 超线程结构

多个CPU虽然提升了计算机的性能,但是付出的代价是高昂的成本和巨大的功耗。而在实际中,基于很多原因,CPU的执行单元并没有被充分使用。如果CPU不能正常读取数据(由于总线/内存的瓶颈),其执行单元利用率会明显下降。目前大多数执行线程缺乏ILP(Instruction_Level_Parallelism,多种指令同时执行)支持。这些都造成了目前CPU的性能没有得到全部的发挥。因此,Intel提出了超线程(Hyper_Threading)技术来让一个CPU同时执行多个线程,从而提高CPU效率和用户满意度。

超线程技术是在一个CPU上同时执行的多个程序共同分享该CPU内的资源,理论上像两个CPU在同一时间执行两个线程,即可在同一时间里,让应用程序使用芯片的不同部分。超线程结构如图所示:

图中的每个CPU并不是物理上的单个CPU,而是两两为一个独立的CPU。即图中只有4个物理CPU,而每个CPU又因超线程技术被分解为两个逻辑CPU。每个逻辑CPU可以执行一个线程序列。这样一个物理CPU可以同时执行两个线程。

注意:

  • 超线程技术的CPU还需要芯片组和软件的支持,才能发挥其优势。
  • 超线程的性能并不等同干两个CPU的性能(虽然采用超线程技术能同时执行两个线程,但它并不像两个真正的CPU那样,每个CPU都具有独立的资源。当两个线程都同时需要某一个资源时,其中一个要暂时停止,并让出资源,直到这些资源闲置后才能继续)。

20.2.3 多核结构

为了克服多CPU和超线程的缺陷,即实现性能像多CPU,功耗像超线程的结构,这种结构就是多核结构。

多核结构:在一个CPU里面布置两个执行核,即两套执行单元,如ALU、FPU和L2缓存等。而其他部分则两个核共享(由于使用的是一个CPU,其功耗和单CPU一样。由于布置了多个核,其指令级并行将是真正的并行,而不是超线程结构的半并行)。

当然,我们也可以在一台计算机里面布置多个配有多个执行核的CPU,而形成更多的核。如图所示为多核、多处理器结构:

20.2.4 多核超线程结构

而在多核情况下,我们也可以将超线程技术予以使用,从而形成多核超线程(Multi-core_Hyper_Threading_Architecture)技术。即每个物理执行核里面又分解为两个或多个逻辑执行单元,如图所示:

20.3 多核的内存结构

由于一台计算机里面有多个执行核,而每个执行核均需要对内存进行访问,那么这种情况下内存在多个核之间分配的方式有以下几种:UMA、NUMA、COMA、NORMA

20.3.1 UMA(Uniform Memory Access)

均匀内存访问(UMA):最简单的内存共享方式就是将内存作为与执行核独立的单元构建在核之外,所有的核通过同一总线对内存进行访问。由于每个核使用相同的方式访问内存,其到内存的延迟也相同。在这种模式下,最重要的是所有核的地位在内存面前平等。

  • 其优点是设计简单,实现容易。
  • 缺点是大锅饭,难以针对个体的程序进行访问优化,和扩展困难。因为随着执行核数的增加,对共享内存的竞争将变得自热化,从而造成系统效率急剧下降。

当前的对称多处理器共享存储系统基本上采用此种模式。这种模式只能在处理器个数或执行核数从较少时方可使用。

20.3.2 NUMA(Non-Uniform Memory Access)

  • 如果我们想构建CPU数量很多的多处理器系统,或者欲构建执行核多于4个的多核系统,则UMA结构因内存共享瓶颈而不能胜任。在这种情况下,一种自然的选择是使用多个分开的独立共享内存,即NUMA模式:每个执行核或CPU到达不同共享内存的距离不同,访问延迟也不一样。在这种模式下,最重要的特点是执行核在不同的内存单元面前地位并不平等:到近的内存具有优势地位,而到远的内存则属于劣势。
  • 在NUMA下,原则上应该将程序调度到离本地内存(程序存放的内存单元)近的执行核上,以提升程序的内存访问效率,从而提高程序的执行效率。NUMA结构的优点是灵活性高、扩展容易。在执行核的数最增加的时候,其访问内存的效率可以保持不下降(这种不下降的前提是优良的调度策略);否则,有可能因内存访问跟离远而造成效率下降。因此,NUMA对调度的要求很高。但因为扩展容易,NUMA得到非常广泛的应用。

20.3.3 COMA(Cache Only memory Access)

NUMA具有灵活、易扩展的优点,但对调度的要求高。如果不能或难以将程序调度到就近的执行核上,则需要新的机制:缓存。即在每个执行核里面配置缓存,其执行需要的数据均由缓存得到满足。这样,不论数据原来是处于哪个内存单元,其对效率的影响均将不复存在。这种完全由缓冲满足数据访问的模式称为全缓存内存访问,即COMA模式。在这种模式下,每个执行核配备的缓存共同组成全局地址空间。

20.3.4 NORMA(Non-Cache Only memory Access)

  • NORMA模式:内存单元为每个执行核所私有,且每个执行核只能访问自己的私有内存,对其他内存单元的访问通过消息传递进行。
  • 这种模式的优点是设计比NUMA还要简单,但执行核之间的通信成本高昂。这已经有一点像网络了。因为效率问题,此种模式在多核体系结构下使用甚少。

20.4 对称多处理器计算机的启动过程

对于对称多处理器来讲,执行流程如下:

所有的CPU里面有一个被定为启动处理器(Boot_strap_Processor,BSP)。而其他的处理器则作为应用处理器(Application_Processor,AP)(到底哪个CPU是BSP则由某一特定寄存器的值来决定)

  • BSP首先读取并执行BIOS(或EFI)的初始化(boot_strap)代码(通常处于物理地址FFFF_FFF0_H)对自己进行初始化:
    • 设置高级可编程中断控制器(Advanced_Pogrammable_Interrupt_Controller,APIC)环境;
    • 建立全局的数据结构;
    • 设置跳转代码(trampoline_codes)
    • 准备AP的运行环境;
  • 而AP则在上电/重启后进行一个简单的自我设置后进入到等待启动状态。
  • 然后BSP通过发送进程间中断来叫醒AP,对AP进行启动并令其进行初始化。
  • AP在收到BSP发出的IPI启动信号后将:
    • 执行BIOS/EFI里面的AP初始化代码或BSP准备的跳转代码。该跳转代码将初始化AP处理器;
    • AP再次进入到等待BSP中断的状态;
  •   而BSP则继续执行BIOS/EFI的后续代码,并负责启动操作系统。

注意:SMP的BIOS与单核或单处理器里的BIOS并不一样。由于有多个处理器,SMP的BIOS里面包括了多个处理器的规格和信息,每个处理器的APIC描述表。而这些信息包括诸如CPU的数量与编号、本地APIC信息、I/O的APIC信息、AP的初始化代码等。

20.5 多处理器之间的通信

进程间的通信机制如下:管道、套接字、信号、信号量、消息队列、共享内存等。参考这些机制,实现多CPU之间的通信的方式是发送中断,详细说明如下:

在多CPU之间通信,自然也可以发送信号。不过这个信号不是内存的一个对象,因为这样的话,无法及时引起另外一个CPU的注意。而要引起其注意,需要发送的是中断。

用来协调这些CPU之间中断的机制就是所谓的高级可编程中断控制器APIC,这是实现SMP功能必不可少的;且是Intel多处理规范的核心。在此种规范下,每个CPU内部必须内置APIC单元。CPU通过彼此发送中断(所谓的IPI,处理器间中断)来完成它们之间的通信。通过给中断附加动作(action),不同的CPU可以在某种程度上彼此进行控制。

除了每个CPU自己本地的APIC外,所有CPU通常还共享一个I/O_APIC来处理由I/O设备引起的中断,这个I/O_APIC是安装在主板上的。如图所示:描述的是英特尔公司的Xeon多处理器结构下的本地APIC和I/O_APIC的结构示意图。如下所示:

除了处理处理器间及输入输出的中断外,APIC也负责处理本地中断源发出的中断:如本地连接的FO设备、时序中断、性能监视计数器中断、高温中断、内部错误中断等。

20.6 SMP缓存一致性

由于在对称多处理器结构下,每个处理器都有白己的缓存。这样在一个系统里存在多个缓存的情况下就有可能出现两个缓存的数据不一致的情况。即两个CPU缓存同样的数据,其中一个或两个CPU对数据进行了修改从而造成两个CPU缓存数据的不同。而这有可能造成严艰的后果。因此确保SMP里面的缓存一致性十分重要。而且SMP必须确保对内存地址的访问是最新的数据。

20.7 多处理器、超线程和多核的比较

多处理器、超线程和多核的共同点是均为了提升计算机性能而设计、均可以同时执行多个指令序列。但是区别也是明显的,体现在同时执行的两个线程之间共享物理资源的多少。

  • 多处理器的共享物理资源最少,每个线程有自己单独的处理器;成本最高、独立性最高、功耗最大;
  • 超线程共亨最多,ALU、FPU、MSR、缓存等均为共享物理资源;独享的资源有本地APIC、通用寄存器、LI缓存、CPUID等;成本、独立性和功耗坡小;
  • 多核介于二者之间(包括成本),共享处理器,不共享ALU、FPU等;共享资源包括最后一级缓存,少部分寄存器等。而独享的有CPUID、APIC、BIOS等。

注意:超线程技术是英特尔公司所独有,其他公司不一定使用这种技术。(例如,AMD公司就直接从多处理器跨越到了多核)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图王大胜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值