system V共享内存【Linux】

news2024/9/24 13:22:44

文章目录

  • 原理
  • shmget
  • ftok
  • shmat(share memory attach)
  • shmdt,去关联(share memory delete attach)
  • shmctl ,删除共享内存
  • 共享内存与管道

原理

共享内存本质让不同进程看到同一份资源。
申请共享内存:
1、操作系统在物理内存当中申请一块内存空间
2、将申请好的内存分别挂接到各自进程的进程地址空间上
具体如何挂接:
将这块内存空间经过各自进程的页表映射到进程地址空间的共享区中,给应用层返回共享内存的起始虚拟地址

从而实现了进程A和进程B通过各自的页表访问同一块物理内存
在这里插入图片描述

当前进程如何释放共享内存:
1、把当前进程与共享内存去掉关联,把页表的映射关系去掉
2、释放共享内存

申请共享内存、挂接、去掉关联、释放共享内存这些操作都不是进程直接操作的,是由操作系统来完成

在系统当中可能会有大量的进程在进行通信,因此系统当中就可能存在大量的共享内存,那么操作系统必然要对其进行管理,所以共享内存除了在内存当中真正开辟空间之外,系统一定还要为共享内存维护相关的内核数据结构

共享内存的数据结构:

struct shmid_ds {
	struct ipc_perm     shm_perm;   /* operation perms */
	int         shm_segsz;  /* size of segment (bytes) */
	__kernel_time_t     shm_atime;  /* last attach time */
	__kernel_time_t     shm_dtime;  /* last detach time */
	__kernel_time_t     shm_ctime;  /* last change time */
	__kernel_ipc_pid_t  shm_cpid;   /* pid of creator */
	__kernel_ipc_pid_t  shm_lpid;   /* pid of last operator */
	unsigned short      shm_nattch; /* no. of current attaches */
	unsigned short      shm_unused; /* compatibility */
	void            *shm_unused2;   /* ditto - used by DIPC */
	void            *shm_unused3;   /* unused */
};

struct ipc_perm{
	__kernel_key_t  key;
	__kernel_uid_t  uid;
	__kernel_gid_t  gid;
	__kernel_uid_t  cuid;
	__kernel_gid_t  cgid;
	__kernel_mode_t mode;
	unsigned short  seq;
};

shmget

在这里插入图片描述
key:
1、必须在内核中具有唯一性,能够让不同的进程进行唯一性标识
2、第一个进程可以通过key创建共享内存,第二个之后的进程,只要拿着同一个key就可以和第一个进程看到同一个共享内存了
3、对于一个已经创建好的共享内存,key在哪 ?
key在共享内存的描述对象中

传入shmget函数的第一个参数key,需要我们使用ftok函数进行获取

size:
表示待创建共享内存的大小。
shmflg:
表示创建共享内存的方式
1、IPC_CREAT(单独使用):
如果内核中不存在键值与key相等的共享内存,则新建一个共享内存并返回该共享内存的句柄;如果存在这样的共享内存,则直接返回该共享内存的句柄

句柄:我们把具有标定某种资源能力的东西叫做句柄,而这里shmget函数的返回值实际上就是共享内存的句柄,这个句柄可以在用户层标识共享内存,当共享内存被创建后,我们在后续使用共享内存的相关接口时,都是需要通过这个句柄对指定共享内存进行各种操作
2、IPC_CREAT | IPC_EXCL:
如果内核中不存在键值与key相等的共享内存,则新建一个共享内存并返回该共享内存的句柄;如果存在这样的共享内存,则出错返回

IPC_EXCL:不单独使用!

ftok

在这里插入图片描述
ftok函数的作用就是,将一个已存在的路径名pathname和一个整数标识符proj_id转换成一个key值,称为IPC键值,在使用shmget函数获取共享内存时,这个key值会被填充进维护共享内存的数据结构当中。需要注意的是,pathname所指定的文件必须存在且可存取

使用ftok函数生成key值可能会产生冲突,此时可以对传入ftok函数的参数进行修改。
需要进行通信的各个进程,在使用ftok函数获取key值时,都需要采用同样的路径名和和整数标识符,进而生成同一种key值,然后才能找到同一个共享资源

ipcs -q 列出消息队列相关信息

[cxq@iZ7xviiy0goapxtblgih6oZ 1. sharemem]$ ipcs -q

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    

