深入探讨进程间通信的重要性:理解不同的通信机制(下)

news2024/9/21 5:28:37

前言

在上一篇文章中,我们探讨了进程间通信的三种常见机制:管道、消息队列和共享内存。我们了解到,这些机制各有其特点和适用场景,可以根据实际需求选择合适的机制进行进程间通信。然而,进程间通信并不仅限于这三种方式。

在本文中,我们将继续探索进程间通信的知识点,重点关注信号量、信号和套接字。信号量是一种用于进程同步的机制,它可以用于控制对共享资源的访问。信号是一种用于进程间通知的机制,可以用于处理异步事件。而套接字则是一种用于网络通信的接口,它可以实现不同主机之间的进程间通信。

信号量

共享内存通信方式虽然提供了高效的数据交换,但也引发了新的问题。如果多个进程同时修改同一个共享内存区域,很可能会导致数据冲突。举个例子,如果两个进程同时写入同一个地址,先写入的进程可能会发现自己的内容被后写入的进程覆盖。

在进程间共享资源时,使用信号量可以避免多个进程同时访问共享资源而导致数据冲突的问题。信号量是一个整型计数器,用来表示资源的可用数量。通过P操作和V操作来控制信号量的值。

  • P操作会将信号量减1,如果结果小于0,则表示资源已被占用,进程需要阻塞等待。如果结果大于等于0,则表示资源仍然可用,进程可以继续执行。
  • V操作会将信号量加1,如果结果小于等于0,则表示有其他进程正在等待资源,需要唤醒其中一个进程。如果结果大于0,则表示没有进程在等待资源。

通过使用P操作和V操作,可以实现对共享资源的互斥访问和同步执行。例如,可以初始化一个信号量为1,使得只有一个进程可以访问共享资源,从而避免数据错乱。另外,可以初始化一个信号量为0,使得进程按照特定的顺序执行,实现多进程的同步。
接下来,我们先看下互斥访问,如果要使得两个进程互斥访问共享内存,我们可以初始化信号量为 1。

image

具体的过程如下:

  • 进程 A 在访问共享内存之前,先执行了 P 操作。由于信号量的初始值为 1,所以进程 A 执行 P 操作后,信号量减为 0,表示共享资源可用,进程 A 可以访问共享内存。
  • 如果此时进程 B 也想访问共享内存,它执行了 P 操作。结果信号量变为 -1,表示临界资源已被占用,因此进程 B 被阻塞。
  • 直到进程 A 访问完共享内存,才会执行 V 操作,使得信号量恢复为 0。接着,进程 A 唤醒被阻塞的进程 B,使其可以访问共享内存。
  • 最后,进程 B 完成共享内存的访问后,执行 V 操作,将信号量恢复到初始值 1。

将信号量初始化为 1,代表着它是一个互斥信号量。这种设置可以确保在任何时刻只有一个进程可以访问共享内存,从而有效保护了共享内存的完整性。有人可能会发现如果多线程都来访问资源全部阻塞了唤醒谁呢?这不就是我们之前讲到的进程调度算法了吗?进程阻塞后会进入阻塞队列,而唤醒哪个进程则由系统的调度算法决定。

在多进程环境中,每个进程并不一定按照顺序执行,它们以各自独立且不可预测的速度向前推进。然而,在某些情况下,我们希望多个进程能够密切合作,以实现一个共同的任务。

比如生产者消费者模式,假设进程A负责生产数据,而进程B负责读取数据,这两个进程是相互合作、相互依赖的。进程A必须先生产数据,然后进程B才能读取到数据,因此它们之间存在执行顺序。

接下来,我们来讨论同步执行。我们可以通过初始化信号量为0来实现。

image

具体过程如下:

  • 如果进程B比进程A先执行,那么当它执行P操作时,由于信号量的初始值为0,所以信号量会变为-1,表示进程A还没有生产数据,进程B会被阻塞等待。
  • 接着,当进程A生产完数据后,执行V操作,信号量会变为0,这会唤醒被阻塞在P操作的进程B。
  • 最后,进程B被唤醒后,意味着进程A已经生产了数据,进程B就可以正常读取数据了。

可以看出,将信号量初始化为0,代表着这是一个同步信号量,它可以保证进程A在进程B之前执行。

信号

信号是一种在异常情况下进行进程间通信的机制,它是一种异步通信方式,其数据结构一般为一个数字。

在Linux操作系统中,为了响应各种事件,提供了几十种信号,每个信号代表着不同的含义。可以通过运行"kill -l"命令来查看所有的信号列表。

image

对于在Shell终端中运行的进程,我们可以通过键盘输入某些组合键向进程发送信号。例如,按下Ctrl+C会产生SIGINT信号,表示终止该进程;按下Ctrl+Z会产生SIGTSTP信号,表示暂停该进程,但进程并未结束。需要注意的是,Ctrl+Z命令在某些情况下可能会导致内存飙升等问题(比如你看一个全量服务器日志),因此需要谨慎使用。

如果进程在后台运行,可以使用kill命令向进程发送信号,但前提是需要知道正在运行的进程的PID(进程ID)。例如,执行"kill -9 ###“命令会向PID为”###"的进程发送SIGKILL信号,用于立即终止该进程。

