一、多核系统概述:为什么需要多核?
大家好,我是你们的老朋友。今天咱们聊聊多核系统。说实话,我刚入行那会儿,用的还是单核处理器。那时候写程序,根本不用操心什么锁啊、同步啊,代码跑得顺顺当当。但后来,事情变了。
1.1 为什么需要多核?
你想想看,单核处理器的主频已经快跑到物理极限了。频率越高,功耗越大,散热越难搞。我记得有一次,我在调试一个嵌入式设备,CPU温度飙到90度,手都不敢摸。嗯,这就是单核的瓶颈。
多核的出现,说白了就是「人多力量大」。一个核干不完的活,分给几个核一起干。这样既能提升性能,又不用把频率拉得太高。我在项目中遇到过这样一个场景:一个视频编码任务,单核要跑3秒,换成4核并行,直接降到0.8秒。效果立竿见影。
1.2 从单核到多核的演进
这个演进过程,我把它分成三个阶段:
- 单核时代: 一个CPU核心,顺序执行指令。程序写起来简单,但性能受限于频率。
- 超线程时代: 一个物理核模拟两个逻辑核。我刚开始用超线程时,觉得挺神奇的,但实际上提升有限,大概10%-30%。
- 多核时代: 多个物理核心集成在一个芯片上。这才是真正的并行。比如ARM的big.LITTLE架构,大核跑重活,小核跑轻活,省电又高效。
为什么会这样演进?说白了,就是「摩尔定律」快失效了。晶体管没法再无限缩小,那就换个思路,堆核。
1.3 多核架构分类:SMP vs AMP
多核架构主要有两种:SMP(对称多处理)和AMP(非对称多处理)。我分别说说。
SMP(对称多处理)
SMP,就是所有核心地位平等,共享同一块内存和I/O设备。每个核都能访问任何内存地址。听起来很公平对吧?但问题来了——多个核同时访问同一块内存,就会打架。这时候就需要锁机制来协调。
我在项目中用过SMP架构的Linux系统。嗯,写驱动的时候,最头疼的就是锁竞争。一个核在写数据,另一个核在读,搞不好就读到脏数据。所以SMP的编程模型,说白了就是「共享内存 + 锁同步」。
| 特性 | SMP | AMP |
|---|---|---|
| 核心关系 | 对称,地位平等 | 非对称,有主从之分 |
| 内存访问 | 共享内存 | 私有内存或分布式内存 |
| 操作系统 | 单一OS管理所有核 | 每个核可运行不同OS |
| 编程难度 | 中等(需处理锁竞争) | 较高(需处理核间通信) |
| 典型应用 | PC、服务器 | 嵌入式、DSP |
AMP(非对称多处理)
AMP就不一样了。每个核心各司其职,有的负责计算,有的负责I/O,有的负责实时控制。它们之间通过消息传递或共享内存来通信。我做过一个AMP项目:一个核跑Linux做网络协议栈,另一个核跑裸机程序做实时控制。两个核各干各的,互不干扰。
AMP的好处是隔离性好,一个核挂了不影响其他核。但坏处是编程复杂,你得自己设计核间通信协议。我曾经踩过一个坑:两个核共享一个环形缓冲区,结果写指针和读指针没同步好,数据全乱了。嗯,从那以后,我再也不敢轻视核间同步了。
1.4 知识体系结构图
下面这张图,帮你理清本章的知识脉络:
1.5 小结
好了,这一章就聊到这儿。多核系统不是新鲜事,但理解它的演进和分类,是后面学习锁机制的基础。SMP和AMP各有优劣,选哪个取决于你的应用场景。我个人更常用SMP,因为Linux生态成熟,调试工具也多。但如果你做的是实时控制,AMP可能更合适。
下一章,咱们深入聊聊「锁」这个东西。嗯,锁用不好,程序就崩给你看。到时候见。
可可精品资料库