Why mmap is faster than system calls

原文链接 作者 Alexandra (Sasha) Fedorova

关于mmap为什么比系统调用快,作者通过实验进行了验证,通过连续,随机,进行缓存, 不进行缓存,分为4种情况

  • 文件连续访问且被缓存
  • 文件连续访问且未被缓存
  • 文件随机访问且被缓存
  • 文件随机访问且未被缓存
    实验结果发现出去少数例外, mmap系统调用快2-6倍

通过专业的CPU检测工具可以看到
系统调用 60%左右时间 花费在copy_user_enhanced_fast_string 一个复制到用户空间的函数。
mmap 60%左右的时间花费在__memmove_avx_unaligned_erms36%时间花在设置页面映射的各种操作上

可以看到两种方式用在复制的时间大概都在60%, mmap复制只用了AVX技术结合CPU预取功能,使mmap的确非常快。

AVX for wiki

是x86架构微处理器中的指令集,由英特尔在2008年3月提出,并在2011年
第一季度发布的Sandy Bridge系列处理器中首次支持[1]。AMD在随后的
2011年第三季度发布的Bulldozer系列处理器中开始支持AVX[2]。AVX指令
集提供了新的特性、指令和编码方案。

AVX是X86指令集的SSE延伸架构,如IA16至IA32般的把寄存器XMM 128bit
提升至YMM 256bit,以增加一倍的运算效率。此架构支持了三运算指令
(3-Operand Instructions),减少在编码上需要先复制才能运算的动
作。在微码部分使用了LES LDS这两少用的指令作为延伸指令Prefix。

为什么内核实现不能使用AVX 因为如果这样做了,那么它将必须在每个系统调用中保存和恢复那些寄存器,这将使内核态到用户态变得更加昂贵。 因此,这是Linux内核中的一个有意识的决定.

Be First to Comment

发表回复