linux内核同步(5)--其它同步方法

本文详细介绍了内核同步的各种方法,包括禁止抢占、内存屏障等技术,并解释了它们的工作原理和应用场景。对于禁止抢占,文章讲解了如何通过自旋锁避免内核抢占,并探讨了在特定情况下无需自旋锁的情况。而对于内存屏障,则从处理器和编译器两个角度介绍了不同的屏障指令及其作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其他的同步方法:

完成变量

DKL大内核锁

禁止抢占

顺序和屏障等

 

禁止抢占

        由于内核的可抢占性,意味着一个任务与被抢占的任务可能会在同一个临界区内运行。为避免这种情况,内核抢占代码会使用自旋锁作为非抢占区域的标记。即如果一个自旋锁被持有,内核便不能进行抢占。

        但是有一种情况,不需要自旋锁,但是仍需要关闭内核抢占:一般来讲,每个处理器独立的变量也会被多个进程以伪并发的方式进行访问。通常这个变量会氢气自旋锁,防止多处理器上的真并发。如果是每个CPU上独立的变量,可能就不需要锁。

禁止抢占的接口函数:preempt_disablepreempt_enable

 

内存屏障:

        当处理多处理器之间或者硬件设备之间的同步问题时,有时需要在代码中加以指定的顺序发出读内存(读入)和写内存(存储)指令。编译器和处理器为了提高效率,可能对读和写进行重新排序。现在处理器为了优化其传送管道(pipeline),打乱了分派和提交指令的顺序。

 

处理器提供了机器指令来确保顺序要求

编译器不要对给定点周围的指令序列进行重新排序。这种指令叫做屏障 barrier

 

对处理器的操作接口:

rmb():读内存屏障,它确保跨越rmb()载入动作不会发生重排。

wmb():写内存屏障

mb():即提供了读屏障也提供了写屏障。载入和存储动作都不会跨越屏障进行重排。

 

对编译器的处理接口:

barrier():防止编译器跨越屏障对载入或者存储操作进行优化,编译器不会重新组织存储或载入操作而防止改变C代码的效果和现有的数据依赖关系。

 

内存屏障可以完成编译器屏障的功能,但是编译器屏障要比内存屏障更加轻量级。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值