2.2.7 进程通信
进程是操作系统的核心,目前的计算机系统均运行在多道程序设计环境中,其操作系统都建立在进程的概念之上。如前面章节所述,无论是应用程序还是系统程序,都需要针对每一个任务创建相应的进程,每个进程具有各自不同的进程映像。由于不同的进程运行在各自不同的内存空间中,一方对于变量的修改另一方是无法感知的。因此,进程之间的信息传递不可能通过变量或其他数据结构直接进行,只能通过进程间通信来完成。进程通信即并发进程之间相互交换信息,是操作系统内核层极为重要的部分。进程通信根据交换信息量的多少和效率的高低,分为低级通信和高级通信。高级通信可以传递大数据量,低级通信一般只传递状态和整数值。
进程低级通信的特点是传送信息量小,效率低,每次通信传递的信息量固定,可以利用信号量机制实现进程间的数据传递。若传递较多信息则需要进行多次通信。前节讲的进程同步和互斥中的信号传递就是一种低级通信。低级通信从数据传递的角度讲效率很低,同时对用户不透明,即由用户直接实现通信的细节,容易出错。
进程高级通信中,进程之间可以利用操作系统提供的一组通信命令,高效地传送大量数据,同时简化了通信程序的设计。高级通信主要有3种基本模式:共享内存、消息传递和管道通信。
1.共享内存模式
在共享内存模式中,建立起一块供协作进程共享的内存区域,进程通过此共享区域读或写入数据来交换信息(图2-26)。一般这个内存区域在进程的地址范围内,协作进程通过在共享区域内读或写来交换数据,在使用共享区域读操作或写操作时必须互斥,否则会产生错误。在这种方案中,操作系统只提供共享存储空间,对共享区域的使用和进程间的互斥关系都由程序员来控制。生产者-消费者问题在传递数据时可以利用共享内存模式来解决。
2.消息传递模式
在消息传递模式中,通过在协作进程间交换信息来实现通信(图2-27)。
消息传递模式提供一种机制,使协作进程不必通过共享地址空间来进行信息交换,这在分布式环境中特别有用。消息传递工具提供至少两种操作:发送消息和接收消息。进程发送的消息可以是定长的或变长的,发送消息包含3个数据项:接收进程标识、消息大小和消息正文;接收消息也包含3个数据项:发送进程标识、消息大小和消息正文。发送消息和接收消息操作都是原语操作。
图2-26 共享内存模式
图2-27 消息传递模式
3.管道通信模式
管道通信模式采用一种信息流缓冲机构,管道是一个共享文件,连结读进程和写进程以实现它们之间的通信。UNIX系统中管道基于文件系统,在内核中通过文件描述符表示。管道以先进先出(FIFO)方式组织数据传输(图2-28)。
图2-28 管道通信模式
在操作系统中,上述3种模式都已经实现。几种通信模式各自有各自的优点和缺点:使用共享内存模式进行通信的速度比使用消息传递模式要快,消息传递模式一般用于进程间交换数据较少的情况。管道通信模式简单方便,但是其长期存于系统中,使用不当容易出错。对于不同的应用问题,要根据问题本身的情况来选择进程间的通信方式。