Posted on 2008-04-30 01:32
MichaelCao 阅读(1122)
评论(0) 编辑 收藏 引用 所属分类:
OS
刚刚开始想这个问题的时候,觉得好像这个根本就不是一个问题.学操作系统的进程间的通信时,就是先说用互斥锁解决两个进程同时访问临界区的方法.但是后来Dijkstra对于哲学家进餐的问题的解答使用了信号量,于是我们接受了信号量.在看pthread的时候,发现还有个自旋锁.于是有点晕,这两个不都是控制对临界区的访问的么?怎么都上来了?他们之间有什么区别,他们又都是怎么实现的?
首先说自旋锁.这个实现基本上是和TSL相同.TSL指令,首先是要共享一个lock,当进入临界区时,首先将lock复制到寄存器,然后将lock置为1,接下来看寄存器中的值是否为0,为0进入.不为0返回.而最重要的是它能保证指令执行的不可分割性,也就是说在这条指令结束之前,其他指令不允许访问内存.实现的是方式是在指令执行之前将内存总线禁止.结束后在打开内存总线.而自旋锁实现就是这个样子.只不过多循环了几次.为了更好的让cpu调度,在尝试一定次数后返回.因为他是一直在那边循环所以叫做自旋锁.可见这种锁很耗资源.但是速度上来说很快.一旦锁释放,立刻可以得到资源.
再来看看信号量,信号量的实现就不这般精准了.如果使用一个信号量来控制一个临界区的话.就会有很多情况,首先最明显的是读者-写者问题.可以有多个读者,写者只可以有一个.并且信号量的实现也和自旋锁有者一定的区别.当一个信号量不能访问后.进程不会在那里循环,会被睡眠掉.当信号量可以使用的时候,调度器会从可以调度的进程选择一个.
基本上就这个样子.