·经典的进程同步问题
1、简单生产者——消费问题。 生产者是计算进程,消费者是打印进程,在输入时输入进程是生产者,计算进程是消费者。 简单生产者消费问题(上图) 同步互斥关系的分析: 1)、P进程不能往已“满”的缓冲区中取出产品 2)、Q进程不能从已经“空”的缓冲区中取出产品 同步互斥关系的分析(上图)2、多个生产者——消费问题。将多个缓冲区组成一个环形的缓冲池,里面的缓冲区为空的个数为K,每一个缓冲区能容纳一个产品。
环形缓冲池(上图)
同步问题:
1)、生产者不能往“满”的缓冲区中放产品,设置信号量为empty,初始值为K,用于指示缓冲池中空缓冲区的数目。
2)、消费者不能从“空”的缓冲区中取产品,设置信号量为full,初始值为0,用于指示缓冲池中满缓冲区的数目。
互斥问题:设置信号量mutex,初始值为1,用于实现临界区互斥。
多个生产者-消费者算法:
3、读者——写者问题:某个共享文件F,系统允许若干进程对文件F进行读和写。把读文件的进程称为读者,把写文件的进程称为写者,读者和写者必须遵循如下规定:
1)、多个进程可以同时读文件F。
2)、任一个进程在对文件F进行写时,不允许其他进程对文件进行读或写。
3)、当有进程正在读文件时,不允许任何进程去写文件。
问题分析:
1、写者和读者之间互斥。
2、写者和写者之间互斥。
3、读者和读者之间同步。
得出答案:如果第一个读者取得了读文件的权利,其他读者可以跟着读文件,所以写者与读者之间的互斥就变成了写者与第一个读者之间的互斥。
读者——写者问题解决方案:
读者——写者问题解决方案(上图)
·管程
1、管程的提出:因为采用信号量及P、V同步机制来编写并发程序。有如下缺点:
1)、程序易读性差,要了解一组共享变量及信号量的操作是否正确,必须读整个系统或者并发程序。
2)、程序不利于修改和维护,程序的局部性很差,任一组变量或一段代码的修改都可能影响全局。
3)、正确性难以保证,因为操作系统或并发程序通常很大,要保证系统没有逻辑错误是很难的。
2、管程的概念:一个管程是一个由过程,变量及数据结构等组成的一个集合,它们组成一个特殊的模块或软件包。进程可在任何需要的时候调用管程中的过程,但他们不能在管程之外声明的过程中直接访问管程内的数据结构。
管程的组成:一个管程由四个部分组成,管程名称、共享数据的说明、对数据进行操作的一组过程和对共享数据赋初始值的语句。
3、管程的特点:
模块化:一个管程是一个基本程序单位,可以单独编译。
抽象数据类型:管程是一种特殊的数据类型,其中不仅有数据,而且有对数据进行操作的代码。
信息屏蔽:管程是半透明的,管程中的外部过程实现了某些功能,至于这些功能是怎样实现的,在其外部则是不可见的。
·进程通信
由于P、V操作时一类低级通信原语,不能承担进程间大量信息的交换任务,因此需要引入新的通信原语,解决大量信息的交换问题。进程通信分为三种:共享内存、消息机制、管道通信。
1、共享内存:在相互通信的进程之间设有一个公共内存区,一组进程向该公共内存中写,另一组进程从公共内存中读,通过这种方式实现两组进程间的信息交换。
2、消息机制:
1)、消息缓冲通信,根据“生产者——消费者”原理,利用内存中公用信息缓冲区实现进程之间的信息交换。
2)、以发送信件和接收回答信件为进程间通信的基本方式。当一个进程希望与另一个进程通信时,就创建一个链接两个进程的信箱,发送进程把信件投入信箱,接收进程可以在任何时刻取走信件。
3、管道通信:管道通信的基础是文件系统,是指连接两个进程之间的一个打开的共享文件。专用于进程之间进行数据通信,发送进程可以源源不断的从管道一端写入数据流,每次写入的信息长度是可变的,接收进程在需要时可以从管道的另一端读出数据,读出单位长度也是可变的。