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以上就是多元信号量,内部资源可以供多个进程使用

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

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

相关文章

01 SQl注入基础步骤(数字、字符、布尔盲注、报错)

目录 1、SQL注入漏洞的概要 2、SQL注入的常规思路 3、数字型注入 4、字符型注入 5、布尔盲注 6、报错注入 1、SQL注入漏洞的概要 原理:通过用户输入的数据未严格过滤,将恶意SQL语句拼接到原始查询中,从而操控数据库执行非预期操作。 …

leetcode-sql数据库面试题冲刺(高频SQL五十题)

题目: 620.有趣的电影 表:cinema ------------------------ | Column Name | Type | ------------------------ | id | int | | movie | varchar | | description | varchar | | rating | float | ------------------------ id 是该表的主键(具有唯一值…

7.2 奇异值分解的基与矩阵

一、奇异值分解 奇异值分解(SVD)是线性代数的高光时刻。 A A A 是一个 m n m\times n mn 的矩阵,可以是方阵或者长方形矩阵,秩为 r r r。我们要对角化 A A A,但并不是把它化成 X − 1 A X X^{-1}A X X−1AX 的形…

在本地部署DeepSeek等大模型时,需警惕的潜在安全风险

在本地部署DeepSeek等大模型时,尽管数据存储在本地环境(而非云端),但仍需警惕以下潜在安全风险: 1. 模型与数据存储风险 未加密的存储介质:若训练数据、模型权重或日志以明文形式存储,可能被物…

【javaEE】多线程(进阶)

1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…

dify中使用NL2SQL

在 Dify 工作流中融入 NL2SQL(自然语言转 SQL)之能力,可依循如下步骤达成,借由 Dify 的模块化设计以及模型编排之功能,优化数据库查询之智能化交互: 一、环境准备与 Dify 部署 安装 Docker 与 Dify 务须确…

使用Everything搜索指定文件夹中的内容

直接路径搜索法 在 Everything 的搜索框中输入文件夹路径加空格,再输入要搜索的内容或文件名。如要在 D 盘的 “文档” 文件夹中搜索名为 “报告.docx” 的文件,可输入 “D:\ 文档 报告.docx”235。 高级搜索法 打开 Everything 软件,点击菜…

Java在小米SU7 Ultra汽车中的技术赋能

目录 一、智能驾驶“大脑”与实时数据 场景一:海量数据的分布式计算 场景二:实时决策的毫秒级响应 场景三:弹性扩展与容错机制 技术隐喻: 二、车载信息系统(IVI)的交互 场景一:Android Automo…

Vue开发中计算属性与方法调用之间的区别与联系

文章目录 一 概述二 核心区别三 联系四 使用原则 一 概述 在 Vue 中,计算属性(computed) 和 方法(methods) 都可以用于处理数据逻辑,但它们的核心区别在于 缓存机制 和 触发方式 。 计算属性示例&#xf…

【Unity】 HTFramework框架(六十一)Project窗口文件夹锁定器

更新日期:2025年3月7日。 Github源码:[点我获取源码] Gitee源码:[点我获取源码] 索引 Project窗口文件夹锁定器框架文件夹锁定自定义文件夹锁定限制条件 Project窗口文件夹锁定器 在Project窗口中,文件夹锁定器能够为任何文件夹加…

C语言:6.20字符型数据练习题

编写程序,输人一行数字字符(用回车结束),每个数字字符 的前后都有空格。 把这一行中的数字转换成一个整数。 例如,若输入(<CR>代表 Enter键):2 4 8 3<CR>则输出 整数:2483。 #include <stdio.h>int main() {char ch;int number 0;printf("请输入一行…

【软件工程】一篇入门UML建模图(状态图、活动图、构件图、部署图)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;软件开发必练内功_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前…

【C语言】数组篇

目录 引言一维数组数组的定义数组的初始化完全初始化部分初始化省略数组长度 数组元素的访问 多维数组二维数组的定义二维数组的初始化完全初始化部分初始化省略第一维长度 二维数组元素的访问 遍历数组元素遍历一维数组遍历二维数组 数组作为函数参数一维数组作为函数参数二维…

OpenCV视频解码性能优化十连击(实测帧率提升300%)

解密工业级视频处理优化方案&#xff01;从硬件加速到多线程榨干CPU/GPU性能&#xff0c;附RTSP流调优参数与内存泄漏排查技巧。 &#x1f527; 优化前准备 环境检测脚本 import cv2# 验证硬件加速支持 print("CUDA支持:", cv2.cuda.getCudaEnabledDeviceCount() &…

基于编译器特性浅析C++程序性能优化

最近在恶补计算机基础知识&#xff0c;学到CSAPP第五章的内容&#xff0c;在这里总结并且展开一下C程序性能优化相关的内容。 衡量程序性能的方式 一般而言&#xff0c;程序的性能可以用CPE&#xff08;Cycles Per Element&#xff09;来衡量&#xff0c;其指的是处理每个元素…

transformer模型介绍——大语言模型 LLMBook 学习(二)

1. transformer模型 1.1 注意力机制 **注意力机制&#xff08;Attention Mechanism&#xff09;**在人工智能中的应用&#xff0c;实际上是对人类认知系统中的注意力机制的一种模拟。它主要模仿了人类在处理信息时的选择性注意&#xff08;Selective Attention&#xff09;&a…

word甲烷一键下标

Sub 甲烷下标()甲烷下标 宏Selection.Find.ClearFormattingSelection.Find.Replacement.ClearFormattingWith Selection.Find.Text "CH4".Replacement.Text "CHguoshao4".Forward True.Wrap wdFindContinue.Format False.MatchCase False.MatchWhole…

Dify 本地部署教程

目录 一、下载安装包 二、修改配置 三、启动容器 四、访问 Dify 五、总结 本篇文章主要记录 Dify 本地部署过程,有问题欢迎交流~ 一、下载安装包 从 Github 仓库下载最新稳定版软件包,点击下载~,当然也可以克隆仓库或者从仓库里直接下载zip源码包。 目前最新版本是V…

2.1 掌握XML基础知识

本文介绍了结构化、半结构化和非结构化数据的概念与特点。结构化数据以固定格式存储于数据库&#xff0c;便于查询与管理&#xff0c;常用于金融等领域。半结构化数据如XML、JSON&#xff0c;具有一定的组织形式但模式不固定&#xff0c;适用于Web内容和日志文件。非结构化数据…

Android Studio 配置国内镜像源

Android Studio版本号&#xff1a;2022.1.1 Patch 2 1、配置gradle国内镜像&#xff0c;用腾讯云 镜像源地址&#xff1a;https\://mirrors.cloud.tencent.com/gradle 2、配置Android SDK国内镜像 地址&#xff1a;Index of /AndroidSDK/