目录
一、经典问题信号量机制描述
1、任意两个进程可以并发的条件(Bernstein条件)
2、临界区管理原则
3、信号量的P、V操作
(1)P、V操作
(2)P、V操作的原则
(3)用信号量解决进程间互斥问题
4、 生产者---消费者问题(解决访问缓冲区问题)
(1)问题描述
(2)信号量的设置
5、哲学家就餐问题
(1)问题描述
(2)解决思路
6、读者和写者问题(共享文件/存储区)
(1)问题描述
(2)问题分析
(3)信号量的设置
7、理发师问题(调度的问题模拟)
(1)问题描述
(2)信号量的设置
8、苹果橘子问题
(1)问题描述
(2)信号量的设置
一、经典问题信号量机制描述
1、任意两个进程可以并发的条件(Bernstein条件)
其中Ij、Oi分别表示进程t的输入变量或输出变量。
2、临界区管理原则
- §有空让进:如果有一个进程要求进入空闲的临界区,便允许该进程进入。
- §无空等待:任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待。
- §多中选一:有多个进程同时申请进入临界区,只能选择其中一个进入。
- §有限等待:进入临界区的进程要在尽量短的时间内退出,以便其它进程能及时进入临界区。
- §让权等待:如果进程不能进入临界区,则应让出CPU,避免进程出现“忙等”现象。
3、信号量的P、V操作
(1)P、V操作
(2)P、V操作的原则
- P、V操作必须成对出现,有一个P操作就一定有一个V操作:
- 用于互斥时,P、V操作必须处于同一个进程。
- 用于同步时,则同步进程之间的P、V操作成对。
- 同时使用同步和互斥时,同步P操作在前,互斥P操作在后。
(3)用信号量解决进程间互斥问题
semaphore mutex.value=1;
cobegin process pi
begin
…
P(mutex);
临界区
V(mutex);
…
end;
coend;
4、 生产者---消费者问题(解决访问缓冲区问题)
(1)问题描述
一组生产者进程和一组消费者进程共享一个初始为空、大小为n的缓冲区,只有缓冲区为满时,生产者才把消息放入缓冲区,否则必须等待;只有缓冲区不为空时,消费者从中取出消息,否则必须等待。由于缓冲区是临界资源,它只允许一个生产者放入消息,或一个消费者从中取出消息。
(2)信号量的设置
- mutex:互斥信号量,初值为1;
- full:满缓冲区数,初值为0;
- empty:空缓冲区数,初值为N。
- 如果mutex的值为0,则P(mutex)操作会导致进程阻塞状态
- 如果empty的值为0,则P(empty)操作会导致进程阻塞状态
- 如果full的值为0,则P(full)操作会导致进程阻塞状态
5、哲学家就餐问题
(1)问题描述
- 哲学家就餐问题可以这样表述:
假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考。吃东西的时候,他们就停止思考,思考的时候也停止吃东西。餐桌中间有一大碗意大利面,每两个哲学家之间有一只餐叉。因为用一只餐叉很难吃到意大利面,所以假设哲学家必须用两只餐叉吃东西。他们只能使用自己左右手边的那两只餐叉。哲学家就餐问题有时也用米饭和筷子而不是意大利面和餐叉来描述,因为很明显,吃米饭必须用两根筷子。
哲学家从来不交谈,这就很危险,可能产生死锁,每个哲学家都拿着左手的餐叉,永远都在等右边的餐叉(或者相反)。即使没有死锁,也有可能发生资源耗尽。
例如,假设规定当哲学家等待另一只餐叉超过五分钟后就放下自己手里的那一只餐叉,并且再等五分钟后进行下一次尝试。这个策略消除了死锁(系统总会进入到下一个状态),但仍然有可能发生“活锁”。如果五位哲学家在完全相同的时刻进入餐厅,并同时拿起左边的餐叉,那么这些哲学家就会等待五分钟,同时放下手中的餐叉,再等五分钟,又同时拿起这些餐叉。
在实际的计算机问题中,缺乏餐叉可以类比为缺乏共享资源。一种常用的计算机技术是资源加锁,用来保证在某个时刻,资源只能被一个程序或一段代码访问。当一个程序想要使用的资源已经被另一个程序锁定,它就等待资源解锁。当多个程序涉及到加锁的资源时,在某些情况下就有可能发生死锁。
例如,某个程序需要访问两个文件,当两个这样的程序各锁了一个文件,那它们都在等待对方解锁另一个文件,而这永远不会发生。
(2)解决思路
可以创建五个线程表示五位哲学家,五个线程相互独立(异步)。
6、读者和写者问题(共享文件/存储区)
(1)问题描述
有读者和写者两组并发进程,共享一个文件,当两个或以上的读进程同时访问共享数据时不会产生副作用,但若某个写进程和其他进程(读进程或写进程)同时访问共享数据时则可能导致数据不一致的错误。
因此要求:
①允许多个读者可以同时对文件执行读操作;
②只允许一个写者往文件中写信息;
③任一写者在完成写操作之前不允许其他读者或写者工作;
④写者执行写操作前,应让已有的读者和写者全部退出。
(2)问题分析
- 1) 关系分析。由题目分析读者和写者是互斥的,写者和写者也是互斥的,而读者和读者不存在互斥问题。
- 2) 整理思路。两个进程,即读者和写者。写者是比较简单的,它和任何进程互斥,用互斥信号量的P操作、V操作即可解决。读者的问题比较复杂,它必须实现与写者互斥的同时还要实现与其他读者的同步,因此,仅仅简单的一对P操作、V操作是无法解决的。那么,在这里用到了一个计数器,用它来判断当前是否有读者读文件。当有读者的时候写者是无法写文件的,此时读者会一直占用文件,当没有读者的时候写者才可以写文件。同时这里不同读者对计数器的访问也应该是互斥的。
- 3) 信号量设置。首先设置信号量count为计数器,用来记录当前读者数量,初值为0; 设置mutex为互斥信号量,用于保护更新count变量时的互斥;设置互斥信号量rw用于保证读者和写者的互斥访问。
(3)信号量的设置
- mutex:操作读者个数的互斥信号量,
- writer:是写者互斥信号量(就是共享存储区的互斥信号量)。
- 读者:一批读者之间可以不互斥地共享存储区,但要与写者互斥。
- 写者:写者需要互斥地访问共享区。
7、理发师问题(调度的问题模拟)
(1)问题描述
一个理发店由一个有几张椅子的等待室和一个放有一张理发椅的理发室组成。
①若没有要理发的顾客,则理发师去睡觉;
②若一顾客进入理发店,理发师正在为别人理发,且等待室有空椅子,则该顾客就找张椅子按顺序坐下;
③若一顾客进入理发店,理发师在睡觉,则叫醒理发师为该顾客理发;
④若一顾客进入理发店且所有椅子都被占用了,则该顾客就离开。
(2)信号量的设置
- 1)控制变量waiting用来记录等候理发的顾客数,初值均为0;
- 2)信号量customers用来记录等候理发的顾客数,并用作阻塞理发师进程,初值为0;
- 3)信号量barbers用来记录正在等候顾客的理发师数,并用作阻塞顾客进程,初值为0(刚开始时理发师在睡觉,所以理发师这个资源数目为0);
- 4)信号量mutex用于互斥,初值为1.
8、苹果橘子问题
(1)问题描述
桌上有一个盘子,每次只能放入一个水果,爸爸专门向盘子放入苹果,妈妈专门向盘子放入橘子;有一儿一女,儿子只吃橘子,女儿只吃苹果。
(2)信号量的设置
- plate:为互斥信号量,表示是否允许向盘子放入水果,初值为1,表示允许放入,且只允许放入一个。
- apple:表示盘子中是否有苹果,初值为0,表示盘子为空,不许取,若apple=l可以取。
- orange:表示盘子中是否有橘子,初值为0,表示盘子为空,不许取,若orange=l可以取。
如有错误,敬请指正。
您的收藏与点赞都是对我最大的鼓励和支持!