2015-07-19 51 views
1

我以前知道关键部分不能用于进程,因为它们不是内核对象。但是在现代操作系统中,我看到了两个可以与进程一起使用的实现。互斥体和临界区之间的边界是什么?

实现与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 

所以无论关键部分可用于进程完全取决于实施?互斥体和临界区之间的边界在哪里,我们可以将上面的代码称为临界区或它是互斥体的代码?

谢谢。

回答

0

关键部分可用于用户进程内核模式代码。所需的一切都是强制执行关键部分互斥特性的手段。

您引用的两段代码通过使用原子操作实现了关键段(tsl,xchg)。所以代码本身不是关键部分。而关键部分强制相互排斥。