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

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

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

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

答案1

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

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

这些都与页面大小无关。

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

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

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

某些 CPU 架构支持增大某些页面,并减少间接级别。这使得访问速度更快,并减小页表的大小,但代价是内存分配的灵活性降低。对于大多数应用程序来说,时间增益是最小的,但对于一些不能从小页面的灵活性中受益的性能敏感的应用程序(例如数据库)来说,时间增益是可以感觉到的。大页面是比正常数量经历更少级别的页面,并且相应地更大。

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

答案2

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

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

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

相关内容