在单处理器系统中, 关掉中断不关抢占意味着不存在竟态?
dyron 2013-06-20 11:03:49 最近在看关于spin_lock这方面的一些代码, 翻了翻书, 看到之前的经典描述,有几点疑问, 请教一下.
1. 在<深入理解linux内核>中,有这么一个描述, 在单处理器系统中, spin_lock仅仅禁止和启用内核抢占, 请注意, 在自旋锁忙等期间, 内核抢占还是有效的, 等待锁释放的进程有可能被更高优先级
的进行抢占.
static inline void spin_lock(spinlock_t *lock)
{ raw_spin_lock(&lock->rlock);
}
#define raw_spin_lock(lock) _raw_spin_lock(lock)
#define _raw_spin_lock(lock) __LOCK(lock)
#define __LOCK(lock) \
do { preempt_disable(); __acquire(lock); (void)(lock); } while (0)
在上边的定义中发现, 在一进入到锁的情况下, 是先关抢占, 再进行忙等的, 所以认为上边所述的这个观点不正确, 也可能是版本存在的差异.
2. 在单CPU情况下, 关掉中断, 开内核抢占, 似乎也没有人可以打断当前内核的执行路径.
内核抢占点只有几个地方:
. 中断返回时
. 自动放弃CPU
. 异常/系统调用返回时
. 内核再次具有可抢占性的时候.
在上边的条件中, 1,3,4都不存在,2自己又不做, 所以认为内核的执行路径关掉中断, 也不会产
生抢占的可能性, 还请教大家论一论.