相关疑难解决方法(0)

与标准 I/O 系统调用相比,内存映射文件如何显着提高性能?

操作系统概念 说

考虑使用标准系统调用 open()、read() 和 write()对磁盘上的文件进行顺序读取。每个文件访问都需要一个系统调用和磁盘访问

或者,我们可以使用目前讨论的虚拟内存技术将文件 I/O 视为常规内存访问。这种方法称为 内存映射文件,允许虚拟地址空间的一部分与文件逻辑关联。正如我们将看到的,这可以导致显着的性能提升. 文件的内存映射是通过将磁盘块映射到内存中的一个页面(或多个页面)来完成的。对文件的初始访问通过普通的请求分页进行,导致页面错误。然而,文件的一个页面大小的部分从文件系统读取到一个物理页面中(一些系统可能选择一次读取超过一个页面大小的内存块)。对文件的后续读取和写入将作为常规内存访问进行处理。通过内存操作文件而不是产生使用 read() 和 write() 系统调用的开销,可以简化并加速文件访问和使用。

你能分析一下内存映射文件的性能吗?

如果我是正确的,内存映射文件的工作方式如下。创建内存映射需要系统调用。然后当它访问映射内存时,就会发生页面错误。页面错误也有开销。

与标准 I/O 系统调用相比,内存映射文件如何显着提高性能?

谢谢。

linux io virtual-memory

15
推荐指数
2
解决办法
2万
查看次数

Linux 上内存过量使用的目的是什么?

我知道内存过量使用,我非常不喜欢它并且通常禁用它。我不是在考虑基于setuid的系统进程(比如那些 runningsudopostfix),而是一个普通的 Linux 进程,它是由一些没有管理员权限的用户在某个命令行上启动的。

一个编写良好的程序可能malloc(或mmap经常被 使用malloc)比可用内存更多的内存,并在使用它时崩溃。如果没有内存过量使用,那mallocmmap将失败,而编写良好的程序将捕获该失败。malloc当使用失败的结果时,编写不佳的程序(使用时不检查失败)会崩溃malloc

当然,虚拟地址空间(由mmapso by扩展malloc)与 RAM 不同(RAM 是由内核管理的资源,请参阅this;进程的虚拟地址空间由execve(2)初始化并由mmap& sbrkso don扩展不直接消耗RAM,只消耗虚拟内存)。

请注意,当真正需要时,可以使用madvise(2)来优化 RAM 使用(它可以给出提示,使用MADV_DONTNEED内核将一些页面交换到磁盘上)。想要过度使用的程序可以将mmap(2)MAP_NORESERVE. 我对内存过度使用的理解就像每个内存映射(byexecvemmap)都隐式使用MAP_NORESERVE

我的看法是它对非常有缺陷的程序非常有用。但恕我直言真正的开发人员应该经常检查的失败mallocmmap以及相关的虚拟地址空间变化的功能(例如像在这里)。我研究过的大多数源代码的自由软件程序都有这样的检查,也许是某种 …

linux mmap

14
推荐指数
3
解决办法
5465
查看次数

内核如何在磁盘缓存和交换之间做出决定?

继其他问题中提出的主题之后,我相信当 Linux 内核尝试释放物理 RAM 时,它会在丢弃磁盘缓存中的页面或将其他页面刷新到交换区之间做出某种决定。 我对此不确定,也许我完全误解了这个机制。

无论如何,以下方面之间存在协同作用:

  • 内核保留自己的内部磁盘缓存
  • 程序内存映射文件
  • “常规”应用程序内存被放置在交换文件中

所有这三个都可以用来释放物理 RAM,这三个都依赖于将“脏”页写入磁盘,或者只是知道这些页已经干净地复制到磁盘上并将它们从物理 RAM 分配中丢弃。


通过交换空间,可以为各个交换分区和文件赋予优先级,以便在较慢的设备之前使用较快的设备。我不知道其他非交换设备有任何此类配置。

我的问题是:内核如何决定释放哪些内存?

  • 它纯粹基于上次访问吗?
  • 内核是否同等地使用以上所有三个?
    • 它们(以及各个磁盘)之间是否有优先级
    • 可以配置吗?

这个问题是由与此类似的经历驱动的,但我希望这个问题重点关注底层机制,而不是解决特定问题。

linux memory swap

7
推荐指数
1
解决办法
2024
查看次数

Linux 如何将物理地址转换为(可能是多个)虚拟地址?

根据我的理解,当Linux将物理页帧交换进/出RAM时,它需要为映射到该物理页的所有虚拟页设置有效位。将虚拟页映射到物理页框似乎在教科书中解释得很好,但是内核如何从物理页框找到所有虚拟页呢?如果能在 Linux 源代码中实际实现,我们将不胜感激。

linux virtual-memory memory-management

3
推荐指数
1
解决办法
651
查看次数

标签 统计

linux ×4

virtual-memory ×2

io ×1

memory ×1

memory-management ×1

mmap ×1

swap ×1