linux应用开发基础知识(八)——内存共享(mmap和system V)

mmap内存映射

内存共享定义

内存映射,简而言之就是将用户空间的一段内存区域映射到内核空间,映射成功后,用户对这段内存区域的修改可以直接反映到内核空间,同样,内核空间对这段区域的修改也直接反映用户空间。那么对于内核空间<---->用户空间两者之间需要大量数据传输等操作的话效率是非常高的。

以下是一个把普遍文件映射到用户空间的内存区域的示意图
在这里插入图片描述

mmap内存映射方法

mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。
实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段虚拟内存,而系统会自动回写到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。
相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。如下图所示:
在这里插入图片描述

void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);

参数说明:
参数start:指向欲映射的内存起始地址,通常设为 NULL,代表让系统自动选定地址,映射成功后返回该地址。
参数length:代表将文件中多大的部分映射到内存。
参数prot:映射区域的保护方式。可以为以下几种方式的组合:

PROT_READ(可读)
PROT_WRITE(可写)
PROT_EXEC(可执行)
PROT_NONE(不可访问)

参数flags:由以下几个常值指定:

MAP_SHARED(共享的)
MAP_PRIVATE(私有的)
MAP_FIXED(表示必须使用 start 参数作为开始地址,如果失败不进行修正)
其中,MAP_SHARED , MAP_PRIVATE必选其一,而 MAP_FIXED 则不推荐使用。MAP_ANONYMOUS(匿名映射,用于血缘关系进程间通信)

参数fd:表示要映射的文件句柄。如果匿名映射写-1。
参数offset:表示映射文件的偏移量,一般设置为 0 表示从文件头部开始映射。offset必须是分页大小的整数倍(一般是4096的整数倍)。

写共享文件

#include"stdio.h"
#include"unistd.h"
#include"string.h"
#include"fcntl.h"
#include"sys/mman.h"
#include"sys/stat.h"
#include"stdlib.h"
#include"sys/types.h"
int main(int agrc,char* agrv[])
{int len;int fd;void* map;fd = open("1.txt",O_RDWR);if(fd<0){perror("open");return -1;}len = lseek(fd, 0, SEEK_END); printf("%d\n",len);map = mmap(NULL,len,PROT_WRITE,MAP_SHARED,fd,0);if(map == MAP_FAILED){perror("mmap");return -1;}for(int i=0;i<5;i++){memcpy(map++, "b", 1);}return 0;
}

读共享文件

#include"stdio.h"
#include"unistd.h"
#include"string.h"
#include"fcntl.h"
#include"sys/mman.h"
#include"sys/stat.h"
#include"stdlib.h"
#include"sys/types.h"
int main(int agrc,char* agrv[])
{int len;int fd;void* map;fd = open("1.txt",O_RDWR);if(fd<0){perror("open");return -1;}len = lseek(fd, 0, SEEK_END); map = mmap(NULL,len,PROT_READ,MAP_SHARED,fd,0);if(map == MAP_FAILED){perror("mmap");return -1;}while (1) {printf("%s\n",(char*)map);}return 0;
}

mmap内存映射注意事项

(1) 创建映射区的过程中,隐含着一次对映射文件的读操作,将文件内容读取到映射区。
(2) 当MAP_SHARED时,要求:映射区的权限应 <= 文件打开的权限(出于对映射区的保护),如果不满足报非法参数(Invalid argument)错误。
当MAP_PRIVATE时候,mmap中的权限是对内存的限制,只需要文件有读权限即可,操作只在内存有效,不会写到物理磁盘,且不能在进程间共享。
(3) 映射区的释放与文件关闭无关,只要映射建立成功,文件可以立即关闭。
(4) 用于映射的文件大小必须>0,当映射文件大小为0时,指定非0大小创建映射区,访问映射地址会报总线错误,指定0大小创建映射区,报非法参数错误(Invalid argument)
(5) 文件偏移量必须为0或者4096的整数倍(不是会报非法参数Invalid argument错误).
(6)映射大小可以大于文件大小,但只能访问文件page的内存地址,否则报总线错误 ,超出映射的内存大小报段错误.

在这里插入图片描述

system V共享内存

使用system V共享内存的步骤

1、创建/打开共享内存。
2、映射共享内存,即把指定的共享内存映射到进程的地址空间用于访问。
3、读写共享内存。
4、撤销共享内存映射。
5、删除共享内存对象。

相关API

//共享内存创建
int shmget(key_t key, int size, int shmflg);
//共享内存映射
void  *shmat(int shmid, const void *shmaddr, int shmflg);
//共享内存撤销,撤销后内存地址不可再访问
int  shmdt(void *shmaddr);
//共享内存控制
int  shmctl(int shmid, int cmd, struct shmid_ds *buf);
shmctl(shmid, IPC_RMID, NULL);删除共享内存

