【Linux初阶】system V - 共享内存

文章目录

  • 前言
  • 一、共享内存初识
    • 1.共享内存的原理
    • 2.理解共享内存
    • 3.共享的内存的概念
  • 二、共享内存函数
    • 1.shmget函数
    • 2.shmat函数
    • 3.shmdt函数
    • 4.shmctl函数
  • 三、共享内存的查看方法及其特征
  • 四、共享内存的代码实现
  • 五、共享内存优缺点分析
    • 1.共享内存的优点
    • 2.共享内存的缺点
  • 六、共享内存内核数据结构理解
  • 结语


前言

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


一、共享内存初识

1.共享内存的原理

在物理内存中申请一块空间,将创建好的内存映射进进程的地址空间中,然后将地址空间这块区域的起始地址返回给上层用户,用户最终可以通过访问起始地址的方式实现对内存的访问。

照猫画虎,同样的一块内存空间可以映射进另一个进程的地址空间中,返回起始地址给用户,另一个进程的上层用户也可以实现的同一块内存的访问,最终实现进程间通信。

未来不想通信:a.取消进程和内存的映射关系; b.释放内存。

在这里插入图片描述

这一块被进程共享的内存称为 共享内存。将创建好的进程映射进进程的地址空间,我们称这个步骤为进程和共享内存挂接。而取消进程与共享内存的映射我们称之为 去关联

———— 我是一条知识分割线 ————

2.理解共享内存

  1. system V - 共享内存版本的进程间通信,是专门设计的,用于IPC(进程间通信)。
  2. 共享内存是一种通信方式,所有想通信的进程,都可以使用。
  3. OS中一定会同时存在很多的共享内存。

3.共享的内存的概念

通过让不同进程,看到同一个内存块的方式,我们就称之为:共享内存


二、共享内存函数

常识补充:shm - 共享内存

1.shmget函数

功能:用来创建共享内存
原型int shmget(key_t key, size_t size, int shmflg);
参数key:这个共享内存段名字size:共享内存大小shmflg:由九个权限标志构成,它们的用法和创建文件时使用的mode模式标志是一样的
返回值:成功返回一个非负整数,即该共享内存段的标识码;失败返回-1
  • key能进行共享内存的唯一性标识,它是由 ftok() 函数得来的。
  • shmflg常见参数有两个:IPC_CREAT、IPC_EXCL。
  • IPC_CREAT- 如果不存在,创建之,如果存在,获取之。
  • IPC_EXC - 无法单独使用,使用方法: IPC_CREAT | IPC_EXC, 如果不存在,创建之,如果存在,就返回出错(说明:如果创建成功,一定是新的ssh)

共享内存 = 物理内存块 + 共享内存的相关属性,我们在申请共享内存的时候,也要对共享内存做管理,管理方法:将共享内存的属性对象用数据结构(struct shmid_ds)的方式管理起来

注意:key的信息会被 shmget函数设置进共享内存的属性对象中保存起来

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
  • cmd的三个可取值

在这里插入图片描述


三、共享内存的查看方法及其特征

  • 共享内存的命令行式查看方法
ipcs -m		#查看被用户使用的共享内存
ipcrm -m shmip	  #删除特定shmip的共享内存

共享内存的特征:共享内存的生命周期是跟随OS的,不是跟随进程的。也就是说,我们需要在指令行下对自己创建的用户级共享内存进行手动删除


四、共享内存的代码实现


五、共享内存优缺点分析

1.共享内存的优点

优点:在所有进程间通信的方法中,共享内存的速度是最快的

如果使用管道,用户拷贝 6次,键盘的输入数据 -> 语言级缓冲区 -> 进程对应的文件缓冲区 -> 管道 -> 另一个进程对应的文件缓冲区 -> 语言级缓冲区 -> 屏幕。

如果使用共享内存,用户拷贝 4次,键盘的输入数据 -> 语言级缓冲区 -> 共享内存 -> 语言级缓冲区 -> 屏幕。

我们知道,在企业的数据通信中,数据往往非常庞大,此时使用共享内存可以大大降低拷贝次数

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

在上文中我们就曾学习过,在内核层面上,为了帮助不同的进程能找到同一块共享内存,我们有 key存在于共享内存的数据结构对象中,它可以让不同进程确定是否看到的是同一块共享内存

