2009-05-24 15:39 几种进程通信方法的研究和比较
陆静.胡明庆 (宁波大学科学技术学院理工分院浙江宁波315211) 1.引言 为了提高计算机系统的效率.增强计算机系统内各种硬件 的并行操作能力.操作系统要求程序结构必须适应并发处理的 需要.为此引入了进程的概念。进程是操作系统的核心,所有基 于多道程序设计的操作系统都建立在进程的概念之上。目前的 计算机系统均提供了多任务并行环境.无论是应用程序还是系 统程序.都需要针对每一个任务创建相应的进程。进程是设计和 分析操作系统的有力工具。然而不同的进程之间.即使是具有家 族联系的父子进程.都具有各自不同的进程映像。由于不同的进 程运行在各自不同的内存空间中.一方对于变量的修改另一方 是无法感知的.因此.进程之间的信息传递不可能通过变量或其 它数据结构直接进行,只能通过进程间通信来完成。并发进程之 间的相互通信是实现多进程间协作和同步的常用工具.具有很 强的实用性 2.进程通信分类 进程通信是操作系统内核层极为重要的部分 根据进程通 信时信息量大小的不同,可以将进程通信划分为两大类型:控制 信息的通信和大批数据信息的通信.前者称为低级通信,后者称 为高级通信 低级通信主要用于进程之间的同步、互斥、终止、挂起等等 控制信息的传递,主要有以下三种方式: (1)利用系统调用睡眠SLEEP()和唤醒WAKEUP()实现 进程之间的同步,互斥。SLE EP可以使调用它的进程以指定的优 先级在系统的某个等待队列上睡眠.而WAKEUP则用来唤醒在 指定队列上睡眠的进程 (2)利用系统调用WAIT'()和EXIT()实现父子进程之间的 同步 调用WAIT的父进程必须等待子进程运行结束才能继续 运行,而EXIT则可以用来终止某一个进程,并把相关状态返回 给它的父进程 (3)利用软中断信号实现同一用户的各进程之间的通信。 高级通信主要用于进程间数据块的交换和共享 常见的高级通 信有管道(PIPE)、消息队列(MESSAGE)、共享内存(SHARED MEM0RY)等。 3.软中断通信 软中断信号是一种简单且最基本的进程间通信机制.它最 大的特点是提供了一种简单的处理异步事件的方法。例如,我们 常见的用户从键盘输入组合键Ctrl+C来中断一个程序的运行. 或者在两个进程之间通过某个信号来通知发生了异步事件.或 者向系统或进程报告突发的硬件故障如非法指令、运算溢出等 等 更重要的是用户进程还可以向自己发送信号以中断程序的 执行.并自动转入指定的软中断处理函数中去执行用户自行安 排的处理内容.处理完毕后再返回用户进程继续执行.从而为应 用程序提供了由用户自行处理随机事件的通信机制。 因此,软中断信号实现(signal implementation)是操作系统 用来通知进程有事件发生的一种机制 由于这种信号总是在进 程处于运行状态时才会去响应的.故称之为软中断信号。 软中断信号的使用者是操作系统和用户源程序.操作系统 事先将系统中可以使用的软中断信号进行集中编码并定义相应 含义后.提交用户使用。用户可以通过相应的软中断序号或软中 断名称来使用软中断 4.管道通信(PIPE) 管道是一种常用的单向进程间通信机制 两个进程利用管 道进行通信时.发送信息的进程称为写进程.接收信息的进程称 为读进程。管道通信方式的中间介质就是文件.通常称这种文件 为管道文件.它就像管道一样将一个写进程和一个读进程连接 在一起,实现两个进程之间的通信。写进程通过写入端(发送端) 往管道文件中写入信息;读进程通过读出端(接收端)从管道文 件中读取信息。两个进程协调不断地进行写和读,便会构成双方 通过管道传递信息的流水线。 利用系统调用PIPE()可以创建一个无名管道文件,通常称 为无名管道或PIPE;利用系统调用MKNOD()可以创建一个有 名管道文件.通常称为有名管道或FIFO。无名管道是一种非永 久性的管道通信机构.当它访问的进程全部终止时,它也将随之 被撤消。无名管道只能用在具有家族联系的进程之间。有名管道 可以长期存在于系统之中.而且提供给任意关系的进程使用,但 是使用不当容易导致出错.所以操作系统将命名管道的管理权 交由系统来加以控制 管道文件被创建后,可以通过系统调用WRITE()和READ ()来实现对管道的读写操作;通信完毕后,可用CLOSE()将管道 文件关闭。 5.消息缓冲通信(MESSAGE) 多个独立的进程之间可以通过消息缓冲机制来相互通信. 这种通信的实现是以消息缓冲区为中间介质.通信双方的发送 和接收操作均以消息为单位。在存储器中,消息缓冲区被组织成 队列,通常称之为消息队列。消息队列一旦创建后即可由多进程 共享.发送消息的进程可以在任意时刻发送任意个消息到指定 的消息队列上,并检查是否有接收进程在等待它所发送的消息。 若有则唤醒它:而接收消息的进程可以在需要消息的时候到指 定的消息队列上获取消息.如果消息还没有到来.则转入睡眠状 态等待。 由于一个消息队列由多个进程共享.因此挂在队列上的消 息需要统一规格。以Linux为例.系统定义了一个公用的消息缓 冲区数据结构msgbuf.而消息队列则是由若干msgbuf构成的链 表。利用系统调用MSGGET()可以创建消息队列,这一步工作也 被称为消息队列的初始化。在进行消息缓冲通信时.发送消息进 程使用系统调用MSGSND()将消息挂人消息队列,接收消息进 程使用系统调用MSGREC()从消息队列上摘取消息。在需要改 变队列的使用权限及其它一些特性时,用MSGCTL()来实现。 共享的消息队列是一个临界资源,针对同一消息队列的诸 发送和接收进程必须保证互斥进入,这种进程间的同步和互斥 是由系统提供的系统调用自动实现的,所以用户在使用时不需 要再考虑它们之间的同步关系.非常方便。 但是消息发送进程在发送消息前必须先请求一个msgbuf, 然后将要发送的消息从私有的地址空间中复制 到msgbuf中才能发送;消息接收进程则相反,必须先从消息队 列上摘取消息msgbuf.再将msgbuf中的信息复制到自己的程序 空间中。因此,在消息缓冲通信方式中需要进行大量额外的复制 操作,这是消息缓冲通信方式的缺点。 6.共享内存通信(SHARED MEMORY) 针对消息缓冲需要占用CPU进行消息复制的缺点.OS提 供了一种进程间直接进行数据交换的通信方式一共享内存 顾 名思义.这种通信方式允许多个进程在外部通信协议或同步,互 斥机制的支持下使用同一个内存段(作为中间介质)进行通信. 它是一种最有效的数据通信方式,其特点是没有中间环节.直接 将共享的内存页面通过附接.映射到相互通信的进程各自的虚 拟地址空间中.从而使多个进程可以直接访问同一个物理内存 页面.如同访问自己的私有空间一样(但实质上不是私有的而是 共享的)。因此这种进程间通信方式是在同一个计算机系统中的 诸进程间实现通信的最快捷的方法.而它的局限性也在于此.即 共享内存的诸进程必须共处同一个计算机系统.有物理内存可 以共享才行。 与消息缓冲通信类似.在进行共享内存通信之前.必须先通 过系统调用SHMGET()创建一个共享内存段.然后使用系统调 用SHMAT()和SHMDT()来实现共享内存的映射和分离.用系 统调用SHMCTL()来改变共享内存段的存取权限及其它一些特 性。 共享内存通信与消息缓冲通信有很多相似之处:多个进程 都是通过获取共享内存的标识符来访问指定的共享内存.都要 进行权限检查等等。不同的是共享内存一旦附接后就作为进程 地址空间的一部分提供给进程使用 对于该共享内存的读写操 作如同对进程私有的缓冲区一样.操作系统不再关心进程间是 如何使用这个共享内存,更无法进行干预。因此。系统提供的共 享内存系统调用函数是不带同步工具的. 多个进程对共享内存 的读写操作所需要的同步和互斥则必须由各进程通过使用其它 的同步工具来解决。 7.几种通信方法总结 综上所述.进程之间的多种通信方法各自有各自的优点和 缺点: 如果用户传递的信息较少.或是需要通过信号来触发某些 行为.前文提到的软中断信号机制不失为一种简捷有效的进程 间通信方式.但若是进程间要求传递的信息量比较大或者进程 间存在交换数据的要求,那就需要考虑别的通信方式了。 无名管道简单方便.但局限于单向通信的工作方式.并且只 能在创建它的进程及其子孙进程之间实现管道的共享:有名管 道虽然可以提供给任意关系的进程使用.但是由于其长期存在 于系统之中,使用不当容易出错.所以普通用户一般不建议使 用。 消息缓冲可以不再局限于父子进程.而允许任意进程通过 共享消息队列来实现进程间通信.并由系统调用函数来实现消 息发送和接收之间的同步.从而使得用户在使用消息缓冲进行 通信时不再需要考虑同步问题.使用方便,但是信息的复制需要 额外消耗CPU的时间.不适宜于信息量大或操作频繁的场合。 共享内存针对消息缓冲的缺点改而利用内存缓冲区直接交 换信息,无须复制,快捷、信息量大是其优点。但是共享内存的通 信方式是通过将共享的内存缓冲区直接附加到进程的虚拟地址 空间中来实现的.因此,这些进程之间的读写操作的同步问题操 作系统无法实现。必须由各进程利用其他同步工具解决。另外, 由于内存实体存在于计算机系统中.所以只能由处于同一个计 算机系统中的诸进程共享。不方便网络通信。 不同的进程通信方式有不同的优点和缺点.因此.对于不同 的应用问题,要根据问题本身的情况来选择进程间的通信方式。 |
|