• 操作系统(九)进程通信


    1 IPC

    inter process comutation 进程间通信
    进程地址空间不会被其他进程访问,当出现进程协作时,需要进程之间有效沟通。

    1.1通信操作

    IPC提供两个操作:

    send
    receive

    如果两个进程之间想通信,需要建立通信链路,通过send和receive交换消息

    1.2通信链路的实现

    通信链路的实现:

    物理:共享内存、硬件总线
    逻辑:逻辑属性

    1.3通信分类

    1.3.1直接通信与间接通信

    从发射路径来看(发送给谁):

    • A:间接通信,通过内核(邮件)
    • B:直接通信(打电话)
      在这里插入图片描述
    直接通信

    1 .必须正确命名对方

    • send(P,message)——发送信息到进程P receive(P,message)——从进程Q接受消息

    2.通信链路的属性

    • 1.自动建立链路
    • 2.一条链路对应一个链接存在
    • 3.链接可以是单向的,但通常为双向
    间接通信

    1.定向从信息队列接收消息

    • 每个信息队列都有唯一一个ID,只有共享了一个消息队列,进程才能通信
    • 创建消息队列,通过消息队列发送和接收消息,销毁消息队列
    • send(A,message) 发送消息到队列A
    • receive(B,message) 从队列A接收消息

    2.通信链路属性:

    • 1.进程共享一个共同的消息队列,才能建立链路
    • 2.链接可以与多个进程相关联
    • 3.每对进程可以共享多个通信链路
    • 4.链接可以是双向或单向

    1.3.2消息传递的特征

    • 消息传递可以是阻塞和非阻塞的
    • 阻塞:被认为是同步的,发送进程会阻塞直到接收进程接收,接收进程会阻塞知道资源可用。
    • 非阻塞:被认为是异步的。发送进程发送资源后继续运行,接收进程接收消息或者接收空

    1.4缓冲问题

    将消息缓存起来,避免接收的不匹配。

    1.4.1容量问题

    1.容量为0,相当于同步。

    2.有限容量,当数据满,发送等待,数据空,接收等待。
    3.无限容量,发送方不需要等待,数据空,接受仍然需要等待

    2信号(signal)

    2.1原理

    硬件中断interrupt,signal是软件中断通知事件处理。

    2.2接收信号后处理方式

    1.catch:指定信号处理函数被调用(c++ try…catch)
    2.ignore:依靠操作系统的默认操作(进程终止或挂起)
    3.mask:闭塞信号因此不会传送,禁止进程接收和处理信号(登录程序不能暂停,因为暂停程序被屏蔽掉了)

    2.3不足

    不能传输要交换的任何数据,传送信息量小,只有一种数据类型。

    2.4实现

    1.注册:注册信号处理函数给操作系统内核。
    2.发送信号时,操作系统内核负责把信号送给指定进程,启动对应信号处理函数。
    3.执行信号处理函数。

    • 操作系统从内核返回进程时,返回信号处理函数的入口如不是调用系统语句的后条命令,需要将用户空间堆栈修改。先返回信号处理函数,再返回中断位置。(木马病毒会这么做)
      在这里插入图片描述

    3管道

    3.1

    组合程序,一个程序的输出是另一个程序的输入。子进程从父进程继承文件描述符。进程不知道从键盘、文件、程序读取还是写入到终端、文件、程序。
    系统调用:读管道(read)、写管道(write)、创建管道(pipe)
    在这里插入图片描述
    shell:1.创建管道 2.为1s创建进程,设置stdout为管道写端 3.为more创建进程,设置stdin为管道读端

    4消息队列

    由操作系统维护的以字节序列为及本单位的间接通信机制。
    管道:父进程帮子进程建立关系。数据是字节流。
    消息队列:实现多个不想管进程通过消息队列通信,send和receive传递的是有意义字节结构。
    系统调用:获取消息队列标识msgget,发送消息msgsnd,接收消息msgrcv,消息队列控制msgctl

    5共享内存

    把同一个物理内存区域同时映射到多个进程的内存地址空间的通信机制。
    管道和消息队列是间接的。
    共享内存直接通信方式。开辟了两个进程都能访问的共享内存空间。传输速度快,在最开始就开辟共享内存。直接通信方式需要加入同步互斥机制。

    进程:每个进程有私有的内存地址空间,需要明确设置共享内存段
    线程:共享共享相同的内存地址空间

    系统调用:创建共享段shmget、把共享段映射到进程地址空间shmat、取消共享段到进程地址空间的映射shmdt、共享段控制shmctl

    6socket机制

  • 相关阅读:
    编程-设计模式 2:抽象工厂模式
    Linux下的stratis高级存储
    【C++】运算符重载 ⑪ ( 数组类 中 等号 = 运算符重载 | 函数原型 Array& operator=(Array& a) | 完整代码示例 )
    微信小程序托福考试资料源码系统完整版(带java后台)
    Lumiprobe 活性染料丨杂染料:BDP FL 神经酰胺
    JavaEE:File类查询一个文件的路径(举例+源码 )
    2022-01-22-JDBC
    会议室预订小程序,共享会议室小程序,微信小程序会议室预约系统毕设作品
    微信小程序登录后端
    【数据结构篇】线性表2 —— 栈和队列
  • 原文地址:https://blog.csdn.net/qq_40212968/article/details/127611903