1GB 大页面 - 写入是否发生在 1GB 块中?

Bla*_*ret 5 linux virtual-memory ram

我试图了解大页面大小与数据实际写入 RAM 的方式之间的关系。

当进程使用 1GB 大页面时会发生什么 - 写入是否发生在 1GB 块中?我猜我对这个假设完全错误?

phe*_*mer 5

大页面用于分配内存块,而不是写入它们。

通常,当应用程序需要大量内存时,它们必须分配许多“页面”。页面只是一块物理内存。通常这个块只有几 KB。因此,当应用程序执行大量跨页的大量内存密集型操作时,内核必须将所有这些虚拟内存页转换为物理内存的成本很高。

为了优化这一点,内核提供了大页面,这些页面基本上是大于默认页面大小的分配。因此,不必分配数千个页面,只需分配几个页面即可。读取和写入仍然是正在读取或写入的任何大小。如果应用程序将一个 10 字节的字符串写入一个大页面,它仍然是一个 10 字节的写入。


Gil*_*il' 5

内存写入的块大小定义不止一种。你可以认为它是:

  • 存储指令的宽度(存储字节、存储字……),通常为 1、2、4、8 或 16;
  • 缓存线的宽度,通常是 16 或 64 字节(不同的缓存级别可能有不同的线宽);
  • 内存总线的宽度,在软件中是无法直接观察到的;
  • 可能还有一些更合理的感觉。

这些都与页面大小无关。

页面大小是MMU 中页面的一个属性。MMU 将虚拟地址(由程序使用)转换为物理地址(指定内存中的物理位置)。将虚拟地址转换为物理地址的过程如下:

  • 查找一级描述符表的地址。
  • 提取虚拟地址的最高位并将它们用作一级描述符表中的索引。
  • 解码该索引处的 L1 描述符,这会产生二级描述符表的地址。
  • 从虚拟地址中提取更多位,并将它们用作二级描述符表中的索引。
  • 解码该索引处的 L2 描述符,这会产生页面开始的地址。页是物理上连续的内存单元,由 MMU 表中的一个条目描述。
  • 用页起始地址屏蔽虚拟地址的剩余位以得到物理地址。

常见的 32 位架构经过两个表级别;常见的 64 位架构经过 3. Linux 最多支持 4 个级别。

某些 CPU 体系结构支持使某些页面更大,通过更少的间接级别。这使得访问速度更快,并保持页表的大小较小,但代价是内存分配的灵活性较低。对于大多数应用程序来说,时间增加是最小的,但是对于一些对性能敏感的应用程序,这些应用程序无法从小页面的灵活性中受益,例如数据库。大页面是指通过比正常数量更少的级别,并且相应地更大的页面。

使用大页面的软件通常会专门请求它们(通过标志到mmap,请参阅如何在虚拟地址空间中确定页面大小?了解更多详细信息)。在这个初始请求之后,它不需要知道或关心页面大小。特别是,内存访问由 MMU 处理:访问时不涉及软件。