我有一个应用程序,首先使用linux mmap
系统调用来创建大型匿名映射(大约4MB)。
然后在执行过程中,为了尽快释放内存,我正在考虑对较小的内存块进行映射,以便最初是大块的虚拟内存映射将导致碎片化。
这可能由于虚拟内存转换表碎片而导致性能问题,还是内核使用智能策略来避免这种情况?我可以介意虚拟内存映射的碎片化吗?
答案 0 :(得分:2)
简短的回答:除非您要随机分配大量的最小粒度(即4096字节)的非连续区域,否则不会这样。
长答案:种,
在现代体系结构上,您具有多个级别的虚拟内存映射(或页表,无论您喜欢使用哪个术语),对于64位体系结构,通常都需要为48位地址空间使用4个级别的内存映射(Intel即将推出的扩展将添加另一个级别,该级别允许将4096字节的页面分为256字节的页面)。每次在没有地图存在的区域中分配页面时,内核必须分配一个新的(通常是物理上连续的;请注意,这是相对昂贵的操作)内存以保存该内存空间在该区域的转换图。我将避免使用特定于弓的术语,而仅将其命名为L0 -> L1 -> L2 -> L3
,将L0
作为代表该虚拟内存空间的根映射。这将随页面大小粒度以及不同的操作系统或体系结构(例如Linux具有超级页面)而有所不同。
现在,如果您的新映射处于L3级别,并且具有L3页面表,则新映射将只涉及更改该区域中的条目以指示翻译。如果没有L3页表,则必须分配一个新的L3页表,并将其输入到L2页表中。依此类推,直到L0页面表。
一些注意事项:
gettimeofday
可以从VDSO读取它或使用VDSO蹦床来读取它)。