2.1_4 进程通信

news2024/7/5 22:37:01

文章目录

  • 2.1_4 进程通信
    • (一)什么是进程间通信
    • (二)为什么进程通信需要操作系统支持
    • (三)共享存储
    • (四)消息传递
      • (1)直接通信方式
      • (2)间接通信方式
    • (五)管道通信
  • 总结

2.1_4 进程通信

image-20240221212853808

(一)什么是进程间通信

  进程间通信(Inter-Process Communication,IPC)是指两个进程之间产生数据交互。

  例:在浏览“微博”的时候,可以把其中的帖子分享给“微信”好友。这就产生了进程间通信,发生了进程和进程之间的数据交互。

  进程之间要想通信,需要操作系统的支持。

(二)为什么进程通信需要操作系统支持

  首先,进程是分配系统资源的单位(包括内存地址空间),因此,各进程拥有的内存地址空间相互独立

  但是,若想发生进程间的数据交互,就意味着一个进程要去看看另一个进程的内存空间中存放的数据。但是,如果允许某进程直接访问另一个进程内存空间的数据,就意味着一个进程可以随意修改、读取其他进程的数据了。(例:你的手机中不知道什么时候安装了一个程序,这个程序直接把你微信的数据全部读取走了)这显然是很不安全的。

  因此,出于安全的考虑,各个进程只能访问自己的内存地址空间,而不能访问其他进程的内存地址空间,无论是读、写,都不行。

image-20240221213518251

  因此,如果两个进程P、Q需要进行进程间通信,进程P不可能直接把数据写入进程Q的内存空间,所以肯定要依靠操作系统的支持才能完成进程间的通信。


  接下来介绍三种实现“进程间通信”的机制。

image-20240221215406828

(三)共享存储

image-20240221213959312

  一个进程可以申请一片“共享存储区”,而这个“共享存储区”也可以被其他进程所共享。

  这样一来,进程P如果想给Q共享数据的话,它们就可以对“共享存储区”进行读、写操作,来实现通信。

  注:通过“增加页表项/段表项”即可将同一片共享内存区映射到各个进程的地址空间中(第三章内容)。


  问题:如果多个进程同时往“共享存储区”中写数据,可能会导致“写冲突”,可能有数据覆盖的问题,如何解决?

  :为避免出错,各个进程对共享空间的访问应该是互斥的。例如,当进程P访问共享空间时,其他进程就不能访问。

  如何实现互斥访问?——各个进程可使用操作系统内核提供的同步互斥工具(如P、V操作,后面会讲)。


image-20240221215421160

  基于存储区的共享:操作系统在内存中划出一块共享存储区,数据的形式、存放位置都由通信进程控制,而不是操作系统。这种共享方式速度很快,是一种高级通信方式。

  分配给你一片4KB的共享空间,在里面想在哪个位置读/写、想读/写多大的内容,都是自由的。

  基于数据结构的共享:比如共享空间里只能放一个长度为10的数组。这种共享方式速度慢、限制多,是一种低级通信方式。

  例如这片共享空间是一个int a[10],那么各个进程访问这个共享空间就要遵守数组的读/写方式了。

(四)消息传递

  进程间的数据交换以格式化的消息(Message)为单位。进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换。

image-20240222193336567

image-20240222193359534

(1)直接通信方式

  每个进程的PCB当中,包含一个本进程的“消息队列”。消息队列中,存放着其他进程想要发送给此进程、应该被此进程接收的消息。

image-20240222193609040

  如图,进程P若想要给进程Q发送一个消息。

  首先,进程P应当在自己的内存空间中创建并完善这个要发送的消息msg。(包括消息头、消息体)

  接下来,进程P使用操作系统提供的发送原语send(Q, msg)。(该原语的参数指明了消息的接收者,要发送的消息)

  最后,发送原语send(Q, msg)会使得操作系统内核接收到这个消息,并且把这个消息挂在进程Q的消息队列里面。

image-20240222193920542


  进程Q若想要接收刚才P发来的这个消息msg

  首先,进程Q使用操作系统提供的接收原语receive(P, &msg)。(该原语的参数指明了消息的发送者,发送的消息)

  接下来,操作系统内核会检查进程Q的消息队列,看看:这几个消息,到底哪个消息是由P发送过来的。

  最后,找到此消息,并由操作系统内核将这条消息复制到进程Q的内存空间当中。

image-20240222194208780

  以上就是消息传递之——直接通信方式(点名道姓的消息传递)。

(2)间接通信方式

  间接通信方式,以“信箱”作为中间实体进行消息传递。进程可以使用系统调用,向操作系统申请一个或多个“信箱”。

举例

  进程P向操作系统申请两个信箱,分别为信箱A信箱B

  之后,进程P在自己的内存空间中,创建并完善一个消息msg

  之后,进程P使用发送原语来指明把哪个消息发送到哪个信箱。

