OS-并发-从入门到放弃
放弃
进入并发领域,我们将要放弃很多默认的条件:
- 原子性:
"程序独占处理器执行"的假设不再成立。程序可能在运行中被打断,甚至一条汇编指令也可能被中断。例如,更新共享变量时可能因中断导致数据不完整。为解决此问题,需通过同步原语(如锁)将操作封装为临界区,确保原子性。 - 顺序性:
编译器将代码视为单线程优化,可能导致多线程中变量未被实际访问。例如,若同步变量因编译器重排而未被及时刷新,将引发竞态条件(race condition)。这要求开发者显式使用内存屏障或原子操作保证可见性。 - 可见性:
现代处理器通过指令重排和缓存优化提升性能,但可能导致线程间数据不一致。例如,线程A的写入可能因缓存未同步而对线程B不可见。需通过硬件支持(如CPU内存模型)和操作系统机制(如缓存行冲洗)保证可见性。
并发 vs 并行: