十三、共享内存

news2024/12/24 11:02:18

文章目录

  • 一、什么是共享内存
    • (一)共享内存的定义
    • (二)共享内存的原理
    • (三)共享内存的理解
  • 二、为什么要有共享内存
  • 三、共享内存怎么进行
    • (一) 共享内存的数据结构
    • (二)共享内存的函数
      • 1.shmget函数
      • 2.shmat函数
      • 3.shmdt函数
      • 4.shmctl函数
  • 四、共享内存例子——代码
  • 五、共享内存的优缺点
    • (一)优点
    • (二)缺点

一、什么是共享内存

(一)共享内存的定义

  • 共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。

  • 共享内存是一种用于实现进程间通信(IPC)的方法,不同进程通过访问同一块内存区域实现数据共享和交互。每个进程可以将自身的虚拟地址映射到物理内存中的特定区域,当不同进程将相同的物理内存区域与各自的虚拟地址空间关联时,这些进程就能实现通过共享内存来完成IPC。若某进程更改了共享内存区的内容,其它进程都会觉察到该区域的更改。

(二)共享内存的原理

进程间通信的本质——不同的进程看到同一份资源

每个进程有自己的进程控制块和地址空间,且都有一个与之对应的页表,负责将进程的虚拟地址与物理地址进行映射,通过内存管理单元(MMU)进行管理。两个不同的虚拟地址通过页表映射到物理空间的同一区域,它们所指向的这块区域即共享内存。

(三)共享内存的理解

  • 进程间通信是专门设计的,用来ipc
  • 共享内存是一种通信方式,所有想通信的人都可以用
  • 系统中一定会同时存在许多的共享内存

在这里插入图片描述

二、为什么要有共享内存

通过让不同的进程,看到同一个进程内存的方式。

三、共享内存怎么进行

(一) 共享内存的数据结构

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 */
};

(二)共享内存的函数

1.shmget函数

功能:用来创建共享内存
原型 int shmget(key_t key, size_t size, int shmflg);
参数:
key:这个共享内存段名字 size:共享内存大小
shmflg:由九个权限标志构成,它们的用法和创建文件时使用的mode模式标志是一样的
返回值:成功返回一个非负整数,即该共享内存段的标识码;失败返回-1

2.shmat函数

功能:将共享内存段连接到进程地址空间
原型 void *shmat(int shmid, const void *shmaddr, int
shmflg);
参数 :
shmid: 共享内存标识 shmaddr:指定连接的地址
shmflg:它的两个可能取值是SHM_RND和SHM_RDONLY 返回值:成功返回一个指针,指向共享内存第一个节;失败返回-1

注意:
shmaddr为NULL,核心自动选择一个地址
shmaddr不为NULL且shmflg无SHM_RND标记,则以shmaddr为连接地址。
shmaddr不为NULL且shmflg设置了SHM_RND标记,则连接的地址会自动向下调整为SHMLBA的整数倍。公式:shmaddr -
(shmaddr % SHMLBA) shmflg=SHM_RDONLY,表示连接操作用来只读共享内存

3.shmdt函数

功能:将共享内存段与当前进程脱离
原型:
int shmdt(const void *shmaddr);
参数
shmaddr: 由shmat所返回的指针 返回值:成功返回0;失败返回-1

注意:
将共享内存段与当前进程脱离不等于删除共享内存段

4.shmctl函数

功能:用于控制共享内存
原型:
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
参数:
shmid:由shmget返回的共享内存标识码 cmd:将要采取的动作(有三个可取值)
buf:指向一个保存着共享内存的模式状态和访问权限的数据结构 返回值:成功返回0;失败返回-1
在这里插入图片描述

四、共享内存例子——代码

五、共享内存的优缺点

(一)优点

所以共享内存是所有进程间通信方式中最快的一种通信方式,因为该通信方式需要进行的拷贝次数最少。

(二)缺点

但是共享内存也是有缺点的,我们知道管道是自带同步与互斥机制的,但是共享内存并没有提供任何的保护机制,包括同步与互斥。

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

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

相关文章

【Redis系列】Redis布隆过滤之8亿大数据集实战

序言 即便平凡的日子仿佛毫无波澜,但在某个特定的时刻,执着的努力便会显现出它的价值和意义。 文章标记颜色说明: 黄色:重要标题红色:用来标记结论绿色:用来标记一级重要蓝色:用来标记二级重要 …

SPC Control Chart Tools for WPF 3.1 Crack

使用 WPF 的 SPC 控制图工具,将变量控制图(X-Bar R、X-Bar Sigma、单个范围、中值范围、EWMA、MA、MAMR、MAMS 和 CuSum 控制图)、属性控制图(p、np、c、u 和 DPMO 控制图)、频率直方图和帕累托图添加到 WPF 和 WPF We…

物理机:显卡3080 环境Centos7.9 如何检查及安装显卡驱动

环境: 硬件服务器:I5处理器, 显卡:3080 12G 等。 目标: 测试是否安装显卡。 如何找到正确的驱动版本。 安装显卡正确的显卡驱动。 一、检查是否正确安装显卡: # 检查使用什么型号的显卡: yum…

淄博烧烤,怎么就“出圈”了-也是机器视觉行业职场中的态度:少一点套路,多一些真诚,少一点计较,多一些宽容

