多核体系结构
多核体系结构分4个演变阶段:
多处理器结构(主板上两个CPU):
- 一个总线上挂多个处理器
- 根据处理器的角色分:对称多处理器结构(SMP)、非对称多处理器结构(AMP)
多线程结构(一核两线程):
- 由于单处理器的性能没有得到全部发挥,让一个处理器同时执行多个线程。
- 在处理器上多加入一个逻辑处理单元指针。
- 共享:ALU、浮点运算单元、二级缓存、某些MSR
- 不共享:本地APIC、通用寄存器、一级缓存、
- 需要芯片和操作系统都支持:Windows XP、Linux 2.4以后都支持多线程处理器。
多核结构(四核、八核):
- 一个CPU多套执行单元
- 不共享:ALU、FPU、二级缓存、本地APIC、BIOS。
- 共享:某些MSR、最后一级缓存
- 在处理器内部,两个核之间隔绝,通过处理器外部,北桥芯片的仲裁器负责任务分配和缓存协调。
多核超线程(四核八线程):
- 结合多线程结构和多核结构
对于多核处理器,有一个核被设置为启动处理器(BSP),其它为应用处理器(AP)。在启动阶段,现有BSP进行启动工作,之后BSP通过中断唤醒各个AP进行初始化。
处理器间通信:
- CPU间通信需要通过中断进行,不然无法引起另一个CPU的响应。
- 每个CPU都有一个本地APIC(高级可编程中断控制器)来协调处理器间中断。
- 此外主板上还有IO APIC,负责处理来自外部的IO中断。多有CPU共享IO APIC。
多核处理器,每个核都有独立的缓存,为了确保同一内存地址在多个缓存里内容相同,需要处理缓存一致性问题。微软使用MESI模型处理缓存一致性问题。
多核环境下对操作系统的修正
进程的同步
原子性变成跨越CPU的原子性,即一个CPU执行时,另一个CPU不执行某段程序。
软件同步原语仍然必须基于硬件原子操作的支持。
硬件原子操作
前面章节说过,单核情况下,硬件提供的原子操作有三种:
- 中断启用与禁止
- 加载存入指令
- 测试与设置
这三种里,中断在多核环境下无法保证原子。其它两种还可以用。
此外还有一种总线锁原子操作,就是将总线锁住,只有持有该锁的CPU才能使用总线。
还有一种同步原语:xchg指令。
软件同步原语
在硬件原子操作之上,操作系统提供程序使用的软件同步原语。
例如:
- 互斥锁
- 执行体
- 旋锁:CPU互斥机制,不是线程互斥机制。拥有旋锁的CPU上的所有线程都可以访问该旋锁保护的数据结构,其它CPU上的线程无法访问被保护的数据结构。
进程调度
除了单核进程调度涉及的各种问题以外,还需要多个核之间的负载平衡问题。
每个CPU都有自己的就绪队列。
主动负载平衡:队列里面进程数多的CPU将某些进程推出去。
被动负载平衡:队列为空的CPU从别的CPU队列里面将进程拉出来。
钉子进程:必须在特定CPU上执行的进程。钉住的原因:
- 非对称多处理器体系结构,各个核功能不同
- 某个进程的许多信息已经在某个CPU的缓存中。
- 一个进程的多个线程尽量分配到一个CPU上,因为这些线程共享的许多资源都在这个CPU上。
———————————————————————————————————————————
欢迎关注我的微博:大雄_RE。专注软件逆向,分享最新的好文章、好工具,追踪行业大佬的研究成果。