互斥和临界区之间的边界是什么?

时间:2015-07-19 16:37:56

标签: operating-system kernel ipc mutex critical-section

我曾经知道关键部分不能用于进程,因为它们不是内核对象。但在Modern操作系统中,我看到了两个可以与进程一起使用的实现。

使用TSL实施:

enter region:
    TSL REGISTER,LOCK | copy lock to register and set lock to 1
    CMP REGISTER,#0 | was lock zero?
    JNE enter region | if it was not zero, lock was set, so loop
    RET | return to caller; critical region entered
leave region:
    MOVE LOCK,#0 | store a 0 in lock
    RET | return to caller

使用XCHG实施:

enter region:
    MOVE REGISTER,#1 | put a 1 in the register
    XCHG REGISTER,LOCK | swap the contents of the register and lock variable
    CMP REGISTER,#0 | was lock zero?
    JNE enter region | if it was non zero, lock was set, so loop
    RET | return to caller; critical region entered
leave region:
    MOVE LOCK,#0 | store a 0 in lock
    RET | return to caller

那么关键部分是否可以用于流程真的取决于实现?互斥和临界区之间的前沿在哪里,我们可以将上面的代码称为关键部分或它是互斥的代码吗?

感谢。

1 个答案:

答案 0 :(得分:0)

关键部分可用于用户进程内核模式代码。所需要的只是一种强制执行关键部分互斥属性的方法。

您引用的两个代码块通过使用原子操作(tslxchg)来实现关键部分。所以代码本身并不是一个关键部分。关键部分强制互斥。