Linux——system V共享内存

共享内存区是最快的IPC(进程内通信)形式,不再通过执行进入内核的系统调用来传递彼此的数据

1.共享内存的原理

IPC通信的本质是让不同的进程先看到同一份资源,然后再进行通信,所以想要通过共享内存进行通信,那么第一步一定是让两个进程能够看到看到物理内存中的同一份资源。

2.共享内存函数

通过共享内存函数来创建共享内存

shmget

功能
        创建共享内存

原型

        int shmget(key_t key, size_t size, int shmflg);

参数

        key:该共享内存段名字

        size:共享内存的大小

        shmflg:由九个权限标志位构成

                      若取值为IPC_CREAT:共享内存不存在,创建并返回;

                                                            共享内存存在,获取并返回;

                      若取值为IPC_CREAT | IPC_EXCL:共享内存不存在,创建并返回

                                                                                共享内存已存在,出错返回

返回值

        成功返回一个非负整数,即该共享内存的标识码(shmid)

        失败返回-1       

:所以当想要创建一个新的共享内存时,shmflg的取值应为:IPC_CREAT | IPC_EXCL

问:这个key值从何而来?以及这个key值有和作用?

答1:key值是通过ftok函数得来的,ftok会根据文件名/路径相应的inode以及proj_id生成一个唯一的key值,且该key值和路径(pathname)是一一对应的关系

ftok:

功能        

        用来生成一个唯一的key值,该key值用于IPC 通信,共享内存的位置由系统决定

原型

        key_t ftok(const char *pathname, int proj_id);

参数

        pathname:文件路径,必须存在

        proj_id:项目标识符,通常是一个字符(0~255之间的整数)

:为什么是路径?除了历史原因之外,路径具有唯一性。

答2:显然这个key值是用来创建共享内存的。具体怎么实现的呢?比如当前进程需要创建一个新的共享内存,那么在shmget中,只要key值相同,他们就能够打开同一个共享内存,此时就满足了不同进程看到同一份资源的要求。

进程A和进程B的虚拟地址不同,但是它们指向了同一块物理内存

除了让不同进程能够看到同一份资源外,我们还需要将物理内存中的共享内存和进程的虚拟地址建立映射关系

shmat

功能

        将共享内存段连接到进程地址空间(建立物理内存和虚拟内存间的映射关系)

原型

        void *shmat(int shmid, const void *shmaddr, int shmflg);

参数

        shmid:创建/打开共享内存成功时返回给当前进程的共享内存标识码

        shmaddr:指定连接的地址

        shmflg:一般为nulltpr

返回值

        成功返回一个指针,指向共享内存的第一个节

        失败返回-1

当前进程不在使用共享内存时,需要与共享内存脱离

shmdt

功能

        将共享内存段与当前进程脱离

原型

        int shmdt(const void *shmaddr);

参数

        shmaddr: shmat所返回的指针  

返回值

        成功返回0

        失败返回-1

:脱离不等于删除当前内存段

shmctl

功能

        用于控制共享内存

原型

        int shmctl(int shmid, int cmd, struct shmid_ds *buf);

参数

        shmid:shmget返回的共享内存标识码

        cmd:将要采取的动作(有三个可取值)

        buf:指向⼀个保存着共享内存的模式状态和访问权限的数据结构

返回值

        成功返回0

        失败返回-1

:三个可取值

IPC_STAT:把shmid_ds结构中的数据设置为共享内存的当前关联值

IPC_SET:在进程有足够权限的前提下,把共享内存的当前关联值设置为shmid_ds数据结构中给出的值

IPC_RMID:删除共享内存段

3.初步认识信号量

对于共享内存而言,它没有保护机制(当一个用户的信息还没有写完时,可能就被另一个用户读走了),没有保护机制就会造成读取数据的不一致。因此我们需要引入信号量来解决这个问题

3.1概念补充

在初步认识信号量前,需要对某些概念进行补充。

①:代码分为临界区和非临界区

对于非临界区而言,即每个程序自己的代码,他们之间不会相互影响

对于临界区而言,涉及资源互斥的部分,也就上面提到的共享资源访问时出现问题的部分

②:互斥

只允许一个程序访问进程

③:临界资源

被保护起来的资源

④:同步

多个进程访问临界资源时,具有一定的顺序性

⑤:原子性

简单说就是做和不做的区别

:对共享资源的保护,总之就是对访问共享资源的代码进行保护

