返回顶部
首页 > 资讯 > 精选 >怎样解析Mmap原理和使用方式
  • 768
分享到

怎样解析Mmap原理和使用方式

2023-06-15 13:06:22 768人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关怎样解析Mmap原理和使用方式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、传统的读写文件一般来说,修改一个文件的内容需要如下3个步骤:把文件内容读入到内存中

这篇文章将为大家详细讲解有关怎样解析Mmap原理和使用方式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

一、传统的读写文件

一般来说,修改一个文件的内容需要如下3个步骤:

  • 把文件内容读入到内存中。

  • 修改内存中的内容。

  • 把内存的数据写入到文件中。

过程如图 1 所示:

怎样解析Mmap原理和使用方式

如果使用代码来实现上面的过程,代码如下:

read(fd, buf, 1024);  // 读取文件的内容到buf ...                   // 修改buf的内容 write(fd, buf, 1024); // 把buf的内容写入到文件

从图 1 中可以看出,页缓存(page cache) 是读写文件时的中间层,内核使用 页缓存 与文件的数据块关联起来。所以应用程序读写文件时,实际操作的是  页缓存。

二、使用 mmap 读写文件

从传统读写文件的过程中,我们可以发现有个地方可以优化:如果可以直接在用户空间读写 页缓存,那么就可以免去将 页缓存  的数据复制到用户空间缓冲区的过程。

那么,有没有这样的技术能实现上面所说的方式呢?答案是肯定的,就是 mmap。

使用 mmap 系统调用可以将用户空间的虚拟内存地址与文件进行映射(绑定),对映射后的虚拟内存地址进行读写操作就如同对文件进行读写操作一样。原理如图 2  所示:

怎样解析Mmap原理和使用方式

前面我们介绍过,读写文件都需要经过 页缓存,所以 mmap 映射的正是文件的 页缓存,而非磁盘中的文件本身。由于 mmap 映射的是文件的  页缓存,所以就涉及到同步的问题,即 页缓存 会在什么时候把数据同步到磁盘。

linux 内核并不会主动把 mmap 映射的 页缓存 同步到磁盘,而是需要用户主动触发。同步 mmap 映射的内存到磁盘有 4 个时机:

  • 调用 msync 函数主动进行数据同步(主动)。

  • 调用 munmap 函数对文件进行解除映射关系时(主动)。

  • 进程退出时(被动)。

  • 系统关机时(被动)。

三、mmap的使用方式

下面我们介绍一下怎么使用 mmap,mmap 函数的原型如下:

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

下面介绍一下 mmap 函数的各个参数作用:

  • addr:指定映射的虚拟内存地址,可以设置为 NULL,让 Linux 内核自动选择合适的虚拟内存地址。

  • length:映射的长度。

  • prot:映射内存的保护模式,可选值如下:

    • PROT_EXEC:可以被执行。

    • PROT_READ:可以被读取。

    • PROT_WRITE:可以被写入。

    • PROT_NONE:不可访问。

  • flags:指定映射的类型,常用的可选值如下:

    • MAP_FIXED:使用指定的起始虚拟内存地址进行映射。

    • MAP_SHARED:与其它所有映射到这个文件的进程共享映射空间(可实现共享内存)。

    • MAP_PRIVATE:建立一个写时复制(Copy on Write)的私有映射空间。

    • MAP_LOCKED:定映射区的页面,从而防止页面被交换出内存。

    • ...

  • fd:进行映射的文件句柄。

  • offset:文件偏移量(从文件的何处开始映射)。

介绍完 mmap 函数的原型后,我们现在通过一个简单的例子介绍怎么使用 mmap:

int fd = open(filepath, O_RDWR, 0644);                           // 打开文件 void *addr = mmap(NULL, 8192, PROT_WRITE, MAP_SHARED, fd, 4096); // 对文件进行映射

在上面例子中,我们先通过 open 函数以可读写的方式打开文件,然后通过 mmap 函数对文件进行映射,映射的方式如下:

  • addr 参数设置为 NULL,表示让操作系统自动选择合适的虚拟内存地址进行映射。

  • length 参数设置为 8192 表示映射的区域为 2 个内存页的大小(一个内存页的大小为 4 KB)。

  • prot 参数设置为 PROT_WRITE 表示映射的内存区为可读写。

  • flags 参数设置为 MAP_SHARED 表示共享映射区。

  • fd 参数设置打开的文件句柄。

  • offset 参数设置为 4096 表示从文件的 4096 处开始映射。

mmap 函数会返回映射后的内存地址,我们可以通过此内存地址对文件进行读写操作。我们通过图 3 展示上面例子在内核中的结构:

怎样解析Mmap原理和使用方式

关于怎样解析Mmap原理和使用方式就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 怎样解析Mmap原理和使用方式

