一、多核系统概述:为什么需要多核?

大家好,我是你们的老朋友。今天咱们聊聊多核系统。说实话,我刚入行那会儿,用的还是单核处理器。那时候写程序,根本不用操心什么锁啊、同步啊,代码跑得顺顺当当。但后来,事情变了。

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的好处是隔离性好,一个核挂了不影响其他核。但坏处是编程复杂,你得自己设计核间通信协议。我曾经踩过一个坑:两个核共享一个环形缓冲区,结果写指针和读指针没同步好,数据全乱了。嗯,从那以后,我再也不敢轻视核间同步了。

我的建议: 如果你刚开始接触多核编程,先从SMP入手。因为Linux等主流OS对SMP支持得很好,锁机制也成熟。AMP更适合对实时性要求极高的场景。

1.4 知识体系结构图

下面这张图,帮你理清本章的知识脉络:

多核系统知识体系 为什么需要多核? 从单核 → 超线程 → 多核 多核架构分类 SMP(对称多处理) 共享内存 + 锁同步 AMP(非对称多处理) 核间通信 + 消息传递
避坑指南: 我曾经犯过一个低级错误——在SMP系统上写了一个无锁的全局变量,结果两个核同时写,数据全乱了。记住:多核环境下,共享数据必须加锁,别偷懒。

1.5 小结

好了,这一章就聊到这儿。多核系统不是新鲜事,但理解它的演进和分类,是后面学习锁机制的基础。SMP和AMP各有优劣,选哪个取决于你的应用场景。我个人更常用SMP,因为Linux生态成熟,调试工具也多。但如果你做的是实时控制,AMP可能更合适。

下一章,咱们深入聊聊「锁」这个东西。嗯,锁用不好,程序就崩给你看。到时候见。


可可精品资料库