72、内核同步与缓存问题解析

内核同步与缓存问题解析

1. 缓存原理与风险

缓存利用了引用局部性原理,主要包括空间局部性和时间局部性:
- 空间局部性 :软件很可能按顺序访问内存。
- 时间局部性 :软件很可能访问最近访问过的内存。

在实际编程中,我们可以利用缓存现象和引用局部性原理,例如:
- 将数据结构的重要成员放在一起,最好在单个缓存行内,并位于结构的顶部。
- 对结构成员进行填充,避免跨越缓存行。

然而,使用缓存也存在风险,主要包括缓存一致性问题和伪共享问题。

2. 缓存一致性问题

在多核SMP系统中,每个CPU核心都有自己的私有内部缓存和TLB。缓存通常采用预读、写回策略,以优化性能。

以一个简单的例子来说明缓存一致性问题。假设有一个多核SMP系统,有2个核心,RAM中有一个全局整数N,初始值为55。

状态 时间/值 CPU核心0 L1, L2 CPU核心1 L1, L2 统一L3缓存 RAM
初始状态 (N); 核心0读取N (值55) t0.1 - - - 55
t0.2 - - 55 55
t0.3 55, 55 - 55 55
核心0: 将N设置为41 t1.1 41, 41 - 55 55
t1.2 41, 41 - 41 55
t1.3 41, 41 - 41 41
核心1: N ++; t2.1 41, 41 41, 41 41 41
t2.2 41, 41 42, 42 41 41
t2.3 41, 41 42, 42 42 41
t2.4 41, 41 42, 42 42 42
更新核心0的L1, L2 t3 42, 42 42, 42 42 42

具体的事务步骤如下:
1. 时间t0.1 :数据同步 (N=55)
- t0.2:核心0上的线程从RAM读取N,设置L3缓存条目。
- t0.3:设置L1和L2缓存条目,此时该核心的所有内部缓存和L3中都有值55。
2. 时间t1.1 :核心0上的线程将N从55修改为41,最初只有核心0的内部缓存反映了这一变化。
3. 时间t2 :核心1上的线程安全地执行N ++。
4. 需要更新N的值。
5. 处理器通过硬件缓存一致性协议检测到缓存和RAM不同步,进行同步操作:
- t1.2:使核心0的缓存失效并刷新到L3。
- t1.3:使核心0的缓存失效并刷新到RAM。
6. RAM和缓存同步后,核心1继续工作,缓存一致性过程重复:
- t2.1:从RAM将N读入核心1的内部缓存。
- t2.2:递增N,核心1的内部缓存从41更新到42。
- t2.3:将更新后的值 (42) 刷新到共享L3缓存。
- t2.4:将 (N=42) 刷新到RAM。
7. 核心1的缓存更新,处理并再次刷新以反映新状态。
8. t3:检测到核心0的内部缓存不同步并进行更新。
9. 新值设置完成后,所有CPU缓存彼此一致,并且与RAM一致。

缓存一致性处理虽然重要,但在性能和功耗方面代价很高。这种缓存行为,即从缓存写入RAM后需要在其他核心上进行相应的RAM到缓存的更新,通常称为“缓存跳动”或缓存“乒乓”。

系统通常使用基于硬件的缓存一致性协议来处理缓存一致性问题,如MESI、MOESI、Illinois等,也有基于目录的协议。现代AMD64/x86_64和大多数ARM处理器通常使用基于总线窥探的MOESI硬件协议。

3. 伪共享问题

考虑两个相邻声明的变量:

u16 ax = 1, bx = 2;

由于它们相邻声明,编译器很可能在运行时让它们占用同一个CPU缓存行。

在多核系统中,假设核心0上的线程T1处理变量ax,核心1上的线程T2处理变量bx。当T1修改ax时,CPU 0的缓存行将失效并刷新到RAM,然后RAM更新到核心1的缓存;同时,T2修改bx时也会有类似的操作。

这种情况会导致缓存和RAM之间大量的流量,即“缓存乒乓”,严重影响性能,增加功耗,这就是伪共享问题。

解决伪共享问题的方法是确保变量之间有足够的间隔,避免共享同一缓存行,例如:

u16 ax = 1;
char padding[64];
u16 bx = 2;

也可以使用编译器指令,但目前没有统一的共识。

在大型 (SMP) NUMA系统中,伪共享问题可能会更严重。例如,在内存管理层的一个关键数据结构中,由于两个自旋锁变量相邻声明,通常会共享同一缓存行,导致性能问题。

通过仔细测量性能,与“正常”基线进行比较,可以发现异常情况,识别是否由于伪共享导致性能下降。还可以使用处理器的性能测量计数器 (PMCs) 来微调缓存未命中/刷新事件,使用perf和eBPF等工具进行操作。

4. 锁的问题与锁无关编程

当操作共享可写数据时,通常使用锁来保护关键部分,但锁会带来性能问题。可以通过一些物理世界的类比来直观理解,例如漏斗、收费站或交通灯,这些都会导致瓶颈,在高端多核系统中问题会更严重。

此外,锁争用也是一个问题。增加系统中的锁数量可以降低特定锁的争用,但过多的锁会增加系统的复杂性,增加死锁的风险。

为了在保持性能的同时实现内核的可扩展性,需要使用锁无关算法,其中包括按CPU数据、锁无关数据结构和读-复制-更新 (RCU) 等技术。

