martin

thinking

常用链接

统计

software

最新评论

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

posted on 2013-06-08 17:04 martin_yahoo 阅读(1418) 评论(1)  编辑 收藏 引用

评论

# re: MP操作系统内核中自旋锁(spinlock)的实现[未登录] 2013-06-15 09:01 Korall

减少锁的争用 两种办法,第二种是因噎废食啊。第一种办法遵循的是小粒度锁的原则,能达到真正的目标  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理