image-20240225003827444

注意:间接通信方式,在使用发送原语时,仅指明发送到哪个信箱,而并不指明发送给哪个进程。

  之后,进程Q使用接收原语来指明从哪个信箱接收哪个消息。

image-20240225004028604

注意:可以多个进程往同一个信箱send消息,也可以多个进程从同一个信箱中receive消息。

(五)管道通信

image-20240225004306860

  和水管中的水流是一样的,数据的流向只能是单向的,而不能是双向同时进行的。

  “管道”是一个特殊的共享文件,又名pipe文件。其实就是在内存中开辟一个大小固定的内存缓冲区。

  某个进程通过系统调用,来申请一个管道文件,操作系统会新建这个管道文件。这个文件的本质其实就是在内存当中开辟了一个大小固定的内存缓冲区,然后两个进程可以往这个内存缓冲区里面写数据或者读数据。但是数据的读写是先进先出的。

问题

  这样看来,“管道”其实就是开辟了一个内存缓冲区,那它和“共享存储”方式中的“共享存储区”不是没区别了吗?

  二者有区别。

  对于“共享存储区”,进程P、Q在该区域内,想怎么读写就怎么读写,想从哪读写就从哪读写,没有任何的限制。

  但是,对于“管道通信”方式,对于“管道文件”,既然进程P往里面写数据,同时进程Q从里面读数据,而且还要保证数据是先进先出的,就并不能想写到哪写到哪,想从哪读从哪读了。(实际上就是队列,出队只能从队头,入队只能从队尾,因此是有限制的。说的再准确点,就是循环队列)

注意

  1.管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道。(向操作系统申请两个管道文件)

补充:(其实是计网中的概念)

  全双工通信:两个方向的数据传输可以同时进行。

  半双工通信:同时只允许单方向的传输。也可以等传输结束后切换为相反方向再进行传输,但同一时刻只能有一个方向的数据传输。

  2.各进程要互斥地访问管道。

注:

  对管道的互斥访问,是由操作系统本身就已经实现的,进程不需要关心。

  3.当管道写满时,写进程阻塞,直到读进程将管道中的数据取走,即可唤醒写进程。(毕竟管道文件是一个大小固定的内存缓冲区)

  4.当管道读空时,读进程阻塞,直到写进程往管道中写入数据,即可唤醒读进程。

  5.管道中的数据一旦被读出,就彻底消失。因此,当多个进程读同一个管道时,可能会错乱。对此,通常有两种解决方案:

    a.一个管道允许多个写进程,一个读进程。(408真题官方答案)

    b.允许有多个写进程,多个读进程,但系统会让各个读进程轮流从管道中读数据。(Linux的方案)

总结

image-20240225010902796

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1468736.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Spring MVC篇】简单案例分析

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【Spring MVC】 本专栏旨在分享学习Spring MVC的一点学习心得,欢迎大家在评论区交流讨论💌 目录 一、加法计算器二…

system_v

共享内存 创建共享内存 key_t ftok(const char *pathname, int proj_id);使用相同的pathname和proj_id可以得到相同的key_t pathname必须是一个存在的目录 int shmget(key_t key, size_t size, int shmflg);需要使用ftok获取key_t IPC_CREAT——不存在就创建&#xff0c…

鸿蒙DevEco Service开发准备与使用

DevEco低代码是一个基于Serverless和ArkUI的端云一体化低代码开发平台,可通过拖拽式开发,可视化配置构建元服务。打通HarmonyOS云侧与端侧能力,轻松实现HMS Core和AGC Serverless能力的调用。通过与元服务生态、HMS Core、AGC Serverless平台…

论文阅读:Ground-Fusion: A Low-cost Ground SLAM System Robust to Corner Cases

前言 最近看到一篇ICRA2024上的新文章,是关于多传感器融合SLAM的,好像使用了最近几年文章中较火的轮式里程计。感觉这篇文章成果不错,代码和数据集都是开源的,今天仔细读并且翻译一下,理解创新点、感悟研究方向、指导…

政安晨:【机器学习基础】(一)—— 泛化:机器学习的目标

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 简述 泛化是机器学习中的基本概念之一。它指的是通过学习…

ElasticSearch索引数据备份与恢复

索引数据备份 在磁盘创建备份目录并授权 # 创建备份目录 /home/esbackup # 授权 chmod 777 /home/esbackup修改配置文件elasticsearch.yml echo path.repo: ["/home/esbackup"] >> /etc/elasticsearch/elasticsearch.yml重启elasticsearch(我是docker创建的…

嵌入式按键处理驱动(easy_button)

