我曾经知道关键部分不能用于进程,因为它们不是内核对象。但在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
那么关键部分是否可以用于流程真的取决于实现?互斥和临界区之间的前沿在哪里,我们可以将上面的代码称为关键部分或它是互斥的代码吗?
感谢。
答案 0 :(得分:0)
关键部分可用于用户进程或内核模式代码。所需要的只是一种强制执行关键部分互斥属性的方法。
您引用的两个代码块通过使用原子操作(tsl
,xchg
)来实现关键部分。所以代码本身并不是一个关键部分。关键部分强制互斥。