3.2信号量

举一个电影院的例子:
一个影厅只有100个位置,如果票重复和提供的座位不足以发售的票都会出现问题。那么解决问题的措施就是 1.避免出现座位重复的票 2.避免发售的票太多。因此进入影院前,需要订票来确定自己座位

对于共享内存而言,将共享内存分块访问,那么所做的就是 1.避免多个进程访问共享内存中的同一块资源  2.避免过多进程对该共享内存进行访问

因此信号量的本质是一个计数器,用于描述临界资源中,资源数量的多少,如果进程申请资源成功就做减减操作,直至为零。

:任何进程想要访问临界资源,必须先申请信号量,本质是对资源(座位)的预订机制

当进程申请信号量时,就做减减操作,保证该操作具有原子性,该操作称为p操作

当进程不用时,就做加加操作,同时保证该操作具有原子性,该操作称为v操作

3.3不同信号量

二元信号量:信号量只有0或者1

多元信号量:1以上就是多元信号量,内部资源可以供多个进程使用

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

初识数组

数组的大概内容(自学)上篇 数组的创建和赋值 创建: int [] name new int [5]; int name [] new int [5]; int [] name {1,2.3,4,5}; 赋值: int [] score {1,2,3}; int [] score new int [] {1,2,3}; int [] score;//声明 score new int []…

OSPF-单区域的配置

一、单区域概念: 单区域OSPF中,整个网络被视为一个区域,区域ID通常为0(骨干区域)。所有的路由器都在这个区域内交换链路状态信息。 补充知识点: OSPF为何需要loopback接口: 1.Loopback接口的…

c++介绍锁二

锁主要在两个以上的线程中使用&#xff0c;当多个线程访问共享资源时&#xff0c;我们需要使用锁&#xff0c;开保证共享资源的唯一性。 当两个线程访问不带锁的共享资源时&#xff0c;如下代码 #include<array> #include<thread> #include<iostream> usin…

Ubuntu系统部署.NET 8网站项目

一、使用XShell连接 Ubuntu系统初次连接时默认的用户名为&#xff1a;ubuntu&#xff0c;使用此用户名与系统登录密码进行连接。 登录成功效果如下图&#xff1a; 二、root用户登录 linux下有超级用户&#xff08;root&#xff09;和普通用户&#xff0c;普通用户不能直接操…

学习资料电子版 免费下载的网盘网站(非常全!)

我分享一个私人收藏的电子书免费下载的网盘网站&#xff08;学习资料为主&#xff09;&#xff1a; link3.cc/sbook123 所有资料都保存在网盘了&#xff0c;直接转存即可&#xff0c;非常的便利&#xff01; 包括了少儿&#xff0c;小学&#xff0c;初中&#xff0c;中职&am…

图形编辑器基于Paper.js教程24:图像转gcode的重构,元素翻转,旋转

前段时间在雕刻图片时&#xff0c;旋转图片&#xff0c;翻转图片后&#xff0c;发现生成准确的gcode&#xff0c;虽然尺寸对&#xff0c;但是都是以没有旋转&#xff0c;没有翻转的图片进行生成的。后来思考了一下&#xff0c;发现这真是一个大bug&#xff0c;无论图片如何选择…

无公网IP也能远程控制Windows:Linux rdesktop内网穿透实战

文章目录 前言1. Windows 开启远程桌面2. Linux安装rdesktop工具3. Win安装Cpolar工具4. 配置远程桌面地址5. 远程桌面连接测试6. 设置固定远程地址7. 固定地址连接测试 前言 如今远程办公已经从一种选择变成了许多企业和个人的必修课&#xff0c;而如何在Linux系统上高效地访…

一文了解汽车图像传感器

2024年底,安森美做了题为"How Automotive Image Sensors Transform the Future of Autonomous Driving"的演讲,这里结合其内容对自动驾驶图像传感器做一个介绍。 当前的自动驾驶感知技术主要有两大技术路线:一种是仅使用摄像头作为传感器进行信息采集的纯…

Talking Head Review (数字人算法综述)

文章目录 引言3D Model basedGeneFace背景方案实验 GeneFace背景方案实现细节实验 Real3D-Portrait背景方案实现细节实验 MimicTalk背景方案实现细节实验 face-vid2vid背景方案实现细节实验 MegaPortraits背景方案实现细节实验 VASA-1背景方案实现细节实验 LivePortrait背景方案…

