几种进程通信方法的研究和比较
陆静.胡明庆
(宁波大学科学技术学院理工分院浙江宁波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的时间.不适宜于信息量大或操作频繁的场合。
共享内存针对消息缓冲的缺点改而利用内存缓冲区直接交
换信息,无须复制,快捷、信息量大是其优点。但是共享内存的通
信方式是通过将共享的内存缓冲区直接附加到进程的虚拟地址
空间中来实现的.因此,这些进程之间的读写操作的同步问题操
作系统无法实现。必须由各进程利用其他同步工具解决。另外,
由于内存实体存在于计算机系统中.所以只能由处于同一个计
算机系统中的诸进程共享。不方便网络通信。
不同的进程通信方式有不同的优点和缺点.因此.对于不同
的应用问题,要根据问题本身的情况来选择进程间的通信方式。
参考文献:
1.胡明庆、高魏、钟梅.操作系统与实验教程.清华大学出版社.2006年
8月
2.庞丽萍。操作系统原理.牟中科技大学出版社。2ooo卑
3.黄超.1mux高级开发技术.机械工业出版社.2002年
阅读(1574) | 评论(0) | 转发(0) |