免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1578 | 回复: 0
打印 上一主题 下一主题

内核中的互斥,我的理解 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-12 16:02 |只看该作者 |倒序浏览
发在这里,望指正和补充

一、内核中的并行的原因(FROM LKD3):
1.中断 --中断可以在任何时刻异步地发生,也就可能随时打断当前正在执行的代码。
2.软中断(和tasklet)-- 内核可能在任何时候唤醒或调度软中断和tasklet,打断当前正在执行的代码。
3.内核抢占--内核中的任务可能被另一个任务抢占。
4.睡眠以及用户空间的同步--进程睡眠会唤醒调度程序,导致一个新的进程运行。
5.SMP--多个处理器可以同时执行代码。


二、互斥的使用

3、4属于进程间的互斥,当进程间有共享数据需要保护时,可以使用semaphore。一个进程需要读写共享数据时,要先获取相应的semaphore,当获取失败时,它则进入睡眠状态,等待另一个进程完成对共享数据的操作后释放semaphore并将其唤醒。这里涉及到进程的睡眠,spin lock会造成死锁,所以并不适用。

情况1属于中断和进程间的互斥。如果一个进程在操作和中断例程共享的数据的时候,突然有中断的到来,这样中断处理例程就会抢占执行,在进程没有完成对共享数据操作的时候插入它的操作,这样就会造成共享数据的混乱,所以就有必要加锁。由于在中断处理过程中不存在进程上下文不允许睡眠,所以这里不能使用semaphore而要使用spin lock,同时,为了避免进程在获取spin lock后操作共享数据时被中断打断(但中断不能获取spin lock)而造成死锁,所以在这种情况下进程必须在操作共享数据时关中断--使用
spin_lock_irqsave()/spin_unlock_irqrestore()。

情况2跟1类似,不同的是适用于中断下半部。这时候可以使用spin_lock_bh()/spin_unlock_bh()。

情况5可以使用spin lock或semaphore,短期低开销的加锁可以使用spin lock,长期的加锁则应该使用semaphore。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP