[OS] Assignment3_Prerequisite_mmap()_1

专业解释

这张图片展示了 mmap() 函数的作用和其在内存映射中的应用。在操作系统中,mmap() 是一个系统调用,它的主要作用是将文件或设备的内容映射到进程的虚拟地址空间中,使得文件内容可以像内存一样直接访问。

  • mmap() 函数的核心功能:将内核空间中的一段内存映射到用户空间。这意味着文件或设备的内容不需要通过 readwrite 系统调用来访问,而是直接作为进程内存的一部分。
  • 双向影响:一旦映射完成,对文件内容的修改将直接影响内核空间和用户空间,二者之间共享一份数据。这种方式可以提高 I/O 操作的效率,特别是对于大文件的读取和写入。

在图中:

  • Process User Space 代表进程的用户空间内存,显示了文件在内存中的映射区域。
  • file 代表要映射的文件,offset 指的是映射的起始位置,length 表示映射区域的大小。

通俗解释

简单来说,mmap() 就是把一个文件当作内存的一部分,让程序可以直接对文件的内容进行读写,而不必频繁地通过 readwrite 函数进行操作。这样不仅使操作更简单,还能提高程序的效率。对于文件的修改会立即反映在程序内存中,反之亦然。

图中的箭头表示,文件的某一部分被映射到了进程的用户空间内存中,可以直接操作这段内存来读取或修改文件。

拓展知识

  1. mmap() 的应用场景

    • 大文件处理:mmap() 非常适合处理大文件,因为它避免了数据的多次拷贝,提高了性能。
    • 内存共享:可以在多个进程之间共享数据,尤其适用于需要频繁访问相同数据的情况。
    • 映射设备内存:有些系统设备的内存也可以通过 mmap() 访问,这样可以简化硬件控制和数据操作。
  2. mmap() 的常见标志

    • MAP_SHARED:允许共享映射,对文件的更改会在所有映射中生效。
    • MAP_PRIVATE:创建一个私有的映射,对文件的更改只在当前进程中生效,其他进程不可见。
  3. 与传统 I/O 的区别

    • mmap() 直接将文件映射到内存中,减少了系统调用的开销。
    • 相比于 readwritemmap() 只需一次调用,节省了内存的拷贝操作,因此更适合需要频繁访问的场景。

使用 mmap() 的主要原因是提升文件 I/O 的效率和简化数据访问。以下是一些具体的优点和适用场景:

1. 提升效率

  • 减少系统调用开销:传统的文件读写需要多次调用 readwrite,每次都需要在用户空间和内核空间之间切换,这会产生较大的性能开销。mmap() 通过将文件映射到进程的地址空间,使得文件内容可以直接像内存一样访问,减少了系统调用次数和内存拷贝。
  • 零拷贝:通过 mmap(),文件的数据可以直接映射到内存,避免了从文件到缓存再到应用程序的多次拷贝。对于大文件的处理,mmap() 可以显著减少内存占用和 CPU 负载。

2. 简化编程

  • 直接访问文件内容:使用 mmap() 后,文件内容可以直接作为内存中的数据进行访问,像数组一样读写,而不需要处理文件读写的逻辑。对于涉及大量随机读写操作的程序,比如数据库系统,mmap() 可以让代码更简洁、易读。
  • 方便数据共享:多个进程可以通过 mmap() 将同一个文件映射到它们的内存空间中,共享同一块内存数据。这样可以在多个进程之间快速交换数据,无需额外的通信机制。

3. 适合大文件处理

  • 节省内存:当需要处理非常大的文件时,传统方法可能需要将文件全部加载到内存中,这在内存受限的环境下不可行。而 mmap() 允许按需访问文件的特定部分,不需要一次性全部加载,内存使用更高效。
  • 按需分页:操作系统会根据访问情况按需将文件的不同页加载到内存中,而不必一次性加载整个文件。这种按需分页机制非常适合大文件的部分访问场景。

适用场景

  • 数据库系统:数据库通常需要频繁地随机访问磁盘中的数据,mmap() 提供的零拷贝和直接内存访问让数据库引擎可以更高效地管理数据。
  • 大数据处理:在数据分析或科学计算中,经常需要读取或处理非常大的文件,mmap() 可以节省内存和处理时间。
  • 内存共享:当多个进程需要共享大量数据(例如,进程间共享缓存),使用 mmap() 可以更方便地实现高效的共享内存。

1. 用户空间与内核空间

  • 内核空间(Kernel Space):这是操作系统核心运行的区域,具有最高权限。它管理硬件资源(如 CPU、内存、磁盘)并控制系统中的所有进程。
  • 用户空间(User Space):这是用户程序(比如应用程序)运行的区域,权限受限,不能直接访问硬件资源。用户程序需要通过系统调用向内核请求资源或服务。

2. 磁盘与内存

在计算机中,磁盘(例如硬盘或 SSD)是用来永久存储数据的设备,而 内存(RAM)是用来临时存储和快速访问数据的设备。磁盘存储的数据需要被加载到内存中,程序才能对其进行操作。通常,文件是存储在磁盘上的,而程序的数据在执行时需要被加载到内存中。

3. mmap() 的工作流程

mmap() 的核心功能是将磁盘上的文件映射到进程的用户空间地址范围中,使程序可以直接访问文件的数据,而不必通过 readwrite 调用。以下是 mmap() 的关键步骤和它在内存、内核和磁盘之间的关系:

1)用户空间请求映射

当用户空间的程序调用 mmap() 时,实际上是发起了一个系统调用。这个系统调用进入内核空间,请求将某个文件的内容映射到程序的地址空间中。

2)内核空间设置映射关系
  • 内核接收到 mmap() 请求后,会在程序的用户空间地址范围中“预留”一块地址区间,作为文件内容的映射区域。这块预留的地址空间称为虚拟地址空间
  • 但此时,并不会立刻将文件数据加载到内存中。内核只是创建了一个“映射关系”,指示程序在访问这块地址空间时,其实访问的是磁盘上的文件内容。
3)按需加载(Demand Paging)
  • 当程序真正访问这块地址空间(也就是用户空间的映射区域)时,内核会检查对应的物理内存是否已经加载了数据。如果没有加载(因为一开始没有预加载),会触发一个缺页中断
  • 内核会捕捉到这个缺页中断,并根据映射关系,从磁盘上将文件对应的部分数据读取到内存中(通常是按页大小读取,比如 4KB 的页)。
  • 数据加载到内存后,内核更新页表,以便后续对该地址的访问直接读取内存数据,无需再从磁盘读取。
4)内核和用户空间共享数据
  • 一旦文件内容被加载到内存中,用户空间的程序就可以直接访问内存中的数据,而不再需要频繁访问磁盘。这块内存实际上是共享的,在一定条件下,用户空间和内核空间都可以看到这块内存的修改。
  • 也就是说,用户空间对映射区域的任何修改,都会立即反映在内核管理的内存中,反之亦然。对于使用 MAP_SHARED 标志的映射,修改甚至可以被同步到磁盘上的文件。

总结关系

  • 内核空间:管理 mmap() 的映射关系和内存分配。mmap() 的请求由内核处理,内核负责将文件映射到用户空间。
  • 用户空间:用户程序通过 mmap() 在用户空间中获得对文件的直接访问,不必通过额外的系统调用来读取文件。
  • 磁盘:文件最初在磁盘上存储,只有在程序访问映射区域时,内核才会按需将文件数据从磁盘加载到内存。
  • 内存:文件内容按需加载到内存中,这样用户程序可以直接访问并操作文件内容,同时节省内存资源。

说明:

1. Process User Space(进程用户空间)

专业解释

  • 用户空间是应用程序(如我们编写的程序)运行的内存区域,权限较低,不能直接操作硬件或系统资源。操作系统将内存划分为用户空间和内核空间,用户空间的程序只能通过系统调用与内核交互。

通俗解释

  • 用户空间就像是一个“安全沙盒”,程序在这个区域里运行,所有操作受到限制,不能随便访问系统的核心部分(内核空间)和其他程序的数据。

与其他词汇的关系

  • mmap() 将文件映射到用户空间中,程序可以直接在用户空间访问文件内容。

2. Kernel Space(内核空间)

专业解释

  • 内核空间是操作系统内核运行的地方,负责管理系统资源和处理系统调用。内核空间有完全的权限,可以直接操作硬件、内存和进程之间的通信。

通俗解释

  • 内核空间是系统的“控制中心”,它负责监控和管理计算机的资源,类似于“管理员”权限。用户空间的程序不能直接访问这个区域,必须通过系统调用请求内核的帮助。

与其他词汇的关系

  • mmap() 是用户空间程序请求内核空间的帮助,将文件映射到内存的操作由内核完成。

3. Mapped File(映射文件)

专业解释

  • 被映射的文件是通过 mmap() 映射到用户空间的文件内容,程序可以在用户空间直接访问这个文件的数据,而不必通过读取和写入系统调用。

通俗解释

  • 映射文件就像是一个“文件窗口”,程序可以通过这个窗口直接读取或写入文件内容,而不需要反复打开和关闭文件。

与其他词汇的关系

  • 映射文件是存在于磁盘上的数据,通过 mmap() 将其内容映射到内存中(用户空间的一部分),供程序直接访问。

4. Offset(偏移量)

专业解释

  • 偏移量指的是从文件开头开始的字节偏移位置。mmap() 可以指定一个偏移量,表示从文件的这个位置开始映射。

通俗解释

  • 偏移量就像书页的页码,告诉我们从文件的哪个位置开始读取或写入。比如偏移量为 1000 就意味着从文件的第 1000 个字节开始映射。

与其他词汇的关系

  • mmap() 可以指定偏移量来映射文件的特定部分,而不是从头到尾映射整个文件。

5. Length(长度)

专业解释

  • 长度指的是映射区域的大小(以字节为单位)。在 mmap() 中,您可以指定要映射的文件部分的大小,而不是整个文件。

通俗解释

  • 长度就像是我们想要读多少页内容。比如指定长度为 4000 字节,就是想从偏移量开始,连续读取或操作 4000 字节的数据。

与其他词汇的关系

  • 长度决定了映射区域的范围,可以用来控制映射的数据量,从而节省内存。

6. Page Table(页表)

专业解释

  • 页表是内核用于管理虚拟地址和物理地址之间映射关系的数据结构。它帮助操作系统跟踪用户空间的每一页(小块内存)是否在物理内存中。

通俗解释

  • 页表就像是地址簿,记录了用户程序的每个地址对应的物理内存位置。它可以帮助操作系统知道我们想访问的数据在不在内存中。

与其他词汇的关系

  • mmap() 映射的文件内容会在用户空间生成虚拟地址,内核会通过页表来管理这个虚拟地址和物理地址之间的映射关系。

7. Page Fault(缺页中断)

专业解释

  • 缺页中断是当程序访问的虚拟地址在内存中不存在时,由操作系统触发的中断。内核会捕捉这个中断,将相应的数据从磁盘加载到内存,更新页表,然后继续执行程序。

通俗解释

  • 缺页中断就像是在找书中的某页时发现没借到该页的书,于是赶紧去借回来。这种情况在 mmap() 中常见,因为一开始文件数据不会全部加载,只有访问到某个区域时才触发加载。

与其他词汇的关系

  • mmap() 实现按需加载,只有在用户程序访问映射的区域时才触发缺页中断,从而加载相应的数据到内存。

各词汇的共同关系和完整流程

  1. mmap() 请求:用户空间程序通过系统调用请求内核,将磁盘上的文件映射到用户空间的虚拟地址中。

  2. 映射关系的建立:内核在用户空间中保留一个虚拟地址范围,并将这个虚拟地址和文件位置(偏移量和长度)建立映射关系,但并不立即加载数据。

  3. 按需加载与页表管理

    • 当程序访问映射区域时,如果相应的数据不在内存中,会触发缺页中断
    • 内核捕捉到缺页中断后,通过页表找到对应的磁盘位置,将数据加载到内存中,并更新页表中的映射关系。
  4. 共享数据:映射文件的数据在内存中共享,用户空间的修改会直接反映在内核管理的内存中,必要时甚至可以同步到磁盘。

  5. 偏移量和长度的控制mmap() 可以通过偏移量和长度控制映射的具体位置和范围,从而更精细地使用内存。


通俗总结

简单来说,mmap() 是一个“快捷窗口”,让程序能直接访问文件内容而不需反复打开和读取。这个过程由内核负责管理,文件数据从磁盘按需加载到内存中,以节省资源。各词汇之间的关系如下:

  • 内核空间负责管理映射关系,用户空间通过映射直接访问文件;
  • 页表维护虚拟地址和物理地址的对应关系,缺页中断让系统按需加载数据;
  • 偏移量和长度帮助精确控制映射的范围,避免不必要的内存占用。

希望这能帮助您理解 mmap() 的机制以及图中的每个词汇之间的关系。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

部署istio应用未能产生Envoy sidecar代理

1. 问题描述及原因分析 在部署Prometheus、Grafana、Zipkin、Kiali监控度量Istio的第2.2章节,部署nginx应用,创建的pod并没有产生Envoy sidecar代理,仅有一个应用容器运行中 故在随后的prometheus中也没有产生指标istio_requests_total。通…

HBuilderX自定义Vue3页面模版

HBuilderX自定义Vue3页面模版 首先在HBuilderX工具下的任意一个项目添加新建自定义页面模版 新建模版文件&#xff0c;并打开进行编辑 vue3-setup-js.vue文件里填写样式模版&#xff08;根据自己的需要进行修改&#xff09; <template><view class"">&…

PAT甲级-1084 Broken Keyboard

题目 题目大意 坏的键盘不能打出字符。给出2个字符串&#xff0c;一个字符串是期望打出的字符&#xff0c;另一个字符串是实际打出的字符。要求输出坏掉的字符&#xff0c;字母键用大写字母。字符范围是_以及大小写字母和数字。 思路 因为大小写字母是同一个键&#xff0c;所…

【天线&其他】大疆无人机热成像人员目标检测系统源码&数据集全套:改进yolo11-bifpn-SDI

改进yolo11-ASF等200全套创新点大全&#xff1a;大疆无人机热成像人员目标检测系统源码&#xff06;数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.11.03 注意&#xff1a;由于项目一直在更新迭代&#xff0c;上面“1.图片效果展示”和“2.视频效果展示”展示的系…

gitee推送代码remote rejected

其原因是码云邮箱设置怕暴露邮箱账号&#xff0c;所以禁止了代码推送 直接把这个选项关掉就行了

英特尔股价分析,财报超出预期,英特尔股票该买入还是卖出?

猛兽财经核心观点&#xff1a; &#xff08;1&#xff09;虽然英特尔第三季度的营收超出预期&#xff0c;但盈利却不及预期。 &#xff08;2&#xff09;华尔街分析虽然仍对英特尔持谨慎态度&#xff1b;但预计其2025年后有望取得重大进展。 &#xff08;3&#xff09;猛兽财经…

靠谱的零代码产平台开发— 应用创建与设置

在当今数字化快速发展的时代&#xff0c;企业对于快速构建和部署应用的需求日益增长。然而&#xff0c;传统的应用开发方式往往耗时耗力&#xff0c;且需要专业的编程技能。为了应对这一挑战&#xff0c;靠谱的零代码平台应运而生&#xff0c;它们通过直观的拖拽式界面和丰富的…

如何优雅处理异常?处理异常的原则

前言 在我们日常工作中&#xff0c;经常会遇到一些异常&#xff0c;比如&#xff1a;NullPointerException、NumberFormatException、ClassCastException等等。 那么问题来了&#xff0c;我们该如何处理异常&#xff0c;让代码变得更优雅呢&#xff1f; 1 不要忽略异常 不知…

Scrapy入门

Scrapy 是用 Python 实现的一个为了爬取网站数据、提取结构性数据而编写的应用框架。 安装scrapy pip install scrapy2.5.0 1.新建 Scrapy项目 scrapy startproject mySpider # 项目名为mySpider 2.进入到spiders目录 cd mySpider/mySpider/spiders 3.创建爬虫 scrapy gensp…

从0开始linux(20)——文件(1)文件描述符

欢迎来到博主的专栏&#xff1a;从0开始linux 博主ID&#xff1a;代码小豪 文章目录 文件打开文件文件修饰符从linux源码了解文件描述符 文件 首先我们先来搞清楚文件是什么&#xff1f;文件其实就是一段数据&#xff0c;是一段存储在磁盘当中的数据&#xff0c;文件是由文件内…

【汇编语言】[BX]和loop指令(二)——在Debug中跟踪用loop指令实现的循环程序

文章目录 前言1. 题目引入1.1 问题一1.2 问题二1.3 问题三1.4 代码实现 2. 程序跟踪2.1 加载程序&#xff0c;用r命令查看寄存器内容2.2 用U命令查看内存中的程序2.3 用T命令进行程序跟踪2.4 用P命令使得程序返回 3. 循环次数更多的程序3.1 代码实现3.2 一个新的命令——g3.3 如…

Unity照片墙效果

Unity照片墙效果&#xff0c;如下效果展示 。 工程源码

鸿蒙HarmonyOS开发生日选择弹框

鸿蒙HarmonyOS开发生日选择弹框 生日选择弹框和城市选择弹框差不多&#xff0c;都是通过观察上一个数据变化来设置自己的数据 一、思路&#xff1a; 一个弹框上建三个compoent&#xff0c;一个年&#xff0c;一个月&#xff0c;一个日。日的数据是根据年和月进行变化的 二、…

浏览器内核版本更新:Chrome 130✔

SunBrowser 内核版本更新至 Chrome 130&#xff0c;UA 同步更新至 130。 如何更新浏览器内核版本&#xff1f; 本地设置更新 在 AdsPower 客户端点击右上角的[设置]&#xff0c;再点击[本地设置]&#xff0c;下滑找到版本信息&#xff0c;选中需要的内核版本立即下载。 新建浏…

【实践】某央企研究院如何打造IT监控告警平台?

01客户简介&#xff1a; 案例客户为某央企下属研究院。 02痛点分析&#xff1a; 随着信创国产化持续推进&#xff0c;案例客户已完成部分IT核心系统的替代&#xff0c;部署了一系列国产软硬件设施&#xff0c;如Kylinv10操作系统、融智通网络设备等。由于信创生态不够成熟&a…

SpringBoot在线教育系统:集成第三方服务

5系统详细实现 5.1 普通管理员管理 管理员可以对普通管理员账号信息进行添加修改删除操作。具体界面的展示如图5.1所示。 图5.1 普通管理员管理界面 5.2 课程管理员管理 管理员可以对课程管理员进行添加修改删除操作。具体界面如图5.2所示。 图5.2 课程管理员管理界面 5.3 …

vscode | 开发神器vscode快捷键删除和恢复

目录 快捷键不好使了删除快捷键恢复删除的快捷键 在vscode使用的过程中&#xff0c;随着我们自身需求的不断变化&#xff0c;安装的插件将会持续增长&#xff0c;那么随之而来的就会带来一个问题&#xff1a;插件的快捷键重复。快捷键重复导致的问题就是快捷键不好使了&#xf…

C++优选算法九 链表

一、常用技巧 画图&#xff01;直观形象&#xff0c;便于理解。引入虚拟“头”结点。不吝啬空间。快慢双指针&#xff1a; 判环 找链表中环的入口 找链表中倒数第n个结点 二、常用操作 创建一个新结点尾插头插 三、示例题目 1.两数相加. - 力扣&#xff08…

计算机网络:网络层 —— 虚拟专用网 VPN

文章目录 虚拟专用网 VPN 概述内联网 VPN外联网 VPN 虚拟专用网 VPN 概述 虚拟专用网&#xff08;Virtual Private Network&#xff0c;VPN&#xff09;&#xff1a;利用公用的因特网作为本机构各专用网之间的通信载体&#xff0c;这样形成的网络又称为虚拟专用网。 出于安全…

Web 安全基础知识梳理大全,零基础入门到精通,收藏这篇就够了

一、各种linux虚拟机忘记密码 1、红帽忘记密码修改root密码 1 在重启的时候 e 进入 2 在linux16 后面找到UTF-8 在后面加 rd.break 然后ctrlx 3 这时候可以输入mount 看一下 会发现根为 /sysroot/ 没有w权限&#xff0c;只有ro权限 4 输入 mount -o remount,r…