简介 在嵌入式裸机开发中,经常有按键的管理需求,GitHub上已经有蛮多成熟的按键驱动了,但是由于这样那样的问题,最终还是自己实现了一套。本项目地址:bobwenstudy/easy_button (github.com)。 项目开发过程中参考了如…

了解 JavaScript 中的重放攻击和复现攻击

在网络安全领域,重放攻击(Replay Attack)和复现攻击(Playback Attack)是一些可能导致安全漏洞的攻击形式。这两种攻击类型涉及在通信过程中再次发送已经捕获的数据,以达到欺骗系统的目的。本文将介绍 JavaS…

Linux之JAVA环境配置Tomcat离线安装与启动

目录 一.前提 二.Linux安装JDK 1.解压 2.配置环境变量 3.设置环境变量生效 三.Tomcat安装(开机自启动) 1.解压 2.启动Tomcat 3.设置防火墙 四.MySQL安装(开机自启动) 1.删除固有数据库 2.将MySQL安装包解压到指定目录…

【Linux】部署单机项目(自动化启动)---(图文并茂详细讲解)

目录 一 准备工作 1.1 连接服务器拷贝文件 1.2 解压 二 JDK安装 2.1 配置坏境变量 2.2 查看版本 三 Tomcat(自启动) 3.1 复制启动命令的位置 3.2 添加命令相关配置文件 3.2.1 配置jdk及tomcat目录 3.2.2 添加优先级 3.3 设置自启动命令 3.4 开放端口 四 My…

CSP-J 2023 复赛第4题:旅游巴士

【题目来源】https://www.luogu.com.cn/problem/P9751https://www.acwing.com/problem/content/description/5313/【题目描述】 小 Z 打算在国庆假期期间搭乘旅游巴士去一处他向往已久的景点旅游。 旅游景点的地图共有 n 处地点,在这些地点之间连有 m 条道路。 其中…

【深度学习目标检测】十九、基于深度学习的芒果计数分割系统-含数据集、GUI和源码(python,yolov8)

使用深度学习算法检测芒果具有显著的优势和应用价值。以下是几个主要原因: 特征学习的能力:深度学习,特别是卷积神经网络(CNN),能够从大量的芒果图像中自动学习和提取特征。这些特征可能是传统方法难以手动…

每日五道java面试题之spring篇(五)

目录: 第一题. 使用 Spring 有哪些方式?第二题. 什么是Spring IOC 容器?第三题. 控制反转(IoC)有什么作用?第四题. IOC的优点是什么?第五题. BeanFactory 和 ApplicationContext有什么区别? 第一题. 使用 Spring 有哪…

数据湖技术方案

围绕数据人工智能计算实现材料研发全流程加速需要,面向“数字反应堆”需要的数据湖服务,“数据湖”是统一存储池,可对接多种数据输入方式,可以存储任意规模的结构化、半结构化、非结构化数据。 数据湖可无缝对接多种计算分析平台&…

Mac安装Appium

一、环境依赖 一、JDK环境二、Android-SDK环境(android自动化)三、Homebrew环境四、Nodejs 安装cnpm 五、安装appium六、安装appium-doctor来确认安装环境是否完成七、安装相关依赖 二、重头大戏, 配置wda(WebDriverAgent&#x…

《凤凰架构》 -分布式事务章节 读书笔记

分布式事务严谨的定义:分布式环境下的事务处理机制 CAP定理:在一个分布式系统中,涉及共享数据问题时,以下三个特性最多只能同时满足两个 一致性:代表数据在任何时刻、任何分布式节点中看到的都是符合预期的&#xff0…

跨界计算与控制,强化显控和UI, 君正MPU再添新旗舰--Ingenic MPU X2600隆重发布

近日,北京君正隆重发布MPU芯片新产品X2600。该产品以商业和工业应用的数个细分领域为重点目标市场,兼顾通用处理器应用需求。无论从CPU结构的设计,还是专门控制器和接口的配备,都体现了北京君正MPU团队“技术路线上追求自主跨界&a…

unity学习(40)——创建(create)角色脚本(panel)——UI

1.点击不同的头像按钮,分别选择职业1和职业2,create脚本中对应的函数。 2.调取inputfield中所输入的角色名(限制用户名长度为7字符),但愿逆向的服务器可以查重名: 3.点击头衔,显示选择的职业&a…

4.寻找两个正序数组的中位数

题目:给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 解题思路:用二分法查找。使用归并的方式,合并两个有序数组,得到一个大的有序数组。大的…

MongoDB实战 – 用Python访问MongoDB数据库

MongoDB实战 – 用Python访问MongoDB数据库 MongoDB in Action – Access MongoDB Databases with Python By JacksonML Python语言功能强大众所周知,在数据库管理领域也无所不能。MongoDB是文档数据库,属于NoSQL数据库的一种,在业界也非常…