无涯教程-进程 - 内存映射

mmap()系统调用提供了将文件或设备映射到内存的调用进程的虚拟地址空间中的映射。这有两种类型-

文件映射  -  此映射将进程的虚拟内存区域映射到文件,这意味着读取或写入那些内存区域会导致文件被读取或写入,这是默认的映射类型。

匿名映射  -  此映射进程的虚拟内存区域,没有任何文件支持,内容被初始化为零。此映射类似于动态内存分配(malloc()),并在某些malloc()实现中用于某些分配。

一个进程映射中的内存可以与其他进程中的映射共享,这可以通过两种方式完成-

  • 当两个进程映射文件的同一区域时,它们共享相同的物理内存页面。

  • 如果创建了子进程,则该子进程将继承父进程的映射,并且这些映射所引用的物理内存页面与父进程相同,子进程中的任何数据更改后,都会为子进程创建不同的页面。

当两个或多个进程共享同一页面时,每个进程可以看到其他进程根据映射类型所做的页面内容更改,映射类型可以是私有的或共享的-

  • 私有映射(MAP_PRIVATE)  -  此映射内容的修改对其他进程不可见,并且该映射未携带到基础文件。

  • 共享映射(MAP_SHARED)   -  对此映射内容的修改对其他进程可见,并且映射被携带到基础文件中。

#include <sys/mman.h>void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

上面的系统调用成功时返回映射的起始地址,错误时返回MAP_FAILED。

#include <sys/mman.h>int munmap(void *addr, size_t length);

上面的系统调用成功返回0或错误返回-1。

系统调用munmap执行已内存映射区域的取消映射,字段addr指示映射的起始地址,长度指示要映射的映射的字节大小。通常,映射和取消映射将针对整个映射区域。如果必须不同,则应将其缩小或切成两部分。如果地址没有任何映射,则此调用无效,并且该调用返回0(成功)。

让我们考虑一个例子-

步骤1  -  如下所示,写入文件字母数字字符-

0 1 2 ... 25 26 27 28 29 30 31 32 33 34 35 36 37 38 ... 59 60 61
A B C ... Z 0 1 2 3 4 5 6 7 8 9 A b c ... x y z

步骤2  -  使用mmap()系统调用将文件内容映射到内存中,映射到内存后,它将返回起始地址。

步骤3  -  使用数组表示法访问文件内容(也可以使用指针表示法进行访问),因为它不会读取read()系统调用。使用内存映射,避免在用户空间,内核空间缓冲区和缓冲区高速缓存之间进行多次复制。

步骤4  -  重复读取文件内容,直到用户输入" -1"(表示访问结束)。

步骤5  -  执行清理活动,即取消映射映射的内存区域(munmap()),关闭文件并删除文件。

/* Filename: mmap_test.c */
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/mman.h>
void write_mmap_sample_data();int main() {struct stat mmapstat;char *data;int minbyteindex;int maxbyteindex;int offset;int fd;int unmapstatus;write_mmap_sample_data();if (stat("MMAP_DATA.txt", &mmapstat) == -1) {perror("stat failure");return 1;}if ((fd = open("MMAP_DATA.txt", O_RDONLY)) == -1) {perror("open failure");return 1;}data = mmap((caddr_t)0, mmapstat.st_size, PROT_READ, MAP_SHARED, fd, 0);if (data == (caddr_t)(-1)) {perror("mmap failure");return 1;}minbyteindex = 0;maxbyteindex = mmapstat.st_size - 1;do {printf("Enter -1 to quit or ");printf("enter a number between %d and %d: ", minbyteindex, maxbyteindex);scanf("%d",&offset);if ( (offset >= 0) && (offset <= maxbyteindex) )printf("Received char at %d is %c\n", offset, data[offset]);else if (offset != -1)printf("Received invalid index %d\n", offset);} while (offset != -1);unmapstatus = munmap(data, mmapstat.st_size);if (unmapstatus == -1) {perror("munmap failure");return 1;}close(fd);system("rm -f MMAP_DATA.txt");return 0;
}void write_mmap_sample_data() {int fd;char ch;struct stat textfilestat;fd = open("MMAP_DATA.txt", O_CREAT|O_TRUNC|O_WRONLY, 0666);if (fd == -1) {perror("File open error ");return;}//Write A to Zch = A;while (ch <= Z) {write(fd, &ch, sizeof(ch));ch++;}//Write 0 to 9ch = 0;while (ch <= 9) {write(fd, &ch, sizeof(ch));ch++;}//Write a to zch = a;while (ch <= z) {write(fd, &ch, sizeof(ch));ch++;}close(fd);return;
}
Enter -1 to quit or enter a number between 0 and 61: 3 
Received char at 3 is D 
Enter -1 to quit or enter a number between 0 and 61: 28
Received char at 28 is 2 
Enter -1 to quit or enter a number between 0 and 61: 38 
Received char at 38 is c 
Enter -1 to quit or enter a number between 0 and 61: 59 
Received char at 59 is x 
Enter -1 to quit or enter a number between 0 and 61: 65 
Received invalid index 65 
Enter -1 to quit or enter a number between 0 and 61: -99 
Received invalid index -99 
Enter -1 to quit or enter a number between 0 and 61: -1

进程 - 内存映射 - 无涯教程网无涯教程网提供mmap()系统调用提供了将文件或设备映射到内存的调用进程的虚拟地址空间中的映射。这有...https://www.learnfk.com/process/inter-process-communication-memory-mapping.html

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

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

相关文章

C语言_分支和循环语句(1)

文章目录 前言分支语句循环语句一、什么是语句1.C语句可分为以下五类&#xff1a;2. 控制语句3.以下三类&#xff1a; 二、分支语句&#xff08;选择结构&#xff09;2.1 .1 if语句语法结构2.1.2 if书写形式的对比2.1.3 练习2.2 switch 语句 2.2.1 在switch语句中的break2.2.2 …

java八股文面试[JVM]——JVM调优

知识来源&#xff1a; 【2023年面试】JVM性能调优实战_哔哩哔哩_bilibili

ImportError: cannot import name ‘SQLDatabaseChain‘ from ‘langchain‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

一文了解BFD技术:实现故障快速检测!

一、概诉 BFD提供了一个通用的、标准化的、介质无关的、协议无关的快速故障检测机制&#xff0c;有以下两大优点&#xff1a; 1.对相邻转发引擎之间的通道提供轻负荷、快速故障检测。 2.用单一的机制对任何介质、任何协议层进行实时检测。 BFD是一个简单的“Hello”协议。两个…

vue关闭弹窗刷新父页面 this.$refs

代码截图 主页面 弹出框页面 接这一篇文章后续 参考链接

Arduino驱动四位0.36英寸共阴数码管模块

目录 一、简介二、参数性能三、电路原理图四、使用方法 一、简介 点击图片购买 四位0.36英寸共阴数码管模块由一个12引脚的0.36英寸红色共阴数码管和一个TM1650驱动芯片构成&#xff0c;大大减少了驱动引脚与连线&#xff0c;只需要四根引线IIC即可控制数码管的显示。TM11650是…

【C++进阶(一)】STL大法以及string的使用

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; STL标准库 1. 前言2. STL库的版本以及缺陷3. ST…

浅析阿里云灵积(平台)模型服务

简介&#xff1a; DashScope灵积模型服务以模型为中心&#xff0c;致力于面向AI应用开发者提供品类丰富、数量众多的模型选择&#xff0c;并为其提供开箱即用、能力卓越、成本经济的模型服务API。DashScope灵积模型服务依托达摩院等机构的优质模型&#xff0c;在阿里云基础设施…

opencv 案例实战02-停车场车牌识别SVM模型训练及验证

1. 整个识别的流程图&#xff1a; 2. 车牌定位中分割流程图&#xff1a; 三、车牌识别中字符分割流程图&#xff1a; 1.准备数据集 下载车牌相关字符样本用于训练和测试&#xff0c;本文使用14个汉字样本和34个数字跟字母样本&#xff0c;每个字符样本数为40&#xff0c;样本尺…

如何使用CSS实现一个3D旋转效果?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 3D效果实现⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域…

【C++奇遇记】函数模板

&#x1f3ac; 博客主页&#xff1a;博主链接 &#x1f3a5; 本文由 M malloc 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;LeetCode刷题集 数据库专栏 初阶数据结构 &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如…

【LeetCode-中等题】238. 除自身以外数组的乘积

题目 题解一&#xff1a;暴力双指针—超时了 双指针暴力查找(需考虑begin end 和begin end i) 的情况 ----- 力扣示例超出时间限制 public int[] productExceptSelf(int[] nums) {int length nums.length;int begin 0;int end length -1;int i 0;int[] number new in…