不,是的,也许吧.这取决于.

调用mmap通常只意味着对应用程序而言,映射文件的内容将映射到其地址空间,就像文件已加载到那里一样.或者,好像该文件确实存在于内存中,就好像它们是同一个(包括更改被写回磁盘,假设您具有写访问权限).

不多也不少.它没有加载某些东西的概念,应用程序也不知道这意味着什么.

应用程序并不真正了解内存等任何内容,尽管虚拟内存系统使其看起来像这样.应用程序可以“看到”(和访问)的内存可能或可能不对应于实际的物理内存,原则上这可以随时更改,无需事先警告,也没有明显的原因(对您的应用程序来说很明显).

除了可能由于页面错误而经历小的延迟之外,应用程序(原则上)完全不知道发生任何此类事情并且几乎没有或没有对它的控制1.

通常,应用程序将根据需要从映射文件(包括主可执行文件!)加载页面,这是遇到故障的结果.但是,操作系统通常会尝试推测性地预取数据以优化性能.

在实践中,调用mmap将立即开始(异步)从映射的开始预取页面,直到某个实现指定的大小.原则上,对于小文件,这意味着答案是“是”,对于较大的文件,这将是“否”.

但是,mmap不会阻止等待readahead的完成,这意味着在mmap返回后你不能保证任何文件立即存在于RAM中(不管你在任何时候都有这种保证!).就此而言,答案是“也许”.

在Linux下,我上次看,默认的预取大小是31个块(~127k) – 但这可能已经改变,加上它是一个可调参数.当触摸预取区域附近或末尾的页面时,异步预取更多页面.

如果你暗示MADV_RANDOM是疯狂的,预取“不太可能发生”,在Linux下这完全禁用了预取.

另一方面,给出MADV_SEQUENTIAL提示将从映射的开始开始异步地预取“更积极地”(并且可以更快地丢弃被访问的页面).在Linux下,“更积极”意味着正常数量的两倍.

给出MADV_WILLNEED提示建议(但不保证)尽快加载给定范围内的所有页面(因为您说要访问它们).操作系统可能会忽略这一点,但在Linux下,它被视为一个订单而不是一个提示,直到进程的最大RSS限制和一个实现指定的限制(如果我没记错的话,是物理内存量的1/2) ).

请注意,MADV_DONTNEED可以说是在Linux下错误地实现的.提示不是按POSIX指定的方式解释的,即您可以暂时将页面分页,而是指您要丢弃它们.这对于只读映射的页面没有什么大的区别(除了一个小的延迟,你说它可以),但它肯定对其他一切都很重要.

特别是,使用MADV_DONTNEED认为Linux会在操作系统将它们懒惰地写入磁盘后释放不需要的页面,这不是事情的运作方式!您必须明确同步或准备惊喜.

在调用mmap之前调用了文件描述符的readahead(或者之前已经读过/写过文件),文件的内容实际上确实会立即存在于RAM中.

但是,这只是一个实现细节(统一虚拟内存系统),并受系统内存压力的影响.

调用mlock将 – 假设成功2 – 立即将请求的页面加载到RAM中.它会阻塞,直到所有页面都存在,并且您可以保证页面将保留在RAM中,直到您将其解锁.

1存在查询(mincore)特定范围内的任何或所有页面是否实际存在的功能,以及提示操作系统关于您希望在没有任何硬保证(madvise)的情况下发生的事情的功能,最后,强制有限的页面子集出现在内存(mlock)中以实现特权进程的功能.

2它可能不会,因为缺乏特权和超额配额或物理RAM的数量.

