system V——进程间通信

上一篇博客中我介绍了system V进程间通信中的内存共享,但是其中还有两
种通信方式:消息队列、和信号量,接下来我将简单介绍一下,消息队列和
信号量以及操作系统是如何看待system V进程间通信的。

1. 消息队列

a. 大致介绍

消息队列会维护一个队列,供两个进程进行进程间通信:它与共享内存不同的就是它的数据是存储在一个节点中,再次存储数据时再创建一个节点链入到顺序表或者链表构成的队列中,关于它的数据存储格式是在一个结构体中,但是这个结构体由用户自定义:
在这里插入图片描述
其中第一个成员是用户自定义的类型(例如我要自定义A进程存储进去的数据是A类型ATYPE,我们可以使用宏定义来进行)第二个是用户的存储数据,这个可以是一个数组也可以是一个结构体,而对于数据的访问方式,那自然是由第一个成员的类型来让用户决定的。所以假如我们要让两个进程实现进程间通信的话,使用内存共享我们可能不太方便区分共享内存中的数据究竟是谁要接收,使用消息队列的话我们可以自定义数据的访问方式,当我们需要A进程提取B进程的消息时,我们就可以在队列中遍历寻找数据类型为B进程所时使用的类型,这样就可以区分数据是谁发送供谁使用了:
在这里插入图片描述

b. 函数接口

消息队列的函数接口大致与共享内存的接口形式上差不多,依旧是:
msgget
在这里插入图片描述
消息队列的数据发送:
在这里插入图片描述
消息队列的删除:
在这里插入图片描述
其中删除消息队列的方式仍旧是IPC_RMID。
命令行中使用ipcs -q可以查看系统中的消息队列
ipcrm -q + msgid可以删除消息队列
操作系统中也会存在许多的消息队列,那么消息队列也需要被管理仍旧是先描述后组织。
以上就是消息队列的大致认识

2. 简单认识信号量

我们在认识共享内存的时候我们发现共享内存是不安全的,它没有管道那样的同步机制,只要进程可以挂接上它,那么那个进程就可以随意的访问共享内存。这就会导致可能这个进程还在往进写数据时,另一个进程就开始读了。这样使得两个进程做的工作都没有了意义。
所以共享资源的使用是需要被保护起来的,就有了互斥和同步。

互斥:任何一个时刻只允许一个执行流访问共享资源
同步:多个执行流访问共享资源时,按照一定顺序访问

保护共享资源,其实也可以理解为保护代码中使用共享资源的代码段,只要将这一段代码维护好了,那么共享资源也就被维护好了,因为共享资源的使用也不就是通过代码来使用的嘛。所以我们将共享资源叫做临界资源,而访问临界资源的代码叫做临界区。对临界资源的保护就转化成了临界区的保护。
在这里插入图片描述
在接口中信号量的创建接口中,第二个参数是创建多少个信号量,因为我们的共享资源申请时虽然是一大片,但是使用时可能是多个部分,所以需要多个信号量。创建出来的多个信号量,我们也叫信号量集。
信号量的本质其实就是一个计数器,你可以理解为信号量中有一个整型,它表示了共享资源中可使用资源的数量。当有进程访问这个整形就–,当使用完成该部分共享资源时这个整形就会++。
这样当我们使用信号量保护我们的共享资源之后,如果有进程需要访问我们的共享资源,我们首先需要看到信号量中的那个整形是否大于0,如果大于0,那么我们这个进程就可以开始访问共享资源,同时整形–。如果整形等于0,那么此时访问信号量的进程就会被阻塞挂起,直到共享资源中有可用的资源。
这个时候我们就可以保护共享资源了:
在这里插入图片描述
而当信号量中的整形最大是1,意味着该整形只有两种状态0或1,那就表示该信号量所保护的资源同一时间只能由一个进程访问使用,而这种保护机制就叫互斥,也叫加锁,加了互斥锁。
上面说到,信号量可以理解为其中有一个整形,用来记录可访问共享资源的数目,那么这个整形也就意味着必须能够被不同进程能够看到,那么就说明它不是属于某一个进程中的资源。而是操作系统提供的资源。不同进程看到了同一份资源,这不就是进程间通信嘛。所以信号量也是进程间通信,也是共享资源。那么它也需要被保护啊。所以我们对信号量的操作是原子性的,在对他的操作中只有++和–,–只有成功和不成功。也就是对信号量的操作中只有不执行和执行后必须完成两种状态这种原子操作,这样也算是保护了自己。
通过使用信号量,可以有效地控制对共享资源的访问,避免了数据竞争和冲突,确保了线程或进程之间的安全协作。