此时问题来了,为什么我没有在你的数据结构中找到 key的信息呢?事实上,我们看不到 key,是因为设计者对其做了相应的封装,它就被保存在了下面这个结构体中:

 struct ipc_perm shm_perm; /* operation perms */

在这里插入图片描述

程序获取共享内存部分数据结构展示:

	printf("获取属性: size: %d, pid: %d, myself: %d, key: 0x%x", \ds.shm_segsz, ds.shm_cpid, getpid(), ds.shm_perm.__key);

输出结果如下:

在这里插入图片描述


结语

🌹🌹 system V - 共享内存 的知识大概就讲到这里啦,博主后续会继续更新更多C++ 和 Linux的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!你们的支持是博主坚持创作的动力!💪💪

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

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

相关文章

JavaWeb中Json传参的条件

JavaWeb中我们常用json进行参数传递 对应的注释为RequestBody 但是json传参是有条件的 最主要是你指定的实体类和对应的json参数能否匹配 1.属性和对应的json参数名称对应 2.对应实体类实现了Serializable接口,可以进行序列化和反序列化,这个才是实体类转…

Java课题笔记~ Request请求

1.请求消息格式 客户端发送一个HTTP请求到服务器的请求消息包括以下格式: 请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。下图给出了请求报文的一般格式。 GET请求: POST请求&am…

RTT(RT-Thread)IO设备模型

目录 IO设备模型 模型框架原理 IO设备类型 创建和注册IO设备 RTT设备管理程序实现原理 访问IO设备 查找设备 初始化设备 打开设备 关闭设备 控制设备 读写设备 数据收发回调 数据接收回调 数据发送回调 设备模型实例 IO设备模型 RT-Thread 提供了一套简单的 I/O …

OptaPlanner笔记6 N皇后

N 个皇后 问题描述 将n个皇后放在n大小的棋盘上,没有两个皇后可以互相攻击。 最常见的 n 个皇后谜题是八个皇后谜题,n 8: 约束: 使用 n 列和 n 行的棋盘。在棋盘上放置n个皇后。没有两个女王可以互相攻击。女王可以攻击同一水…

机器人CPP编程基础-04输入Input

机器人CPP编程基础-03变量类型Variables Types ……AI…… C #include<iostream> // 引入iostream库&#xff0c;这个库包含了对输入/输出进行操作所需的函数和对象 using namespace std; // 使用命名空间std&#xff0c;这样我们就可以直接使用std中的名字&#xff0c…

(二)结构型模式:1、适配器模式(Adapter Pattern)(C++实现示例)

目录 1、适配器模式&#xff08;Adapter Pattern&#xff09;含义 2、适配器模式应用场景 3、适配器模式的UML图学习 4、C实现适配器模式的示例 1、适配器模式&#xff08;Adapter Pattern&#xff09;含义 将一个接口转换为客户端所期待的接口&#xff0c;从而使两个接口…

树和二叉树 --- 数据结构

目录 1.树的概念及结构 1.1树的概念 1.2树的表示 1.3树在实际生活中的运用 2.二叉树的概念及结构 2.1概念 2.2特殊的二叉树 2.3二叉树的性质 2.4二叉树的存储结构 1.树的概念及结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n (n>0)个有限结点组成…

【server组件】——mysql连接池的实现原理

目录 1.池化技术 2.数据库连接池的定义 3.为什么要使用连接池 4. 数据库连接池的运行机制 5. 连接池与线程池的关系 6. CResultSet的设计 6.1构造函数 7. CDBConn的设计 6.1.构造函数 6.2.init——初始化连接 8.数据库连接池的设计要点 9.接口设计 9.1 构造函数 …

【LeetCode】617.合并二叉树

题目 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另一些不会&#xff09;。你需要将这两棵树合并成一棵新二叉树。合并的规则是&#xff1a;如果两个节点重叠…

Azure资源命名和标记决策指南

参考 azure创建虚拟机在虚拟机中选择编辑标签&#xff0c;并添加标记&#xff0c;点击应用 3.到主页中转到所有资源 4. 添加筛选器并应用 5.查看结果&#xff0c;筛选根据给服务器定义的标签筛选出结果。 参考链接: https://learn.microsoft.com/zh-cn/azure/cloud-adoption…

