Linux内核设计与实现——内核同步
系统大全为您提供
内核同步
读写信号量都是二值信号量,即计数值最大为1,增加读者时,计数器不变,增加写者,计数器才减一。也就是说读写信号量保护的临界区,最多只有一个写者,但可以有多个读者。
所有读-写锁的睡眠都不会被信号打断,所以它只有一个版本的down操作。
了解何时使用自旋锁和信号量对编写优良代码很重要,但是多数情况下,并不需要太多考虑,因为在中断上下文只能使用自旋锁,而在任务睡眠时只能使用信号量。
完成变量
如果在内核中一个任务需要发出信号通知另一任务发生了某个特定事件,利用完成变量(completion variable)是使两个任务得以同步的简单方法。如果一个任务要执行一些工作时,另一个任务就会在完成变量上等待。当这个任务完成工作后,会使用完成变量去唤醒在等待的任务。例如,当子进程执行或者退出时,vfork()系统调用使用完成变量唤醒父进程。
Seq锁(顺序锁)
这种锁提供了一种很简单的机制,用于读写共享数据。实现这种锁主要依靠一个序列计数器。当有疑义的数据被写入时,会得到一个锁,并且序列值会增加。在读取数据之前和之后,序列号都被读取。如果读取的序列号值相同,说明在读操作进行的过程中没有被写操作打断过。此外,如果读取的值是偶数,那么就表明写操作没有发生(要明白因为锁的初值是0,所以写锁会使值成奇数,释放的时候变成偶数)。
在多个读者和少数写者共享一把锁的时候,seq锁有助于提供一种非常轻量级和具有可扩展性的外观。但是 seq 锁对写者更有利,只要没有其他写者,写锁总是能够被成功获得。挂起的写者会不断地使得读操作循环(前一个例子),直到不再有任何写者持有锁为止。
禁止抢占
由于内核是抢占性的,内核中的进程在任何时刻都可能停下来以便另一个具有更高优先权的进程运行。这意味着一个任务与被抢占的任务可能会在同一个临界区内运行。为了避免这种情况,内核抢占代码使用自旋锁作(可以防止多处理器机器上的真并发和内核抢占)为非抢占区域的标记。如果一个自旋锁被持有,内核便不能进行抢占。
实际中,某些情况(不需要仿真多处理器机器上的真并发,但需要防止内核抢占)并不需要自旋锁,但是仍然需要关闭内核抢占。为了解决这个问题,可以通过 preempt_disable 禁止内核抢占。这是一个可以嵌套调用的函数,可以调用任意次。每次调用都必须有一个相应的 preempt_enable 调用。当最后一次 preempt_enable 被调用后,内核抢占才重新占用。
顺序和屏障
对于一段代码,编译器或者处理器在编译和执行时可能会对执行顺序进行一些优化,从而使得代码的执行顺序和我们写的代码有些区别。
一般情况下,这没有什么问题,但是在并发条件下,可能会出现取得的值与预期不一致的情况,比如下面的代码:
/* * 线程A和线程B共享的变量 a和b * 初始值 a=1, b=2 */ int a = 1, b = 2; /* * 假设线程A 中对 a和b的操作 */ void Thread_A() { a = 5; b = 4; } /* * 假设线程B 中对 a和b的操作 */ void Thread_B() { if (b == 4) printf("a = %d ", a); }
由于编译器或者处理器的优化,线程A中的赋值顺序可能是b先赋值后,a才被赋值。
所以如果线程A中 b=4; 执行完,a=5; 还没有执行的时候,线程B开始执行,那么线程B打印的是a的初始值1。
这就与我们预期的不一致了,我们预期的是a在b之前赋值,所以线程B要么不打印内容,如果打印的话,a的值应该是5。
在某些并发情况下,为了保证代码的执行顺序,引入了一系列屏障方法来阻止编译器和处理器的优化。
为了使得上面的小例子能正确执行,用上表中的函数修改线程A的函数即可:
/* * 假设线程A 中对 a和b的操作 */ void Thread_A() { a = 5; mb(); /* * mb()保证在对b进行载入和存储值(值就是4)的操作之前 * mb()代码之前的所有载入和存储值的操作全部完成(即 a = 5;已经完成) * 只要保证a的赋值在b的赋值之前进行,那么线程B的执行结果就和预期一样 */ b = 4; }
以上就是系统大全给大家介绍的如何使的方法都有一定的了解了吧,好了,如果大家还想了解更多的资讯,那就赶紧点击系统大全官网吧。
本文来自系统大全http://www.win7cn.com/如需转载请注明!推荐:win7纯净版
相关文章
- win11如何添加控制面板?win11控制面板快捷方式添加方法
- win11如何设置绿色护眼模式?win11绿色护眼模式开启教程
- win11开始菜单怎么固定软件?win11开始菜单固定软件设置方法
- win10不显示新安装硬盘怎么办?win10新安装硬盘找不到解决方法
- win10分辨率无法设置怎么办?win10分辨率不能修改解决方法
- win10如何修改开机问候语?win10系统开机问候语更改教程
- win7电脑怎么整理磁盘碎片?win7系统磁盘碎片整理操作方法
- win7系统修改用户名后无法登录账号怎么解决?
- 360浏览器如何开启桌面搜索栏?360浏览器桌面搜索栏启动教程
- Word怎么切换成正常模式?Word兼容模式修改为正常模式教程
系统下载排行榜71011xp
番茄花园 GHOST WIN7 SP1 X64 快速稳定版 V2017.03 (64位
2深度技术 GHOST WIN7 SP1 X64 稳定安全版 V2017.02(64位
3雨林木风 GHOST WIN7 SP1(32位)装机版 V2017.03
4深度技术 GHOST WIN7 SP1 X86 专业装机版 V2017.03(32位
5电脑公司 GHOST WIN7 SP1 X86 经典旗舰版 V2017.03(32位
6深度技术 GHOST WIN7 SP1 X86 稳定安全版 V2017.02
7深度技术 GHOST WIN7 SP1 X64 专业装机版 V2017.03(64位
8电脑公司 GHOST WIN7 SP1 X64 经典旗舰版 V2017.03(64位
9电脑公司 GHOST WIN7 SP1 X64 新春贺岁版 V2017.02(64位
10电脑公司 GHOST WIN7 SP1 X86 新春贺岁版 V2017.02(32位
win10系统下载 Win10 1607 精简安装版 LTSB长期服务版
2Win10专业工作站版最新镜像 V2022.06
3微软原版Win10 ISO镜像64位(win10纯净版)
4深度技术 Ghost Win10 64位 国庆特别版 V2021.10
5电脑公司Ghost Win10 64位装机版V2017.03
6雨晨 Win10 1703 15063.250 64位 极速精简版
7JUJUMAO Win8.1 Up3 X64 极速精简版v2019.11
8win10系统下载 稳安快 Win10 x64 极速精简版 V1.0
9lopatkin Win10专业精简版 V2022.05
10Win10 21H2 纯净版镜像 V2021
Win11PE网络纯净版 V2021
2风林火山 Ghost Win11 64位 专业正式版 V2021.10
3Win11官方纯净版 V2021
4Win11 23H2 25115 官方原版镜像 V2022.05
5新一代系统 JUJUMAO Win11专业版 64位 v2021.08
6雨林木风 Ghost Win11 64位 正式版 V2021.10
7微软MSDN原版Win11系统 V2021
8Win11 22000.282正式版镜像 V2021.10
9深度技术 Ghost Win11 64位 专业版 V2021.10
10微软Win11游戏系统 V2021.10
深度技术 GHOST XP SP3 电脑专用版 V2017.03
2深度技术 GGHOST XP SP3 电脑专用版 V2017.02
3Win7系统下载 PCOS技术Ghost WinXP SP3 2017 夏季装机版
4萝卜家园 GHOST XP SP3 万能装机版 V2017.03
5番茄花园 GHOST XP SP3 极速体验版 V2017.03
6雨林木风 GHOST XP SP3 官方旗舰版 V2017.03
7电脑公司 GHOST XP SP3 经典旗舰版 V2017.03
8雨林木风GHOST XP SP3完美纯净版【V201710】已激活
9萝卜家园 GHOST XP SP3 完美装机版 V2016.10
10雨林木风 GHOST XP SP3 精英装机版 V2017.04
热门教程
装机必备 更多+
重装工具