操作系统-进程间的四种通信(共享内存、消息队列、信号、管道)

本文主要是介绍操作系统-进程间的四种通信(共享内存、消息队列、信号、管道),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

进程间通信

文章目录

  • 进程间通信
    • 共享内存
    • 消息队列
    • 信号
      • 信号的接收处理
      • 内核对于信号的基本处理办法
    • 管道通信
      • 无名管道
      • 有名管道

进程间的通信有三种基本的模型,共享内存和消息传递和管道。

  • 共享内存模型会建立起一块协作进程的共享的内存区域,进程通过向共享区域读入或写入数据来交换信息
  • 消息传递模型通过在协作进程间交换信息来实现通信

共享内存

共享内存区是最快的(进程间通信)IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。

注意:共享内存没有进行同步与互斥!共享内存不会自动销毁,要手动销毁。

共享内存的原理图 --学习进程前先学习一下内存管理效果感觉更好 -内存管理部分我以己经学完,所以理解的比较轻松,内存管理部分后边我也会在学习一遍,也会有笔记发布在我的博客上。

在这里插入图片描述

了解关于共享内存的接口以及示例可访问下面链接:
https://blog.csdn.net/2202_75305885/article/details/136240275

采用共享内存进行进程间通信,需要通信进程简建立共享内存区域

通常,一片共享内存区域驻留在创建共享内存的进程地址空间内,其他希望使用这个共享内存段的进行通信的进程应将其附加到自己的地址空间。

通常操作系统会试图阻止一个进程访问另一个进程的内存,共享内存需要两个或更多的进程同意取消这一限制。

他们希望通过共享区域内读出或者写入来交换信息,数据的类型或者位置取决于这些进程,而不是受控于操作系统。另外通信的进程需要确保,他们不会向同一位置写入数(可以用同步与互斥来确保)

消息队列

消息队列是有操作系统维护的以字节序列为基本单位的间接通信机制

  • 每个消息是一个字节序列
  • 相同标识的消息组成按先进先出的顺序组成一个消息队列

在这里插入图片描述

消息队列的系统调用

在这里插入图片描述

信号

软中断信号(signal,简称为信号)用来通知进程发生了异步事件。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。注意,信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据。

进程间的软件中断通知和处理机制,如SIGKILL,SIGSTOP、SIGSTOP等

  • 操作系统在编译你的程序的时候,会缺省的加上对于这些信号的处理例程。

信号的接收处理

  • 捕获(catch):执行进程指定的信号处理函数被调用
  • 忽略(Ignore):执行操作系统指定的缺省处理。
    • 例如:进程终止、进程挂起等
  • 屏蔽(Mask):禁止进程接受和处理信号

缺点:

传送的信息量小,只有一个信号类型

信号的实现

在这里插入图片描述

内核对于信号的基本处理办法

  • Linux内核给一个进程发送信号的方法是,在进程所在的进程表项的信号域设置对应于该信号地位,

  • 内核处理一个进程收到的信号的时机是在一个进程从内核态返回用户态时。所以,当一个进程在内核态下运行时,软中断信号并不立即起作用,要等到将返回用户态时才处理。进程只有处理完信号才会返回用户态,进程在用户态下不会有未处理完的信号。

  • 内核处理一个进程收到的软中断信号是在该进程的上下文中,因此,进程必须处于运行状态

  • 如果进程收到一个要捕捉的信号,那么进程从内核态返回用户态时执行用户定义的函数。而且执行用户定义的函数的方法很巧妙,内核是在用户栈上创建一个新的层,该层中将返回地址的值设置成用户定义的处理函数的地址,这样进程从内核返回弹出栈顶时就返回到用户定义的函数处,从函数返回再弹出栈顶时, 才返回原先进入内核的地方。这样做的原因是用户定义的处理函数不能且不允许在内核态下执行(如果用户定义的函数在内核态下运行的话,用户就可以获得任何权限)。

此处内容摘自 https://baike.baidu.com/item/%E4%BF%A1%E5%8F%B7/7927794?fr=ge_ala 只是摘录部分,全部内容可前往链接

管道通信

进程间基于内存文件的通信机制

  • 也就是说,如果两个进程要使用管道通信,内核会在内存中创建一块内存,只要多个进程能访问到这块内存就可以了
  • 管道其实就是操作系统内核中的一块缓冲区
  • 一次只允许一个进程使用的资源,称为临界资源。管道在同一时刻只允许一个进程对其进行写入或是读取操作,因此管道也就是一种临界资源。而临界资源需要保护,内核也管道文件提供了同步和互斥的功能