3. 操作系统对system V进程间通信的看法

经过以上的认识我们可以看到,system V进程间通信不像管道一样使用了旧的文件系统的接口来实现的,它是全新的一个部分,是独立于内存管理、文件管理、驱动管理、进程管理的。当我们观察三个通信控制接口时,都会发现,当使用特定命令操作时,它们都会提供各自的暴露给用户的数据结构:
共享内存:
在这里插入图片描述
消息队列:
在这里插入图片描述
信号量:
在这里插入图片描述
前面说了这些通信资源也是需要被管理的,那么管理的方式依旧是通过将它们抽象成结构体,然后通过数据结构组织起来,而以上的各个结构体是操作系统暴露给用户供用户使用的对资源的属性或者内容修改的部分。这些结构体是内核数据结构中的子集。而在这些结构体中我们发现它们后缀为_ds的结构体中第一个成员都是一个类型为struct ipc_perm的结构体,而这其中就记录着一个属性key,这个key就是用户所传入的参数key,也是操作系统识别通信资源的依据。
而在操作系统内核中,有一类型为struct ipc_ids的结构体,其中有一个成员entries,它是一个指针,它的类型是struct ipc_id_ary。struct ipc_id_ary中有一个柔性指针数组,这个数组中存储着一个结构体,它的类型是struct kernel_ipc_perm看起来和向上面的通信资源结构体的ipc_perm很像,其实内核中的管理通信资源的结构体也是像以上的设计,它们各种通信方式的结构体的开头成员都是kernel_ipc_perm,这样就可以通过柔性数组访问到任何一种通信方式的结构体,从而对通信资源实行管理。而访问通信资源的结构体我们只需要通过key遍历柔性数组的元素,找到之后判断出它是哪种通信方式,然后对这个kernel_ipc_perm结构体取地址,强转成对应的通信资源结构体
,这样就可以访问到目标通信资源结构体了。
在这里插入图片描述
这样假如这个数组中的第二个元素是共享内存的kennel_perm,我们要访问它就可以这样:

(struct shmid_ds*)p[1]->...

这种方式不就是C语言版的多态吗?
这样就能访问到每一个通信资源结构体了。操作系统也就是使用这样的结构来通过一个数组管理好所有的通信结构体。

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

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

相关文章

4核8G服务器配置性能怎么样?12M带宽配置服务器能干什么?

腾讯云轻量4核8G12M轻量应用服务器支持多少人同时在线?通用型-4核8G-180G-2000G,2000GB月流量,系统盘为180GB SSD盘,12M公网带宽,下载速度峰值为1536KB/s,即1.5M/秒,假设网站内页平均大小为60KB…

CVE-2012-1823 漏洞复现

CVE-2012-1823 PHP SAPI 与运行模式 首先,介绍一下PHP的运行模式。 下载PHP源码,可以看到其中有个目录叫sapi。sapi在PHP中的作用,类似于一个消息的“传递者”,比如在《Fastcgi协议分析 && PHP-FPM未授权访问漏洞 &…

中年低端中产程序员从西安出发到海南三亚低成本吃喝万里行:西安-南宁-湛江-雷州-徐闻-博鳌-陵水-三亚-重庆-西安

文章大纲 旅途规划来回行程的确定南宁 - 北海 - 湛江轮渡成为了最终最大的不确定性!感谢神州租车气温与游玩地点总体花费 游玩过程出发时间:Day1-1月25日星期四,西安飞南宁路途中:Day2-1月26日星期五,南宁-湛江-住雷州…

工业自动化监控界面与网页、移动UI大相径庭,不能机械照搬。

工业自动化系统监控界面与网页UI、移动UI设计的不同之处主要体现在以下几个方面: 设备和数据展示:工业自动化系统监控界面需要展示大量的设备状态和实时数据,如传感器数据、设备运行状态等。相比之下,网页UI和移动UI设计更注重内容…

【开源】JAVA+Vue.js实现衣物搭配系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 衣物档案模块2.2 衣物搭配模块2.3 衣物收藏模块 三、系统设计3.1 用例设计3.2 E-R图设计3.3 数据库设计3.3.1 衣物档案表3.3.2 衣物搭配表3.3.3 衣物收藏表 四、系统实现4.1 登录页4.2 衣物档案模块4.3 衣物搭配模块4.4…