显示系统中正在使用的System V共享内存段的信息

[cxq@iZ7xviiy0goapxtblgih6oZ 1. sharemem]$ ipcs -m

共享内存的生命周期是随内核的,内核存在,共享内存就存在
用户不主动关闭,共享内存会一直存在
如果想要关闭共享内存,只能内核重启(用户释放)

关闭共享内存:

0是shmid

[cxq@iZ7xviiy0goapxtblgih6oZ 1. sharemem]$ ipcrm -m 0

在这里插入图片描述

shmat(share memory attach)

在这里插入图片描述

让当前进程和指定的共享内存关联起来

shmdt,去关联(share memory delete attach)

在这里插入图片描述

shmctl ,删除共享内存

在这里插入图片描述

第一个参数shmid,表示所控制共享内存的用户级标识符。
第二个参数cmd,表示具体的控制动作。

shmctl函数的第二个参数传入的常用的选项有以下三个
1、IPC_STAT,获取共享内存的当前关联值,此时参数buf作为输出型参数
2、IPC_SET ,在进程有足够权限的前提下,将共享内存的当前关联值设置为buf所指的数据结构中的值
3、IPC_RMID ,删除共享内存段

第三个参数buf,用于获取或设置所控制共享内存的数据结构

代码:两个进程之间通信,使用共享内存和管道

共享内存与管道

管道通信:
在这里插入图片描述
将一个文件从一个进程传输到另一个进程需要进行四次拷贝操作

1、server将信息从输入文件复制到server的临时缓冲区中。
2、将server临时缓冲区的信息复制到管道中。
3、client将信息从管道复制到client的缓冲区中。
4、将client临时缓冲区的信息复制到输出文件中。

使用共享内存进行通信,将一个文件从client传输到server只需要进行两次拷贝操作
1、从输入文件到共享内存。
2、从共享内存到输出文件。

优:共享内存是所有进程间通信方式中最快的一种通信方式,因为该通信方式需要进行的拷贝次数最少
缺:管道是自带同步与互斥机制的,但是共享内存并没有提供任何的保护机制,包括同步与互斥。

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

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

相关文章

PGCCC|【PostgreSQL】PCA认证考试大纲#postgresql认证

PostgreSQL Certified Associate|PCA(初级) 学员将学会安装、创建和维护PostgreSQL数据库。学完后,学员可以从事PostgreSQL数据库的数据操作和管理等工作。 获证途径 参加PostgreSQL培训再考试 考试为上机考试。 PostgreSQL PCA培训考试课…

【嵌入式Linux】<知识点> GDB调试(更新中)

文章目录 前言 一、GDB调试预备工作 二、GDB的启动与退出 三、GDB中查看源代码 四、GDB断点操作 五、GDB调试指令 前言 在专栏【嵌入式Linux】应用开发篇_Linux打工仔的博客中,我们已经写了大量的源程序。但是在调试这些程序时我们都是通过printf大法和肉眼除…

网络(一)——初始网络

文章目录 计算机网络的背景网络发展认识 "协议" 网络协议初识协议分层网络分层 网络传输基本流程数据包封装和分用网络中的地址管理认识IP地址认识MAC地址 计算机网络的背景 网络发展 独立模式:计算机之间相互独立 在最早的时候,计算机之间是相互独立的&…

【启明智显分享】乐鑫HMI方案4.3寸触摸串口屏应用于称重测力控制仪表

称重测力控制仪表是将称重传感器信号(或再通过重量变送器)转换为重量数字显示,并可对重量数据进行传输、储存、统计、打印的电子设备,常用于工农业生产中的自动化配料,称重,以提高生产效率。随着工业化的发…

Oracle11g_RAC for vmware workstation 安装教程(on suse11)

一、前言 本文介绍在vmware workstation环境下,基于suse11sp1操作系统安装Oracle11g RACASM 数据库(两节点)。 1.1 RAC中的基本概念 安装ORACLE RACASM前,您可能需要事先简要的了解RAC,CRS,ASM的概念。 1.1…

【Linux】01.Linux 的常见指令

1. ls 指令 语法:ls [选项] [目录名或文件名] 功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息 常用选项: -a:列出当前目录下的所有文件,包含隐藏文件…

java 实验一:Java集成开发环境的搭建

