xv6 锁

 

  在xv6 中锁对象是 spinlock,spinlock中的locked为1的时候表示被占用,为0的时候锁空闲。

struct spinlock {
  uint locked;       // Is the lock held?
  ......
};

 

  使用 acquire获取锁

void acquire(struct spinlock *lk)
{
  ........
  while(xchg(&lk->locked, 1) != 0);
  ......
}

  该函数中通过xchg原子性交换locked和1,并返回locked的原来的值。当返回值为1时,说明其他线程占用了该锁,继续循环等待;当返回值为0时,说明其他地方没有占用该锁,同时locked本设置成1了,所以该锁被此处占用。

  

static inline uint xchg(volatile uint *addr, uint newval)
{
  uint result;

  // The + in "+m" denotes a read-modify-write operand.
  asm volatile("lock; xchgl %0, %1" :
               "+m" (*addr), "=a" (result) :
               "1" (newval) :
               "cc");
  /*
    //最终汇编类似于
    movq    *addr, %rdx
    movl    newval, %eax
    lock; xchgl (%rdx), %eax
    movl    %eax, result
    
  */
  return result;
}

  xchg通过lock xchg实现原子性的交换,把*addr的老值放入eax中,然后在赋值给result。

 

  释放锁

void release(struct spinlock *lk)
{
  ...
  // Release the lock, equivalent to lk->locked = 0.
  // This code can't use a C assignment, since it might
  // not be atomic. A real OS would use C atomics here.
  asm volatile("movl $0, %0" : "+m" (lk->locked) : );
  ...
}

 

转载于:https://www.cnblogs.com/hygblog/p/9361888.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值