(已解决)Vue routes的 children使用(小白来看,包会!)

前言 分析链接:Vueelement ui实现好看的个人中心_vue个人信息页面代码-CSDN博客 使用了很多vue深层知识,简化并且做到自己的项目上面 对小白很有帮助,因为我就是小白,才搞明白。 最核心的就是routes的 children使用&#xff0c…

C++入门(上)

文章目录 1:什么是C2.C的发展史3:C关键字(C98)4:命名空间4.1:命名空间的概念4.2:命名空间的定义4.3:命名空间的使用4.3.1加命名空间的名称以及域作用限定符4.3.2:使用using将命名空间中某个成员引入4.3.3:使用using namespace 命名空间名称展开命名空间代码1代码2 5:C输入与输出…

pytorch常用激活函数笔记

1. relu函数: 公式: 深层网络内部激活函数常用这个 import matplotlib.pyplot as pltdef relu_fun(x):if x>0:return xelse:return 0x np.random.randn(10) y np.arange(10)plt.plot(y,x)for i ,t in enumerate(x):x[i] relu_fun(t) plt.p…

《21天精通IPv4 to IPv6》第3天:IPv6地址配置——如何为不同的系统配置IPv6?

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

2024 年 6 款最佳 PDF 编辑器,您可以免费获得

PDF 作为与 Windows、iOS、Linux 和各种其他操作系统兼容的安全文档格式而享有盛誉。这种广泛的兼容性使 PDF 成为一种流行的选择,几乎每个用户都会在不同的环境中遇到 PDF 文件。无论是合同、发票、电子书、信用卡对账单、银行对账单、税务表格还是保险文件&#x…

算法学习——LeetCode力扣字符串篇

算法学习——LeetCode力扣字符串篇 344. 反转字符串 344. 反转字符串 - 力扣(LeetCode) 描述 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须原地…

精读《js 模块化发展》

1 引言 如今,Javascript 模块化规范非常方便、自然,但这个新规范仅执行了 2 年,就在 4 年前,js 的模块化还停留在运行时支持,10 年前,通过后端模版定义、注释定义模块依赖。对经历过来的人来说,…

二叉树和堆(优先队列)

前言: 本章会讲解二叉树及其一些相关练习题,和堆是什么。 二叉树: 二叉树的一些概念: 一棵二叉树是有限节点的集合,该集合可能为空。二叉树的特点是每一个节点最多有两个子树,即二叉树不存在度大于2的节点…

酷开科技荣获“消费者服务之星”称号后的未来展望

恭喜酷开科技荣获2023年第四季度黑猫平台“消费者服务之星”称号!这是对酷开科技长期以来坚持用户至上、用心服务的肯定和认可。作为OTT行业的佼佼者,酷开科技一直秉承着“以用户为中心”的服务理念,不断追求卓越品质,为用户提供更…

模型 PMF(产品市场契合度)

系列文章 主要是 分享 思维模型,涉及各个领域,重在提升认知。产品与市场高度契合。 1 PMF(Product Market Fit)产品市场契合度 的应用 1.1 PMF在创业过程中的应用-Vincy公司的产品PartnerShare 实现PMF需要企业深入了解目标市场的需求和用户的反馈&…

C++入门学习(二十七)跳转语句—continue语句

当在循环中遇到continue语句时,它会跳过当前迭代剩余的代码块,并立即开始下一次迭代。这意味着continue语句用于跳过循环中特定的执行步骤,而不是完全终止循环。 直接看一下下面的代码更清晰: 与上一节的break语句可以做一下对比…

Learn LaTeX 015 - LaTex Typeset 抄录

https://www.douyin.com/user/self?modal_id7306721102380764453&showTabpost GitHub address: https://github.com/yasenstar/learn_latex Gitee address: https://gitee.com/yasenstar/learn_latex

亚信安慧AntDB零故障割接方案的实践

亚信安慧AntDB秉持着为客户提供最佳数据库解决方案的理念,不断探索并创新,最近取得了重大的突破。他们成功地研发出一种先进的数据库割接方案,实现了不停服、零故障的数据库割接操作,有效地将替换所带来的业务影响降至最低。 这一…

LLM少样本示例的上下文学习在Text-to-SQL任务中的探索

导语 本文探索了如何通过各种提示设计策略,来增强大型语言模型(LLMs)在Few-shot In-context Learning中的文本到SQL转换能力。通过使用示例SQL查询的句法结构来检索演示示例,并选择同时追求多样性和相似性的示例可以提高性能&…