# Why mmap is faster than system calls
Date: 2020-07-24


[原文链接](https://medium.com/@sasha_f/why-mmap-is-faster-than-system-calls-24718e75ab37) 作者 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](https://zh.wikipedia.org/zh-hans/AVX%E6%8C%87%E4%BB%A4%E9%9B%86)

```
是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内核中的一个有意识的决定.

