操作系统---进程同步

目录

进程同步

进程互斥

进程互斥的软件实现

单标志法

双标志先检查法

双标志后检查法

Peterson算法

进程互斥的硬件实现

中断屏蔽方法

TestandSet指令

swap指令

​信号量机制---进程互斥和进程同步

整形信号量

记录型信号量

实现进程互斥

​实现进程同步

 实现进程前驱关系

生产者和消费者问题

 多生产者多消费者问题

 吸烟者问题

读者-写者问题

 哲学家进餐问题

管程 

进程同步

进程具有异步性,即进程在执行的过程中,进程的执行次序,执行时间长短,执行速度等都是不可知的。但是有时候我们必须让进程之间按照某一固定的次序完成。

进程同步就是为了解决异步性,进程同步又可以称为直接制约关系,指多个进程为了满足某一种功能,在工作时需要协调工作次序而产生的制约关系

进程互斥

临界资源:在一段时间内只允许一个进程访问的资源 例如打印机,摄像头等

进程互斥: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、每次仅且允许一个进程在管程内执行某一个过程

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值