在Unix/Linux系统下读写文件,一般有两种方式。

一种是open一个文件,然后使用read系统调用读取文件的一部分或全部。这个read过程是这样的:内核将文件中的数据从磁盘区域读取到内核页高速缓冲区,再从内核的高速缓冲区读取到用户进程的地址空间。这里就涉及到了数据的两次拷贝:磁盘->内核,内核->用户态。

而且当存在多个进程同时读取同一个文件时,每一个进程中的地址空间都会保存一份副本,这样肯定不是最优方式的,造成了物理内存的浪费。看下图:

第二种方式就是使用内存映射的方式。具体操作方式是:open一个文件,然后调用mmap系统调用,将文件的内容的全部或一部分直接映射到进程的地址空间,映射完成后,进程可以像访问普通内存一样做其他的操作,比如memcpy等等。mmap并不分配物理地址空间,它只是占有进程的虚拟地址空间。这跟第一种方式不一样的,第一种方式需要预先分配好物理内存,内核才能将页高速缓冲中的文件数据拷贝到用户进程指定的内存空间中。

而第二种方式,当多个进程需要同时访问同一个文件时,每个进程都将文件所存储的内核高速缓冲映射到自己的进程地址空间。当第一个进程访问内核中的缓冲区时候,前面讲过并没有实际拷贝数据,这时MMU在地址映射表中是无法找到与ptr相对应的物理地址的,也就是MMU失败,就会触发缺页中断。内核将文件的这一页数据读入到内核高速缓冲区中,并更新进程的页表,使页表指向内核缓冲中的这一页。之后有其他的进程再次访问这一页的时候,该页已经在内存中了,内核只需要将进程的页表登记并且指向内核的页高速缓冲区即可。如下图所示:

下面是具体的使用方法:

#include  /* for mmap and munmap */#include  /* for open */#include  /* for open */#include  /* for open */#include  /* for lseek and write */#include  int main(int argc, char **argv){ int fd; char *mapped_mem, * p; int flength = 1024; void * start_addr = 0;  fd = open(argv[1], O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); flength = lseek(fd, 1, SEEK_END); write(fd, "0

igs无法分配驱动器映射表_Linux的mmap内存映射原理到底是怎样的?相关推荐

  1. igs无法分配驱动器映射表_利用VBA获取驱动器的信息

    大家好,我们今日讲解"VBA信息获取与处理"教程中第十七个专题"文件及文件夹信息的获取及操作"的第三节"利用VBA获取文件的信息和属性",这 ...

  2. igs无法分配驱动器映射表_硬盘无法使用,用DiskPart进行分区和格式化,非常简单...

    如果计算机硬盘出现问题,有时不是硬件上出现了错误,很可能只是逻辑上出现了问题,这时就可以使用DiskPart来快速解决. 在Windows 10上,当外部存储(例如U盘.可移动硬盘或SD卡)由于数据损 ...

  3. igs无法分配驱动器映射表_如何同步本地文件到网络驱动器/NAS?

    ​在我们的生活中,有多种原因促使我们需要将文件夹同步到(网络驱动器)共享文件夹或NAS.例如,想要脱机查看先前可用的文件夹.同步文件夹的作用:自动保存两个或多个相同的文件夹,并将所有更改的文件夹从源目 ...

  4. igs无法分配驱动器映射表_左神算法基础:哈希函数和哈希表

    笔者在读研刚开始的时候,偶尔看面经,有这样一个问题:只用2GB内存在20亿个整数中找到出现次数最多的数,当时的我一脸懵逼,怎么去思考,20亿个数?What The Fuck! 但是,看完今天的文章,你 ...

  5. igs无法分配驱动器映射表_项目超过255个摄像机怎么分配IP地址

    ------ 欢迎新老朋友们加入微信群,方便技术讨论,信息互通,行业交流:智能弱电行业专家群:智能弱电行业技术群:智能弱电行业信息群:申请加入请加小编微信:15537112161------- 我们做 ...

  6. igs无法分配驱动器映射表_关于光盘读取二三事(解决UDF多次刻录无法读取问题)...

    点击关注上方"消遣杂谈",关注后了解更多内容. 目的:修改注册表的相关信息,实现光盘自由的读取,减少资源的浪费. 前言:在平时工作中,经常遇到别的电脑刻录的光盘放到另外一台电脑中无 ...

  7. linux红外键盘映射表,linux下修改键盘映射

    有段时间特别喜欢HHKB(一款适合专业人士使用的键盘),不过被它超高的价位给打败了.后来想想喜欢它的缘由有两个,第一就是它control键的位置,它的control键位于常规键盘的capslock键的 ...

  8. linux+mmap父子通信_linux库函数mmap()原理?转载

    linux库函数mmap()原理 转载 1.mmap基本概念 2.mmap内存映射原理 3.mmap和常规文件操作的区别 4.mmap优点总结 5.mmap相关函数 6.mmap使用细节 7.mmap ...

  9. Python字符串操作集锦之字符串映射表

    14.字符串的映射(mapping) 字符串的映射中,包含两个函数maketrans()和translate(),并且通常是这两个函数配合使用 .这两函数都是string中的模块,所以使用前需要导入s ...

最新文章

  1. python新手入门-python新手入门方法
  2. windows 64位 安装mvn提示 不是内部或外部命令
  3. 惊了,掌握了这个炼丹技巧的我开始突飞猛进
  4. Python编程:从入门到实践 11-3
  5. 苹果App签名工具有哪些?
  6. 中国区块链专利数量全球第一 BAT专利数稳居世界20强
  7. Python CSV模块
  8. 关系型数据库中一对多,多对一,多对多关系(详细)
  9. 值得您收藏的png图标第二辑
  10. 使用C++让鼠标指针抖动
  11. 2019年二级造价工程师讲义视频课件免费下载地址
  12. 微信相关账号需要哪些资质
  13. scrapy爬虫实例:凤凰网
  14. 计算机控制课设串级回路,华北电力大学过程计算机控制课设ddc串级回路pid闭环.docx...
  15. Form表单 JSON Content-type解析
  16. FastDFS集群环境搭建(五)FastDFS监控器fdfs_monitor
  17. sql 2008 数据库每天增量备份,每周完整备份
  18. 一年半Android工作经验剑指杭州:我是如何拿下头条、阿里和滴滴 offer 的
  19. 局域网、城域网、广域网及国际互联网介绍
  20. 微信小程序-炫酷手持滚动弹幕生成小工具

热门文章

  1. 用C语言实现高效嵌入式系统编程
  2. ZYNQ使用PS+PL点灯总结
  3. 好看好听的入门挂脖耳机,真是个工作好帮手,英雄S1上手
  4. 两个路由器的无线连接——FAST路由版
  5. 天茹美妆祛斑怎么样?
  6. Nvidia Tensor Core-WMMA API编程入门
  7. 解决彻底删除网址前的ico小图标
  8. Python tkinter - 第五章 按钮控件(Button)属性
  9. 全栈“食”代:用 Django + Nuxt 实现美食分享网站(一)
  10. 群狼调研开展深圳市某区开展控烟工作暗访