本文链接: https://lsjlt.com/news/280370.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎样解析Mmap原理和使用方式
    这篇文章将为大家详细讲解有关怎样解析Mmap原理和使用方式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、传统的读写文件一般来说,修改一个文件的内容需要如下3个步骤:把文件内容读入到内存中...
    99+
    2023-06-15
  • LinkedBlockingQueue链式阻塞队列的使用和原理解析
    目录概览使用方法1. add | remove | element2. offer | poll | peek3. put | take4. offer | poll (timeou...
    99+
    2022-11-13
    LinkedBlockingQueue 链式阻塞队列 阻塞队列LinkedBlockingQueue
  • 怎样解析C++函数调用方式
    本篇文章给大家分享的是有关怎样解析C++函数调用方式,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。在C++语言中进行C++函数调用时,C++中的虚函数的作用主要是实现了多态的机...
    99+
    2023-06-17
  • 解析Python中回调函数的原理及使用方式
    Python回调函数的原理和用法解析 回调函数是一种常见的编程技术,尤其在Python中被广泛使用。它可以使我们在异步编程中更加灵活地处理事件和执行任务。本文将对回调函数的原理和用法进行详细解析,并提供具体的代码示例。 一、回调...
    99+
    2024-02-02
    原理解析 用法分析
  • vue3中的setup使用和原理解析
    目录1.前言2.setup3.源码分析setupStatefulComponent执行setup函数 finishComponentSetup4.总结1.前言 最近在做vu...
    99+
    2024-04-02
  • 解析vue的provide和inject使用方法及其原理
    首先来谈谈我们为什么要使用provide/inject呢?对于爷爷和孙子组件之间,甚至太爷爷组件与孙子组件通信我们用vuex不就ok了。 那事实的确如此,但是,请听我说但是,有时候你...
    99+
    2024-04-02
  • GTK treeview原理及使用方法解析
    GtkTreeView 构件是一个高级的构件,利用他你就可以制作出漂亮的普通列表或者是树状的列表。这个构件里可以包含一或者多行。他的构架呢?正是采用了大名鼎鼎的MVC (Model View Controller) 设计...
    99+
    2022-06-04
    GTK treeview原理
  • Google和Facebook不使用Docker的原理解析
    写作本文的起因是我想让修改后的分布式 PyTorch 程序能更快的在 Facebook 的集群上启动。探索过程很有趣,也展示了工业机器学习需要的知识体系。 2007 年我刚毕业后在 ...
    99+
    2024-04-02
  • 解析vue3的ref,reactive的使用和原理
    目录1.前言2.比较3.ref源码解析4.reactive源码解析createReactiveObjecthandles的组成get陷阱set陷阱5.总结1.前言 vue3新增了re...
    99+
    2024-04-02
  • Java多线程使用方式和实现原理
    本篇内容介绍了“Java多线程使用方式和实现原理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java中的线程Java之父对线程的定义是:线...
    99+
    2023-06-02
  • JavaScriptpromise的使用和原理分析
    目录一、为什么一个promise可以调用多个.then方法二、什么是Promise.resolve()三、Promise.all缺陷和Promise.allSettled四、Prom...
    99+
    2023-05-15
    JavaScript promise原理 JS promise
  • 怎样进行Kubernetes的网络原理解析
    这篇文章给大家介绍怎样进行Kubernetes的网络原理解析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1. Linux网络基础1.1 名词解释Network Namespace(网络命名空间):Linux...
    99+
    2023-06-04
  • Go defer 原理和源码剖析是怎样的
    本篇文章为大家展示了Go defer 原理和源码剖析是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Go 语言中有一个非常有用的保留字 defer,它可以调用一个函数,该函数的执行被推迟到包裹...
    99+
    2023-06-25
  • CSS全局样式和表格样式怎么使用
    今天小编给大家分享一下CSS全局样式和表格样式怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。CSS全局样式1、布局容...
    99+
    2023-07-04
  • React中setState使用原理解析
    目录setState使用详解使用setState的原因setState的基本用法setState的异步更新setState获取异步结果setState一定是异步setState使用详...
    99+
    2022-11-13
    React setState使用 React setState
  • go-micro使用Consul做服务发现的方法和原理解析
    目录安装Consul安装Consul插件服务端使用Consul服务注册注册过程健康检查客户端使用Consul调用服务发现过程效果展示go-micro v4默认使用mdns做服务发现。...
    99+
    2024-04-02
  • Handler 原理分析和使用之HandlerThread
    HandlerThread是一个带有Looper的线程类,它继承自Thread类,并且实现了Runnable接口。通过Handler...
    99+
    2023-09-12
    Handler
  • Vue3中的ref和reactive响应式原理解析
    目录1 ref2 isref判断是不是一个ref对象3 shallowref创建一个跟踪自身.value变化的 ref,但不会使其值也变成响应式的4 triggerRef5 cust...
    99+
    2022-11-13
    Vue3 ref和reactive响应式 Vue3 ref和reactive
  • History是基本原理及使用方法是怎样的
    这期内容当中小编将会给大家带来有关History是基本原理及使用方法是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。当我们频繁使用 Linux 命令行时,有效地使用历史记录,可以大大提高工作效率。在...
    99+
    2023-06-15
  • RocketMQ 事务消息 原理及使用方法解析
    🍊 Java学习:Java从入门到精通总结 🍊 深入浅出RocketMQ设计思想:深入浅出RocketMQ设计思想 🍊 绝对不一样的职场干货:大厂最佳实践经验指南 📆 最近更新:2023...
    99+
    2023-09-14
    java-rocketmq rocketmq java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作