【ArcGIS】经纬度数据转化成平面坐标数据

将点位置导入Gis中&#xff0c;如下&#xff08;经纬度表征位置&#xff09;&#xff1a; 如何利用Gis将其转化为平面坐标呢&#xff1f; Step1 坐标变换 坐标变换&#xff0c;打开ArcToolbox&#xff0c;找到“数据管理工具”->“投影和变换”->“要素”->“投影”…

JZ33二叉搜索树的后序遍历序列

题目地址&#xff1a;二叉搜索树的后序遍历序列_牛客题霸_牛客网 题目回顾&#xff1a; 解题思路&#xff1a; 使用栈 栈的特点是&#xff1a;先进后出。 通读题目后&#xff0c;我们可以得出&#xff0c;二叉搜索树是左子节点小于根节点&#xff0c;右子节点大于根节点。 …

【Tomcat】(Tomcat 下载Tomcat 启动Tomcat 简单部署 基于Tomcat进行网站后端开发)

文章目录 Tomcat下载Tomcat启动Tomcat简单部署 基于Tomcat进行网站后端开发 Tomcat Tomcat 是一个 HTTP 服务器.HTTP 协议就是 HTTP 客户端和 HTTP 服务器之间的交互数据的格式. HTTP 服务器我们可以通过 Java Socket 来实现. 而 Tomcat 就是基于 Java 实现的一个开源免费,也是…

CNN的特性

1、位移不变性 它指的是无论物体在图像中的什么位置&#xff0c;卷积神经网络的识别结果都应该是一样的。 因为CNN就是利用一个kernel在整张图像上不断步进来完成卷积操作的&#xff0c;而且在这个过程中kernel的参数是共享的。换句话说&#xff0c;它其实就是拿了同一张“通…

数据结构:选择排序

简单选择排序 选择排序是一种简单直观的排序算法。首先在未排序序列中找到最大&#xff08;最小&#xff09;的元素&#xff0c;存放到排序学列的其实位置&#xff0c;然后在剩余的未排序的元素中寻找最小&#xff08;最大&#xff09;元素&#xff0c;存放在已排序序列的后面…

cmake扩展(1)——VS+CMake创建Qt项目

创建项目 创建CMakeLists #cmake最低版本 cmake_minimum_required(VERSION 3.10) #项目名 project(regextool)#查找所有*.h,*.ui,*.cpp文件&#xff0c;并存入SOURCES中 file(GLOB SOURCES "*.cpp" "*.ui" "*.h")#开启moc set(CMAKE_AUTOMOC O…

计算机视觉中的特征检测和描述

一、说明 这篇文章是关于计算机视觉中特征检测和描述概念的简要理解。在其中&#xff0c;我们探讨了它们的定义、常用技术、简单的 python 实现和一些限制。 二、什么是特征检测和描述&#xff1f; 特征检测和描述是计算机视觉中的基本概念&#xff0c;在图像识别、对象跟踪和图…

Opencv特征检测之ORB算法原理及应用详解

Opencv特征检测之ORB算法原理及应用详解 特征是图像信息的另一种数字表达形式。一组好的特征对于在指定 任务上的最终表现至关重要。视觉里程 &#xff08;VO&#xff09; 的主要问题是如何根据图像特征来估计相机运动。但是&#xff0c;整幅图像用来计算分析通常比较耗时&…

机器学习终极指南:特征工程(02/2) — 第 -2 部分

接上文&#xff1a;机器学习终极指南&#xff1a;特征工程&#xff08;01/2&#xff09; 五、处理不平衡数据 处理不平衡的数据是机器学习的一个重要方面。不平衡数据是指目标变量的分布不均匀&#xff0c;并且与另一个类相比&#xff0c;一个类的代表性不足。这可能导致模型…

[内网渗透]CFS三层靶机渗透

文章目录 [内网渗透]CFS三层靶机渗透网络拓扑图靶机搭建Target10x01.nmap主机探活0x02.端口扫描0x03.ThinkPHP5 RCE漏洞拿shell0x04.上传msf后门(reverse_tcp)反向连接拿主机权限 内网渗透Target2&#xff08;1&#xff09;路由信息探测&#xff08;2&#xff09;msf代理配置&a…