文章目录
进程同步
引言
课程概述中讲过一个汇编指令执行顺序的问题:
该问题是由于引入分时方式而引起的,本节将讨论为了解决上述问题,历史上都出现过哪些解决方案。
如何鉴别分时操作系统引起的问题
再看一个例子:
上面的程序是一个多进程服务器,代码是有问题的,我们来分析下问题在哪里。
首先多进程体现在使用了fork(),多进程常见的问题是“共享变量问题”,那么上述代码中有没有共享变量呢?
count是共享变量:试想当多个进程同时执行count--
的时候,那么这个问题就等同于课程概述中的问题了(可以回去复习下)。
鉴别共享变量问题的方法:
- 首先确定是否是多进程或多线程代码,如果是那么继续判断。
- 判断是否有共享变量,何为共享变量?即多个进程或线程中共用的那个变量。
- 如果有共享变量,那么就会有问题了,需要考虑如何避免共享变量带来的问题。
几种解决上述问题的方案:
- Peterson方法
- 硬件同步
- 信号量
概念补充
临界区问题:
- 关于临界区这个名字的解释:critical翻译成临界,所以这里叫临界区。不过笔者觉得这里的翻译实在是过于生硬,不如叫关键区好。
- 什么是临界区呢?简单来讲,访问共享变量的那段代码就叫临界区,共享变量可以成为临界资源。其实称为关键区和关键资源更好。
- 临界区问题的规范定义:考虑一个有n个进程的系统{P0,P1,…,Pn},每个进程都有一段临界区代码:
比如在临界区内修改共享变量,那么当一个进程在临界区,所有其他进程都不能进入临界区 - 上面黑体字其实就是解决临界区问题的方法,那么如何设计这种解决方案呢?
解决临界区问题应该满足的条件
- 互斥访问:只有一个进程可以在临界区内&#