您的位置:首页 > 运维架构 > Linux

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

2014-11-08 14:31 260 查看
其他的同步方法:

完成变量

DKL大内核锁

禁止抢占

顺序和屏障等

禁止抢占

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

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

禁止抢占的接口函数:preempt_disable和preempt_enable

内存屏障:

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

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

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

对处理器的操作接口:

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

wmb():写内存屏障

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

对编译器的处理接口:

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

内存屏障可以完成编译器屏障的功能,但是编译器屏障要比内存屏障更加轻量级。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: