详解经典进程同步问题(生产者消费者问题/哲学家进餐问题/读者写者问题)_OS

目录

1. 利用信号量实现进程的同步和互斥

利用信号量实现进程互斥

利用信号量实现进程同步

2. 生产者消费者问题

3. 哲学家就餐问题

4. 读者写者问题

读者优先

写者优先

读者写者问题的变形

使用信号量解决读者写者问题

5. 经典同步问题例题

6. 管程机制

使用管程解决生产者消费者问题

管程与进程的区别

7. 进程通信

共享存储器

 消息传递系统

 管道通信

易错知识点




1. 利用信号量实现进程的同步和互斥

利用信号量实现进程互斥

  为使多个进程能互斥地访问某临界资源,只须为该资 源设置一个互斥信号量 mutex,并设其初始值为 1,然后将各进程访问该资源的临界区 CS 置于 wait(mutex) 和 signal(mutex) 操作之间即可。 在进程互斥中使用 P、V 操作,须在同一程序段成对出 现同一信号量的 P、V 操作,否则会造成系统瘫痪。

注意:

  实现互斥的信号量的PV操作必须在同一程序当中成对的出现

利用信号量实现进程同步

   与此同时,可以利用信号量来描述前趋图

 

wait和signal操作必须成对出现

同步的wait操作在互斥的wait操作前

2. 生产者消费者问题

  生产者—消费者”问题 (producer/consumer problem) 是最著名的进程同步问题。 它描述了一组生产者向一组消费者提供产品,它们共享 一个有界缓冲池,生产者向其中投放产品,消费者从中 取得产品。 它是许多相互合作进程的抽象,如输入进程与计算进 程;计算进程与打印进程等。

  设置两个资源信号量和一个互斥信号量

 注意:

empty是空缓冲区的数目,其初值是有界缓冲池的大小n

full满缓冲区的数目,其初值是1

互斥信号量的初值是1

注意:

  两个P操作的顺序不当会导致死锁的出现

3. 哲学家就餐问题

此算法可以保证不会有相邻的两位哲学家同时进餐。 若五位哲学家同时饥饿而各自拿起了左边的筷子,这使 五个信号量 chopstick 均为 0,当他们试图去拿起右边 的筷子时,都将因无筷子而无限期地等待下去,即可能 会引起死锁。

4. 读者写者问题

读者优先

  需要设置一个共享变量,两个互斥信号量

  需要注意的是,对于共享变量Readcount的访问也是互斥的。

  第一位读者阻止写者

  最后一位读者允许写者

写者优先

注意:

写者优先增加了一个读写互斥信号量S

读者写者问题的变形

 

 

使用信号量解决读者写者问题

5. 经典同步问题例题

 例题1:

例题2:

例题3:

例题4:

注意本题当中对S的PV操作,应该放在不同程序段,因为笼子里一次只可以放一个,必须消费者V操作以后,生产者才可以继续放。

 例题5:

 

例题6:

6. 管程机制

  基本思想: 把访问某种临界资源的所有进程的同步操作 都集中起来,构成一个所谓的“秘书”进程(管程), 凡是访问临界资源的进程,都需要报告“秘书”,由秘 书来实现诸进程的同步。

  管程的定义: 一个数据结构和在该数据结构上能被并发进程所执行的一组操作,这组操作能使进程同步和改变 管程中的数据。

  管程的组成:①管程的名称;②局部于管程内部的共享 数据结构说明;③ 对该数据结构进行操作的一组过程; ④ 对局部于管程内部的共享数据设置初始值的语句。

  管程中的共享变量在管程外部是不可见的,不能被任何 外部过程访问。管程相当于围墙,把共享变量和对它进 行操作的若干过程围了起来。 外部只能通过调用管程中所说明的外部过程(函数)来 间接地访问管程中的共享变量。 一个进程通过调用管程内的一个过程而进入管程。 管程通常是用来管理资源的,因而在管程中设有进程等 待队列以及相应的等待及唤醒操作。 管程每次只允许一个进程执行,从而实现了进程的互斥

使用管程解决生产者消费者问题

注意:此处的full 和 empty均为条件变量

 

 

管程与进程的区别

注意

管程定义是公共数据结构

7. 进程通信

共享存储器

 

 消息传递系统

 管道通信

易错知识点

1. 临界区是指进程当中用于访问临界资源的那段代码

2.  信号量机制是一种有效实现进程同步和互斥的机制;进程的并发执行不需要信号量。

3. 进程进入临界区必须满足互斥条件,进程进入临界区但没有离开就进入阻塞是可以的;

例如:

一个正在访问临界资源的的进程由于申请等待I/O操作而中断,它允许其他进程抢占处理器,但是它不允许其他进程进入它的临界区。

4. PV操作是一种低级进程通信原语;PV操作由一种不可中断的过程组成

5. 原语是不可分割的指令序列

6. 管程外过程调用管程内数据结构的说明不是管程的组成部分

7. 管程当中的signa操作与信号量机制当中的V操作不同,信号量机制当中的V操作一定会改变信号量的值S=S+1,但是管程当中的signal是针对某个条件变量的,若不存在因为该条件而阻塞的进程,则 signal不会产生任何影响

8. 信箱通信是一种间接通信

9. 管程不仅可以实现进程间的互斥,还可以实现进程间的同步;管程是由编程语言支持的进程同步机制;在任何时候,只可以由一个进程在管程当中;管程当中定义的变量只可以被管程内的过程访问

10. 若X是管程当中的条件变量,则当进程执行x.wait()时所做的工作是阻塞该进程,并将其插入x的阻塞队列。

11. 信号量机制可以实现让权等待

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值