前言从操作系统的角度整理操作系统进程间的通信方式。
过程通信
过程通信是指过程之间的信息交换。
进程是操作系统分配资源的单位,每个进程都有自己的内存地址空间。 然而,操作系统提供了一种允许进程间信息交换(即进程间通信)的方法,因为一个进程不能直接访问另一个进程的地址空间,以便确保操作系统的安全。
操作系统提供共享存储、管道通信和消息传递。
共享存储
操作系统为两个进程分配一个共享空间,两个进程通过操作该共享空间进行通信。
它必须是互斥的
两个进程对共享空间的访问必须是独占的。 还是必须使用操作系统提供的工具(如p、v操作)进行独占
共享存储有两种类型:基于数据结构的共享和基于存储区的共享
基于数据结构的共享
也就是说,共享空间只能存储一个固定的数据结构,这种共享方式速度慢,限制多,是一种低级通信方式。 基于存储的共享
在内存中建立共享内存区域,数据格式、存储位置由进程控制; 这种共享方式是更高速、更高级的通信方式。 管道通信
管道是用于连接读写过程的共享文件,也称为pipe文件。 其实就是在内存中打开一定大小的缓冲区。
此缓冲区大小通常与内存页面的大小匹配,在linux系统上为4kb。
管道通信只能采用半双工通信
要实现双向并发通信,需要安装两个管道。
每个过程必须互斥地接入管道
数据作为字符流写入管道。 如果写入未满,则不允许读取。 如果不读天空,就不允许写
当管道已满时,写入进程的write (阻止系统调用,等待读取进程删除数据。
读取进程删除所有数据后,管道将变空,并阻止读取进程的read ()系统调用。
数据被读取后,会从管道中丢弃
也就是说,最多只有一个读取过程。 否则,可能会读错数据。
消息传递
消息传递是以格式化了进程间数据交换的消息为单位,通过操作系统提供的消息的发送接收这两个基元进行数据交换的方式。
格式化的消息
一般由消息标头和消息主体组成;
消息标头包含格式化的消息,如发送进程ID、接收进程ID、消息类型和消息长度。 消息传递有直接通信方式和间接通信方式两种
直接通信方式
进程1向源进程2发送所格式化的消息,它直接位于接收进程的消息缓冲器队列的末尾,进程2通过源进程顺序地读取缓冲器队列的值。
间接通信方式
由于消息首先发送到中间实体(邮箱),因此也是邮箱通信方式。
系统为每个通信过程管理一个邮箱。 此邮箱包含正在各种不同进程之间通信的消息。 因为标头包含每个进程的邮箱,所以不必担心会被错误捕获。
进程1通过发送原语将消息发送到邮箱,进程2通过接收原语读取消息。