一、实验目的 1、掌握Java集成开发环境的搭建方式,重点掌握JDK/Eclipse的安装,同时熟悉开发环境的使用; 2、重点掌握JDK/Eclipse的安装,同时熟悉开发环境的使用; 3、会使用输出语句在命令行输出信息; 4…

智能合约和分布式应用管理系统:技术革新与未来展望

引言 随着区块链技术的不断发展,智能合约和分布式应用(DApps)逐渐成为数字经济中的重要组成部分。智能合约是一种自执行的协议,能够在预设条件满足时自动执行代码,而无需人工干预或中介机构。这种自动化和信任机制极大…

学习网络的第一步:全面解析OSI与TCP/IP模型

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! Hello,大家好!我是你们的好朋友小米。今天我们来聊一聊网络基础知识中的重量级选手——OSI模型和TCP/IP模型!网络的世界就像一个巨大的迷宫,而这两个…

Hadoop简明教程

文章目录 关于HadoopHadoop拓扑结构Namenode 和 Datanode 基本管理启动Hadoop启动YARN验证Hadoop服务停止Hadoop停止HDFS Hadoop集群搭建步骤准备阶段Java环境配置Hadoop安装与配置HDFS格式化与启动服务测试集群安装额外组件监控与维护: 使用Docker搭建集群使用Hado…

SQL构造一个触发器audit_log

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 构造一个触发…

华为如何做成数字化转型?

目录 企业数字化转型是什么? 华为如何定义数字化转型? 为什么做数字化转型? 怎么做数字化转型? 华为IPD的最佳实践之“金蝶云” 企业数字化转型是什么? 先看一下案例,华为经历了多次战略转型&#xf…

Python数据分析-乳腺癌诊断分析预测

一、研究背景 乳腺癌是全球女性中最常见的癌症之一,发病率和死亡率都处于较高水平。据世界卫生组织(WHO)统计,乳腺癌每年造成数百万女性的死亡,并且其发病率在许多国家呈上升趋势。乳腺癌的早期诊断对于提高患者的生存…

气膜仓储与传统仓储的成本优势对比—轻空间

随着物流和仓储需求的不断增长,企业对仓储设施的要求也日益提高。传统仓储设施虽然具有一定的优势,但在建设和运营成本上往往较高。近年来,气膜仓储作为一种新型仓储方式,以其独特的优势逐渐受到市场青睐。轻空间将详细探讨气膜仓…

小程序创建与项目初始化(构建 npm + 集成 Sass)

一、打开微信开发者工具 确认 左侧导航栏是否选中的 小程序点击 【】创建小程序 二、创建小程序 三、初始化 清空 app.wxss、app.js 去掉 rendererOptions 和 componentFramework 不需要最新的搜索引擎 留下以下文件 四、自定义构建 npm 集成 Sass 首先 先把小程序源…

如何使用Python正则表达式解析多行文本

使用 Python 的正则表达式来解析多行文本通常涉及到使用多行模式(re.MULTILINE)和 re.DOTALL 标志,以及适当的正则表达式模式来匹配你想要提取或处理的文本块。以下是一个简单的示例,展示了如何处理多行文本: 1、问题背…

maven编码报错

maven 编译的时候编码报错: classworlds For input string: "ㄻ孛孛"报错原因: maven 编码使用的是UTF-16 ,系统中使用UFT-8 解决办法: 如下设置为UTF-8

SSM社区物业管理系统-计算机毕业设计源码91276

摘要 随着城市化进程的加快,居民社区的规模和数量不断增长,传统的人工管理方式已经无法满足管理需求。借助信息技术和互联网应用,社区物业管理系统可以实现物业管理信息的集中化、自动化和便捷化,提供全方位的管理和服务支持。社区…

PostgreSQL17索引优化之支持并行创建BRIN索引

PostgreSQL17索引优化之支持并行创建BRIN索引 最近连续写了几篇关于PostgreSQL17优化器改进的文章,其实感觉还是挺有压力的。对于原理性的知识点,一方面是对这些新功能也不熟悉,为了尽可能对于知识点表述或总结做到准确,因此需要…

Linux之文件fd

个人主页:点我进入主页 专栏分类:C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 C进阶​ ​​​​算法 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂 目录 一.文件内容的回顾 二.提炼一下对文件的…