system V共享内存【Linux】

文章目录

  • 原理
  • 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值,然后才能找到同一个共享资源

显示系统中正在使用的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.mzph.cn/web/44063.shtml

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

相关文章

详解Redis:什么是Redis?

什么是Redis? Redis(Remote Dictionary Server)是一种开源的、高性能的、基于内存快速读写的的数据结构存储系统,常用于缓存,分布式锁等场景; Redis常用数据类型有哪些? String(字符串) 适用场景…

Qt中实现让静态图片动起来,创建动画效果

在现代应用程序开发中,动画效果是提升用户体验的重要元素之一。Qt作为一个强大的跨平台应用程序框架,提供了丰富的工具和库来创建各种动画效果。本文将介绍如何在Qt中使用静态图片创建动画效果。 实现方法一 使用QTimer和QPixmap 1.准备图片资源&#…

Qt图形与图片(Qt位置相关函数、Qt基础图形的绘制、双缓冲机制、显示SVG格式图片)

此篇文章介绍几种主要位置函数及其之间的区别,以及各种与位置相关函数的使用场合;然后,通过一个简单绘图工具实例,介绍利用QPainter和QPainterPath两种方法绘制各种基础图形;最后,通过几个实例介绍如何利用…

暑假自律日记十

7.11 (半小时日记打卡之——暑假第十天) 日程 8.30起床 9.20到达逸夫楼开始总结区间DP,上午完成了区间DP和四边形优化部分的学习 下午组队打了一场去年的牛客多校,压力有点大,问题也有点多,总而言之&…

GD32F303RET6读取SGM58031电压值

1、SGM58031芯片详解 (1)SGM58031是一款低功耗,16位精度,delta-sigma (ΔΣ)模数转换器(ADC)。它从3V到5.5V供电。 (2)SGM58031包含一个片上参考和振荡器。它有一个I2C兼容接口,可以选择四个I2…

深入Memcached键值对限制:优化存储策略

标题:深入Memcached键值对限制:优化存储策略 Memcached作为一种广泛使用的高性能分布式内存缓存系统,对键值对的大小有特定的限制。这些限制不仅关系到缓存效率,还直接影响到缓存数据的组织和内存的使用。本文将深入探讨Memcache…

【RHCE】系统服务综合实验

一、实验内容 现有主机 node01 和 node02,完成如下需求: 1、在 node01 主机上提供 DNS 和 WEB 服务 2、dns 服务提供本实验所有主机名解析 3、web服务提供 www.rhce.com 虚拟主机 4、该虚拟主机的documentroot目录在 /nfs/rhce 目录 5、该目录由 node02…

Python | Leetcode Python题解之第229题多数元素II

题目: 题解: class Solution:def majorityElement(self, nums: List[int]) -> List[int]:cnt {}ans []for v in nums:if v in cnt:cnt[v] 1else:cnt[v] 1for item in cnt.keys():if cnt[item] > len(nums)//3:ans.append(item)return ans

【conda】解决 An HTTP error occurred when trying to retrieve this URL.问题