DeepSeekR1之四_在RAGFlow中配置DeepSeekR1模型

DeepSeekR1之四_在RAGFlow中配置DeepSeekR1模型 文章目录 DeepSeekR1之四_在RAGFlow中配置DeepSeekR1模型1. 通过Ollama下载模型1. 下载DeepSeekR1模型2. 下载嵌入模型 2. 查看本地的Ollama模型3. 模型提供商中添加模型1. 打开模型提供商2. 选择Ollama待添加模型3. 添加DeepSee…

【 <一> 炼丹初探:JavaWeb 的起源与基础】之 JavaWeb 项目的部署:从开发环境到生产环境

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、开发环境…

可视化图解算法:反转链表

1. 题目 描述 给定一个单链表的头结点pHead(该头节点是有值的&#xff0c;比如在下图&#xff0c;它的val是1)&#xff0c;长度为n&#xff0c;反转该链表后&#xff0c;返回新链表的表头。 数据范围&#xff1a; 0<≤n≤1000 要求&#xff1a;空间复杂度 O(1) &#xf…

P8685 [蓝桥杯 2019 省 A] 外卖店优先级--优先队列“数组”!!!!!

P8685 [蓝桥杯 2019 省 A] 外卖店优先级 题目 解析优先队列如何判断是否使用优先队列&#xff1f;省略规则优先队列常用操作大顶堆 vs 小顶堆定义队列h队列数组 代码 题目 解析 每个外卖店会在不同的时间点收到订单&#xff0c;我们可以看见测试用例的时间顺序是不同的&#x…

使用苹果M芯片打包Docker Image无法在amd64环境下运行

问题所在 使用苹果M芯片打包Docker Image无法在amd64环境下运行&#xff0c;因为arm环境下打包docker默认打包为arm格式&#xff0c;可以使用以下命令查看&#xff1a; docker inspect <ImageID>找到Architecture&#xff0c;可以发现 解决方法 在docker-compose.ym…

低代码开发直聘管理系统

低代码 DeepSeek 组合的方式开发直聘管理系统&#xff0c;兼职是开挂的存在。整个管理后台系统 小程序端接口的输出&#xff0c;只花了两个星期不到。 一、技术栈 后端&#xff1a;SpringBoot mybatis MySQL Redis 前端&#xff1a;Vue elementui 二、整体效果 三、表结…

MySQL的安装及配置

一.以安装包方式下载 1.进入MySQL官网&#xff0c;下载安装包 官网链接&#xff1a;https://downloads.mysql.com/archives/installer/ 2.安装MySQL 二.压缩包方式下载 下载位置&#xff1a;mysql下载位置 解压缩后位置&#xff1a;D:\mysql-8.0.15-winx64 在主目录下复制…

CI/CD—Jenkins配置一次完整的jar自动化发布流程

背景&#xff1a; 实现设想&#xff1a; 要创建自动化发布&#xff0c;需要准备一台测试服务器提前安装好java运行所需的环境&#xff0c;JDK版本最好和Windows开发机器上的版本一致&#xff0c;在Jenkins上配置将构建好的jar上传到测试服务器上&#xff0c;测试服务器自动启动…

C++蓝桥杯皮亚诺曲线距离求解

C蓝桥杯皮亚诺曲线距离求解 一、题目概述二、解题分析2.1解题思路2.2k值范围限制 三、实现代码四、代码测试4.1蓝桥杯测试平台4.2直接传入原始输入的k值4.3限制k值大小4.4pow函数求整数高次幂存在误差4.5满分代码 附录error: ‘long long int y1’ redeclared as different kin…

开源!速度100Kb/s的有线和无线双模ESP32S3芯片的DAP-Link调试器

开源&#xff01;速度100Kb/s的有线和无线双模ESP32S3芯片的DAP-Link调试器 目录 开源&#xff01;速度100Kb/s的有线和无线双模ESP32S3芯片的DAP-Link调试器本项目未经授权&#xff0c;禁止商用&#xff01;本项目未经授权&#xff0c;禁止商用&#xff01;本项目未经授权&…

简记_硬件系统设计之需求分析要点

目录 一、 功能需求 二、 整体性能需求 三、 用户接口需求 四、 功耗需求 五、 成本需求 六、 IP和NEMA防护等级需求 七、 认证需求 功能需求 供电方式及防护 供电方式&#xff1a;市电供电、外置直流稳压电源供电、电池供电、PoE&#xff08;Power Over Ether…