解释操作系统中使用的单处理器/多处理器锁定系统
Explain a uniprocessor / multiprocessor locking system used in operating systems
所以我正在学习操作系统课程,目前正在学习有关同步的章节。
我遇到了这些函数作为获取和释放锁的方法,课程展示了这些方法并询问为什么这适用于单处理器系统而不适用于多处理器系统。当然我知道它在单处理器系统上工作,但我不明白在多处理器系统上会发生什么。谁能解释一下,谢谢!
以下是在多处理器系统上可能不够用的 2 种方法:
锁获取方法
void lock_acquire(lock_t *lock) {
disable_interrupts();
while (*lock) {
enable_interrupts();
disable_interrupts();
}
*lock=1;
enable_interrupts();
解锁方式
void lock_release(lock_t *lock) {
disable_interrupts();
*lock=0;
enable_interrupts();
}
因为禁用中断不会阻止总线上的第二个处理器访问读取和写入之间的临界区,事实上在多处理器系统上您应该使用 TSL
或 XCHG
防止此问题阻塞内存总线的指令,如下所示:
mutex_lock:
TSL register,mutex
CMP register,#0
JZE ok
call thread_yield
JMP mutex_lock
ok: ret
mutex_unlock:
MOV MUTEX,#0
ret
所以我正在学习操作系统课程,目前正在学习有关同步的章节。 我遇到了这些函数作为获取和释放锁的方法,课程展示了这些方法并询问为什么这适用于单处理器系统而不适用于多处理器系统。当然我知道它在单处理器系统上工作,但我不明白在多处理器系统上会发生什么。谁能解释一下,谢谢!
以下是在多处理器系统上可能不够用的 2 种方法: 锁获取方法
void lock_acquire(lock_t *lock) {
disable_interrupts();
while (*lock) {
enable_interrupts();
disable_interrupts();
}
*lock=1;
enable_interrupts();
解锁方式
void lock_release(lock_t *lock) {
disable_interrupts();
*lock=0;
enable_interrupts();
}
因为禁用中断不会阻止总线上的第二个处理器访问读取和写入之间的临界区,事实上在多处理器系统上您应该使用 TSL
或 XCHG
防止此问题阻塞内存总线的指令,如下所示:
mutex_lock:
TSL register,mutex
CMP register,#0
JZE ok
call thread_yield
JMP mutex_lock
ok: ret
mutex_unlock:
MOV MUTEX,#0
ret