admin 管理员组

文章数量: 887031


2024年2月29日发(作者:js合并数组去除重复)

Windows系统中进程间通信方式探析

引言:系统中进程间的通信及数据交换对于许多应用是至关重要的,尤其是随着软件开发模式逐渐走向分散化和模块化的今天,系统内部或通信双方各进程间协调、控制愈发频繁起来,保持及时的通信及数据交换是完成好任务的必要条件。因此解决好此类问题是做好系统的全题条件。

1.进程及通信类型

1.1系统中进程的划分

系统中的进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码、数据以及它可利用的系统资源(如文件、管道等)组成。对Windows操作系统而言,多用户多任务是其最基本的要求,从而多进程是其基本特征。进程间共同完成特定任务时分工、协作是必然的,从此角度出发,可将系统中的进程分为两类:客户方进程和服务方进程[1]。客户方进程是指发起通信的进程或应用程序,而服务方进程是指接受并应答发起方信号的进程。此种分类对所有的通信双方都适用,但无益于软件开发。另一种分类方法是从软件开发的角度出发,可将系统中的进程分成已方进程、系统进程和他方进程[2]。已方进程即由软件开发方开发的应用程序进入系统后形成的进程,而软件开发方开发的应用程序以外的应用程序进入系统后形成的进程称为他方进程,而系统进程则是由Windows操作系统所提供的进程。第三种分类方法是以进程所处的位置为出发点,可分为本地进程和远程进程[3]。

1.2进程间的通信类型及特点

根据进程分类结果,可以得到进程间的通信类型:

Ⅰ、本地已方进程之间的通信;

Ⅱ、本地已方进程和远程已方进程间的通信;

Ⅲ、本地已方进程和本地他方进程间的通信;

Ⅳ、本地已方进程和远程他方进程间的通信;

对于第一种进程间通信,通信双方进程的彼此都来自于同一软件开发方,进程间通信的协议、数据和内容都可由软件开发方在软件设计阶段统一加以考虑。软件开发方在软件设计阶段充分考虑到进程间通信的需求,进而主动采取某种较为成熟的通信实现方式来分

别设计实现进程间通信的客户端和服务器端,从而形式进程间通信的既成的“默契”,这种“默契”实际上是在软件设计阶段就取得了,在此将这种通信模式称为“有意识”型。

第二种进程间的通信方式,尽享了第一种进程间通信方式的便利,但不在开发时选择通信的方式上受到了一定的限制,是一种有约束的“有意识”型模式。

第三种和第四种进程间的通信方式中,通信双方来自完全不同的软件开发方,由此很难在事先达成类似第一、二类型进程间的通信的那种“默契”,通信过程中,通信双方往往没有既定的客户端和服务器端,服务器端完全不知道客户端进程的存在,也不清楚客户端要与之实现通信所使用的某种特定的协议的内容,服务端只能对符合自己格式和类型的客户请求作出响应,故此这种通信模式是“无意识”型[2]的,不管进程是否在本地,通信的双方都只是按自己认定的规则做事,在本地按既定的规则做,不在同一主机也按符合远程通信的既定规则工作。

上述的分类方式有助于开发者选择不同的通信方式,但不足以反映通信时进程的特点。因此,关于进程间的通信又常根据进程通信时信息量大小的不同分类,进程间传递少量的控制信息将其通信称为低级通信,而传递大批数据信息时,将其称为高级通信。

低级通信主要用于进程之间的同步、互斥、终止、挂起等等控制信息的传递。高级通信主要用于进程间数据块的交换和共享。

2进程间通信方式及不同通信类别下的选用

2.1进程间通信方式及特点

Ⅰ、文件映射。文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待。因此,进程不必使用文件I/O操作,只需简单的指针操作就可读取和修改文件的内容。但文件映射只能用于本地机器的进程之间,不能用于网络中,而开发者还必须控制进程间的同步。

Ⅱ、共享内存。Win32 API中共享内存(Shared Memory)实际就是文件映射的一种特殊情况。进程在创建文件映射对象时用特定的地址来代替文件句柄(HANDLE),就表示了对应的文件映射对象是从操作系统页面文件访问内存,其它进程打开该文件映射对象就可以访问该内存块。由于共享内存是 用文件映射实现的,所以它也有较好的安全性,也只能运行于同一计算机上的进程之间。

Ⅲ、WM_COPYDATA消息。WM_COPYDATA是一种很好的数据传输方式。当一个应用向另一个应用传送数据时,发送方只需使用调用SendMessage函数,参数是目的窗口的句柄、传递数据的起始地址、WM_COPYDATA消息。接收方只需像处理其它消息那样处理WM_COPY

DATA消息,这样收发双方就实现了数据共享。它的使用非常简单,在底层实际上是通过文件映射来实现的。它的缺点是灵活性不高,并且它只能用于Windows平台的单机环境下。

Ⅳ、剪贴板。剪贴板(Clipped Board)实质是Win32 API中一组用来传输数据的函数和消息,为Windows 应用程序之间进行数据共享提供了一个中介,Windows已建立的剪切(复制)-粘贴的机制为不同应用程序之间共享不同格式数据提供了一条捷径。但剪贴板只能在基于Windows的程序中使用,不能在网络上使用。

Ⅴ、动态数据交换。动态数据交换(DDE)是使用共享内存在应用程序之间进行数据交换的一种进程间通信形式。DDE交换可以发生在单机或网络中不同计算机的应用程序之间。开发者还可以定义定制的DDE数据格式进行应用程序之间特别目的IPC,它们有更紧密耦合的通信要求。大多数基于Windows的应用程序都支持DDE。

Ⅵ、对象连接与嵌入。应用程序利用对象连接与嵌入(OLE)技术管理复合文档(由多种数据格式组成的文档),OLE提供使某应用程序更容易调用其它应用程序进行数据编辑的 服务。例如,OLE支持的字处理器可以嵌套电子表格,当用户要编辑电子表格时OLE库可自动启动电子表格编辑器。当用户退出电子表格编辑器时,该表格已在原始字处理器文档中得到更新。在这里电子表格编辑器变成了字处理器的扩展,而如果使用DDE,用户要显式地启动电子表格编辑器。同DDE技术相同,大多数基于Windows的应用程序都支持OLE技术。

Ⅶ、管道。管道(Pipe)是一种具有两个端点的通信通道:有一端句柄的进程可以和有另一端句柄的进程通信。管道可以是单向即一端是只读的,另一端点是只写的;也可以是双向的一管道的两端点既可读也可写。

管道有两种,一种是匿名管道(Anonymous Pipe),它用于在父进程和子进程之间,或同一父进程的两个子进程之间传输数据的无名字的单向管道。匿名管道是单机上实现子进程标准I/O重定向的有效方法,它不能在网上使用,也不能用于两个不相关的进程之间。另一种管道是命名管道,命名管道(Named Pipe)是服务器进程和一个或多个客户进程之间通信的单向或双向管道。命名管道提供了相对简单的编程接口,使通过网络传输数据并不比同一计算机上两进程之间通信更困难,不过如果要同时和多个进程通信它就力不从心了。

Ⅷ、邮件槽。邮件槽(Mailslots)提供进程间单向通信能力,任何进程都能建立邮件槽成为邮件槽服务器。其它进程,称为邮件槽客户,可以通过邮件槽的名字给邮件槽服务器进程发送消息。进来的消息一直放在邮件槽中,直到服务器进程读取它为止。一个进程既可以是邮件槽服务器也可以是邮件槽客户,因此可建立多个邮件槽实现进程间的双向通信。

Ⅸ、动态连接库。Win32动态连接库(DLL)中的全局数据可以被调用DLL的所有进程共享,这就又给进程间通信开辟了一条新的途径,当然访问时要注意同步问题。虽然可以通过DLL进行进程间数据共享,但从数据安全的角度考虑,我们并不提倡这种方法,使用带有访问权限控制的共享内存的方法更好一些。

