进程间通信(Process To Process Communication)
目录 |
进程间通信是指在并行计算过程中,各进程之间进行数据交互或消息传递, 其通信量的大小主要取决于并行设计的粒度划分和各个执行进程之间的相对独立性。也就是在多进程环境下,使用的数据交互、事件通知等方法使各进程协同工作。
进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着双方都可以访问的介质,进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区。但是,系统空间却是“公共场所”,所以内核显然可以提供这样的条件。除此以外,那就是双方都可以访问的外设了。在这个意义上,两个进程当然也可以通过磁盘上的普通文件交换信息,或者通过“注册表”或其它数据库中的某些表项和记录交换信息。广义上这也是进程间通信的手段,但是一般都不把这算作“进程间通信”。由于不同的进程运行在各自不同的内存空间中.一方对于变量的修改另一方是无法感知的。因此,进程之间的信息传递不可能通过变量或其它数据结构直接进行,只能通过进程间通信来完成。
根据进程通信时信息量大小的不同,可以将进程通信划分为两大类型:控制信息的通信和大批数据信息的通信.前者称为低级通信,后者称为高级通信。低级通信主要用于进程之间的同步、互斥、终止、挂起等等控制信息的传递。高级通信主要用于进程间数据块的交换和共享,常见的高级通信有管道(PIPE)、消息队列(MESSAGE)、共享内存(SHARED MEM0RY)等。
在终止进程之前,父进程必须关闭子进程和它的主线程的句柄,以避免在应用程序运行时泄漏资源。当然,当进程终止运行时,系统会自动消除这些泄漏现象,但是,当进程不再需要访问 子进程和它的线程时,编写得较好的软件应该显式关闭这些句柄 (通过调用CloseHandle函数来关闭)。忘记关闭这些句柄是开发人员最常犯的错误之一。由于某些原因,许多开发人员认为,关闭进程或线程的句柄,会促使系统撤消该进程或线程。实际情况并非如此,关闭句柄只是告诉系统,对进程或线程的统计数据不感兴趣。进程或线程将继续运行,直到它自己终止运行。进程间通信主要包括管道,系统IPC(Inter-Process Communication,进程间通信)(包括消息队列,信号,共享存储), 套接字(SOCKET)。管道包括三种:
进程间通信是同一台处理机或不同处理机的多个进程间传送数据或消息的一些技术或方法,方式有:
管道可用于具有亲缘关系进程间的通信,有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。
信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一致得。
消息队列是消息的链接表,它克服了上两种通信方式中信号量有限的缺点,具有写权限得进程可以按照一定得规则向消息队列中添加新信息;对消息队列有读权限得进程则可以从消息队列中读取信息。
可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。
进程通过与内核及其它进程之间的互相通信来协调它们的行为。如Linux支持多种进程间通信(IPC)机制,信号和管道是其中的两种。除此之外,Linux还支持System V的IPC机制(用首次出现的Unix版本命名)。