进程间的通信方式

    今天在学习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

      也称共享文件方式,基于文件系统,利用一个打开的共享文件连接两个相互通信的进程,文件作为缓冲传输介质

    •Windows中有命名管道和匿名管道
    •匿名管道只是在父子进程之间或者一个进程的两个子进程之间进行通信。它是单向的。
    •命名管道具有很好的使用灵活性,表现在:
  1) 既可用于本地,又可用于网络。
  2) 可以通过它的名称而被引用。
  3) 支持多客户机连接。
  4) 支持双向通信。
  5) 支持异步重叠I/O操作。

    匿名管道,它通过API函数CreatePipe创建。

    命名管道  它通过CreateNamedPipe创建一个命名管道

    BOOL CreatePipe(

    PHANDLE hReadPipe,     // 指向读端句柄的指针

    PHANDLE hWritePipe,     // 指向写端句柄的指针

    LPSECURITY_ATTRIBUTES lpPipeAttributes, // 指向安全属性结构的指针

    DWORD nSize  );                                      // 管道的容量

原文地址:https://www.cnblogs.com/zzPrince/p/3408808.html