我是靠谱客的博主 潇洒星星,最近开发中收集的这篇文章主要介绍操作系统:图文详解 内存映射操作系统:图文详解 内存映射前言目录1. 定义2. 作用3. 实现过程4. 特点5. 应用场景6. 实例讲解7. 总结,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
操作系统:图文详解 内存映射
前言
- 内存映射 在
Linux
操作系统中非常重要,因为其涉及到高效的跨进程通信 & 文件操作 - 今天,我将详细讲解操作系统中核心概念:内存映射
目录
示意图
1. 定义
关联 进程中的1个虚拟内存区域 & 1个磁盘上的对象,使得二者存在映射关系
- 上述的映射过程 = 初始化该虚拟内存区域
- 虚拟内存区域被初始化后,就会在交换空间中换你来还去
- 被映射的对象称为:共享对象(普通文件 / 匿名文件)
2. 作用
若存在上述映射关系,则具备以下特征
- 在多个进程的虚拟内存区域 已和同1个共享对象 建立映射关系的前提下
- 若 其中1个进程对该虚拟区域进行写操作
- 那么,对于 也把该共享对象映射到其自身虚拟内存区域的进程 也是可见的
示意图如下
- 假设进程1、2的虚拟内存区域同时映射到同1个共享对象;
- 当进程1对其虚拟内存区域进行写操作时,也会映射到进程2中的虚拟内存区域
示意图
3. 实现过程
- 内存映射的实现过程主要是通过
Linux
系统下的系统调用函数:mmap()
- 该函数的作用 = 创建虚拟内存区域 + 与共享对象建立映射关系
- 其函数原型、具体使用 & 内部流程 如下
/**
* 函数原型
*/
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
/**
* 具体使用(用户进程调用mmap())
* 下述代码即常见了一片大小 = MAP_SIZE的接收缓存区 & 关联到共享对象中(即建立映射)
*/
mmap(NULL, MAP_SIZE, PROT_READ, MAP_PRIVATE, fd, 0);
/**
* 内部原理
* 步骤1:创建虚拟内存区域
* 步骤2:实现地址映射关系,即:进程的虚拟地址空间 ->> 共享对象
* 注:
* a. 此时,该虚拟地址并没有任何数据关联到文件中,仅仅只是建立映射关系
* b. 当其中1个进程对虚拟内存写入数据时,则真正实现了数据的可见
*/
4. 特点
- 提高数据的读、写 & 传输的时间性能
- 减少了数据拷贝次数
- 用户空间 & 内核空间的高效交互(通过映射的区域 直接交互)
- 用内存读写 代替 I/O读写
- 提高内存利用率:通过虚拟内存 & 共享对象
5. 应用场景
在Linux
系统下,根据内存映射的本质原理 & 特点,其应用场景在于:
- 实现内存共享:如 跨进程通信
- 提高数据读 / 写效率 :如 文件读 / 写操作
6. 实例讲解
下面,我将详细讲解 内存映射应用在跨进程通信 & 文件操作的实例
6.1 文件读 / 写操作
- 传统的
Linux
系统文件操作流程如下
示意图
- 使用了内存映射的 文件读 / 写 操作
示意图
从上面可看出:使用了内存映射的文件读/写 操作方式效率更加高、性能最好!
6.2 跨进程通信
- 传统的跨进程通信
示意图
- 使用了内存映射的 跨进程通信
示意图
从上面可看出:使用了内存映射的跨进程通信 效率最高、性能最好!
7. 总结
-
本文全面讲解了
Linux
操作系统中的内存映射 -
下面我将继续讲解 编程开发的基础知识,有兴趣可以继续关注Carson_Ho的开发笔记
最后
以上就是潇洒星星为你收集整理的操作系统:图文详解 内存映射操作系统:图文详解 内存映射前言目录1. 定义2. 作用3. 实现过程4. 特点5. 应用场景6. 实例讲解7. 总结的全部内容,希望文章能够帮你解决操作系统:图文详解 内存映射操作系统:图文详解 内存映射前言目录1. 定义2. 作用3. 实现过程4. 特点5. 应用场景6. 实例讲解7. 总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复