MP操作系统内核中自旋锁(spinlock)的实现

MP操作系统内核中自旋锁(spinlock)的实现

在多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函数,在上锁的时候屏蔽中断。

你可能感兴趣的:(MP操作系统内核中自旋锁(spinlock)的实现)