进程通信:进程之间的信息交换
低级进程通信:由于进程的互斥与同步,需要在进程间交换一定的信息。
低级进程通信的缺点:
以信号量机制为例:
效率低:生产者每次只能向缓冲池投放一个消息,消费者每次只能从缓冲区中取得一个消息。
通信对用户不透明:进程通信的设置,数据的传送,进程的互斥与同步,都必须由程序员实现。
所以在进程之间传送大量数据时,应当利用OS提供的高级通信工具。
优点:
使用方便。OS隐藏了实现进程通信的具体细节,通信过程对用户透明。
高效地传送大量数据。
进程通信的类型:
共享存储器系统:
(1)(低级通信)基于共享数据结构的通信方式:进程公用某些数据结构,实现信息交换。如生产者消费者问题中的有界缓冲区。操作系统仅提供共享数据结构,由程序员负责对公用数据结构的设置及对进程间同步的处理。效率低下,仅适用于传输少量的数据。
(2)基于共享存储区的通信方式:
为了传输大量数据,在内存中划出了一块共享存储区域,进程可通过共享区交换信息。属于高级通信。
需要通信的通信进程在通信前,先向系统申请获得共享存储区的一个分区,并将其附加到自己的地址空间中,对其中的数据进行正常读写,读写完成或不再需要时,将其归还给共享存储区。
管道通信系统:
管道是指一个读进程和一个写进程以实现它们之间的通信的一个共享文件。首创在UNIX中。
写进程以字符流的形式将大量数据送入管道,读进程从管道接受数据。以队列方式工作,先写入的先读出。
管道机制需要:
互斥:即当一个进程正在对pipe执行读写操作时,其他进程必须等待。
同步:当写进程把一定数据写入pipe,区睡眠等待。读进程取走数据,把它唤醒。当读进程读一空pipe时,也应睡眠等待。当写进程将数据写入管道后,将之唤醒
确定对方是否存在:只有确定了对方已存在时,才能进程通信
客户机-服务器系统:
用于实现网络间的进程通信、本地的进程间通信。
(1)套接字:
一个套接字就是一个通信标识类型的数据结构,包含了目的地址,端口号,传输层协议,进程所在的网络地址等,是进程通信和网络通信的基本构件。
每个套接字由IP地址和一个端口号组成。
基于文件型:套接字是基于本地文件系统,一个套接字关联到一个特殊的文件,通信双方通过对这个特殊文件的读写实现通信,类似管道
基于网络型:通信双方运行在不同主机的网络环境下,被分配了一对套接字,一个属于客户端,一个属于服务器。
客户端发送请求时,随机申请一个套接字,主机为之分配一个端口(大于1024),与套接字绑定。
服务器端拥有全局公认的套接字和端口,并通过监听端口等待客户请求。
任何进程都可以向它发出连接请求。
服务器端一旦收到请求,就接受来自客户端的连接,完成连接后,主机之间可以进行通信。
通信结束后,系统通过关闭接收进程的套接字撤销连接。
(2)远程过程调用
RPC(远程过程调用)是一个通信协议,用于通过网络连接的系统。该协议允许运行于一台主机系统上的进程调用另一台主机系统上的进程,而对程序员表现为常规的过程调用,无需额外地为此编程。
为了实现RPC的透明性,RPC引入了一个存根的概念:
在本地客户端,每个能够独立运行的远程过程都拥有一个客户存根,本地进程调用远程过程实际是调用该过程关联的存根。
与此类似,每个远程进程所在的服务器端,其对应的实际可执行过程也存在一个服务器存根与其关联。
消息传递系统:
进程不借助任何共享存储区或数据结构。进程以格式化的消息为单位,将通信的数据封装在消息中,利用操作系统提供的一组通信命令(原语),在进程间进行消息传递。
例:在计算机网络中,消息又称为报文;在微内核操作系统中,微内核与服务器之间的通信采用消息传递机制。
直接通信方式:利用OS提供的发送原语,直接把消息发给目标进程
间接通信方式:发送和接受进程,通过共享中间实体(信箱)的方式进行消息的发送和接收,完成进程间的通信。
间接消息传递系统:
信箱头:存放信箱的描述信息
信箱体:由若干个格子组成
信箱分类:私用信箱,公用信箱,共享信箱
私用信箱:用户进程可为自己建立一个新信箱,并作为该进程的一部分。当拥有该信箱的进程结束后,信箱也随之消失。
拥有者能读取消息,其他用户只能发送消息
可采用单向通信链路的信箱来实现。
公用信箱:由操作系统创建,提供给系统中的所有进程使用。公用信箱在系统运行期间始终存在。
公用信箱应采用双向通信链路来实现。
共享信箱:
由某进程创建,创建时提供共享进程的名字
拥有者和共享者均可读取信息
直接消息传递系统:
采用直接通信方式,即发送进程利用OS所提供的发送命令,直接把消息发送给目标进程。
(1)直接通信原语
对称寻址方式:要求发送进程和接受进程都必须以显式方式提供对方的标识符
send(receiver,message):发送一个消息给接受进程receiver
receive(sender,message):接受sender发来的消息
非对称寻址方式:
只要发送者指定接受者,接受者不需要指定发送者。接受进程可能需要与多个发送进程通信
send(P,message):发送一个消息给进程P
receive(id,message):接受来自任何进程的消息,id变量可设置为进行通信的发送方的进程id或名字
(2)消息格式:
定长消息格式:适用于消息比较短。减少了对消息的处理和存储开销,但是发送较长信息不方便
边长消息格式:消息长度可变。方便用户,但是处理和存储边长消息,需要付出更多开销。
进程的同步方式:
消息传递可以是阻塞或非阻塞。
发送进程执行send原语时:
阻塞发送:发送进程阻塞,直到消息被接受
非阻塞发送:发送进程发送消息,并继续运行
接受进程执行receive()原语:
阻塞接收:接受进程阻塞,直到有消息可用
非阻塞接收:如果有消息,就返回消息;否则表明无消息可用。
三种方式:
发送进程阻塞,接受进程阻塞
进程之间紧密同步
发送进程不阻塞,接受进程阻塞
常用于服务进程,如打印服务
发送进程和接受进程均不阻塞
经常被使用,不要求任何一方等待
直接消息传递系统实例: