首页 > 编程知识 正文

windows编程(java进程和线程的区别)

时间:2023-05-05 07:41:46 阅读:76983 作者:854

1文件映射

“文件映射”(Memory-Mapped Files )允许进程将文件内容视为进程地址部分中的内存。 因此,该进程不需要使用文件I/O操作,并且可以通过简单的指针操作读取和修改文件的内容。

使用Win32 API,多个进程可以访问同一文件映射对象,每个进程都在自己的地址空间中接收指向内存的指针。 这些指针允许不同的进程读取和修改文件的内容,并允许共享文件中的数据。

有三种方法可以使APP应用程序中的多个进程共享一个文件映射对象。

(1)继承)第一个进程创建文件映射对象,其子进程继承该对象的句柄。

)2)命名文件映射)第一个过程可以在创建文件映射目标时为该目标指定名称(可以与文件名不同)。 第二个进程可以使用此名称打开此文件映射对象。 第一个进程还可以通过几个其他IPC机制(有名的管道、邮件插槽等)将名称传递给第二个进程。

)3)句柄复制:第一个过程创建文件映射对象,然后通过其他IPC机制(有名的管道、邮件槽等)将对象句柄传递到第二个过程。 第二个进程在复制句柄时获取对文件映射对象的访问权限。

文件映射是一种在多个进程之间共享数据的非常有效的方法,具有很好的安全性。 但是,文件映射只能在本地计算机上的进程之间使用,不能在网络上使用。 此外,开发人员必须控制进程之间的同步。

2共享内存

Win32 API中的共享内存实际上是文件映射的一种特殊情况。 使用0xFFFFFFFF而不是文件句柄(HANDLE )创建文件映射对象的过程,相应的文件映射对象从操作系统的页面文件访问内存,而其他过程由于共享内存是在文件映射中实现的,因此安全性也很高,只能在同一计算机上的进程之间运行。

3匿名管道

“管道”(Pipe )是具有两个端点的通信通道:具有一个控制柄的进程和具有另一个控制柄的进程可以进行通信。 管道可以是单向的。 一端为只读,另一端为只读。 双向管路的两端也可以读写。

“匿名管道”(Anonymous Pipe )是未命名的单向管道,用于在父进程和子进程之间或在同一父进程的两个子进程之间传输数据。 管道通常由父进程创建,通道的读端点或写端点的句柄由通信的子进程继承,并可进行通信。 父进程还可以建立多个继承匿名管道读写句柄的子进程。 这些子进程可以使用管道直接通信,而无需通过父进程。

匿名管道是独立实现子进程标准I/O重定向的有效方法,不能在线使用,也不能在两个不相关的进程之间使用。

有四个名字的管子

“命名管道”(Named Pipe )是服务器进程与一个或多个客户端进程之间通信的单向或双向管道。 与匿名管道不同,命名管道可以在无关进程之间和不同计算机之间使用。 服务器可以在创建命名管道时指定名称,任何进程都可以使用该名称打开管道的另一端,并根据所授予的权限与服务器进程进行通信。

命名管道提供了一个相对简单的编程接口,通过网络传输数据并不比同一台计算机上的两个进程之间的通信困难,但不足以同时与多个进程通信。

5邮件插槽

邮件槽提供进程间的单向通信功能,任何进程都可以创建邮件槽作为邮件槽服务。 其他进程(称为邮件插槽客户端)可以使用邮件插槽的名称向邮件插槽服务器进程发送消息。 进来的消息将一直放在邮件槽中,直到服务器进程读取它。 一个过程可以是邮件时隙服务器或邮件时隙客户端,从而可以建立多个邮件时隙来实现过程之间的双向通信。

邮件插槽允许将消息发送到本地计算机上的邮件插槽、其他计算机上的邮件插槽或指定网络区域中的所有计算机上同名的邮件插槽。 广播通信的消息长度不能超过400字节。 非广播消息长度受邮件插槽服务中指定的最大消息长度的限制。

邮件插槽类似于命名管道,但通过不可靠的数据报(如TCP/IP协议的UDP数据包)传输数据。 如果网络出现错误,则不能保证正确接收消息,但命名管道会根据受信任的连接传输数据。 但是,邮件插槽具有简单的编程接口和将消息广播到指定网络区域内的所有计算机的功能,因此邮件插槽是APP应用程序发送和接收消息的另一种选择

6剪贴板

“剪贴板”(Clipped Board )是一组用于在Win32 API中传输数据的函数和消息,用于仲裁windows APP应用程序之间的数据共享。 在Windows上建立的剪切(复制)粘贴机制为在不同的APP应用程序之间共享不同格式的数据提供了快捷方式。 当使用者在APP应用程式中执行剪下或复制动作时,APP应用程式会将选取的资料以一种或多种格式放置在剪贴簿上。 在其他APP应用程序中,可以从剪贴板中选择数据,然后从指定的格式中选择适合自己的格式。

剪贴板是非常松散的交换介质,可以支持任何数据格式。 每种格式都由无符号整数标识,并对应于标准(预定义)剪贴板格式,它是Win32 API中定义的常量。 对于非标准格式,可以使用Register Clipboard Format函数将其注册为新的剪贴板格式。 利用剪贴板交换的数据只要数据格式一致或可以转换为任意一种格式即可。 但是,剪贴板只能在基于Windows的程序中使用,不能在网络上使用。

7动态数据交换

动态数据交换(DDE )是使用共享内存在APP应用程序之间进行数据交换的进程间通信格式。 可以使用DDE访问APP应用程序

行一次性数据传输,也可以当出现新数据时,通过发送更新值在应用程序间动态交换数据。

DDE和剪贴板一样既支持标准数据格式(如文本、位图等),又可以支持自己定义的数据格式。但它们的数据传输机制却不同,一个明显区别是剪贴板操作几乎总是用作对用户指定操作的一次性应答-如从菜单中选择Paste命令。尽管DDE也可以由用户启动,但它继续发挥作用一般不必用户进一步干预。DDE有三种数据交换方式:

(1)冷链:数据交换是一次性数据传输,与剪贴板相同。

(2)温链:当数据交换时服务器通知客户,然后客户必须请求新的数据。

(3)热链:当数据交换时服务器自动给客户发送数据。

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

8对象连接与嵌入

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

同DDE技术相同,大多数基于Windows的应用程序都支持OLE技术。

9动态连接库

Win32动态连接库(DLL)中的全局数据可以被调用DLL的所有进程共享,这就又给进程间通信开辟了一条新的途径,当然访问时要注意同步问题。

虽然可以通过DLL进行进程间数据共享,但从数据安全的角度考虑,我们并不提倡这种方法,使用带有访问权限控制的共享内存的方法更好一些。

10远程过程调用

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

由于Win32 API提供的RPC服从OSF-DCE(Open Software Foundation Distributed Computing Environment)标准。所以通过Win32 API编写的RPC应用程序能与其它操作系统上支持DEC的RPC应用程序通信。使用RPC开发者可以建立高性能、紧密耦合的分布式应用程序。

11 NetBios函数

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

12 Sockets

Windows Sockets规范是以U.C.Berkeley大学BSD UNIX中流行的Socket接口为范例定义的一套Windows下的网络编程接口。除了Berkeley Socket原有的库函数以外,还扩展了一组针对Windows的函数,使程序员可以充分利用Windows的消息机制进行编程。

现在通过Sockets实现进程通信的网络应用越来越多,这主要的原因是Sockets的跨平台性要比其它IPC机制好得多,另外WinSock 2.0不仅支持TCP/IP协议,而且还支持其它协议(如IPX)。Sockets的唯一缺点是它支持的是底层通信操作,这使得在单机的进程间进行简单数据传递不太方便,这时使用下面将介绍的WM_COPYDATA消息将更合适些。

13 WM_COPYDATA消息

WM_COPYDATA是一种非常强大却鲜为人知的消息。当一个应用向另一个应用传送数据时,发送方只需使用调用SendMessage函数,参数是目的窗口的句柄、传递数据的起始地址、WM_COPYDATA消息。接收方只需像处理其它消息那样处理WM_COPY DATA消息,这样收发双方就实现了数据共享。

WM_COPYDATA是一种非常简单的方法,它在底层实际上是通过文件映射来实现的。它的缺点是灵活性不高,并且它只能用于Windows平台的单机环境下。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。