进程间的通信

进程通信是指进程之间的信息交换。PV操作是低级通信方式,高级通信方式是指以较高的效率传输大量数据的通信方式。高级通信方法主要有以下三类。

共享存储

在通信的进程之间存在一块可以直接访问的共享空间,通过对这片共享空间进行写/读操作实现进程之间的信息交换。在对共享空间进行写/读操作时,需要使用同步互斥工具(如P操作、V操作),对共享空间的写/读进行控制。共享存储又分为两种:低级方式的共享是基于数据结构的共享,高级方式则是基于存储区的共享操作系统只负责为通信进程提供可共享使用的存储空间和同步互斥工具,而数据交换则是由用户自己安排读/写指令完成。

需要注意的是,用户进程空间一般都是独立的,要想让两个用户进程共享空间必须通过特殊的系统调用实现,而进程内的线程是自然共享进程空间的。


消息传递

在消息传递系统中,进程间的数据交换是以格式化的消息为单位的。若通信的进程之间不存在可直接访问的共享空间,则必须利用操作系统提供的消息传递方法实现进程通信。进程通过系统提供的发送消息和接收消息两个原语进行数据交换。

1)直接通信方式:发送进程直接把消息发送给接收进程,并将它挂在接收进程的消息缓冲队列上,接收进程从消息缓冲队列中取得消息。

2)间接通信方式:发送进程把消息发送到某个中间实体中,接收进程从中间实体中取得消息。这种中间实体一般称为信箱,这种通信方式又称为信箱通信方式。该通信方式广泛应用于计算机网络中,相应的通信系统称为电子邮件系统。


管道通信

管道通信是消息传递的一种特殊方式。所谓管道,是指用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件,又名pipe文件。向管道(共享文件)提供输入的发送进程(即写进程),以字符流形式将大量的数据送入(写)管道;而接收管道输出的接收进程(即读进程),则从管道中接收(读)数据。为了协调双方的通信,管道机制必须提供以下三方面的协调能力:互斥、同步和确定对方的存在。

有两种基本的管道类型:匿名管道和命名管道。

匿名管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。

命名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。


另外,除了上面的三种主要通信方式外,还有几种其他的进程间通信方式。

环境变量、文件描述符

当创建一个子进程时,它接受了父进程许多资源的拷贝。子进程接受了父进程的文本、堆栈以及数据片断的拷贝。子进程也接受了父进程的环境数据以及所有文件描述符的拷贝。子进程从父进程继承资源的过程创造了进程间通信的一个机会。父进程可以在它的数据片断或环境中设置一定的变量,子进程于是接受这些值。同样,父进程也可以打开一个文件,推进到文件内的期望位置,子进程接着就可以在父进程离开读/写指针的准确位置访问该文件。


这类通信的缺陷在于它是单向的、一次性的通信。也就是说,除了文件描述外,如果子进程继承了任何其它数据,也仅仅是父进程拷贝的所有数据。 一旦创建了子进程,由子进程对这些变量的任何改变都不会反映到父进程的数据中。同样,创建子进程后,对父进程数据的任何改变也不会反映到子进程中。所以,这种类型的进程间通信更像指挥棒传递。一旦父进程传递了某些资源的拷贝,子进程对它的使用就是独立的,必须使用原始传递资源。


命令行参数

通过命令行参数(command-line argument)可以完成另一种单向、一次性的进程间通信我前面的文章已经提到过使用命令行参数。命令行参数在调用一个exec或派生调用操作系统时传递给子进程。命令行参数通常在其中一个参数中作为NULL终止字符串传递给exec或派生函数调用。这些函数可以单向、一次性方式给子进程传递值。WINDOWS有调用执行exe程序的API。大家可以去参考一下ShellExecuteA函数相关。


动态数据交换

动态数据交换( dynamic data exchange ) 是当今可用的进程间通信最强大和完善的形式之一。动态数据交换使用消息传递、共享内存、事务协议、客户/服务器范畴、同步规则以及会话协议来让数据和控制信息在进程间流动。动态数据交换对话( dynamic data exchange session, DDE )的基本模型是客户、服务器。服务器对来自客户的数据或动作作出反应。客户和服务器可以以多种关系来通信。

一个服务器可以与任意数量的客户通信。一个客户也可以与任意数量的服务器通信。单个DDE代理既可以是客户,也可以是服务器。也就是说,进程可以从一个正为另一个进程执行服务的DDE代理请求服务。


参考:点击打开链接


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值