当前位置: 技术问答>linux和unix
问一个P、V原语实现的问题
来源: 互联网 发布时间:2015-07-03
本文导语: 在《操作系统:设计与实现》一书中说:”操作系统只需在以下操作时短暂地关掉中断,这些操作包括:检测信号量修改信号量以及在需要时使进程睡眠。“ 我的问题是:作为原语,上述所有操作应该包含在sti...
在《操作系统:设计与实现》一书中说:”操作系统只需在以下操作时短暂地关掉中断,这些操作包括:检测信号量修改信号量以及在需要时使进程睡眠。“
我的问题是:作为原语,上述所有操作应该包含在sti和cli之间,这样的话P操作中睡眠和开中断之间的顺序怎么解决?如果先睡眠,那么开中断就不是不能马上跟着执行的,而是等到唤醒,但是中断没开连进程调度都不能进行,又如何唤醒呢(是不是这样我不知道,猜想的)?如果先开中断,后睡眠,那么就可能出现这种情况:开中断后进程马上被调度切换,下次调度回来时执行睡眠,这样就有了P操作的现有效果,但是这样就不是原语了吧?
小弟学识浅薄,想不出个所以然来,盼求各位高人指点一二,跪谢。。。。。
我的问题是:作为原语,上述所有操作应该包含在sti和cli之间,这样的话P操作中睡眠和开中断之间的顺序怎么解决?如果先睡眠,那么开中断就不是不能马上跟着执行的,而是等到唤醒,但是中断没开连进程调度都不能进行,又如何唤醒呢(是不是这样我不知道,猜想的)?如果先开中断,后睡眠,那么就可能出现这种情况:开中断后进程马上被调度切换,下次调度回来时执行睡眠,这样就有了P操作的现有效果,但是这样就不是原语了吧?
小弟学识浅薄,想不出个所以然来,盼求各位高人指点一二,跪谢。。。。。
|
你看的是什么文件,我知道的,在一个简单的类linux的实现里,P的时候,计数器减1前关中断,然后判断,如果小于0,挂入等待队列,设置状态,然后,调用一个task dispatch,在它里面开中断。
linux内核里,down是一个原子操作,汇编实现的,如计数器减一后小于0,调用的是__down_fail();__down_fail()调用的是__down()。
关于这方面,我也没仔细想过,说说你看到的实现和你的想法吧。
linux内核里,down是一个原子操作,汇编实现的,如计数器减一后小于0,调用的是__down_fail();__down_fail()调用的是__down()。
关于这方面,我也没仔细想过,说说你看到的实现和你的想法吧。