文章目录
进程同步
- 由于进程具有异步性,可能会使的进程乱序
- 同步亦称直接制约关系,它是指为了完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调他们的工作次序而产生的制约关系。进程间的直接制约关系就是源于他们之间的相互合作
- 简单的来讲,就是某个进程不得不放在某个进程之后,才会有效果,比如管道通信,先写后读
进程互斥
- 进程的并发需要共享的支持。各个进程并发执行不可避免的需要共享一些系统资源(如:内存、打印机、摄像头等)
- 互斥共享方式:系统中的某些资源,一个时间段内指允许一个进程访问该资源
- 同时共享方式:系统中的某些资源,允许一个时间段内有多个进程"同时"对它们进行访问
- 临界资源:一个时间段只允许一个进程使用的资源成为临界资源(对临界资源的访问,必须互斥地进行)
- 互斥又称为间接制约关系。指当一个进程访问某临界资源是,另一个想要访问该临界资源的进程必须等待。当前访问临界资源的进程结束访问时,释放资源后,另一个进程才能去访问临界资源
- 进程互斥应遵循的原则:
*1.空闲让进:临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区
*2.忙则等待:当已有进程进入临界区,其他试图进去临界区的进程必须等待
*3.有限等待:对请求访问的进程,应保证在有限时间内进入临界区
*4.让权等待:当进程不能进入临界区时,应立即释放处理机,防止进程忙等待
对临界资源的访问,可以在逻辑上分为如下四个部分:
- 临界区也可称临界段
进程互斥的软件实现方法
单标志法
- 算法思想:一个进程在访问完临界区后会把使用临界区的权限转交给另一个进程。每个进程机内临界区的权限只能被另一个进程赋予
- 可以实现“同一时刻只允许一个进程访问临界区”
- 主要问题:违背“空闲让进”原则
双标志先检查
- 算法思想:设置一个不二类型数组flag[],数组中各个元素用来标各进程想进入临界区的意图。比如:“flag[0]=true”,意味着0号进程现在想要进入临界区。每个进程进入临界区之前先检查当前有没有别的进程想进入临界区,如果没有,则把自身对应的的标志flag[i]设为true,之后开始访问临界区
- 主要问题:违反了"忙则等待"(进入区的“检查”和"上锁"两个处理不是一起呵成的。“检查”后,“上锁”前可能发生进程切换)
双标志后检查
- 算法思想:双标志后检查法的改版。这个算法是先“上锁”,后“检查”。
- 主要问题:违背了“空则让进”和“有限等待”原则,各个进程都长期无法访问临界资源而产生饥饿现象
Peterson算法
- 算法思想:如果两个进程都争着想进入临界区,可以尝试主动让对方先进入临界区
- 主要问题:未遵循“让权等待”原则
进程互斥的硬件实现方法
中断屏蔽方法
- 利用“开/关中断指令”实现(在某进程开始访问临界区到结束访问为止都不允许被中断,也就是不发生进程切换)
- 优点:简单、高效
- 缺点:不适用于多处理机(一个处理机关中断,进程访问临界区,另一个处理机也关中断,进程也可能会访问临界区,导致两个进程同时访问临界区);只适用于操作系统内核进程,不适用于用户进程(开/关中断指令只能运行在内核态,如果这组指令让用户使用后会很危险)
TestAndSet(TS指令/TSL指令/TestAndSetLock指令)
- 该指令是用硬件实现的,执行的过程不允许被中断,只能一气呵成。
- 优点:实现简单,直接将“上锁”与“检查”融为一个原子操作,无需检查是否有逻辑漏洞;适用于多处理机环境
- 缺点:未遵循“让权等待”原则,暂时无法进去临界区的进程会占用CPU并循环执行TSL指令,从而导致“忙等”
Swap指令(XCHG指令)
- 也叫Exchange指令,或称XCHG指令
- 该指令使用硬件实现的,执行的过程不允许被中断,只能一气呵成。
- 优点:实现简单;适用于多处理机
- 缺点:未遵循“让权等待”原则,暂时无法进去临界区的进程会占用CPU并循环执行XCHG指令,从而导致“忙等”