进程同步
- 临界区
- 生产者消费者问题
- 读者写者问题
临界区和竞争条件
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.有其它写者时,新写者必须等待。】
【读者写者问题其他解决方法:写者和读者需要互斥的访问临界资源,但是不同的读者可同时访问,但是写者访问需要和任何读者写者互斥。】
哲学家就餐问题
(资源竞争)