共享存储映射

2023-11-16

存储映射I/O
存储映射I/O(memory-mapped I/O)使一个磁盘文件与存储空间中的一个缓冲区相映射。于是当从缓冲区中获取数据,就相当于读文件中的相应字节。与此类似,将数据存入缓冲区,则相应的字节就自动写入文件。这样,就可在不适用read和write函数的情况下,使用地址(指针)完成I/O操作。
使用这种方法,首先应通知内核,将一个指定文件映射到储存区域中。这个映射工作可以通过mmap函数来实现。

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

返回:成功:返回创建的映射区首地址;失败:MAP_FAILED宏

参数:

addr: 建立映射区的首地址,由linux内核指定。使用时,直接传递NULL
length:欲创建映射区的大小
prot:映射区权限PROT_READ,PROT_WRITE,PROT_READ|PROT_WRITE
flags:标志位参数(常用于设定更新物理区域,设置共享,创建匿名映射区)
			MAP_SHARED:会将映射区所做的操作反映到物理设备(磁盘)上。
			MAP_PRIVATE:映射区所做的修改不会反映到物理设备。
fd:用来建立映射区的文件描述符
offset:映射文件的偏移(4K的整数倍)

注意:
①第二个参数不能为零,因此不能open一个新文件而不用ftruncate函数拓展直接创建映射区。
②传入munmap函数的映射区地址只能是申请时获得的首地址。
③创建映射区的权限要小于等于打开文件的权限,映射区的创建过程中隐含着一次对文件的读操作。
④ offset必须是4K的整数倍,因为映射区是由MMU来映射的,而MMU的基础单位是4K。
⑤一旦mmap映射区创建成功,文件描述符将失去意义。
⑥mmap创建映射区出错概率非常高,一定要检查返回值,确保映射区建立成功再进行后续操作。

父子等有血缘关系的进程之间也可以通过mmap建立的映射区来完成数据通信。但相应的要在创建映射区的时候指定对应的标志位参数flags:
MAP_PRIVATE:(私有映射)父子进程各自独占映射区;
MAP_SHARED:(共享映射)父子进程共享映射区;
结论:父子进程共享:1.打开的文件2.mmap建立的映射区(但是必须使用MAP_SHARED)

匿名映射

通过使用我们发现,使用映射区来完成文件读写操作十分方便,父子进程间通信也比较容易。但缺陷是,每次创建映射区一定要依赖一个文件才能实现。通常为了建立映射区要open一个temp文件,创建好了再unlink,close,比较麻烦。可以直接使用匿名映射来代替。其实Linux系统提供给我们创建匿名映射区的方法,无需依赖一个文件即可创建映射区。同样需要借助标志位参数flags来指定。

使用MAP_ANONYMOUS(或MAP_ANON),如:

int * p = mmap(NULL, 4, PROT_WRITE|PROT_READ,MAP_SHARED|MAP_ANONYMOUS,-1,0);

需要注意的是,MAP_ANONYMOUS和MAP_ANON这两个宏是linux操作系统特有的宏。在类Unix系统中如无该宏定义,可使用如下两步来完成匿名映射区的建立。

① fd = open("/dev/zero",O_RDWR);
②p = mmap(NULL,size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);

mmap无血缘关系进程间通信

实质上mmap是内核借助文件帮我们创建了一个映射区,多个进程之间利用该映射区完成数据传递。由于内核空间多进程共享,因此无血缘关系的进程间也可以使用mmap来完成通信。只要设置相应的标志位参数flags即可。若想实现共享,应当使用MAP_SHARED。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

