PV操作问题

PV操作是管理临界资源,达成并行执行的重要方法,但是最近上操作系统课时,课本上说P操作可以将semaphore减为负值,并且负值得绝对值表示申请资源的数目,这让我感到疑惑。
Tanenbaum的Modern Operating System P128 是这样写的:

If the value is 0, the process is put to sleep without completing the down(P) for the moment.

……

Thus, after an up(V)  on a semaphore with processes sleeping on it, the semaphore will still be 0, but there will be one fewer process sleeping on it.

也就是说当执行P操作时,若semaphore的值为0则,不将semaphore的值减1即P操作未执行完,直接让这个进程阻塞,之后等到进入临界区的进程完成操作执行V之后,这个进程再把它的P操作执行完。

为什么要这样呢?为什么不能按我课本上所说的让P操作执行完后阻塞,然后可以根据semaphore的值来判断到底有几个进程被阻塞,在等待?

也许是因为没有必要统计多少资源被阻塞,而且若semaphore小于0,被阻塞的进程被用户强制关闭,则临界资源永远得不到释放,操作系统还要去检查被用户强制关闭的阻塞进程是否有未执行的V操作,并将其执行,这就增加了复杂度。

真正的原因跪求高手解答。

Comments

  1. 我觉得功能都是一样的。

    当value为负数的时候,v的绝对值和等待的线程数量是一致的。

    但是,直接判断value是否小于0和判断链表是不是空的效率比较很重要,不知道都是怎么实现的而已。
    另外,如果是Tanenbaum的方法,那value就是无符号了,范围更大了。

    ReplyDelete

Post a Comment

Popular posts from this blog

socket close shutdown函数区别

批量在文件头插入

hash表取模技巧