无名管道

  • 只能用于具有亲缘关系的进程,像父子进程、兄弟进程、祖孙进程、叔侄进程。其中,指令中的竖线,ps aux | grep,是兄弟关系,因为ps和grep的父进程都是bash。。
  • 半双工,在需要双方进行通信的时候,需要建立起两个管道。
  • **进程退出,管道释放。这里的进程是指持有管道的最后一个进程。**当然,你也可以选择将所有进程手动关闭掉那两个文件描述符。
  • 内核会对管道(匿名/命名管道)进行同步与互斥。- 无名管道的大小一般是64K
  • 无名管道默认是阻塞模式

在这里插入图片描述

无名管道只能在血缘的进程间通信的原因

无名管道通信指的是多个进程在内核申请的管道文件进行通信,这就需要所有进程能够知道这个申请成功管道文件的读写文件描述符,有亲缘关系的进程可以在分离进程之前在内核空间申请管道文件,在分离进程后所有有亲缘关系的进程都能通过复制的文件描述符访问同系统文件表,进而访问一个管道文件的地址,因此无名管道只适用于有亲缘的进程之间的通信

有名管道

在内核中这块缓冲区是有标识的,意味着所有的进程都可以通过这个标识找到这块缓冲区进行通信,也就是命名管道可以用于同一主机上的任意进程进行通信。
命名管道的标识实际上是一个文件,可见于文件系统,意味着所有进程都可以通过打开文件进而访问到内核中的缓冲区。

特性:

  • 半双工
  • 面向字节流,读写非常灵活
  • 有名管道在文件系统中具有唯一的路径名,可以通过路径名进行访问和引用
  • 同步与互斥
  • 可以是任意进程间的通信
  • 进程退出,内核中的内存也就释放了,但是有名管道文件还在。

这篇关于操作系统-进程间的四种通信(共享内存、消息队列、信号、管道)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1070583

相关文章

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

poj 2431 poj 3253 优先队列的运用

poj 2431: 题意: 一条路起点为0, 终点为l。 卡车初始时在0点,并且有p升油,假设油箱无限大。 给n个加油站,每个加油站距离终点 l 距离为 x[i],可以加的油量为fuel[i]。 问最少加几次油可以到达终点,若不能到达,输出-1。 解析: 《挑战程序设计竞赛》: “在卡车开往终点的途中,只有在加油站才可以加油。但是,如果认为“在到达加油站i时,就获得了一

[Linux]:进程(下)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. 进程终止 1.1 进程退出的场景 进程退出只有以下三种情况: 代码运行完毕,结果正确。代码运行完毕,结果不正确。代码异常终止(进程崩溃)。 1.2 进程退出码 在编程中,我们通常认为main函数是代码的入口,但实际上它只是用户级

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

poj3750约瑟夫环,循环队列

Description 有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。 Input 第一行输入小孩的人数N(N<=64) 接下来每行输入一个小孩的名字(人名不超过15个字符) 最后一行输入W,S (W < N),用

Linux操作系统 初识

在认识操作系统之前,我们首先来了解一下计算机的发展: 计算机的发展 世界上第一台计算机名叫埃尼阿克,诞生在1945年2月14日,用于军事用途。 后来因为计算机的优势和潜力巨大,计算机开始飞速发展,并产生了一个当时一直有效的定律:摩尔定律--当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。 那么相应的,计算机就会变得越来越快,越来越小型化。

POJ2010 贪心优先队列

c头牛,需要选n头(奇数);学校总共有f的资金, 每头牛分数score和学费cost,问合法招生方案中,中间分数(即排名第(n+1)/2)最高的是多少。 n头牛按照先score后cost从小到大排序; 枚举中间score的牛,  预处理左边与右边的最小花费和。 预处理直接优先队列贪心 public class Main {public static voi

vue2 组件通信

props + emits props:用于接收父组件传递给子组件的数据。可以定义期望从父组件接收的数据结构和类型。‘子组件不可更改该数据’emits:用于定义组件可以向父组件发出的事件。这允许父组件监听子组件的事件并作出响应。(比如数据更新) props检查属性 属性名类型描述默认值typeFunction指定 prop 应该是什么类型,如 String, Number, Boolean,