mmap函数_为什么mmap比read系统调用更快

本文探讨了mmap函数相对于read系统调用的性能优势,主要原因是避免了系统调用的开销和利用了内存带宽。通过实验,发现在多种情况下,mmap的读取速度比read快2-6倍。关键因素包括减少了保护域切换、利用高级矢量扩展(AVX)进行数据复制以及预填充映射页面。
摘要由CSDN通过智能技术生成

更多互联网新鲜资讯、工作奇淫技巧关注原创【飞鱼在浪屿】(日更新)

f2cb1bc57322d84f14e216d825dc95d4.png

为什么mmap快于系统调用时,答案不可避免地是“系统调用开销”:跨越用户空间和内核之间边界的成本。事实证明,这种开销比你想象的要细微得多,因此深入了解性能差异。


背景(如果你是OS专家,请跳过):

系统调用:系统调用是一个特殊功能,交叉保护域。当程序在用户模式(非特权保护域)中执行时,不允许执行内核模式(特权保护域)中执行的代码所允许的操作。例如,在用户空间中运行的程序通常无法在没有内核帮助的情况下读取文件。当用户程序向操作系统请求服务时,系统会通过系统调用保护自己免受恶意程序或错误程序的侵害。系统调用执行通常称为“trap”的特殊硬件指令,该指令将控制权转移到内核中。然后内核可以决定是否满足请求。

虽然这种保护超级有用,但要付出一定的代价。当从用户空间进入内核时,必须保存硬件寄存器,因为内核可能需要使用它们。此外,由于直接对用户级指针的解引用是不安全的(如果为空,将导致内核崩溃),因此必须将这些指针所引用的数据复制到内核中。

从系统调用返回时,必须以相反的顺序重复该工序:复制出用户请求的任何数据(因为不能仅仅将用户程序指针提供给内核内存),还原寄

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
***函数用于将一个文件或者设备映射到进程的地址空间中,以便于对其进行读写操作。在Linux系统中,mmap函数系统调用号为0x09。 下面是一个使用mmap函数将文件映射到内存中的示例代码: ``` section .data filename db 'test.txt', 0 filemode equ 0666 section .bss filedes resd 1 filelen resd 1 filemap resd 1 section .text global _start _start: ; 打开文件 mov eax, 5 ; 系统调用号为5表示open函数 mov ebx, filename ; 文件名 mov ecx, O_RDONLY ; 打开方式为只读 int 0x80 ; 调用系统调用 mov [filedes], eax ; 将返回值保存到filedes变量中 ; 获取文件长度 mov eax, 19 ; 系统调用号为19表示lseek函数 mov ebx, [filedes] ; 文件描述符 mov ecx, 0 ; 偏移量为0 mov edx,0 ; SEEK_SET表示从文件开头开始计算偏移量 int 0x80 ; 调用系统调用 mov [filelen], eax ; 将返回值保存到filelen变量中 ; 映射文件到内存中 mov eax, 90 ; 系统调用号为90表示mmap函数 mov ebx, 0 ; 地址为0表示让系统自动分配地址 mov ecx, [filelen] ; 映射的长度为文件长度 mov edx, PROT_READ ; 映射的权限为只读 mov esi, MAP_PRIVATE ; 映射的方式为私有映射 mov edi, [filedes] ; 文件描述符 mov ebp, 0 ; 偏移量为0 int 0x80 ; 调用系统调用 mov [filemap], eax ; 将返回值保存到filemap变量中 ; 关闭文件 mov eax, 6 ; 系统调用号为6表示close函数 mov ebx, [filedes] ; 文件描述符 int 0x80 ; 调用系统调用 ; 程序退出 mov eax, 1 ; 系统调用号为1表示exit函数 xor ebx, ebx ; 返回值为0 int 0x80 ; 调用系统调用 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值