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,那么此时访问信号量的进程就会被阻塞挂起,直到共享资源中有可用的资源。
而对于信号量来说**–操作叫做P操作,++操作叫做V操作**。
这个时候我们就可以保护共享资源了:
在这里插入图片描述
而当信号量中的整形最大是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://xiahunao.cn/news/2780654.html

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

相关文章

用HTML5 + JavaScript绘制花、树

用HTML5 JavaScript绘制花、树 <canvas>是一个可以使用脚本 (通常为JavaScript) 来绘制图形的 HTML 元素。 <canvas> 标签/元素只是图形容器&#xff0c;必须使用脚本来绘制图形。 HTML5 canvas 图形标签基础https://blog.csdn.net/cnds123/article/details/112…

腾讯云4核8G服务器性能如何?支持多少用户访问?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…

{}初始化和初始化列表

C98标准中允许使用花括号对数组和自定义类型的变量进行初始化&#xff0c;C11扩展了大括号的用途&#xff0c;允许使用花括号对所有的内置类型和自定义类型进行初始化&#xff0c;使用时&#xff0c;可以加号&#xff0c;也可以不加。 对于自定义类型&#xff0c;当花括号中的常…

windows 下安装gin

go install 执行命令&#xff0c;执行不了的参考一下 https://blog.csdn.net/weixin_42592326/article/details/135946806 Golang 中没法下载第三方包解决办法-CSDN博客 go install github.com/gin-gonic/ginlatest 还是安装不了的话&#xff0c;用手机开热点&#xff0c;电…

Avaddon勒索病毒解密工具

前言 Avaddon勒索病毒被笔者称为2020年全球十大流行勒索病毒之一&#xff0c;其首次出现于2020年6月在俄罗斯某地下黑客论坛开始出售&#xff0c;该勒索病毒使用C语言进行编写&#xff0c;采用RSA-2048和AES-256加密算法对文件进行加密&#xff0c;该勒索病毒的传播方式多种多…

自动化AD域枚举和漏洞检测脚本

linWinPwn 是一个 bash 脚本&#xff0c;可自动执行许多 Active Directory 枚举和漏洞检查。该脚本基于很多现有工具实现其功能&#xff0c;其中包括&#xff1a;impacket、bloodhound、netexec、enum4linux-ng、ldapdomaindump、lsassy、smbmap、kerbrute、adidnsdump、certip…

第75讲Avatar头像FooterHome实现

Avatar头像实现 avatar&#xff1a; <template><el-dropdown><span class"el-dropdown-link"><el-avatar shape"square" :size"40" :src"squareUrl" /></span><template #dropdown><el-drop…

MySQL基本操作之数据库的操作

一.创建数据库 1.基本语法 create database 数据库名&#xff1b; 注意别忘记加分号。 2.if not exists 数据库名字是唯一的&#xff0c;所以不可以创建已存在的数据库&#xff0c;如下&#xff1a; 重复创建就会报错 所以有了if not exists这个语法&#xff0c;加上之后&…

JAVA设计模式之访问模式详解

访问者模式 1 访问者模式介绍 访问者模式在实际开发中使用的非常少,因为它比较难以实现并且应用该模式肯能会导致代码的可读性变差,可维护性变差,在没有特别必要的情况下,不建议使用访问者模式. 访问者模式(Visitor Pattern) 的原始定义是&#xff1a;允许在运行时将一个或多…

数据分析基础之《pandas(8)—综合案例》

一、需求 1、现在我们有一组从2006年到2016年1000部最流行的电影数据 数据来源&#xff1a;https://www.kaggle.com/damianpanek/sunday-eda/data 2、问题1 想知道这些电影数据中评分的平均分&#xff0c;导演的人数等信息&#xff0c;我们应该怎么获取&#xff1f; 3、问题…

vue3 之 商城项目—layout静态模版结构搭建

layout—模块静态模版搭建 一般情况下我们会有nav区域&#xff0c;header区域&#xff0c;二级路由出口区域以及footer区域&#xff0c;如图 我们在开发的时候先把大模块搭建起来&#xff0c;再一步一步填充小模块 在layout下建文件&#xff0c;目录如下 在index.vue中把上…

DP读书:《openEuler操作系统》(九)从IPC到网卡到卡驱动程序

DP读书&#xff1a;《openEuler操作系统》从IPC到网卡到卡驱动程序&#xff09; 上章回顾_SPI上节回顾_TCP 网卡驱动程序简介1.设备驱动2.总线与设备3.网卡及其抽象 驱动程序的注册与注销1. 注册2. 注销 设备初始化1. 硬件初始化2. 软件初始化 设备的打开与关闭1. 设备的打开2.…

阿里云带宽计费模式怎么选?如何收费的?

阿里云服务器带宽计费模式分为“按固定带宽”和“按使用流量”&#xff0c;有什么区别&#xff1f;按固定带宽是指直接购买多少M带宽&#xff0c;比如1M、5M、10M、100M等&#xff0c;阿里云直接分配用户所购买的带宽值&#xff0c;根据带宽大小先付费再使用&#xff1b;按使用…

javascript语法备忘

< noscript>是不支持js的浏览器用来替换script下内容的东西。 chrome清除js缓存 基础 $(document).ready(function(){... }); // 可以简写为&#xff1a; $(function(){...func1(){} });这是在页面DOM加载完成后执行的代码&#xff0c;而windown.onload则需要在页面DOM…

「数据结构」哈希表1:基本概念

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;Java数据结构 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 基本概念 &#x1f349;哈希表&#x1f349;哈希冲突&#x1f34c;负载因子调节&#x1f34c;解决哈希冲突&#x1f95d;1. 闭散…

2024年世界听力日活动的主题是什么?

改变思维模式&#xff1a;让所有人的耳和听力保健成为现实&#xff01; Let’s make ear and hearing care a reality for all! 据 世界卫生组织 报道&#xff1a;在全球范围内&#xff0c;超过 80% 的耳和听力保健需求仍未得到满足 &#xff1b; 未得到解决的听力损失每…

Microsoft Word 超链接

Microsoft Word 超链接 1. 取消超链接2. 自动超链接2.1. 选项2.2. 校对 -> 自动更正选项2.3. Internet 及网络路径替换为超链接 References 1. 取消超链接 Ctrl A -> Ctrl Shift F9 2. 自动超链接 2.1. 选项 2.2. 校对 -> 自动更正选项 ​​​ 2.3. Internet…

controller-manager学习三部曲之二:源码学习

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 作为《controller-manager学习三部曲》系列的第二篇&#xff0c;前面通过shell脚本找到了程序的入口&#xff0c;接下来咱们来学习controller-mana…

《21天精通IPv4 to IPv6》第15天:IPv6的扩展技术——如何扩展IPv6?

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

文件的操作(下)

1.顺序读写函数 这些函数都是 按照顺序读写的&#xff0c;所谓的按顺序读写就是我么你打开文件后光标是从头开始的&#xff0c;每输入一个数据就会自动往下一格移动。上面说的适面于所有输入流一般指适用于标准输入流和其他输入流&#xff08;如文件输入流&#xff09;&#xf…