科技食谱

读写程序文件,为什么写mmap更快

在软件开发中,读写文件是一项经常的操作,速度的提高极大地影响了软件的整体性能。在读写这些文件时,为什么使用mmap来处理文件比普通系统调用更快?

当用户在操作系统中执行程序时,该程序使用两个区域:用户空间和内核空间。程序可以自由访问用户空间,但是程序不能直接访问内核空间。将资源空间分成两部分在安全性方面是极好的,但是由于涉及硬件任务(例如读写文件)的处理只能在内核空间中进行,因此用户无法处理内核空间是不便的。

因此,系统调用是用户空间和内核空间之间的桥梁,以便用户可以处理内核空间。例如,在获取文件时,使用Open系统调用创建用于文件输入/输出的文件描述符,调用读取系统调用,并将文件描述符文件数据读入缓冲区以启用数据操作。

在操作系统中处理文件时,这是一个常规过程,但是也可以调用mmap系统来读取和写入文件。可以将mmap文件映射到操作系统虚拟内存的系统调用可以从映射的虚拟内存地址读取和写入文件,从而无需使用其他系统调用。

为了比较在使用常规系统调用的情况下和在使用mmap的情况下的文件操作速度,分别以4KB,8KB和16KB块大小来测量顺序读取速度和随机读取速度。实际上,当缓冲区高速缓存中存在数据时,连续读取速度测量结果中的mmap加载速度会更快。

与连续读取的情况一样,随机读取速度超过了正常的系统调用加载速度,单位为mmap。可以看出,当以16KB的块大小执行顺序读取时,CPU使用率和将数据从内核空间复制到用户空间所花费的时间(copy_user_enhanced_fast_string)占程序总执行时间的61%。另外,有15%的时间花费在涉及转移到其他内核空间中的用户空间的命令上(功能do_syscall_64,entry_SYSCALL_64)。使用mmap,有61%的钱花在了“ __memmove_avx_unaligned_erms”上。换句话说,可以说,通过常规系统调用占用大部分处理的部分(copy_user_enhanced_fast_string)与通过mmap占用大量处理的部分(__memmove_avx_unaligned_erms)之间的效率差异极大地影响了读取速度的差异。 。

两者之间的效率差异对应于AVX,AVX将数据视为多个流,并且’__memmove_avx_unaligned_erms’支持AVX并可以有效地使用内存带宽,但是’copy_user_enhanced_fast_string’不支持AVX,因此无法尽可能多地利用带宽。这就是为什么mmap可以比正常的系统调用更快地执行文件操作的原因。

通用系统调用不支持AVX的原因在于,每个系统调用都存储并操作了寄存器,这增加了移动用户空间和内核空间的处理负担。结果,它表明它可能会运行更快的应用程序,这些应用程序在正常的系统调用中将文件操作替换为mmap。相关信息可以在这里找到。

lswcap

lswcap

通过每月的AHC PC和HowPC杂志时代,他在网络IT媒体上观看了“技术时代”,如ZDNet,电子报互联网经理,Consumer Journal Ivers的编辑,TechHolic出版商和Venture Square的编辑。 我很好奇这个仍然充满活力的市场。

Add comment

Follow us

Don't be shy, get in touch. We love meeting interesting people and making new friends.

Most discussed

%d 블로거가 이것을 좋아합니다: