目录
进程同步
进程具有异步性,即进程在执行的过程中,进程的执行次序,执行时间长短,执行速度等都是不可知的。但是有时候我们必须让进程之间按照某一固定的次序完成。
进程同步就是为了解决异步性,进程同步又可以称为直接制约关系,指多个进程为了满足某一种功能,在工作时需要协调工作次序而产生的制约关系
进程互斥
临界资源:在一段时间内只允许一个进程访问的资源 例如打印机,摄像头等
进程互斥:A进程访问临界资源,进程B也申请访问这个临界资源,进程B就只能等进程A自动释放这个资源后才可以访问这个临界资源
进程互斥的软件实现
单标志法
一个进程访问完了临界区,会将访问权限交给另外一个进程
- 对于只有两个进程的情况下:初始化turn=0即要求p0先运行。1、如果p0先上处理机,那么接下来p0运行结束后,turn=1,进程切换至p1,p1可以运行,继续p0运行,运行顺序是p0,p1,p0,p1……2、如果p1先上处理机,那么程序会卡在while(turn!=1); 处,直到p1的时间片用完,发生进程调度,切换p0进程,p0开始执行
- 单标志法的问题是:违背了空闲让进原则,在上一点中提到了,p1申请访问临界区,此时临界区是空闲的,但是p1不能访问,违背了空闲让进原则
双标志先检查法
设置boolean类型的数组,表示进程是否想要进入临界区
先判断临界区是否被其他进程访问,后设置此进程申请访问临界区
- 当p0进程申请访问临界区时,flag[1]如果是false,那么p0进程访问成功,flag[1]如果是true,表示p1已经申请访问临界区了,p0进程等待,直到p1释放临界区资源
- 如果按照①⑤②⑥③⑦的顺序推行,p0,p1同时访问临界区,最主要的是违背了忙则等待原则 flag[0],flag[1]都是false,执行①,不进入while循环,如果在执行①结束后,p1进程申请处理机,此时 flag[0],flag[1]都是false,那么⑤不进入while循环,可以访问临界区 在多核cpu情况下,p0和p1进程都可以获取访问此临界区的权限,不满足互斥访问
双标志后检查法
先设置此进程申请访问临界区,后判断临界区是否被其他进程访问
- 按照2615的顺序执行,p0,p1进程都无法进入临界区,违背了空闲让进和有限等待的原则
Peterson算法
如果两个进程都想访问临界区,可以让别的进程先访问
- 实现了”空闲让进","忙则等待“,”优先等待“,没有遵守”让权等待“
进程互斥的硬件实现
中断屏蔽方法
通过开中断和关中断两个指令来实现,原语也是通过这两个指令实现的
优点:简单,快捷
缺点:1、不适合多处理机环境:开中断和关中断两个指令只会在同一个cpu上有效
2、运行在操作系统的内核中:开中断和关中断两个指令属于特权指令,运行在核心态
TestandSet指令
通过硬件实现,执行过程不允许中断
swap指令
信号量机制---进程互斥和进程同步
在上述提到的三种进程互斥的软件实现方法中,都无法实现”让权等待“
整形信号量
整形信号量: 实现了”空闲让进","忙则等待“,”优先等待“,没有遵守”让权等待“
记录型信号量
记录型信号量: 实现了”空闲让进","忙则等待“,”优先等待“,遵守了”让权等待“
实现进程互斥
1、临界区之前,使用p操作
2、临界区之后,使用v操作
实现进程同步
1、设置同步变量 s=0;
2、在先执行的代码后,执行v操作
3、在后执行的代码前,执行p操作
实现进程前驱关系
生产者和消费者问题
系统中会有一组生产者进程和消费者进程,生产者进程每次会生产产品进入缓冲区,消费者进程每次会拿走一个产品
生产者和消费者共享初始为空,大小为n的缓冲区
只有缓冲区没满,生产者才可以将产品放入缓冲区,否则等待
只有缓冲区不为空,消费者才可以从缓冲区取出产品,否则等待
缓冲区是临界资源,需要互斥访问
进程互斥的p操作在进程同步的p操作之后!!!
多生产者多消费者问题
吸烟者问题
对于这个问题:offer1和offer2,offer3同一时间只会有一个值为1,那么同一时间只会有一个进程访问临界区,可以不设置互斥变量
读者-写者问题
读者优先(可能导致写进程饥饿)
读写公平法(先来先服务)
哲学家进餐问题
死锁的产生
如何避免死锁:
管程
和p、v操作一样,实现进程的同步和互斥,管程是一种新的进程同步工具
管程的组成部分:
1、局部于管程的共享数据结构说明
2、对该数据结构进行操作的一组过程
3、对这个局部于管程的共享数据结构初始化的语句
4、管程有一个名字
管程的基本特征:
1、局部于管程的数据只能被局部于管程的过程访问
2、一个进程只能提供调用局部于管程的过程来访问局部于管程的数据
3、每次仅且允许一个进程在管程内执行某一个过程