写数据

#include<stdio.h>
#include"stdlib.h"
#include"unistd.h"
#include"sys/types.h"
#include"string.h"
#include"sys/stat.h"
#include"sys/shm.h"
#include"sys/ipc.h"
int main(int agrc,char* agrv[])
{key_t key;int shimd;void* shmaddr;key = ftok("2.txt", 100);printf("key = %d\n",key);if(key == -1){perror("key");return -1;}shimd = shmget(key, 512, IPC_CREAT|0666);printf("shimd = %d\n",shimd);if(shimd == -1){perror("get");return -1;}shmaddr = shmat(shimd, NULL, 0);strcpy(shmaddr, "hello,world!");sleep(1);return 0;
}

读数据

#include<stdio.h>
#include"stdlib.h"
#include"unistd.h"
#include"sys/types.h"
#include"string.h"
#include"sys/stat.h"
#include"sys/shm.h"
#include"sys/ipc.h"
int main(int agrc,char* agrv[])
{key_t key;int shimd;void* shmaddr;key = ftok("2.txt", 100);if(key == -1){perror("key");return -1;}shmaddr = shmat(32811, NULL, 0);printf("%s\n",(char*)shmaddr);shmdt(shmaddr);sleep(1);return 0;
}

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

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

相关文章

海外注册 | 欧盟医疗器械法规下免除临床试验的条件与要求

在欧盟医疗器械法规&#xff08;MDR&#xff09;的严格监管下&#xff0c;植入性医疗器械和III类医疗器械通常需要进行临床试验来证明其安全性和性能。 然而&#xff0c;MDR也规定了一些特定情况下免除临床试验的可能性。以下是免除临床试验的条件和要求的详细说明&#xff1a…

MVC(Model-View-Controller)模式

MVC&#xff08;Model-View-Controller&#xff09;模式三个主要组件&#xff1a;模型&#xff08;Model&#xff09;&#xff0c;视图&#xff08;View&#xff09;&#xff0c;和控制器&#xff08;Controller&#xff09;&#xff1a; 模型&#xff08;Model&#xff09;&a…

【高中数学/基本不等式】已知:a,b皆为正数,且1/(2a+b)+1/(a+2b)=1 求:a+b的最小值?

【问题来源】 https://www.ixigua.com/7025123539728466469?logTag1c2fd2e305d60e6277ab 第二题 【问题】 已知&#xff1a;a,b皆为正数&#xff0c;且1/(2ab)1/(a2b)1 求&#xff1a;ab的最小值&#xff1f; 【解答】 解&#xff1a;此题也有分母难消的问题&#xff…

人口萎缩,韩国釜山“进入消失阶段”

KlipC报道&#xff1a;调查显示&#xff0c;随着低生育率和人口老化&#xff0c;釜山人口逐渐萎缩&#xff0c;韩国第二大城市釜山显现出“进入消失阶段”的迹象。 据悉&#xff0c;“消失风险指数”是将20岁至39岁女性人口总数除以65岁及以上人口得到的数值。当该指数大于1.5…

自然语言处理学习(2)基本知识 文本预处理+文本数据分析+文本增强

conda activate DL conda deactivate课程链接 一 一些包的安装 1 stanfordcorenlp 在anoconda prompt 里面&#xff1a;进入自己的conda环境&#xff0c;pip install stanfordcorenlp 进入方式 相关包下载&#xff0c;Jar包我没有下载下来&#xff0c;太慢了&#xff0c;这个…

记录Atlas800服务器环境安装

一、创建安装账号 groupadd HwHiAiUser useradd -g HwHiAiUser -d /home/HwHiAiUser -m HwHiAiUser -s /bin/bash二、下载依赖包 以下包根据需求自行下载 wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py39_24.5.0-0-Linux-aarch64.sh wg…

debug-mmlab

mmyolo bug1: MMYOLO for yolov5 instance segmentation on balloon dataset getting this error "ValueError: Key img_path is not in available keys. solution: pip install albumentations1.3.1 reference

【计算机考研】408王道四本书的正确使用顺序

个人认为如果对408的分数要求不太高&#xff0c;120分以下跟着王道就够了&#xff0c;而120分以上还需要看一下教材。 王道的书很适合应试考试&#xff0c;书中的内容都是抓重点&#xff0c;咸鱼老师上课讲的内容也非常好&#xff0c;通俗易懂&#xff0c;计算机网络要稍逊一些…