共享存储映射 的相关文章

  • 06makefile学习之三个自动变量($@,$^,$<),模式规则和静态模式规则

    06makefile学习之三个自动变量 lt 和模式规则 以下为相关makefile的学习文章 01makefile学习之GCC编译的四个阶段 带编译阶段 汇编阶段 S c的区别 02makefile学习之makefile的基本原则 03m
  • 03Linux下C语言锁的学习之条件变量

    03Linux下C语言锁的学习之条件变量 1 为何要使用条件变量 通过上两篇对互斥锁和读写锁的学习 我们知道锁是用来保证共享数据的访问混乱 实现多线程同步 但是你有没有想过 当这个共享数据不是固定的一个 而是会变化的呢 何为变化 就是说不断
  • 13LinuxC线程学习之利用pthread_create设置线程分离属性和相关属性解释

    1 线程属性 1 本节作为指引性介绍 linux下线程的属性是可以根据实际项目需要 进行设置 之前我们讨论的线程都是采用线程的默认属性 默认属性已经可以解决绝大多数开发时遇到的问题 如我们对程序的性能提出更高的要求那么需要设置线程属性 比如
  • 九、Linux系统编程:线程池编程

    9 线程池编程 创建线程要花费昂贵的资源和时间 如果任务来了才创建线程那么响应时间会变长 而且一个进程能创建的线程数有限 为了避免这些问题 在程序启动的时候就创建若干线程来响应处理 它们被称为线程池 里面的线程叫工作线程 9 1 概念 线程
  • ioctl函数详细分析

    IPv4 和 IPv6 的网络接口操作使用套接字 ioctl 命令 级别 中级 Katiyar Manish manish katiyar in ibm com 软件工程师 IBM Intel Microsoft HPShweta Gupt
  • 08LinuxC线程学习之pthread_join函数以及根据参2获取返回值的案例

    1 pthread join函数 int pthread join pthread t thread void retval 功能 阻塞等待线程退出 获取线程退出状态 其作用 对应进程中 waitpid 函数 成功 0 失败 错误号 参1
  • Linux线程介绍(Linux 系统编程)

    进程与线程 典型的UNIX Linux进程可以看成只有一个控制线程 一个进程在同一时刻只做一件事情 有了多个控制线程后 在程序设计时可以把进程设计成在同一时刻做不止一件事 每个线程各自处理独立的任务 进程是程序执行时的一个实例 是担当分配系
  • Posix信号量

    Posix信号量 一 Posix信号量 1 概述 二 Posix提供两种信号量 有名信号量和基于内存的信号量 三 命名信号量 1 sem open和sem close函数 2 sem unlink函数 3 sem wait函数 5 sem
  • Makefile(面试必备)

    1 Makefile基本介绍 1 1 makefile介绍 make是一个工程管理器 它可以根据文件时间自发检测更新的文件从而减少编译量 makefile文件和make工具一起使用 用于控制工程项目的编译和链接 也可以用来编写手册页和程序的
  • linux系统编程:线程同步-信号量(semaphore)

    线程同步 信号量 semaphore 生产者与消费者问题再思考 在实际生活中 只要有商品 消费者就可以消费 这没问题 但生产者的生产并不是无限的 例如 仓库是有限的 原材料是有限的 生产指标受消费指标限制等等 为了进一步 解决好生产者与消费
  • 【Linux系统编程】20.程序、进程、CPU和MMU、PCB

    目录 程序 进程 CPU和MMU PCB 程序 编译好的二进制文件 存在磁盘上 只占用磁盘资源 进程 进程是活跃的程序 占用系统资源 在内存中执行 程序运行起来 产生一个进程 程序类似于剧本 进程类似于一场戏 一场戏需要舞台 演员 灯光 道
  • 10LinuxC线程学习之pthread_detach函数,错误返回值分析及其案例

    1 pthread detach函数 int pthread detach pthread t thread 功能 1 实现线程分离 不再受主线程管理 由系统接任 线程结束后 其退出状态不由其他线程获取 而直接自己自动释放 网络 多线程服务
  • 面试官都在问

    面试官都在问 Linux命令mpstat详解 1 mpstat的基本用法 mpstat的全称为Multiprocessor Statistics 是一款常用的多核CPU性能分析工具 用来实时查询每个CPU的性能指标 以及所有CPU的平均指标
  • Linux:死锁与解决方法

    死锁 死锁 指在一组进程中的各个进程均占有不会释放的资源 但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态 死锁现象 现象1 如果执行流加锁完毕后 不进行解锁则会造成死锁 上篇所述 现象2 线程A获取了1锁 线程B获取了2
  • 十、C++11左值右值、左值引用、右值引用、万能引用、完美转发

    10 C 11左值右值 左值引用 右值引用 10 1 左值 右值 左值 可以在 左边使用的值 右值 只能在 右边使用的值 字面量 中间结果 临时对象 匿名对象 无法直接取地址 不能使用左值引用 10 2 左值引用 右值引用 实例 左值引用
  • 【hello Linux】Linux第一个小程序 - 进度条

    目录 先来区分两个标识符 回车和换行 1 倒计时 2 进度条 Linux 下面来编写Linux系统下的第一个小程序 进度条 先来区分两个标识符 回车和换行 r 和 n r 回车 代表回到本行的开头 n 换行 代表回到光标的下一行的光标处 我
  • 【Linux系统编程(二)】Linux文件IO操作

    文章目录 Linux文件IO操作 1 系统调用 2 系统调用和库函数的区别 3 C库中IO函数工作流程 4 文件描述符 4 1 文件描述符表是如何管理文件描述符的呢 4 2 查看当前系统文件描述最大数量 5 文件IO的操作 5 1 open
  • 六、Linux系统编程:读写锁

    5 读写锁 读写锁 ReentrantReadWriteLock 就是读线程和读线程之间不互斥 读读不互斥 读写互斥 写写互斥 一个资源可以被多个读线程访问 也可以被一个写线程访问 但不能同时存在读写线程 读写互斥 读读共享 5 1 锁操作
  • 02守护进程学习之创建守护进程的七步骤及其分析

    02守护进程学习之创建守护进程的七步骤及其分析 与守护进程相关的文章 01守护进程学习之会话的概念和创建会话 包含Linux下相应id的总结一览 02守护进程学习之创建守护进程的七步骤及其分析 03守护进程学习之创建守护进程的代码例子 1
  • IO多路复用机制详解

    高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型 常见的IO模型有四种 1 同步阻塞IO Blocking IO 即传统的IO模型 2 同步非阻塞IO Non blocking IO 默认创建的socket都是阻塞的 非阻塞IO