linux文件 内存映射 锁,linux – mmap:将映射文件立即加载到内存中吗?相关推荐

  1. linux so lazyload,linux函数深入探索——open函数打开文件是否将文件内容加载到内存空间...

    转自:https://blog.csdn.net/qq_17019203/article/details/85051627 问题:open(2)函数打开文件是否将文件内容加载到内存空间 首先,文件打开 ...

  2. linux 内存中建立文件,linux函数深入探索——open函数打开文件是否将文件内容加载到内存空间...

    转自:https://blog.csdn.net/qq_17019203/article/details/85051627 问题:open(2)函数打开文件是否将文件内容加载到内存空间 首先,文件打开 ...

  3. linux配置文件重新加载失败,linux下为什么每次修改完配置文件之后都需要重新加载配置文件...

    解释了 linux下为什么每次修改完配置文件之后都需要重新加载配置文件 目录一.关于inode 二.inode的作用 二.为什么每次修改完服务器配置文件之后,都需要重新加载一下配置文件? 一.关于in ...

  4. c语言文件 加载内存吗,把文件中的数据加载到内存进行查找C语言实现.docx

    把文件中的数据加载到内存进行查找C语言实现 #define _CRT_SECURE_NO_WARNINGS#include#include#includechar **pp=NULL;void ini ...

  5. python变量区变量保存与加载_python – Flask:使用全局变量将数据文件加载到内存中...

    我有一个大的 XML文件,它被打开,加载到内存中,然后由 Python类关闭.简化示例如下所示: class Dictionary(): def __init__(self,filename): f ...

  6. java动态编译类文件并加载到内存中

    如果你想在动态编译并加载了class后,能够用hibernate的数据访问接口以面向对象的方式来操作该class类,请参考这篇博文-http://www.cnblogs.com/anai/p/4270 ...

  7. android drawable 图片大小,不同的drawable文件夹下图片加载到内存后图片尺寸大小的分析...

    先说结论: 不同drawable文件下图片在同一手机图片尺寸是不同的 同一个drawable文件夹下的图片在不同分辨率的手机图片尺寸是不同的 先聊下DP 要在密度不同的屏幕上保留界面的可见尺寸,您必须 ...

  8. 导入Java文件还是class文件_java程序运行的时候,是把所有的class文件都加载到内存吗?还是用的什么加载什么?...

    这一块还没有深入了解,不敢误人子弟. 我知道的,虚拟机在运行的时候,会预先加载一个常用的class,比如java.lang包下面的. 至于你在程序中自己引用的class文件/jar包之类的,是有一个加 ...

  9. 可执行程序加载到内存的过程

    在linux中,程序的加载,涉及到两个工具,linker 和loader.Linker主要涉及动态链接库的使用,loader主要涉及软件的加载. 1.  exec执行一个程序 2.  elf为现在非常 ...

最新文章

  1. FormData上传文件同时附带其他参数
  2. 解决flex4 分辨率自适应问题
  3. ubuntu下的win交叉编译
  4. codeforces 521div3(D Cutting Out)java
  5. 2017年关于数据科学的六大预言
  6. 【最新合集】编译原理习题(含答案)_20代码生成_MOOC慕课 哈工大 陈鄞
  7. win7链接html线到屏幕上,为你解决win7系统html文件图标变成空白的具体技巧 - win7吧...
  8. 使用JSON Viewer直观查看JSON数据
  9. 【Http】加解密 生成 X.509格式,DER编码,后缀名.cer 加密公钥证书
  10. spark的python开发安装方式_windows下安装spark-python
  11. Windows核心编程_修改其它进程里的内存值+示例:修改游戏分数
  12. 【机器视觉锁付整体解决方案】视觉纠偏和找孔示教操作
  13. Web安全——同源策略理解
  14. wordpress企业站模板
  15. mysql ndb 关闭,监控mysql、ndb进程重启
  16. ofd格式转pdf,所需代码和jar包--亲测可用
  17. 阿里云服务器优惠活动 降低至7.7元/月
  18. python操作pdf与图片相互转换
  19. 51 地图基本接口(二)
  20. 如何使用Metasploit对安卓手机进行控制

热门文章

  1. C++之TR1::function
  2. MySQL 4种text类型的最大长度
  3. 一文彻底了解Logstash
  4. javaweb---三层架构++
  5. Why is it recommended to create clusters with odd number of nodes? | 为什么集群节点建议奇数个?
  6. 深入理解h2和r2dbc-h2
  7. Flume性能测试报告
  8. 电子病历系统厂家排名_指挥大厅音响系统方案,会议话筒厂家-麦纳电子科技
  9. python正则表达式模块_Python正则表达式模块(re模块)
  10. charles 手机抓包设置