波奇学Linux:进程通信之消息队列,操作系统管理ipc资源,信号量

news2024/9/24 9:26:52

进程通信的前提:必须让不同进程看到同一份资源。

管道:文件缓冲区 共享内存:内存块 消息队列:队列

消息队列

让不同的进程看到同一个队列,允许不同的进程向内核发送带类型的数据块

带类型是为了区分数据块是由哪个类型区分的。

*共享内存和消息队列都是SystemV标准

共享内存接口和消息队列接口很像

消息队列接口

建立队列

控制消息队列

消息队列收发

msgp数据块地址,msgsz数据大小

查看消息队列/删除消息队列

ipcs -q

ipcrm -q msgid

信号量也类似

操作系统对ipc(各种通信方式)的管理

管理各自通信方式的结构体的第一个字段都是一样的

 不同通信方式第一个字段struct ipc_perm都是一样的

存在一个数组对多种通信方式的struct ipc_perm管理。注意并不是通信方式结构体在数组中,而是通信方式结构体的第一个字段在数组中

当访问某个ipc资源时,通过确定ipc_perm*array的数组中ipc_perm中的key值确认是否资源是否创立。key值在结构体ipc_perm中

shmid,msgid实际上就是数组的下标

访问某个ipc资源的属性,通过地址强转成某个ipc类型,访问对应的属性。

操作系统没有直接管理各种类型ipc资源,而是通过给各种ipc资源相同的字段,通过字段和地址强转来实现各种类型ipc资源,类似于多态。

操作系统可以区分指针指向的对象类型。

shmid和fd不一样,不是从0开始了,这个数组不隶属于任何进程,由系统独立控制,shmid下标线性递增,直到最大值变成0。

互斥,临界资源,临界区

共享内存存在数据不一致问题:进程一写入部分数据时,进程二拿走大部分数据,导致双方发和收数据不完整。 

通过加锁的方式来实现互斥访问,互斥-只允许一个执行流访问共享资源,进程二等进程一写完才能读。

共享的,任何时刻只允许一个执行流访问资源--临界资源,如管道。

访问临界资源的代码称为临界区

信号量/信号灯

信号量的本质是一把计数器,类似于 int cnt=n

描述临界资源中资源(共享且互斥)的数量多少

以电影院买票为例,电影票和座位映射,座位相当于共享资源,购买电影票相当于预定资源。

每卖出一张票,计算器就要减一,放映厅的资源就少一个。票数计算器减少到0,资源已经被申请完毕了。

把临界资源划分成多份,把临界资源把只需要访问的区域锁住。

通过引入一个计数器,直接让cnt--,表示申请资源,当cnt<=0,资源被申请完了,限制执行流申请。

申请计算器资源成功,表示具有访问资源的权限,本质上是对计数器资源的预订机制

计数器可以有效保证进入共享资源的执行流数量。

当多个执行流并发,执行流访问共享资源的一部分的时候,不是直接访问,而是先申请计数器资源。

资源为一的情况下,多个执行流只有一个执行流可以访问到-互斥

 把值只能为1和0的计数器,叫做二元信号量,本质上是一个锁。

当计数器为一的情况下,其实将临界资源看成整体,整体申请,整体释放。

信号量本身也就是共享资源

多个执行流申请信号量资源,信号量减少必须是安全的。

cnt--:

c语言一条语句变成汇编三条语句

cnt变量 内存->cpu寄存器

cpu内进行--操作

将计算结果写回cnt变量内存位置

信号量变化是原子的

申请信号量,本质是对计数起-- P操作

释放资源,释放信号量,本质是对计数器进行++操作,v操作

申请和释放PV操作 --- 原子的!即两态的,要么完成,要么不做

(语句在执行时只有一条汇编语句)

这样是为了保持信号量变化是安全的 

信号量值是1,0两态的,二元信号量,就是互斥功能。

SystemV版本信号量接口

信号量在进程充当flag作用,而不是传递大量数据,比如就像是前端的flag值