Ⅹ、远程过程调用。Win32 API提供的远程过程调用(RPC)使应用程序可以使用远程调用函数,这使在网络上用RPC进行进程通信就像函数调用那样简单。RPC既可以在单机不同进程间使用也可以在网络中使用。由于Win32 API提供的RPC服从OSF-DCE (Open

Software Foundation Distributed Computing Environment)标准。所以通过 Win32

API编写的RPC应用程序能与其它操作系统上支持DEC的RPC应用程序通信。使用RPC开发者可以建立高性能、紧密耦合的分布式应用程序。

Ⅺ、NetBios函数[4]。Win32 API提供NetBios函数用于处理低级网络控制,这主要是为IBM NetBios系统编写与Windows的接口。除非那些有特殊低级网络功能要求的应用程序,其它应用程序最好不要使用NetBios函数来进行进程间通信。

Ⅻ、Windows套接字(Windows Sockets)。Windows套接字规范是以ey大学BSD UNIX中流行的Socket接口为范例定义的一套Windows下的网络编程接口,是跨平台的协议,现在通过Sockets实现进程通信的网络应用越来越多。另外高版本的

WinSock 不仅支持TCP/IP协议,而且还支持其它协议(如IPX)。Sockets的唯一缺点是它支持的是底层通信操作,使用是十分繁琐,这使得在本地进程间进行简单数据传递较为不便。

2.2 第一种通信进程类型间通信的实现方法

所有的通信,对于通信的双方均需要事先达成通信协议方可实现,对于第一种通信类型的进程间的通信,通信的双方是同一开发者,取得“默契”条件成熟,实现较易。较其方式也最多。主要有以下几种: 文件映射、共享内存、WM_COPYDATA消息、剪贴板、动态数据交换、对象连接与嵌入、匿名管道、动态连接库、NetBios函数、Windows套接字等。

2.3第二种通信进程类型间通信的实现方法

虽然与第一种一样有取得“默契”的先天条件,但由于通信的双方处于不同的主机中,且由于Windows操作系统的进程间的保护机制,会造成执行时发生数据存取的保护性错误(Access Voilaton),故通信的方式受到一定的限制。此种有意识模型的通信方式主要有以下几种:文件映射、WM_COPYDATA消息、动态数据交换、对象连接与嵌入、命名管道、邮件槽、Windows套接字(Windows Sockets)等。

2.3第三种通信进程类型间通信的实现方法

本种通信进程类型中的通信双方虽然处于同一主机中,但由于开发者的不同,双方只能根据公共的规则和协议实现各自的开发。故其通信方式亦受到一定的约束,其常用的方式有如下几种:动态数据交换、对象连接与嵌入、命名管道、邮件槽、Windows套接字等。

2.4第四种通信进程类型间通信的实现方法

这种通信进程类型中的通信双方间的通信所受的制约最多,既要考虑到进程间远程特性,又要考虑到双方的开发者“不识”,故其通信方式在选择时最为谨慎,常用的通信方式有:命名管道、邮件槽、Windows套接字等。

3.结语

系统进程繁多,Wiondows32下为进程间提供的通信方式繁杂,在软件开发的过程中,对不同类型进程间的通信方式选用适当的通信方式,既能适当减少开发的工作量又能保证所开发软件的健壮性和可靠性,同时能大大提高了通信的灵活性。在实际开发中,将几种模式的进程间通信的实现方法结合起来加以应用,即可实现各类进程间的数据交换。

参考文献

[1]新编WINDOWS API参考大全编写组.新编WINDOWSAPI参考大全[M].北京:电子工业出版社,2005.

[2]梁庚,白焰. Windows下进程间通信方式探讨[J] 微型电脑应用 2006,(22):44,58~60.

[3]求是科技 王洪涛编著. 深入剖析Visual C++[M].北京:人民邮电出版社,2004.

[3]David Bennet著.徐军译.VC++5开发人员指南[M].北京:机械工业出版社,1998.

[4]肖红伟.VC++6.0编程实效百例[M].北京:人民邮电出版社,2002.

(作者单位:无锡商业职业技术学院物联网技术学院)


本文标签: 进程 间通信 文件