今天在学习com的时候,注意到一个知识点叫“进程间的通信”。查阅了一些资料和书籍。和大家分享。
进程通信,指的是进程之间的信息交换。其交换信息量少者是一个状态或者数值,多则是成千上万个字节。比如,进程之间的互斥和同步,实际他们也确确实实是实现了进程之间的“通信”,但是它们交换的信息量少而被归为“低级通信”。他们通信效率低,而且对用户不透明(通过对比体会其含义)。使用起来很不方便。
我们主要来讲一下高级的进程通信。所谓高级,是用户直接利用操作系统提供的方式去实现通信。对用户隐藏了细节。减少了编程的复杂性。这里多说一句,很多东西,别人帮我们做了,我们要知道“别人帮我们做了什么”,“为什么要帮我们做”,“大致是如何帮我们做到的”这几个问题,要争取做个“明白人”。
“高级”的进程通信主要分为三种:
1.共享存储器系统
共享内存可以说是最有用的进程间通信方式,也是最 快的IPC(进程间通信)形式。
两个不同进程A、B共享内存的意思是,同一块物理内 存被映射到进程A、B各自的进程地址空间。进程A可以 即时看到进程B对共享内存中数据的更新。
此适用于需要传输大量数据的通信。
2.消息传递
系统为进程提供了两个高级通讯原语send和receive。
在send源语中确定哪个进程接受消息是很有必要的。有两种方式:直接寻址和间接寻址
2.1直接寻址:
发送进程发消息时要指定接收进程的名字,反过来,接收时要指明发送进程的名字
Send(receiver,message)
Receiver(sender,message)
2.2间接寻址
发送进程发消息时不指定接收进程的名字,而是指定一个中间媒介,即信箱或端口。进程间通过信箱或端口实现通信。
发送者和接收者之间的关系可以是一对一,多对一,一对多或多对多。
其中:多对一关系对客户/服务器间的交互非常有用,一个进程给许多别的进程提供服务,这时信箱通常称为端口。(端口实际就是一个缓冲队列)
3.管道通信方式Pipe
也称共享文件方式,基于文件系统,利用一个打开的共享文件连接两个相互通信的进程,文件作为缓冲传输介质
1) 既可用于本地,又可用于网络。
2) 可以通过它的名称而被引用。
3) 支持多客户机连接。
4) 支持双向通信。
5) 支持异步重叠I/O操作。
匿名管道,它通过API函数CreatePipe创建。
命名管道 它通过CreateNamedPipe创建一个命名管道
BOOL CreatePipe(
PHANDLE hReadPipe, // 指向读端句柄的指针
PHANDLE hWritePipe, // 指向写端句柄的指针
LPSECURITY_ATTRIBUTES lpPipeAttributes, // 指向安全属性结构的指针
DWORD nSize ); // 管道的容量