因此,信号的事件来源主要有硬件来源(如键盘的Ctrl+C)和软件来源(如kill命令)。信号是进程间通信机制中唯一的异步通信机制,进程需要为信号设置相应的监听处理程序,当收到特定信号时,执行相应的操作,类似于其他编程语言中的通知机制。

Socket

Socket通信是一种常用的进程间通信机制,可以用于跨网络与不同主机上的进程之间通信,也可以在同一台主机上的进程之间进行通信。

Socket通信是通过网络协议进行数据传输的一种方式。在使用Socket通信时,一个进程可以作为服务器端创建一个Socket,并指定一个IP地址和端口号来监听连接请求;另一个进程则可以作为客户端创建一个Socket,指定服务器的IP地址和端口号来发起连接。一旦连接建立,服务器和客户端就可以通过Socket进行数据的发送和接收。

在同一台主机上,进程可以使用特殊的IP地址(如本地回环地址127.0.0.1)和不同的端口号来建立Socket连接,实现进程间的通信。这种方式被称为本地回环通信,可以用于进程之间的协作和数据交换。

后期我将详细讲解计算机基础的网络篇,敬请期待!

总结

IPC 机制数据抽象参与者方向内核实现
管道字节流两个进程单向通常以 FIFO 的缓冲区来管理数据。
有匿名管道和命名管道两类主要实现
消息队列消息多进程单向
双向
队列的组织方式。
通过文件的权限来管理对队列的访间
信号量计数器多进程单向
双向
内核馀护共享计数器。
通过文件的权限来管理刘计数器的访问
共享内存内存区问多进程单向
双向
内核维护共享的内存区可。
通过文件的权限来管理对共享内存的访间
信号事件编号多进程单向为线程/进程维护信号等待队列。
通过用户了组等的权限来管理信号的操作
套接字数据报文两个进程单向
双向
有基于IP/端口和基于文件路轻的寻址方式。
利用网络栈来管理通信

进程间通信是操作系统中的重要概念,它允许不同的进程之间进行数据交换、消息传递和协作。在Linux系统中,提供了多种进程间通信的机制,包括管道、消息队列、共享内存、信号量、信号和套接字。每种通信机制都有不同的特点和适用场景。需要根据具体需求选择合适的方式。进程间通信涉及到资源的共享和竞争,需要合理地使用同步和互斥机制来保证数据的一致性和正确性。同时,进程的唤醒顺序也会受到系统的调度算法的影响。


我是努力的小雨,一名 Java 服务端码农,潜心研究着 AI 技术的奥秘。我热爱技术交流与分享,对开源社区充满热情。同时也是一位掘金优秀作者、腾讯云创作之星、阿里云专家博主、华为云云享专家。
💡 我将不吝分享我在技术道路上的个人探索与经验,希望能为你的学习与成长带来一些启发与帮助。
🌟 欢迎关注努力的小雨!🌟

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

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

相关文章

Zookeeper学习、Tomcat

怎样使用Zookeeper实现服务发现? 典型回答 服务发现是ZK的重要用途之一,当我们想要基于zk实现服务发现时,一般可以参考以下步骤:1. 向Zookeeper注册服务 服务提供者需要在Zookeeper上创建一个临时节点来注册自己的服务。节点的名…

第五届IEEE先进电气和能源系统国际会议(AEES 2024)即将召开!

第五届先进电气和能源系统国际会议将于2024年11月29日至12月1日在中国兰州召开,欢迎参加! 本届会议关注先进电气和能源系统的新理论及其应用,为相关领域的技术及相关研究领域的专家、学者交流最新研究成果、探讨学术发展方向提供一个广泛的交…

LVS原理——详细介绍

目录 介绍 lvs简介 LVS作用 LVS 的优势与不足 LVS概念与相关术语 LVS的3种工作模式 LVS调度算法 LVS-dr模式 LVS-tun模式 ipvsadm工具使用 实验 nat模式集群部署 实验环境 webserver1配置 webserver2配置 lvs配置 dr模式集群部署 实验环境 router 效果呈现…

漏洞复现-Cacti命令执行漏洞 (CVE-2022-46169)

1.漏洞描述 Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具,可为用户提供强大且可扩展的操作监控和故障管理框架。 该漏洞存在于remote_agent.php文件中,未经身份验证的恶意攻击者可以通过设置HTTP_变量…

Vue2计算属性与Vue3的计算属性对比

