操作系统同步机制的实现

背景

多进程(线程)并发执行会出现进程间相互制约的情况发生,例如两个进程需要:

  • 共享唯一的硬件设备
  • 共享同一块内存区域
  • 一个进程的运行依赖另一进程对共享资源的执行结果

如果多个进程间存在时序关系,需要协同工作以完成一项任务,则成为同步;如果不满足协同的条件,而知识因为共享具有排他性资源时所产生的关系称为互斥

1. 信号量

信号量和PV原语操作是有Dijkstra发明的,它是最为广泛的互斥方法之一:

  • Semaphore S:信号量,表示共享资源的可用数量
  • Operation P:P原语,用于减少S计数
  • Operation V:V原语,用于增加S计数

信号量和PV操作原理:

  1. 当进程想要进入共享区时,首先执行P操作,S-1
  2. 当进程想要退出共享区时,执行V操作,S+1
  3. 进程进出共享区的操作,是原子操作(执行过程不允许被中断)


    操作系统同步机制的实现_第1张图片
    PV 原语

2. Mutex

Mutex是 Mutual Exclusion 简写,其释义有为互斥体

  1. 如果一个资源有多个对象同时访问:称为Counting Semaphores,
  2. 若只允许取值0或1(locked/unlocked):称为Binary Semaphore,可以认为它与Mutex是相同的性质。Mutex是对于Binary Semaphore的一种简单实现方式

3. 管程 (Monitor)

管程是对Semaphore机制的延伸和改善,是一种更简单的同步手段

Semaphore 机制的缺陷:

程序的易读性相对较差,对于信号量的管理也分散在各个参与对象中,因此有可能引起死锁,进程饿死等问题

管程的定义

管程是可以被多个进程/线程安全访问的对象或模块
管程汇总的方法是受到Mutex保护的,意味着同一时刻只允许一个访问者来使用它们。

管程的特性

  • 安全性
  • 互斥性
  • 共享性

很多流行的编程语言都实现了管程机制:如Java,Python,Delphi,Ruby,C#等

4. Linux Futex (Fast Userspace muTEXes)

Linux 中的同步机制,它在应用程序空间中就可以应对大多数同步场景。
判断是否开启了ART_USE_FUTEXES宏
Mutex的加锁逻辑:如果获取到锁,就直接返回,否则进入挂起的状态。


futex例子

你可能感兴趣的:(操作系统同步机制的实现)