当前位置: 首页 > 面试题库 >

MAP_NORESERVE的mmap是否保留物理内存?

岳玉书
2023-03-14
问题内容

该MMAP文件说,下面讲的标志MAP_NORESERVE。

不要为该映射保留交换空间。当保留交换空间时,可以保证可以修改映射。如果没有保留交换空间,则在没有物理内存可用的情况下,可能会在写入时获得SIGSEGV。

我真正想要的只是保留虚拟内存地址,而没有分配实际的物理内存。可以使用MAP_NORESERVE的mmap来完成此操作吗?如果我想使用任何物理内存,我将在MAP_NORESERVE通过mmap分配的地址范围内,再次使用MAP_FIXED对其进行映射。

总而言之,我希望内核不为带有MAP_NORSERVE标志的mmap分配的内存保留任何物理页。它是否真的像这样工作,或者如果内核具有足够的物理内存,内核是否会分配物理页面?


问题答案:

Mmap()是管理{地址,物理内存,磁盘块}之间的关联的方法之一,该关联的所有三个成员都是资源。关联保存在页面表项(PTE)中

mmap()的实际作用是:

  • [也许]在用户进程内部分配一个地址范围。此范围必须包含连续的地址(不应与现有范围重叠)
  • 为请求的范围创建PTE,并使它们指向地址范围内的页面
  • 将PTE指向要进行mmap()处理的文件
  • [也许]分配和预取(某些)页面
  • [也许]保留一些后备存储。

上述步骤中有很多(5之3)是可选的,并取决于mmap()调用中提供的实际参数和标志。(fd可能为-1:创建匿名映射,起始地址可能为NULL:mmap应该分配(以前)未使用的内存范围)

调用mmap()之后,内核中的pagefault-handler应该能够找出要做什么。(将物理内存附加到页面上;刷新并分离;分配并COW,…)

保留交换空间意味着调用方相信 将来任何时候
都将有足够的交换空间。交换空间由所有进程共享,因此永远不能保证有足够的交换空间。预分配它(或多或少)可确保 调用过程
将始终具有足够的分配量。(否则:mmap()应该失败了)



 类似资料:
  • 我正在为我的sqlite日志数据库使用准备好的语句。 我的线程每50ms运行一次,将日志缓冲区中的内容写入数据库。 目前,我正在对每个线程运行一个新的准备好的语句批处理,并在所有数据线写入后关闭它们。 现在我想知道是否最好将准备好的语句保存在内存中,并仅在线程关闭/中断时关闭它? 我之所以进行这种预优化,是因为我希望这个日志线程对主应用程序性能的干扰尽可能小,我可以想象每50秒分配/解析/验证资源

  • 为了降低RSS,我正在Java8上运行不同jvm选项的实验: > 用于Rss跟踪的脚本: 用于设置java进程的JVM args: 与JCMD进行差异:

  • 问题内容: Java的foreach循环是否从第一个对象开始,并且以线性方式工作到结束?例如 是否总是先处理字符串“ Zoe”,然后处理“ Bob”等?没有排序发生?我已经对它进行了测试,但没有找到任何东西,但是我需要保证,在文档中找不到任何东西。 问题答案: 是。顺序不变。这适用于Java类集合框架的所有类型的集合,这些集合实现由for循环使用的迭代器接口。如果要对数组进行排序,则可以使用Arr

  • 问题内容: 有没有办法将重复项保留在Hive的收集集中,或使用其他方法模拟Hive提供的聚合收集的种类?我想将具有相同键的列中的所有项目聚合到一个具有重复项的数组中。 IE浏览器: 应该返回: 问题答案: 尝试在Hive 0.13.0之后使用COLLECT_LIST(col)

  • 问题内容: 我知道这可能是一个愚蠢的问题,但是我已经寻找了一段时间,找不到确切的答案。如果我使用或(在Linux机器上的C语言中),是否有人在RAM中分配空间?例如,如果我有2GB的RAM并想使用所有可用的RAM,我可以只使用组合键,还是还有我不知道的另一种选择? 我想编写一系列简单的程序,这些程序可以同时运行,并保留进程中使用的所有RAM来强制使用交换,并且频繁交换页面。我已经在下面的程序中尝试

  • 我知道React可能会异步和批量地执行状态更新,以进行性能优化。因此,在调用之后,您永远不能相信会更新状态。但是,您是否信任React按照调用时的顺序更新状态 相同的组件? 不同的组件? 任何有文档支持的答案都是非常感谢的。