实现Linux C++进程意外退出时信号处理与堆栈打印

文章目录 0. 引言1. 获取堆栈信息流程图2. 实现进程守护与信号处理2.1 进程如何守护化&#xff1f;2.2 信号处理hook函数注册2.3 守护进程代码熟宣 3. 堆栈信息捕获与打印逻辑4. 其他说明5. 附录完整代码 0. 引言 在软件开发中&#xff0c;特别是对于需要高可靠性的后台服务或…

掌握Go语言邮件发送:net/smtp实用教程与最佳实践

掌握Go语言邮件发送&#xff1a;net/smtp实用教程与最佳实践 概述基本配置与初始化导入net/smtp包设置SMTP服务器基本信息创建SMTP客户端实例身份验证 发送简单文本邮件配置发件人信息构建邮件头部信息编写邮件正文使用SendMail方法发送邮件示例代码 发送带附件的邮件邮件多部分…

大模型知识学习

大模型训练过程 数据清洗 拟人化描述&#xff1a;知识库整理 预训练 拟人化描述&#xff1a;知识学习可以使用基于BERT预训练模型进行训练 指令微调 拟人化描述&#xff1a;实际工作技能学习实际操作&#xff1a;让大模型模仿具体的输入输出进行拟合&#xff0c;即模仿学…

Study--Oracle-06-Oracler网络管理

一、ORACLE的监听管理 1、ORACLE网络监听配置文件 cd /u01/app/oracle/product/12.2.0/db_1/network/admin 2、在Oracle数据库中&#xff0c;监听器&#xff08;Listener&#xff09;是一个独立的进程&#xff0c;它监听数据库服务器上的特定端口上的网络连接请求&#xff0c…

Vitis AI - 量化流程详解

目录 1. 简介 2. 具体流程 2.1 校准激活 2.2 量化感知训练 2.3 量化校准配置 2.4 quantization 函数 3. 总结 1. 简介 想象一下&#xff0c;你有一个非常聪明的机器人朋友&#xff0c;它可以帮你做很多事情&#xff0c;比如预测天气。但是&#xff0c;这个机器人的大脑…

01 数据采集层 流量分发第一步规范采集海量数据

《易经》&#xff1a;“初九&#xff1a;潜龙勿用”。潜龙的意思是隐藏&#xff0c;阳气潜藏&#xff0c;阳爻位于最下方称为“初九”&#xff0c;龙潜于渊&#xff0c;是学而未成的阶段&#xff0c;此时需要打好基础。 而模块一我们就是讲解推荐系统有关的概念、基础数据体系…

基于SpringBoot+Vue商户点评管理与数据分析系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; Java精品实战案例《1000套》 2025-2026年最值得选择的Java毕业设计选题大全&#xff…

使用 Vanna 生成准确的 SQL 查询:工作原理和性能分析

Vanna工作原理 从本质上讲,Vanna 是一个 Python 包,它使用检索增强功能来帮助您使用 LLM 为数据库生成准确的 SQL 查询。 Vanna 的工作分为两个简单的步骤 - 在您的数据上训练 RAG“模型”,然后提出问题,这些问题将返回可设置为在您的数据库上自动运行的 SQL 查询。 vn.t…

【后端面试题】【中间件】【NoSQL】MongoDB提高可用性的方案(主从结构、仲裁节点、分片、写入语义)

主从结构 MongoDB的高可用和别的中间件的高可用方案基本类似。比如在MySQL里&#xff0c;接触了分库分表和主从同步&#xff1b;在Redis里&#xff0c;Redis也有主从结构&#xff1b;在Kafka里&#xff0c;分区也是有主从结构的。 所以先介绍启用了主从同步 我们的系统有一个关…

基于Java的微信记账小程序【附源码】

摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;记账微信小程序被用户普遍使用&#xff0c;为方便用户能够…

算法题中常用的C++功能

文章目录 集合优先队列双端队列排序时自定义比较函数最大数值字符串追加&#xff1a;删除&#xff1a;子串&#xff1a; 元组vector查找创建和初始化赋值&#xff1a; 字典map引入头文件定义和初始化插入元素访问元素更新元素删除元素检查元素存在遍历元素int和string转换 集合…

Ubuntu20.04更新GLIBC到2.35版本

目录 1 背景2 增加源2.1 标准源2.2 镜像源 3 更新 1 背景 Ubuntu20.04默认GLIBC库版本是2.31.今天碰到一个软件需要2.35版本的GLIBC。 升级GLIBC库有两种方式&#xff1a; 下载高版本库源码&#xff0c;编译后替换系统中低版本库。由于GLIBC库是Linux系统中最基础库&#xff…