5. 按CPU变量

按CPU变量为系统中的每个活动CPU核心保留一份变量副本,避免了线程之间的数据共享,从而消除了并发问题的关键部分。

例如,在一个有四个活动CPU核心的系统中,按CPU变量本质上是一个包含四个元素的数组,每个元素代表一个CPU核心上的数据值。

使用按CPU变量可以提高对时间敏感的代码路径的性能,原因如下:
- 避免使用昂贵的、影响性能的锁。
- 对给定的按CPU变量的访问和操作始终在一个特定的CPU核心上进行,避免了缓存跳动和伪共享等昂贵的缓存效应,降低了功耗。

Paul E. McKenney的演示表明,使用按CPU锁无关编程技术可以显著提高性能。

6. 读 - 复制 - 更新(RCU)

读 - 复制 - 更新(RCU)是另一种强大的锁无关编程技术。RCU 允许并发的读操作和写操作,而不需要使用传统的锁机制。

6.1 RCU 的基本原理
  • 读端 :读操作可以在不获取任何锁的情况下进行,因此读操作不会被写操作阻塞。读操作可以在数据结构的旧版本上进行,直到写操作完成并更新了数据结构。
  • 写端 :写操作需要复制一份数据结构的副本,在副本上进行修改,然后在适当的时候将修改后的副本替换原始数据结构。
6.2 RCU 的优势
  • 高性能 :由于读操作不需要获取锁,因此可以实现很高的并发性能。特别是在读多写少的场景下,RCU 的性能优势更加明显。
  • 低延迟 :读操作不会被写操作阻塞,因此读操作的延迟非常低。
6.3 RCU 的应用场景
  • 内核数据结构 :在操作系统内核中,很多数据结构都是读多写少的,例如路由表、进程列表等。使用 RCU 可以提高这些数据结构的并发访问性能。
  • 数据库系统 :在数据库系统中,很多数据也是读多写少的,例如索引、元数据等。使用 RCU 可以提高数据库系统的并发性能。
7. 锁无关编程的综合应用

在实际应用中,我们可以根据具体的场景选择合适的锁无关编程技术,或者将多种技术结合使用。

7.1 按 CPU 变量和 RCU 的结合

在多核系统中,我们可以将按 CPU 变量和 RCU 结合使用。例如,对于一个全局计数器,我们可以使用按 CPU 变量为每个 CPU 核心维护一个本地计数器,然后使用 RCU 来合并这些本地计数器。

graph TD;
    A[CPU Core 0] --> B[Local Counter 0];
    C[CPU Core 1] --> D[Local Counter 1];
    E[CPU Core 2] --> F[Local Counter 2];
    G[CPU Core 3] --> H[Local Counter 3];
    B --> I[RCU Merge];
    D --> I;
    F --> I;
    H --> I;
    I --> J[Global Counter];
7.2 锁无关编程的性能优化

为了进一步提高锁无关编程的性能,我们可以采取以下措施:
- 减少缓存一致性开销 :通过合理设计数据结构,避免伪共享问题,减少缓存一致性开销。
- 优化内存访问 :尽量减少内存访问的次数,提高内存访问的效率。
- 使用硬件加速 :利用现代处理器的硬件特性,如原子操作、缓存预取等,提高锁无关编程的性能。

8. 总结

锁无关编程技术,如按 CPU 变量和 RCU,为解决多核系统中的并发问题提供了有效的解决方案。通过避免使用传统的锁机制,这些技术可以显著提高系统的性能和可扩展性。

技术 优点 缺点 应用场景
按 CPU 变量 避免数据共享,消除并发问题;避免缓存效应,降低功耗 增加内存使用 时间敏感的代码路径
RCU 高性能,低延迟;读操作不被写操作阻塞 实现复杂 读多写少的场景

在实际应用中,我们需要根据具体的场景选择合适的锁无关编程技术,并结合性能优化措施,以实现最佳的性能和可扩展性。同时,我们也需要注意锁无关编程技术的局限性,避免在不适合的场景下使用。

内容概要:本文系统阐述了智能物流路径规划的技术体系实践应用,涵盖其发展背景、核心问题建模、关键算法、多目标动态环境处理、系统架构及典型应用场景。文章以车辆路径问题(VRP)及其变体为核心数学模型,介绍了从Dijkstra、A*等单智能体算法到多车VRP的元启发式求解方法(如遗传算法、蚁群算法、大规模邻域搜索),并深入探讨了多目标优化(成本、时间、碳排放)动态环境(实时订单、交通变化)下的自适应规划策略。结合城市配送、干线运输、场内物流等案例,展示了路径规划在提升效率、降低成本方面的实际价值,并分析了当前面临的复杂性、不确定性等挑战,展望了AI融合、数字孪生、车路协同等未来趋势。; 适合人群:具备一定物流、运筹学或计算机基础,从事智能交通、物流调度、算法研发等相关工作的技术人员管理人员,工作年限1-5年为宜。; 使用场景及目标:①理解智能物流路径规划的整体技术架构核心算法原理;②掌握VRP建模方法多目标、动态环境下路径优化的实现策略;③为物流系统设计、算法选型系统优化提供理论依据实践参考; 阅读建议:建议结合文中案例数学模型,重点理解算法选择实际业务场景的匹配逻辑,关注动态规划多目标优化的工程实现难点,可配合仿真工具或开源求解器进行实践验证。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值