原文链接 作者 Alexandra (Sasha) Fedorova
关于mmap
为什么比系统调用快,作者通过实验进行了验证,通过连续,随机,进行缓存, 不进行缓存,分为4种情况
- 文件连续访问且被缓存
- 文件连续访问且未被缓存
- 文件随机访问且被缓存
- 文件随机访问且未被缓存
实验结果发现出去少数例外,mmap
比系统调用
快2-6倍
通过专业的CPU
检测工具可以看到
系统调用 60%
左右时间 花费在copy_user_enhanced_fast_string
一个复制到用户空间的函数。
mmap 60%
左右的时间花费在__memmove_avx_unaligned_erms
和36%
时间花在设置页面映射的各种操作上
可以看到两种方式用在复制的时间大概都在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