mmap函数也是共享内存,将内存和磁盘中的文件映射。向文件写入时不再通过read/write而是直接通过mmap写入

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

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

相关文章

Linux——匿名管道

Linux——匿名管道 什么是管道匿名管道的底层原理观察匿名管道现象读写端的几种情况写端慢&#xff0c;读端快写端快&#xff0c;读端慢 管道的大小写端关闭&#xff0c;读端一直读写端一直写&#xff0c;读端关闭 我们之前一直用的是vim来编写代码&#xff0c;现在有了vscode这…

Vue路由(黑马程序员)

路由介绍 将资代码/vue-project(路由)/vue-project/src/views/tlias/DeptView.vue拷贝到我们当前EmpView.vue同级&#xff0c;其结构如下&#xff1a; 此时我们希望&#xff0c;实现点击侧边栏的部门管理&#xff0c;显示部门管理的信息&#xff0c;点击员工管理&#xff0c;显…

CK98-数学家键盘配置

官方驱动和说明书下载地址 https://www.coolkiller.cn/download/lists_6.html 介绍&#xff1a;https://new.qq.com/rain/a/20221229A09B1M00 官方CK-98数学家驱动版本&#xff08;谨慎更新&#xff09; 如果升级驱动出现问题&#xff0c;重启驱动软件后会默认让你恢复的。 …

vue ts html 中如何遍历 Enum 类型构建页面结构

vue ts html 中如何遍历 Enum 类型构建页面结构 Enum 被用在一些有明确有限数量的值的时候&#xff0c;比如定义菜单的类型 一、需求 定义了一个 Enum 用来标记菜单类型&#xff1a; enum EnumMenuType {目录 1,菜单,按钮,外链 }你需要知道 Enum 它的序号是随第一个定义的值…

第四十七回 一丈青单捉王矮虎 宋公明二打祝家庄-强大而灵活的python装饰器

四面全是埋伏&#xff0c;宋江和众人一直绕圈跑不出去。正在慌乱之时&#xff0c;石秀及时赶到&#xff0c;教大家碰到白杨树就转弯走。走了一段时间&#xff0c;发现围的人越来越多&#xff0c;原来祝家庄以灯笼指挥号令。花荣一箭射下来红灯龙&#xff0c;伏兵自己就乱起来了…

简单控件属性设置

1、设置文本的内容 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"…

计算机毕业设计分享-ssm心理咨询预约管理系统 19086(赠送源码数据库)JAVA、PHP,node.js,C++、python,大屏数据可视化等

本科生毕业设计&#xff08;论文&#xff09; 题 目心理咨询预约管理系统的设计与实现 学 院 XXXXX 专业班级 XXXXX 学生姓名 XXXX 指导岗位 XXXX 撰写日期&#xff1a;2023年4月 目 录 摘要 1 绪论 1.1背景及意义 …

【K8S类型系统】一文梳理 K8S 各类型概念之间的关系(GVK/GVR/Object/Schema/RestMapper)

参考 k8s 官方文档 https://kubernetes.io/zh-cn/docs/reference/https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.29/ 重点 Kubernetes源码学习-kubernetes基础数据结构 - 知乎 重点 Kubernetes类型系统 | 李乾坤的博客 重点 k8s源码学习-三大核心数…

Linux如何查看端口是否占用

在Linux中&#xff0c;有多种方法可以用来检查端口是否被占用。以下是一些常用的命令&#xff1a; netstat&#xff1a;这是一个非常通用的命令&#xff0c;可以用来查看所有端口的使用情况。如果你想查找特定的端口是否被占用&#xff0c;可以使用netstat命令配合grep。例如&…

QSlider 介绍与使用

1. 简单介绍一下QSlider 当使用 Qt 编写程序时&#xff0c;QSlider 是一个常用的控件&#xff0c;用于实现滑块功能。以下是 QSlider 的主要接口函数和信号&#xff1a; 接口函数&#xff1a; setMinimum(int min) / setMaximum(int max)&#xff1a; 设置滑块的最小值和最大…

