这是 2020 南京大学 “操作系统:设计与实现” (蒋炎岩) 的课程笔记
本节要点:
- 互斥问题
- 共享内存上的互斥
- 原子指令的互斥
- 数据竞争
理解并发的另一个工具:把线程想象成人、把共享内存想象成物理世界
线程不想被别人打断地做一件事
互斥(mutual exclusion) “互相排斥”
typedef struct{...
} lock_t;// 试图获得锁的独占访问,成功获得后返回
void lock(lock_t = lk);
// 释放锁的独占访问
void unlock(lockk_t = lk);
互斥是一把“排他性”的锁——对于锁对象lk
状态机的视角
上了锁的代码完全不能并发执行
先执行的代码,它对共享内存的写,对之后执行的代码是可见的。
在共享内存上,贡献资源的访问太危险(原子性、顺序性、可见性丧失),互斥用来阻止代码块之间的并发,实现“串行化”
锁帮我们拯救了原子性、顺序性、可见性。
共享内存多线程:独立的寄存器/堆栈:共享内存
支持的基本操作
困难之处在于:不能同时读/写共享内存
int x = 0, y = 0;void thread_1{[1]store(x, 1); [2]t = load(y); // 处理器允许 1-2 交换printf("y = %dn", t);
}void thread_2{[1]store(y, 1); [2]t = load(x); // 处理器允许 1-2 交换printf
本文发布于:2024-02-02 21:26:36,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170688039746541.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |