分配页面对齐的内存块有什么好处?

use*_*840 6 c cpu memory-management alignment

我意识到大多数CPU更擅长在对齐的内存地址读取数据,即内存地址是CPU字的倍数.但是,在很多地方我都读过有关分配页面对齐内存的内容.为什么有人想要获得页面对齐的内存地址?它只是为了更大的表现吗?

小智 5

分配内存的“传统”方法是将其放在连续的地址空间中(“堆”,通过调用向上增长sbrk())。每次遇到页面边界时,都会出现页面错误,并且会映射到新页面。此策略有两个后果:

  1. 仅当该页面内的所有分配都已释放并且所有其他分配都映射到较低地址时,才可以释放这些页面。(堆碎片的典型效果)。
  2. 较大的分配可能比严格需要的占用更多的页面(如果它们开始在页面中间的某个位置)。

因此,此策略仅适用于较小的内存块,在这些内存块中,您不想为每个分配“浪费”整个页面。

对于较大的块,最好使用mmap()直接将新页面映射到某处的方式,以便获得“页面对齐的内存”。使用此功能,您的分配不会与其他分配共享页面。一旦您不再需要内存,就可以将其还给操作系统。请注意,许多malloc()实现会根据所需分配的大小自动选择使用sbrk()还是进行mmap()分配。