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

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

  使用 acquire获取锁

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

  该函数中通过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) :
"" (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) : );
...
}

最新文章

  1. 我在 CSDN 的小窝
  2. Clr Via C#读书笔记---垃圾回收机制
  3. iOS 工作遇到问题记录
  4. c#多线程(UI线程,控件显示更新) Invoke和BeginInvoke 区别
  5. MFC开发上位机到底用Dialog结构还是文档结构?
  6. zzuli oj 1165 实数的小数部分(指针专题)
  7. web前端:js
  8. abstract修饰符,具体类与抽象类的区别
  9. CDN(转载)
  10. if(){}else 语句的正确写法以及它的嵌套使用
  11. ajax 大洋与小样的第二步
  12. 入门Webpack
  13. windows 执行bat脚本
  14. 解释一下核主成分分析(Kernel Principal Component Analysis, KPCA)的公式推导过程(转载)
  15. Geohash距离估算
  16. 10分钟轻松设置出 A+ 评分的 HTTP/2 网站
  17. 在sublime text3中安装sass编译scss文件
  18. windows和linux文件的转换
  19. faceswap使用手冊
  20. Redis学习五:Redis的持久化-RDB

热门文章

  1. Windows一键启动多个软件
  2. Spark实验汇总(七个实验相结合)
  3. Victor and String[Bestcoder #52 1004](回文树)
  4. 数据库事务ACID特效
  5. 认识系统服务 (daemons)
  6. Ubuntu的妥协将支持精选的32位应用
  7. _CrtIsValidHeapPointer(pUserData)
  8. 《算法技术手册》George T. Heineman(作者)epub+mobi+azw3
  9. Java HotSpot(TM) Client VM 与 server VM 的配置
  10. Kotlin 学习 (一)