更多互联网新鲜资讯、工作奇淫技巧关注原创【飞鱼在浪屿】(日更新)
为什么mmap快于系统调用时,答案不可避免地是“系统调用开销”:跨越用户空间和内核之间边界的成本。事实证明,这种开销比你想象的要细微得多,因此深入了解性能差异。
背景(如果你是OS专家,请跳过):
系统调用:系统调用是一个特殊功能,交叉保护域。当程序在用户模式(非特权保护域)中执行时,不允许执行内核模式(特权保护域)中执行的代码所允许的操作。例如,在用户空间中运行的程序通常无法在没有内核帮助的情况下读取文件。当用户程序向操作系统请求服务时,系统会通过系统调用保护自己免受恶意程序或错误程序的侵害。系统调用执行通常称为“trap”的特殊硬件指令,该指令将控制权转移到内核中。然后内核可以决定是否满足请求。
虽然这种保护超级有用,但要付出一定的代价。当从用户空间进入内核时,必须保存硬件寄存器,因为内核可能需要使用它们。此外,由于直接对用户级指针的解引用是不安全的(如果为空,将导致内核崩溃),因此必须将这些指针所引用的数据复制到内核中。
从系统调用返回时,必须以相反的顺序重复该工序:复制出用户请求的任何数据(因为不能仅仅将用户程序指针提供给内核内存),还原寄