4.内核同步

        A在异常处理程序中来了中断,在中断处理程序中唤醒了一个高优先级的进程B,如果内核是抢占式,那么会发生强制进程切换,用B切换Athread_infoLinux进程总是抢占的,而抢占式内核是由Love编写的,从linux2.6LoveLinuxthread_infopreempt_count0preempt_count字段总大于0,即总是禁用内核抢占。综上,只有在显式抢占计数为0且在异常处理程序中时,内核才可以被抢占。但在异常准备返回时也要关中断,防止在做准备工作时被抢占。中断程序返回时,要检查CPUthread_infoflagsTIF_NEED_RESCHEDpreempt_count       1.       原子操作:顾名思义,不多说了。它的实现是由inc,等芯片级不可中断汇编语句。在多处理器环境中要加lock前缀,锁定内存总线。LinuxC函数与宏来实现。

2.       优化屏障、内存屏障:用编译器优化代码时,不要指望指令会严格按出现在源代码中的顺序来执行,同时,现代CPU会并行执行若干指令,并可重新安排内存访问。所以处理器同步要避免指令重排序。优化屏障使编译器不用寄存器中的值来优化asm指令前的代码。类似CvolatileLinux3.       自旋锁:自旋,即忙等。为何要忙等?不能像信号量一样把自己阻塞起来?因为当在内核控制路径中的进程,有时(应该说大多数时)不可抢占,所以不能阻塞。它的概念上的功能同信号量。当然,自旋锁锁区禁止内核抢占,否则乱套了。

4.       禁止中断:最容易想到的同步方案,简单快捷,问题是对系统并发性影响很大。

5.       其它:读写自旋锁,实现读写同步的自旋锁,同读写信号量类似;顺序锁类似读写自旋锁,只是算法不同,它允许写者提前,而读者在读前与读后得分别读取一个计数值,而写会改变这个计数值。如果读前后的计数值不一致,说明读的过程中出现了写,这时要重读。

回头再看自旋锁,如果单CPU时自旋,那就系统冻结了,显然不行。它是给多CPU专用的。单CPU

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值