在多CPU系统,即MP系统中,存在总线仲裁。
1. 原子操作
从CPU或者I/O设备到主存储器的单次读或者写操作为原子操作。
这样的操作一旦开始,就不能被系统上来自CPU或者I/O设备的任何其他存储操作所中断,或者受到他们的干扰。
原子变量
2. 自旋锁 (自旋锁用于短期互斥)
自旋锁得名于这样一个事实,一个进程在等候另一个进程正在使用的锁时会处于忙等待(busy-wait,在一个循环中自旋)状态。
typedef int lock_t;
void initlock( volatile lock_t * lock_status)
{
*lock_status = 0;
}
int
test_and_set(volatile int *addr)
{
int old_value;
old_value = swap_atomic(addr, 1);
if (old_value == 0)
return 0;
return 1;
}
void lock(volatile lock_t *lock_status)
{
while (test_and_set( lock_status) == 1) //被锁定时,进程在此自旋。
;
}
// test_and_set 如果前面的状态不为0就返回1,否则返回0.
//如果锁的状态已经是1(锁已经被占用),那么test_and_set函数返回1,并且处理器在循环中自旋,直到该锁被释放为止。只要把锁的状态设置为0,就可以释放锁了。
void
unlock(volatile lock_t * lock_status)
{
*lock_status =0;
}
减少对锁的争用可以采用两种办法:
第一、内核针对不同的临界资源使用不同的自旋锁,防止处理器在没有竞争条件威胁的时候被另一个处理器挂起。
第二、增强lock和unlock函数,在上锁的时候屏蔽中断。