Vue2的计算属性 在Vue2文档上存在这么一个例子:通过计算属性来获取全名 var vm new Vue({el: #demo,data: {firstName: Foo,lastName: Bar},computed: {fullName: function () {return this.firstName this.lastName}} }) 同时,如果我们更改了计算…

【学习笔记】Day 11

一、进度概述 1、《地震勘探原理》第四章 二、详情 4.1 影响地震波传播速度的因素分析 这里只做定性总结,定量参考书上公式(p139-p143)。这一章节是通过观测速度模型,确定岩层结构的基础知识(虽然更像是地质解释那一…

Vue中的路由与多种守卫常见问题及解决方案

在Vue.js项目中,Vue Router是实现单页面应用(SPA)页面跳转的重要工具。路由守卫作为Vue Router的一个关键特性,用于在路由跳转前或跳转后进行逻辑判断,如权限验证、登录状态检查等。然而,在使用路由守卫时&…

零基础5分钟学会谷歌云GCP核心云架构技能 - 成本分析篇

简介: 欢迎来到小李哥谷歌云GCP云计算知识学习系列,适用于任何无云计算或者谷歌云技术背景的开发者,让大家零基础5分钟通过这篇文章就能完全学会谷歌云一个经典的服务开发架构方案。 我将每天介绍一个基于全球三大云计算平台(AW…

基于单片机的智能风扇设计

摘 要: 传统风扇无法根据周围环境的温度变化进行风速的调整,必须人为地干预才能达到需求 。 本文基于单片机的智能风扇主要解决以往风扇存在的问题,其有两种工作模式: 手动操作模式和自动运行模式,人们可以根据需要进行模式选择。 在自动运行…

TIM定时器 溢出时间计算

在f1系列,所有定时器的时钟源频率都是72mhz,因为不管是挂在apb1还是apb2时钟总线上的定时器,经过倍频或者不倍频以后都将把定时器的频率设置成72mhz 时钟源频率除以psc1以后得到实际的频率,之所以psc要加1,是因为设置…

无人机测绘技术如何?

无人机测绘技术作为现代测绘技术的重要组成部分,正以其独特的优势在多个领域发挥着重要作用。以下是对无人机测绘技术的详细分析: 一、技术特点 1. 高精度:无人机测绘搭载高精度传感器和相机,能够快速、准确地获取地面信息&…

Datawhale X 魔搭 AI夏令营第四期-魔搭生图task1学习笔记

根据教程提供的链接,进入相应文章了解魔搭生图的主要工作是通过对大量图片的训练,生成自己的模型,然后使用不同的正向、反向提示词使模型输出对应的图片 1.官方跑baseline教程链接:Task 1 从零入门AI生图原理&实践 2.简单列举一下赛事的…

【Material-UI】Floating Action Button (FAB) 详解:基础用法

文章目录 一、Floating Action Button (FAB) 简介1. FAB 的定义2. FAB 的特点 二、Basic FAB 的基础用法1. 基础 FAB 按钮2. 次要颜色的 FAB 按钮3. 扩展变体的 FAB 按钮4. 禁用状态的 FAB 按钮 三、FAB 按钮的高级自定义1. 自定义按钮大小2. 调整按钮的悬浮位置 四、FAB 的无障…

研究报告系列二:供应链安全风险原因分析及相关新质生产力重要技术探讨

随着软件开发的复杂性和动态性不断增加,软件供应链的安全风险成为了一个亟需重视的重要议题,而在技术的飞速发展和广泛应用下,新质生产力相关领域同样存在着软件供应链安全方面的问题,作为《2023软件供应链安全研究报告》系列中的…

js逆向——2024最新金山词霸(练习二)

首先还是看响应,返回了一串加密数据 继续放大招hook JSON,详细流程在上一篇文章 然后直接跟栈找到解密位置 var t 1 (null e || void 0 e ? void 0 : e.status) ? A(A({}, e), {}, {content: JSON.parse((0,_.B6)(e.content))}) : e; t是解密之后…

护眼大路灯哪个牌子好?公认五款最好护眼大路灯分享

护眼大路灯哪个牌子好?很多家长都是为了孩子的视力健康而置换的护眼大路灯,但是有一部分孩子用了之后反而会和家长说出现眼睛不太舒服,甚至近视加深的情况。而引发这种情况的大多数为产品不达标或非专业台灯,因为专业护眼大路灯是…

白屏检测系统的设计与实现

目录 一、 什么是白屏问题?二、 问题分析与拆解2.1 人工判定一个白屏问题的逻辑2.2 自动化判定一个白屏问题的算法思想 三、 白屏检测算法3.1 图像灰度化3.2 图像二值化3.3 计算(判定为白屏)置信度 四、 白屏检测系统的设计与实现4.1 UI自动化…

某通用系统0day审计过程

前言 代码审计篇章都是自己跟几个师傅们一起审计的1day或者0day(当然都是小公司较为简单),禁止未经允许进行转载,发布到博客的用意主要是想跟师傅们能够交流下审计的思路,毕竟审计的思路也是有说法的,或者是相互源码共享也OK&…

51单片机之动态数码管显示

一、硬件介绍 LED数码管是一种由多个发光二极管(LED)封装在一起,形成“8”字型的显示器件。它广泛用于仪表、时钟、车站、家电等场合,用于显示数字、字母或符号。 通过控制点亮a b c d e f g dp来显示数字,本实验开发板…

最长的一帧学习(待补)

文章目录 一、osgViewer:: ViewerBase:: frame()1.osgViewer:: View:: init()2.osgViewer::Viewer::realize(),窗口和场景的“设置”工作part1 GraphicsContextpart1.1 通过阅读osgViewer::View::setUpViewInWindow()了解osg最基础的操作 part2 DisplaySettingspart…