进程同步

机制/策略

波音斯坦条件

  • 读写
  • 读读
  • 写写

互斥属于同步

临界资源

临界资源: 不能被若干个进程同时使用的资源
临界区:访问临界资源的代码
在这里插入图片描述

Peterson算法

为解决临界资源访问问题

解决的是两个进程( P 0 P_0 P0, P 1 P_1 P1)冲突问题

这个算法过程很重要

在这里插入图片描述
解析
如果两个进程分别单独访问,则不会产生冲突。
如果两个进程同时访问,flag[0] = trueflag[1] = true,因为两个执行必定有先后循序,所以turn只能是后执行的那个值。所以 P 0 , P 1 P_0,P_1 P0,P1的循环中,总有一个while循环会跳出。进入临界区。执行完之后将自己的flag置为false使得另一个进程中的while跳出。

证明一个算法可以解决临界区问题,需要满足以下条件

在这里插入图片描述

硬件同步

在这里插入图片描述

保证原子操作(执行过程中不能被打断)
事务原子性:逻辑上的原子性(逻辑顺序不变)
原子性:连续时间上不能被打断,一次执行完

锁的实现
(1)
在这里插入图片描述
(2)
在这里插入图片描述
忙碌等待:得不到持续等待,直至得到。
非忙碌等待:一段时间内得不到CPU,就放弃对CPU的监听,等待唤醒。

主程序执行
在这里插入图片描述

排队程序
在这里插入图片描述

信号

  • wait()
  • signal()

在这里插入图片描述
由于此实现为忙等待,为了节省CPU将得不到信号量的进程阻塞。
在这里插入图片描述
此处的block不会返回。

信号量等待队列

管程

定义

在这里插入图片描述

管程的初始化

  1. 首先定义 n n n个进程 p 1 , … , p n p_1,\ldots,p_n p1,,pn
  2. 其他处理同步问题的代码都有管程来解决
    在这里插入图片描述
    管程中有三个队列
  • 就绪队列:可以直接执行的进程
  • 等待队列:在管程中执行过程中被阻断,被放入等待队列
  • 外部等待队列:在管程外部,尚未被调入管程的进程

在这里插入图片描述

管程中有两个操作

  • x.wait() 阻塞进程
  • x.signal() 唤醒进程

管程的组成(利用信号量实现管程)

变量
在这里插入图片描述

需要满足互斥的程序 F F F
在这里插入图片描述

wait()

对于每个互斥的进程,拥有自变量x_sem(记录当前进程的序号),x_count(记录被阻塞进程的个数)
在这里插入图片描述

signal

如果有被阻塞的进程,
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值