我认为淄博烧烤之所以火爆,是因为它代表了一种淄博人的态度,一种对生活的热爱和对客人的真诚。 我认为淄博烧烤之所以火爆,是因为它代表了一种淄博人的态度,一种对生活的热爱和对客人的真诚。 我想更重要的一点,淄博烧…

使用NineData定制企业级数据库规范

1. 为什么需要数据库规范? 在企业级应用中,数据库是非常重要的一部分,它们存储着公司的核心数据,包括客户信息、订单、产品信息等等。如果这些数据没有得到妥善的管理,那么就会导致数据不一致、数据丢失、数据泄露等问…

涨知识!细数银行卡三要素 API 的 N 种验证方法

引言 银行卡三要素验证 API 是一种基于姓名、身份证号码和银行卡号等三种信息的验证服务,主要用于绑定银行卡时校验银行卡是否为该身份信息所有、手机号是否为银行卡绑定手机号。 银行卡三要素 API 的验证方法 银行卡三要素 API 的验证原理是通过与银行或银联网络…

k8s二进制搭建|ETCD + Flannel | 单节点部署 | 多节点的部署|dashbord的部署

k8s二进制搭建|ETCD Flannel | 单节点部署 | 多节点的部署|dashbord的部署 二进制搭建 Kubernetes v1.201 初始化环境2 部署 docker引擎3 在mster 192.168.10.10上操作4 在 node01 192.168.10.20节点上操作5 在 node02 192.168.10.30节点上操作6 检查etcd群集状态7 部署 Maste…

SpringBoot——入门程序的简单介绍

简单介绍: 在之前我们创建了一个基础的SpringBoot的程序,可以看到,我们只是启动了一个Java程序,但是它启动了一个Tomcat的服务器。其实在这里面他还启动了很多的服务,只不过这些服务我们都没有用到,我们就…

基于氢储能的热电联供型微电网优化调度方法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【Slack+Claude保姆级安装教程】

🚀 AI破局先行者 🚀 🌲 AI工具、AI绘图、AI专栏 🍀 🌲 如果你想学到最前沿、最火爆的技术,赶快加入吧✨ 🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆&am…

探究问答系统的实现原理及其应用

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

clickhouse的嵌套数据结构Tuple、Array与Nested类型介绍和使用示例

文章目录 Tuple类型Array类型Nested类型使用示例单独使用Tuple数组嵌套 Array(Tuple)Nested类型 生产使用:分组查询 Tuple类型 Tuple是ClickHouse数据库中的一种数据类型,它允许在一个字段中存储由不同数据类型组成的元组(tuple)。元组可以包含任意数量…

RFID技术在智能制造领域的发展

RFID技术在智能制造领域的发展 RFID技术是构建智能制造的基础,自RFID技术普及以来,工业产线、零售、物流、交通、医疗、制造等领域,都能看到到RFID应用的身影。就智能制造领域来说,通过RFID技术可以帮助制造企业开展各项市场需求…

shell函数数组

shell函数数组 数组的表达方式 (30 20 10 60 50 40) #数组0 1 2 3 4 5 #下标下标从0开始,中间可以断开 一: 数组的定义方法 方法一 数组名(value0 value1 value2 ...)方法二 数组名&#xff08…

网络路径下倾斜模型生产流程-模型s3c化

网络路径下倾斜模型生产流程-模型s3c化 将osgb模型处理文件拷贝到osgb模型文件夹下 在osgb模型文件夹下,新建与工程同名文件夹,然后将原文件夹下所有文件拷贝到YNPE27文件夹下, E:\YNPE27\CC\YNPE27\Productions\Production_2\YNPE27 打开o…

Python3,5行代码,Chatxxx能对PDF文件进行旋转、提取、合并等一系列操作,看了这篇,80岁老奶奶走路都不扶墙了。

ChatPDF的妙用 1、引言2、代码实战2.1 原理2.2 安装2.2 示例2.2.1 创建PDF文件2.2.2 旋转PDF文件2.2.3 拆分PDF文件2.2.4 合并PDF文件2.2.5 提取PDF文件内容 3、总结 1、引言 小屌丝:鱼哥,最近干啥了? 小鱼:最近? 你指…

基于MATLAB的无人机遥感数据预处理与农林植被性状估算

在新一轮互联网信息技术大发展的现今,无人机、大数据、人工智能、物联网等新兴技术在各行各业都处于大爆发的前夜。为了将人工智能方法引入农业生产领域。首先在种植、养护等生产作业环节,逐步摆脱人力依赖;在施肥灌溉环节构建智慧节能系统&a…

如何使用CSDN的Markdown编辑器?

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

【C++的类与对象(下)】

目录 一、细说构造函数1.1初始化列表的引入1.2初始化列表1.2关键字explicit 二、static成员2.1static成员的特性2.2题目:实现一个类,计算程序中创建出了多少个类对象2.3题目:设计一个类 只能再栈上或者堆上创建 一、细说构造函数 1.1初始化列…

【A、B、C、D、E类IP地址划分依据,你都会吗?】

IP 地址的格式:IP 地址 网络地址 主机地址 如果 IP 进行了子网划分: 则IP地址网络地址子网地址主机地址 网络地址是互联网上的节点在网络中具有的逻辑地址。MAC 地址,处于数据链 路层,IP 地址处于网络层,端口号处…