zoukankan      html  css  js  c++  java
  • 进程间通信

    参考:https://blog.csdn.net/qq_34827674/article/details/107678226

    整理为如下图:

    管道

    管道,就是内核里面的一串缓存。从管道的一段写入的数据,实际上是缓存在内核中的,另一端读取,也就是从内核中读取这段数据。另外,管道传输的数据是无格式的流且大小受限。

    分类:

      匿名管道

      命名管道FIFO

    特点

      管道这种通信方式效率低,不适合进程间频繁地交换数据

      对于匿名管道,它的通信范围是存在父子关系的进程。因为管道没有实体,也就是没有管道文件,只能通过 fork 来复制父进程 fd 文件描述符,来达到通信的目的。

      另外,对于命名管道,它可以在不相关的进程间也能相互通信。因为命令管道,提前创建了一个类型为管道的设备文件,在进程里只要使用这个设备文件,就可以相互通信。

      不管是匿名管道还是命名管道,进程写入的数据都是缓存在内核中,另一个进程读取数据时候自然也是从内核中获取,同时通信数据都遵循先进先出原则,不支持 lseek 之类的文件定位操作。

    消息队列

      消息队列是保存在内核中的消息链表,在发送数据时,会分成一个一个独立的数据单元,也就是消息体(数据块),消息体是用户自定义的数据类型,消息的发送方和接收方要约定好消息体的数据类型,所以每个消息体都是固定大小的存储块,不像管道是无格式的字节流数据。如果进程从消息队列中读取了消息体,内核就会把这个消息体删除。

      消息队列生命周期随内核,如果没有释放消息队列或者没有关闭操作系统,消息队列会一直存在,而前面提到的匿名管道的生命周期,是随进程的创建而建立,随进程的结束而销毁。

      消息队列有两点不足:一是通信不及时,二是附件也有大小限制,这同样也是消息队列通信不足的点。

      消息队列不适合比较大数据的传输,因为在内核中每个消息体都有一个最大长度的限制,同时所有队列所包含的全部消息体的总长度也是有上限。在 Linux 内核中,会有两个宏定义 MSGMAX 和 MSGMNB,它们以字节为单位,分别定义了一条消息的最大长度和一个队列的最大长度。

      消息队列通信过程中,存在用户态与内核态之间的数据拷贝开销,因为进程写入数据到内核中的消息队列时,会发生从用户态拷贝数据到内核态的过程,同理另一进程读取内核中的消息数据时,会发生从内核态拷贝数据到用户态的过程。

    共享内存

      现代操作系统,对于内存管理,采用的是虚拟内存技术,也就是每个进程都有自己独立的虚拟内存空间,不同进程的虚拟内存映射到不同的物理内存中。所以,即使进程 A 和 进程 B 的虚拟地址是一样的,其实访问的是不同的物理内存地址,对于数据的增删查改互不影响。

      共享内存的机制,就是拿出一块虚拟地址空间来,映射到相同的物理内存中。这样这个进程写入的东西,另外一个进程马上就能看到了,都不需要拷贝来拷贝去,传来传去,大大提高了进程间通信的速度。

    信号量

      为了防止多进程竞争共享资源,而造成的数据错乱,所以需要保护机制,使得共享的资源,在任意时刻只能被一个进程访问。正好,信号量就实现了这一保护机制。

      信号量其实是一个整型的计数器,主要用于实现进程间的互斥与同步,而不是用于缓存进程间通信的数据。

      PV操作。

        P操作:信号量减一,如果信号量<0,则表示自愿被占用,进程需阻塞等待;>=0,表示资源可用

        V操作:把信号量加一,如果信号量<=0,表示有阻塞进程,将该进程唤醒运行;如果>0,则表示没有阻塞的进

    信号

      上面说的进程间通信,都是常规状态下的工作模式。对于异常情况下的工作模式,就需要用「信号」的方式来通知进程。

    在Linux环境中,通过 kill -l 查看所有的信号:

    Socket

      前面提到的管道、消息队列、共享内存、信号量和信号都是在同一台主机上进行进程间通信,那要想跨网络与不同主机上的进程之间通信,就需要 Socket 通信了。

  • 相关阅读:
    无窗口激活ActiveX控件的bug
    吴裕雄天生自然SPRINGSpring java配置
    吴裕雄天生自然Spring第一个Spring入门程序
    吴裕雄天生自然SPRINGBOOT开发实战学习笔记处理The import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder cannot be resolved
    吴裕雄天生自然SPRINGSpring IoC
    吴裕雄天生自然SPRINGBean的初始化和销毁
    吴裕雄天生自然SPRINGSpring AOP
    吴裕雄天生自然SPRINGSpring Bean作用域
    吴裕雄天生自然SPRINGSpring的数据库编程
    吴裕雄天生自然SPRINGBOOT开发实战学习笔记spring boot配置oracle、MySQL
  • 原文地址:https://www.cnblogs.com/zyk1113/p/14329371.html
Copyright © 2011-2022 走看看