操作系统 进程通信方式
作者:互联网
进程通信的类型
- 消息传递通信的实现方法
- 消息传递系统实现中的若干问题
- 消息缓冲队列通信机制
信号量机制就是一种进程通信方式!!
- 缺点:
(1)交换的信息量比较少;
(2)效率低;
(3)对用户不透明。
进程通信的概念
- 进程通信:为协调完成某一任务,几个进程间应保持联系,即交换一定数量的信息。
通信方式:
- 低级通信:仅交换少量的数据和一些状态,如前述 的同步与互斥方式。(P、V操作)
- 高级通信:交换信息量大,用户可直接利用OS提供的通信命令高效的传送大量数据。(OS隐去了实现细节,对用户是透明的。)
共享内存通信方式
共享存储器系统(Shared-Memory System)
- 基于共享数据结构的通信方式
- 要求诸进程共享某些数据结构,借以实现进程间的数据交换。如生产者—消费者问题中,用有界缓冲区来实现通信
- 对用户不透明,程序员负担重,操作系统效率低,只适合传递少量数据,属于低级通信方式
- 基于共享存储区的通信方式
- 在存储器中划出一块共享存储区,诸进程可通过对共享存储区中的数据读写来实现通信
- 属于高级通信,适合传送大量数据
通信方法:
- 方法:
- 在内存中划一块区域作为共享数据区,称为共享内存分区,要通信的进程双方将自己的虚拟地址空间映射到共享内存分区上。
- 通信时,发送进程将需要交换的信息写入该共享内存分区中,接收进程从该共享内存分区中读取信息,从而实现进程之间的通信。
- 特点:是进程之间最快捷、最有效的一种通信方式。UNIX、Windows、OS/2等操作系统都采用了这种通信方式。
消息传递通信方式
- 消息传递系统(Message passing system)
- 进程之间的数据交换,是以格式化的消息(message)为单位的;在计算机网络中,又把message称为报文
- 实现方式:程序员直接利用系统提供的一组通信命令(原语)进行通信。
- 消息传递系统的通信方式属于高级通信方式。可分为直接通信方式和间接通信方式
- 优点:传递信息量大、对用户透明、应用广泛
- 广泛应用于单机系统、多机系统、计算机网络
直接通信方式
发送进程直接将消息发送给接收进程,并将消息挂在接收进程 的消息队列上,接收进程从消息队列中取得消息。
间接通信方式
发送进程发送消息到“信箱”中,接收进程从“信箱”中取得消息, 相应的系统称为电子邮件系统。
消息传递方式的变种很多,常用的有直接通信(消息缓冲区)方式和间接通信(信箱)方式,下图是消息传递通信机制模型。
消息缓冲通信方式
发送者,在通信中存在两种可能的行为:
- ① 发送完消息后不等消息被接收者接收就继续前进;
- ② 发送完消息后阻塞自己直到收到接收者的回答消息后才继续前进。
接收者,也存在两种可能的行为:
- ① 若有消息则接收这个消息后继续前进,若无消息则必须等待消息的到来(即阻塞自己);
- ② 若有消息则接收这个消息后继续前进,若无消息则放弃接收消息而继续前进。
消息缓冲机制通信过程描述如下:
(1)发送者在发送消息前,先在自己的内存空间设置一个发送区,把欲发送的消息填入其中。
(2)发送者申请一个消息缓冲区,将已准备好的消息从发送区送到该消息缓冲区,并将发送者进程的名字、消息的开始地址以及消息的长度(通常以字节或字为单位)等信息填入该消息缓冲区中,然后把该消息缓冲区挂到接收进程的消息链上。
(3)接收者在接收消息前先在自己的内存空间设置相应的接收区。
(4)接收者摘下消息链上的第一条消息,将该消息从消息缓冲区复制到接收区,然后释放该消息缓冲区
据结构描述如下:
struct messagebuffer{ int sender; //发送进程标识符 int size; //消息长度 char text[MAXSIZE]; //消息正文,MAXSIZE为数组text的长度 struct messagebuffer *next;// next为指向下一个消息缓冲区的指针}
发送原语send描述如下
void send(receiver,a){ lock out interrupts; //关中断 getbuffer(a.size,i); i.sender=a.sender; i.size=a.size; i.text=a.text; i.next=NULL; getid(PCBset,receiver,j); P(j.mutex); //互斥使用j的消息队列 Insert(j.mq,i); V(j.mutex); V(j.sm); unlock interrupts; //开中断}
接收原语receive描述如下:
void receive(b){ lock out interrupts; //关中断 j=internal name; P(j.sm); P(j.mutex); //互斥使用j的消息队列 Remove(j.mq,i); V(j.mutex); b.sender=i.sender; b.size=i.size; b.text=i.text; Releasebuff(i); unlock interrupts; //开中断}
信箱通信方式
- 方法:进程之间的通信借助于称为信箱的共享数据结构实体来暂时存放发送进程发送给接收进程的消息。
- 优点:发送方和接收方不必直接建立联系,也没有处理时间上的限制;发送方可以在任何时间发送信件,接收方也可以在任何时间取走信件。
目前人们常用的E-mail就是采用这种方式收发信件的。
信箱通信的同步规则
(1)若发送信件时信箱已满,则发送进程应转变成等待信箱状态,直到信箱有空信格时才被唤醒。
(2)若取信件时信箱中已无信件,则接收进程转变成等待信件状态,直到有信件时才被唤醒。
以私用信箱为例描述信箱机制的通信过程
(1)接收者创建属于自己的私用信箱;
(2)发送者产生一封信件(即一个消息)。
(3)发送者把信件投入接收者的私用信箱。
(4)接收者从自己的私用信箱中读取信件。
投递原语desposit描述如下
void deposit(boxname,msg){ lock out interrupts; //关中断 P(emptynum); //有空格子否,无则阻塞自己 选择标志位为空的格子; 把信件msg放入该空格子中; 置该格子的标志位为满; V(mesnum); //信件多了一个,若有接收者进程被阻塞则唤醒之 unlock interrupts; //开中断 }
读取原语remove描述如下
void remove(boxname,msg){ lock out interrupts; //关中断 P(mesnum); //有信件否,无则阻塞自己 选择标志位为满的格子; 把该满格子中的信件放入msg中; 置该格子的标志位为空; V(emptynum); //空格子多了一个,若有发送者进程被阻塞则唤醒之 unlock interrupts; //开中断}
管道通信方式
管道(Pipe)通信(共享文件方式)
- 管道是指用于连接一个读进程和一个写进程以实现他们之间通信的一个共享文件,又名pipe文件
- 向管道(共享文件)提供输入的发送进程(即写进程), 以字符流形式将大量的数据送入管道;而接受管道输出的接收进程(即读进程),则从管道中接收(读)数据
- 由于发送进程和接收进程是利用管道进行通信的,故又称为管道通信
- 这种方式首创于UNIX系统,由于它能有效地传送大量数据,因而又被引入到许多其它操作系统中
管道的作用类似于消息缓冲区(生产-消费),但有显著不同特点:
① 以文件为传输介质,可传输大量数据。
② 以字符流方式读写,不必以消息为单位。
③ 以队列方式工作,先写入的先读出。
管道(Pipe)通信
- 管道机制必须提供以下三方面的协调能力
- 互斥,即当一个进程正在对pipe执行读/写操作时,其它(另一)进程必须等待
- 同步,指当写(输入)进程把一定数量(如4 KB)的数据写入pipe,便去睡眠等待,直到读(输出)进程取走数据后,再把他唤醒。当读进程读一空pipe时,也应睡眠等待,直至写进程将数据写入管道后,才将之唤醒
- 确定对方是否存在,只有确定了对方已存在时,才能进行通信
标签:信箱,操作系统,通信,发送,消息,进程,接收 来源: https://blog.51cto.com/u_14175378/2759917