Trie树(1.字符串统计____2.最大异或对求解)

Trie树 文章目录 Trie树Trie字符串统计正解 最大异或对1.暴力 &#xff08;可以过6/10个测试点)2. Trie树模拟 用法&#xff1a;高效地存储和查找字符串集合的数据结构 存储形式&#xff1a; 将n个单词各个字符进行枚举&#xff0c;若是&#xff08;根节点所指向包含字符c&…

第九讲-I/0 Interface

1. I/O接口 2. 程序查询I/O方式 3. 中断与中断l/O方式

即插即用篇 | YOLOv8 引入 DoubleAttention 注意力机制 | 《A2-Nets: Double Attention Networks》

论文名称:《A2-Nets: Double Attention Networks》 论文地址:https://arxiv.org/pdf/1810.11579.pdf 文章目录 1 原理2 源代码3 添加方式4 模型 yaml 文件template-backbone.yamltemplate-small.yamltemplate-large.yamltemplate-neck.yamlyolov8-C2

2024国际元宇宙博览会:阿里元境以元宇宙数字内容助力文旅数字化发展

2月26日&#xff0c;MES2024国际元宇宙博览会在深圳会展中心正式开幕&#xff0c;大会以“向3D出发&#xff0c;元宇宙来袭&#xff0c;电竞娱乐正当时”为主题&#xff0c;聚焦元宇宙产业链&#xff0c;以“汇聚企业创新&#xff0c;助力产业重构&#xff0c;推动行业发展”为…

【数学建模获奖经验】2023第八届数维杯数学建模:华中科技大学本科组创新奖获奖分享

2024年第九届数维杯大学生数学建模挑战赛将于&#xff1a;2024年5月10日08:00-5月13日09:00举行&#xff0c;近期同学们都开始陆续进入了备赛阶段&#xff0c;今天我们就一起来看看上一届优秀的创新奖选手都有什么获奖感言吧~希望能帮到更多热爱数学建模的同学。据说点赞的大佬…

数据库题专题训练(包含专题讲解+一整套题) 复试+升本比较适合

【拯救者】数据库题专题训练(包含专题讲解一整套题) 复试专升本期末 更新中 1️⃣ 先讲对应的专题 2️⃣ 最后来一整套模拟考题 &#x1f357;提供文档下载 【拯救者】Ep1_ER图专题(上) ​ ⭐️ 画ER图: 关注三个点 1. 找实体 2.找实体的属性 3.找实…

yolo目标检测实战

该博客主要介绍了&#xff1a; 1. 如何制作yolo目标检测数据集 2.如何在自己的数据集上训练yolo 3.训练好后的模型如何进行推理 1.数据标注 关于数据如何标注&#xff0c;请查看这篇博文 2.数据集目录结构 重点关注红框内部的结构 images: 图片目录 images/train: 训练集…

mysql根据指定顺序返回数据--order by field

在查询数据的时候&#xff0c;在in查询的时候&#xff0c;想返回的数据根据 in里的数据顺序返回&#xff0c;可以直接在orderby中通过 FIELD(字段名称逗号分隔的值的顺序) 进行指定&#xff1b;示例没有加 order by field添加 order by field效果

边缘智能网关:让环境监测更智能

在环境监测领域&#xff0c;边缘智能网关可用于区域环境的实时监测、分析和预警&#xff0c;例如河湖水位监测、雨雪监测、风沙/风速监测&#xff0c;通过实时采集并分析环境变化数据&#xff0c;能够有助于对于突发、急发的各种自然灾害进行快速预警和应对。 一、边缘智能网关…

JeecgBoot3.6.1 中打印功能实现

JeecgBoot3.6.1中实现打印功能 前言 在项目开发中我们可能会遇到打印得需求&#xff0c;基于JeecgBoot框架做了如下案例 一、前端 1、vue页面代码&#xff1a;List.vue <template><BasicTable register"registerTable" :rowSelection"rowSelectio…