xv6 锁
2024-09-02 23:59:12
在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) : );
...
}
最新文章
- 我在 CSDN 的小窝
- Clr Via C#读书笔记---垃圾回收机制
- iOS 工作遇到问题记录
- c#多线程(UI线程,控件显示更新) Invoke和BeginInvoke 区别
- MFC开发上位机到底用Dialog结构还是文档结构?
- zzuli oj 1165 实数的小数部分(指针专题)
- web前端:js
- abstract修饰符,具体类与抽象类的区别
- CDN(转载)
- if(){}else 语句的正确写法以及它的嵌套使用
- ajax 大洋与小样的第二步
- 入门Webpack
- windows 执行bat脚本
- 解释一下核主成分分析(Kernel Principal Component Analysis, KPCA)的公式推导过程(转载)
- Geohash距离估算
- 10分钟轻松设置出 A+ 评分的 HTTP/2 网站
- 在sublime text3中安装sass编译scss文件
- windows和linux文件的转换
- faceswap使用手冊
- Redis学习五:Redis的持久化-RDB
热门文章
- Windows一键启动多个软件
- Spark实验汇总(七个实验相结合)
- Victor and String[Bestcoder #52 1004](回文树)
- 数据库事务ACID特效
- 认识系统服务 (daemons)
- Ubuntu的妥协将支持精选的32位应用
- _CrtIsValidHeapPointer(pUserData)
- 《算法技术手册》George T. Heineman(作者)epub+mobi+azw3
- Java HotSpot(TM) Client VM 与 server VM 的配置
- Kotlin 学习 (一)