1. 修改SSL验证 如果其他方法无效,还可以尝试关闭SSL验证来解决问题。具体操作如下: 在终端中输入以下命令,关闭SSL验证: conda config --set ssl_verify false或者,在conda的配置文件(.condarc&#xff0…

为什么渲染农场渲染的是帧,而不是视频?

在3D动画产业的壮阔画卷中,渲染农场作为幕后英雄,以其庞大的计算能力支撑起无数视觉奇观的诞生。这些由高性能计算机集群构成的系统,通过独特的逐帧渲染策略,解锁了单机难以企及的创作自由与效率。本文将深入剖析这一策略背后的逻…

maven7——(重要,构建项目)maven项目构建(命令)

Maven的常用命令管理项目的生命周期 clean命令 清除编译产生的target文件夹内容,可以配合相应命令在cmd中使用,如mvn clean package, mvn clean test D:\工作\公司培训-4班\day20\day20\untitled1>mvn clean compile命令 该命令可以…

element如何实现自定义表头?

有时候我们需要实现自定义表头,例如表头里加按钮啥的,这时候就需要用到自定义表头,但是官方对自定义表头的使用写的还是比较简单,今天就来详细说说 在需要使用自定义表头的表头上使用:render-header来启用自定义表头: <el-table-column :render-header="button&…

机器学习开源分子生成系列(2)-基于三维形状和静电相似性的DeepFMPO v3D安装及使用

前言 本文是基于 3D 的分子生成方法DeepFMPO v3D的介绍及安装使用。 一、DeepFMPO v3D是什么&#xff1f; github代码介绍文章 在药物发现中&#xff0c;如何寻找具新颖性和结构多样性的候选分子是颇受药物设计科学家关注的问题。通过虚拟筛选的化学空间搜索往往会受限于筛选…

Linux账户和组管理——用户密码文件,工作组账号文件,用户管理

#### 用户密码文件 - /etc/shadow存储密码加密后的密文&#xff0c;又称为“影子文件”&#xff0c;该文件为了保证了账户密码的安全性只有 root 账户拥有读权限&#xff0c;注意&#xff1a;若该文件权限发生变化&#xff0c;需要留心恶意攻击 bash [rootserver ~]# ll /etc/…

linux之栈溢出分析

我们来创建一个例子&#xff0c;其中包含一个段错误&#xff0c;这次是由于栈溢出导致的。这是一个常见的错误&#xff0c;通常发生在程序递归调用深度过大&#xff0c;超出了为栈分配的内存空间。 下面是一个简单的C程序&#xff0c;stack_overflow_example.c&#xff0c;它通…

优化与改进之轻量级Transformer - Transformer教程

在自然语言处理&#xff08;NLP&#xff09;的世界里&#xff0c;Transformer模型无疑是一颗璀璨的明珠。自从它在2017年被提出以来&#xff0c;就凭借其强大的性能和优雅的设计赢得了广泛的关注和应用。然而&#xff0c;随着应用的深入&#xff0c;Transformer的体量和计算资源…

牛顿力学和拉格朗日力学求解atwood machine问题对比

一个半径为 R R R、转动惯量为 I I I 的圆盘。绳子与圆盘无滑动&#xff0c;质量 m 2 m_2 m2​ 的物体在重力 g g g 作用下下坠&#xff0c;带动质量 m 1 m_1 m1​ 的物体上升。求 m 1 m_1 m1​和 m 2 m_2 m2​ 的加速度 a a a。 牛顿力学方法 对质量 m 1 m_1 m1​ 和 …

Web 性能入门指南-1.2 分析在线零售 Web 性能及优化方向

让顾客满意是零售业成功的秘诀。事实证明&#xff0c;提供快速、一致的在线体验可以显著提高零售商关心的每项指标——从转化率和收入到留存率和品牌认知度。 本文大纲&#xff1a; 页面速度影响在线零售业务数据 如何将您的网站速度与竞争对手进行比较 性能优化入门&#xf…

Scanner工具类

扫描控制台输入 1.nextLine nextLine() 方法会扫描输入流中的字符&#xff0c;直到遇到行末尾的换行符 \n&#xff0c;然后将该行的内容作为字符串返回&#xff0c;同时&#xff0c;nextLine() 会将 Scanner 对象的位置移动到下一行的开头&#xff0c;以便下一次读取数据时从下…

代码随想录day09 151.翻转字符串里的单词 、卡码网:55.右旋转字符串

代码随想录day09 151.翻转字符串里的单词 、卡码网&#xff1a;55.右旋转字符串 151. 反转字符串中的单词 这题我直接想到的是istringstream 和 stack 但不知道这样使用是不是违反了规定 class Solution { public:string reverseWords(string s) {istringstream iss(s);stri…