OS-并发-同步

条件变量

条件变量是一种同步机制,用于线程间的通信。当某些执行状态不满足时,线程可以将自己加入到等待队列中,直到该条件发生并被唤醒。条件变量有两个主要操作

OS-并发-锁

互斥

《从入门到放弃》之中,写到并发编程需要放弃原子性、顺序性、可见性。

现在,我们需要让代码重新获得原子性和顺序性。为此,我们需要互斥,也就是阻止并发的发生,阻止多个线程同时读写数据。

OS-并发-从入门到放弃

放弃

进入并发领域,我们将要放弃很多默认的条件:

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

并发 vs 并行

OS-交换空间与缓存管理

交换空间

现代操作系统通过交换空间(swap space)实现虚拟内存的扩展能力。当物理内存容量不足以容纳所有活跃进程的页时,操作系统会将低频访问的页换出(page out)到磁盘的专用交换区域,从而释放物理内存资源。这种机制使得程序能够使用远大于实际物理内存的地址空间。

OS-分页与页表

快速地址转换(TLB)

在《OS-内存管理》中指出,分页机制的一个主要缺点是可能导致额外的内存访问开销。为了加速虚拟地址到物理地址的映射过程,避免频繁查询页表,计算机系统采用了常见的加速技术——缓存。