• 2.1.4进程之间的通信


    什么是进程通信

    在这里插入图片描述

    • 首先我们知道进程是系统资源分配的单位(包括了内存地址空间),因此各进程拥有的内存地址空间相互独立
    • 为了保证安全,一个进程是不能直接访问另一个进程的地址空间的,但是我们又必须实现进程之间的信息交换,为了保证进程的安全通信,操作系统提供了一些方法
    • 进程通信又可分为高级和低级
      • 低级是因为效率低 通信对用户不透明,OS只提供了共享的存储器,而进程之间的通信所需要的共享数据结构的设计和数据的传输和进程的互斥和同步都需要用户自己实现
    • P V操作是低级通信方式

    共享存储

    在这里插入图片描述

    • 进程不能访问相互的私有空间,所以操作系统为进程提供共享空间来进行通信
    • 进程对空间空间的访问必须是互斥的(互斥是通过操作系统提供的工具实现)
    • 两种共享存储的方式
      • 基于数据结构的共享 比如共享空间只放一个长度为10的数组 这是一种低级通信方式,低级是因为操作系统只提供了共享存储器,但是对公用数据结构的设置以及进程间的同步的处理需要程序员设计,所以是低级的
      • 基于存储区的共享 在内存中是画出一块共享存储区,数据的形式和存放的位置都由进程控制,而不是操作系统 这种共享方式速度更快,是一种高级通信方式

    管道通信

    在这里插入图片描述

    • 管道是是用于连接读写进程的一个共享文件,其实就是在内存中开辟的一个大小固定的缓冲区
    • 管道只能采用半双工通信,某一个时间段只能实现单向的传输,如果想实现双向同时通信,则需要设置两个管道
    • 使用的规则
      • 各个进程要互斥得访问管道
      • 数据以字符流写入管道,当管道写满的时候,写进程的write()系统调用将会被阻塞
      • 当读进程将数据全部取走,此时都进程的read()系统调用将被阻塞
      • 如果没写满,就不能读 如果没读空 就不允许写
      • 读进程最多有一个,也代表数据一旦被读出,就从管道中被抛弃
      • 确认对方是否存在

    消息传递

    在这里插入图片描述

    • 进程不需要借助任何的共享存储区或者数据结构,而是以格式化的消息为单位,将通信的数据封装在消息中

    • 发送信息的进程将消息头写好,接受信息进程根据消息头读取信息或寻找信封是哪一个

    • 通过操作系统提供的发送消息/接收两个原语进行数据交换

    • 分类

      • 直接通信方式

        • 1)对称寻址方式 —— 要求发送进程和接收进程都必须以显式方式提供对方的标识符。
          系统提供以下两条通信命令:
          send(receiver,message);
          receive(sender,message);

          不足:一旦改变进程的名称,则可能需要检查所有其他进程的定义,有关对该进程旧名称的所有引用都必须查找到,以便将其修改为新名称,显然,这样的方式不利于实现进程定义的模块化。

          2)非对称寻址方式 —— 接收进程可能需要与多个发送进程通信,无法事先指定发送进程。因此,在接受进程的原语中,不需要命名发送进程,只填写表示源进程的参数,即完成通信后的返回值,而发送进程仍需要命名接收进程。
          send(receiver,message);
          receive(id,message); 接收来自任何进程的消息,id变量可设置为进行通信的发送方进程id或名字。

      • 间接通信方式

        • 信箱的结构 —— 一种数据结构,两个部分
          1)信箱头,用以存放有关信箱的描述信息 —— 信箱标识符、信箱的拥有者、信箱口令、信箱的空格数等
          2)信箱体 —— 由若干个可以存放消息的信箱格组成,信箱格的数目以及每格的大小是在创建信箱时确定的

          信箱通信原语
          1)邮箱的创建和撤销
          进程可利用邮箱创建原语来建立一个新邮箱,创建者进程应给出邮箱名字、邮箱属性(公用、私用或共享);对于共享邮箱,还应给出共享者的名字,当进程不再需要读邮箱时,可用邮箱撤销原语将之撤销。
          2)消息的发送和接收。当进程之间要利用邮箱进行通信时,必须使用共享邮箱,并利用系统提供的通信原语进行通信。
          Send(mailbox,message);
          Receive(mailbox,message);

          信箱的类型
          1)私用邮箱。用户进程可为自己建立一个新邮箱,并作为该进程的一部分。邮箱的拥有者有权从邮箱中读取消息,其他用户则只能将自己构成的消息发送到该邮箱中,可采用单向通信链路的邮箱来实现。当拥有该邮箱的进程结束时,邮箱也随之消失。

          2)公用邮箱。由操作系统创建,并提供给系统种的所有核准进程使用。核准用户既可把消息发到该邮箱,也可从邮箱读取给自己的消息,应采用双向通信链路的邮箱来实现。在系统运行期间始终存在。

          3)共享邮箱。由某进程创建,在创建时或创建后指明它是可共享的,同时须指出共享进程的名字。邮箱的拥有者和共享者都有权从邮箱中取走发送给自己的消息。

          发送进程和接收进程存在以下四种关系:
          1)一对一
          2)多对一
          3)一对多
          4)多对多

  • 相关阅读:
    小程序源码:王者荣耀吃鸡气泡等等头像框DIY在线生成N种风格
    2022年湖北省科技进步奖详细解答,该奖项申报条件以及奖励补贴具体情况解析
    MYSQL的安装及环境配置
    Array.from()的使用方法(数组去重,伪数组转为数组,数组浅克隆),Set和Map数据结构
    前端面经1
    Spring中的注解01
    【面经】被虐了之后,我翻烂了equals源码,总结如下
    计算机类编程课学生编写的代码应该如何管理
    Docker安装SQL Server 2022
    SpringBoot基础入门
  • 原文地址:https://blog.csdn.net/qq_50985215/article/details/127548248