随机推荐

  • Windows10 - 在当前文件夹下打开cmd(命令行)的方法

    1 清除文件路径输入cmd 2 按住shift 再点击鼠标右键 在某个版本前 这里右键还是打开命令行 后来换成了打开ps 有改注册表的方法 将其改回打开cmd
  • vue3 使用vant框架的van-list 上拉加载用法

  • STM32PWM知识详解

    目录 一 PWM简介 1 定义 2 主要参数 二 PWM产生方式 1 普通IO口与PWM口 2 普通IO口产生PWM 3 PWM口产生PWM 总结 参考链接归纳 一 PWM简介 1 定义 脉冲宽度调制 PWM 是一种数字信号 最常用于控制电
  • 【C++入门】虚继承的实现原理

    转载自 http blog csdn net xiejingfa article details 48028491 准备工作 1 VS2012使用命令行选项查看对象的内存布局 微软的Visual Studio提供给用户显示C 对象在内存中的
  • 计算两个数的平方和

    3 计算两个数的平方和 从键盘读入两个实数 编程计算并输出它们的平方和 要求使用数学函数pow x y 计算平方值 输出结果保留2位小数 程序中所有浮点数的数据类型均为float include
  • html右侧增加页面导航快捷键效果图及代码

    如果一个页面非常长时 在页面右侧增加导航快捷键还是比较有必要的 见效果图 局部放大后的效果 具体实现代码如下 html相关代码 div class gototop none div a href img src static imgs to
  • exit()函数

    进程的终止方式 有8种方式使进程终止 其中前5种为正常终止 它们是 1 从 main 返回 2 调用 exit 3 调用 exit 或 Exit 4 最后一个线程从其启动例程返回 5 最后一个线程调用pthread exit 异常终止有3种
  • Redis4.0从库复制报错"master_link_status:down"处理一例

    环境描述 Redis版本 4 0 2 主库 192 168 0 190 从库 192 168 0 191 今天Zabbix告警一直出现redis sync error的信息 于是登陆redis发现从库复制状态一直是master link s
  • 若依前端框架登录执行过程

    一 登录页面 登录页面是Views文件夹下的login vue文件 二 点击登录调用的方法为 handleLogin handleLogin this refs loginForm validate valid gt if valid th
  • Bugku题目MISC部分(持续更新)

    目录 telnet 1和0的故事 这是一张单纯的图片 隐写 社工 进阶收集 来自论坛提问 gQiRf的附件 zip 简单取证1 mimikatz PasswareKitForensic工具 眼见非实 啊哒 ping FileStoraged
  • spring中使用ThreadPoolTaskExecutor配置线程池

    背景 spring中经常使用ThreadPoolTaskExecutor来调用JDK的ThreadPoolExecutor初始化线程池 尤其在有异步执行的任务时 由于spring 异步任务默认使用的executor不会reuse线程 因此需
  • 寄存器优化补充

    一 简要概述 结构体在寄存器中应用可以简化繁琐的寄存器 这段代码在每个结构体成员前增加了一个 IO 前缀 它的原型在这段代码的第一行 代表了C 语言中的关键字 volatile 在 C 语言中该关键字用于表示变量是易变的 要求编译器不要优化
  • Pytorch cpu版安装及卸载详细教程(以及安装成功后无法在ide中使用问题解决方法)

    Pytorch cpu版安装及卸载详细教程 以及安装成功后无法在ide中使用问题解决方法 一 准备 1 首先确定python的版本 且python是64位 win R 输入cmd 确定 在页面中输入python回车 可查看python版本既
  • React---使用react脚手架搭建项目

    一 使用create react app创建react应用 1 1 react脚手架 xxx脚手架 用来帮助程序员快速创建一个基于xxx库的模板项目 包含了所有需要的配置 语法检查 jsx编译 devServer 下载好了所有相关的依赖 可
  • eclipse改变html字体大小,细说eclipse设置字体以及字体大小?

    电脑现已成为我们工作 生活和娱乐必不可少的工具了 在使用电脑的过程中 可能会遇到eclipse设置字体以及字体大小 的问题 如果我们遇到了eclipse设置字体以及字体大小 的情况 该怎么处理怎么才能解决eclipse设置字体以及字体大小
  • 初步使用基于RESTful的前后端交互方式,包括前后端增、删、改流程

    目录 一 问题背景 二 解决方法 1 POST增 2 DELETE删 3 PUT改 4 参考源代码 一 问题背景 最开始接触web后端开发时 使用的请求大多是通过自定义的一些请求名称 比如update do delete do等 现在为了规
  • python实现卷积神经网络实现手写数字识别

    工具 tensorflow opencv import cv2 import numpy as np import tensorflow as tf np set printoptions suppress True def get tra
  • 重新定义分析 - EventBridge 实时事件分析平台发布

    对于日志分析大家可能并不陌生 在分布式计算 大数据处理和 Spark 等开源分析框架的支持下 每天可以对潜在的数百万日志进行分析 事件分析则和日志分析是两个完全不同的领域 事件分析对实时性的要求更高 需要磨平事件领域中从半结构化到结构化的消
  • ListView的视图属性View的Details的时候每一项的旁边老有个小方框,如何去掉?

    ListView有一个CheckBox属性 将其修改为false即可
  • 共享存储映射

    存储映射I O 存储映射I O memory mapped I O 使一个磁盘文件与存储空间中的一个缓冲区相映射 于是当从缓冲区中获取数据 就相当于读文件中的相应字节 与此类似 将数据存入缓冲区 则相应的字节就自动写入文件 这样 就可在不适