2021-06-16进程同步

进程同步
  1. 临界区
  2. 生产者消费者问题
  3. 读者写者问题
临界区和竞争条件

1. 数据不一致性
·多个进程并发或并行执行
(每个进程可在任何时候被打断)
(仅仅进程的部分代码片段可连续执行)
·共享数据并发/并行执行:数据不一致性
·解决方法:同步(互斥)机制

2. 有界缓冲问题(是1的例子)
后续补充

3. 竞争条件
·定义:多个进程并发访问同一共享数据的情况(共享数据的最终结果取决于:最后操作的进程)
·防止竞争条件方法:并发进程同步或互斥

  • 同步和互斥
    同步:协调进程的执行次序,使并发进程间能有效的共享资源和相互合作,保证数据一致性。
    互斥:进程排他性地运行某段代码,任何时候只能有一个进程能够运行。
    (互斥访问独占资源)

5. 临界资源
·一次只允许一个进程使用的资源
·又称互斥资源、独占资源或共享变量
【共享资源:一次允许多个进程使用的资源】
【实例:输入机,打印机】

6. 临界区
·涉及临界资源的代码段
·临界区是代码片段
·临界区是进程内的代码
·每个进程有一个或多个临界区
·临界区的设置方法由程序员确定
·若能保证各个进程互斥进入关联的临界区,可实现对临界资源的互斥访问。
例子

7. 临界区使用准则

在这里插入图片描述

8.访问临界区
过程如下:
进入区实现互斥准则
退出区实现有空让进准则
每个临界区不能过大,从而实现有限等待准则
在这里插入图片描述

9.其他
互斥和同步异同
·互斥:是指某一资源同时只允许一个访问者对其进行访问,具专有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
·同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访属问者同时访问资源。

生产者消费者问题

(共享有限缓冲区)

问题描述

  • 生产者(M个),生产产品,并放入缓冲区。
  • 消费者(N个):从缓冲区取产品消费
  • 问题:如何实现生产者和消费者之间的同步和互斥在这里插入图片描述
    流程
    生产者【生产一个产品……把产品放入指定缓冲区】
    消费者【从指定缓冲区取出产品……消费取出的产品】

互斥分析的基本方法
1.查找临界资源
2.划分临界区
3.定义互斥信号量并赋初值
4.进入区加wait操作:退出区加signal操作

具体分析
·临界资源:
生产者(多个):把产品放入指定缓冲区(临界区)
in:所有的生产者对in指针需要互斥
counter:所有生产者消费者进程对counter互斥
在这里插入图片描述

消费者(多个):从指定缓冲区取出产品(临界区)
out:所有的消费者需要对out指针互斥
counter:所有生产者消费者进程对counter互斥
在这里插入图片描述

流程(实例)
1.确定临界区:生产者中(把产品放入指定缓冲区)消费者中(从指定缓冲区中取出产品)

2增加互斥机制:(加wait/signal)
在这里插入图片描述
3.同步分析

  • 找出需要同步的代码片段(关键代码)
  • 分析这些代码片段的执行次序
  • 增加同步信号量并赋初值
  • 在关键代码前后加wait和signal操作

4算法描述:在这里插入图片描述
在这里插入图片描述

解决方法
在这里插入图片描述

其他
Q:有两个并发进程,设置了互斥信号量mutex,现在mutex=0,则表示一个进程进入临界区
Q:所有的生产者必须等待消费者先运行的前提条件是缓冲区满
Q:所有的消费者必须等待生产者先运行的前提条件是缓冲区空
Q:消费者阻塞在wait(m)(m是互斥信号量)的条件是(有其他生产者已经进入临界区存放产品/有其他消费者已经进入临界区放产品)。
Q:在生产者消费者问题中,以下关于唤醒操作正确的是(生产者唤醒其他生产者/生产者唤醒消费者/消费者唤醒消费者/消费者唤醒生产者)。
Q:假如只有一个生产者和一个消费者,它们共享一个有N个项的缓冲区,如何实现同步和互斥?
A:互斥需要设置一个m信号量初值为1;同步需要额外full 和 empty信号量,标记缓冲区内容;m保证只有一个进程进入临界区,full和empty保证按照一定顺序访问缓冲区。
Q:为什么所有的消费者对out指针需要互斥?
A:因为所有消费者都使用到了out指针,这是临界资源,需要互斥访问。

读者写者问题

(数据读写操作)
问题描述
·两组并发进程(读者和写者)
(共享一组数据区进行读写)
·要求
(允许多个读者同时读)
(不允许读者、写者同时读写)
(不许多个写者同时写)
·例子(对文件的读写操作)

第一类读者问题(读者优先)
读者:

  • 无读者,写者,新读者可读
  • 有写者,或者其他读者在读,新读者可读。
  • 有写者,新读者等。

写者:

  • 无读者,写者,新写者可写。
  • 其他情况都等待

解决方法:
在这里插入图片描述

存在问题
问题:读者不能同时读
违背:有写者在等,其他读者在读,则新读者也可以读。
修改后如下:
在这里插入图片描述
修改方法:
增加一个读者计数器rc,设置初始值为0;
在这里插入图片描述
在增加一个互斥信号量M,设置初始值为1;在这里插入图片描述
【读者优先的读者写者问题中,一个写者先来,但有可能比后来的读者后运行。】
【对于读者而言:1.没有读者和写者时,新的读者可进入数据器读,并阻止写者进入写;2.新的读者仍旧可以进入读;3.有写者在数据器写的时候,新读者和写者必须要等待。 对于写者而言:1.没有写者和读者时,新写者可以进入数据器并且阻止新的读者和写者进入;2.有读者在数据器时,新的写者必须要等;3.有其它写者时,新写者必须等待。】
【读者写者问题其他解决方法:写者和读者需要互斥的访问临界资源,但是不同的读者可同时访问,但是写者访问需要和任何读者写者互斥。】

哲学家就餐问题

(资源竞争)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值