一、简单生产者--消费者问题
问题描述:
设有一个生产者进程P,一个消费者进程Q,他们通过一个缓冲区联系起来。
1.二者关系描述:
(1)生产者生产产品放入缓冲区,消费者从缓冲区取产品,进行消费;
(2)P进程不能往已经“满”的缓冲区放产品,Q进程不放从“空”缓冲中取产品。
2.信号量设置:
empty,初值为1,用于指示缓冲区数量full,初值为0,用于指示满缓冲区数量
二、多个生产者--消费者问题
1.问题描述:
设有若干个生产者P1、P2、...若干个消费者Q1、Q2、...,他们通过一个环形缓冲池联系起来。
2.同步问题和信号量设置:
生产者不能住“满”缓冲区中放产品,设置信号量empty,初始值为k,指示缓冲池中空缓冲区数目。
消费者不能从“空”缓冲区中取产品,设置信号量full,初始值为0,指示缓冲池中的满缓冲区数目。
3.互斥问题和信号量设置:
缓冲池必须互斥访问,设置信号量mutex,初值为1.
4.其他变量设置
整型量i,j,初值为0,分别用于指示空缓冲区和满缓冲区位置。
三、读者--写者问题
1.问题描述:
假定有某个共享文件F,系统允许若干进程对文件F进行读或写。读文件的进程称为读者,写文件的进程称为写者,他们遵守如下规定:
(1)多个进程可以同时读文件F
(2)当一个进程在对文件F进行写时,不允许其他进程对文件进行读或写。
(3)当有进程正在读文件时不允许任何进程去写文件。
2.问题分析
(1)写者进程与读者进程之间互斥,互斥文件F
(2)写者进程与第一个读者之间互斥访问文件。
3.变量设定:
read_count:整数量,当前正在读的读者进程个数,来一个读者,数量加1,走一个读者,数量减1;
mutex:互斥信号量,对read_count互斥访问。
write:互斥信号量,写者与写者的互斥,写者与读者之间的互斥。
四、同步与互斥的综合应用
问题描述:
某个城市为了解决市内汽车太多、拥堵问题,出台一项措施:对进入市区的机动车辆实行单双号限行办法,规定单号单行,双号双行。
有一个进入市区中心的路口,进入该路口的道路有一条,离开该路口道路有两条,一条进入市区,一条进入环线。路口设有车牌识别设备和放行栅栏。
分析:
可抽象为生产者--消费者问题
生产者:检查车辆牌号
消费者1:进入“市区放行栅栏”
生产者2:进入“环路放行栅栏”
五、管程的提出
信号量及PV操作的缺点:
(1)程序易读性差
(2)程序不利于修改和完善
(3)正确性难以保证
为了更易于编写正确的程序,引入管程
六、管程的概念及组成
定义:
是一个由过程、变量及数据结构等组成的一个集合,它们组成一个特殊的模块或软件包。进程可在任何需要的时候调用管程中的过程。
组成:
管程名称、共享数据说明、对数据进行操作的一组过程、对共享数据赋初值的语句。
七、共享内存
1.原理
在相互通信的进程之间设有一个公共内存区,一组进程向该公共内存中写,另一组进程从公共内存中读,通过这种方式实现两组进程之间的信息交换。
八、消息机制--信息缓冲
1.消息缓冲通信原理
进程间的数据交换,是以格式化的消息(也称为报文)为单位的。程序员直接利用操作系统提供的一组通信命令(原语),实现大量数据的传递,通信过程对用户是透明的。
九、消息机制--信箱
2.信箱通信原理:
为了实现进程间的通信,可以设计一个通信机构--信箱,以发送信件和接收信件为进程间通信的基本方式。
十、管道通信
所谓“管道”,是指用于连接一个读进程和一个写进程以实现他们之间通信的一个共享文件,又名pipe文件。
最早出现在UNIX系统中,是UNIX系统进程通信的一大特色。