unix内核概述-同步和临界区

同步和临界区:

实现可重入内核需要同步机制:如果内核控制路径对某个内核数据结构操作时被挂起,那么其他内核控制路径就不应该再对此数据结构操作,除非它已经设为一致性状态。否则两个控制路径交互执行将破坏所存储的信息。一般来说对全局变量的访问通过原子操作来保证。

非抢占式内核:

这与unix是具有抢占式进程的多处理操作系统并不矛盾。当进程在内核态执行时,他不能被任意挂起,也不能被另一个进程代替。因此,在单处理机上,中断或异常处理程序不能修改的所有内核数据结构,内核对他们的访问都是安全的。

如果内核支持抢占,那么在应用同步机制时,确保进入临界区前禁止抢占,退出临界区时启用抢占。

禁止中断:单处理机上的另一种同步机制是:在进入一个临界区之前禁止所有硬件中断,离开时再启用中断。这种机制比较简单,但不是最佳的,如果临界区比较大,那么在一个相当长的时间内,所有的硬件都将处于一个冻结状态。特别是在多处理机上,禁止本地中断是不够的。必须使用其他的同步技术。

信号量:广泛使用的一种机制是信号量,他在单处理器系统和多处理器系统都有效,信号量仅仅是与一个数据结构相关的计算器。所有的内核线程在试图访问这个数据结构之前,都要检查这个信号量。每个信号的组成如下:

一个整形的变量、一个等待进程的链表、两个原子方法down()和up();

down方法对信号量的值减一,如果小于0,该方法则吧正在运行的进程加入到这个信号量链表,然后阻塞该进程。up()方法对信号量值+1,如果信号量新值>0,则激活链表中的一个或多个进程。

自旋锁:

在多处理器系统上,信号量并不是解决同步问题的最佳方案。为了检查信号量,内核必须把进程插入到信号量链表中,然后挂起他。因为这两种操作比较费时,完成这些操作时,其他的内核控制路径可能已经释放了信号量。

在这种情况下,多处理器系统使用自旋锁。自旋锁与信号量非常相似但没有进程链表;当一个进程发现锁被另一个进程锁着的时候,他就不停的旋转,执行一个紧凑的循环命令,直到锁打开。

自旋锁在单处理器上是无效的。当内核控制路径试图访问一个上锁的数据结构时,他无休止的循环,因此内核控制路径可能因为正在修改保护的数据结构而没有机会继续执行,也没有机会释放自旋锁,最后的结果可能是系统挂起。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值