在 Linux 内核中, 是open()
还是mmap()
不是访问文件的更基本方式?通过“基本”,我的意思是“最终调用另一个函数还是另一个函数的简单辅助函数?”。
栈网络上有很多问题询问这两个函数的性能。这个问题的目的是先了解 Linux 内核内部发生了什么。是否open()
调用mmap()
或某些本质上实现的辅助函数mmap()
?或者,是否mmap()
调用open()
或调用一些本质上实现的辅助函数open()
?
问题的要点是这两个系统调用是否是从根本上不同或者一个是否是另一个的“便利功能”。
答案1
请注意映射(2)经常想要一个文件描述符通常由打开(2);从这个意义上说,open
是更根本的。还请注意,虚拟地址空间一些中的过程不仅可以通过mmap
、munmap
、保护(2)但也通过其他系统调用(包括执行(2);也可以看看shm_概述(7))
顺便说一句,Linux 内核没有使用 mmap
或者open
但是提供并实现它们(对于应用程序级别用户空间程式)。
但是Linux内核管理着页面缓存这是更基本且相关的两个都 系统调用。也可以看看LinuxAteMyRam并考虑也许使用疯狂的维斯(2),posix_fadvise(2),预读(2)给页面缓存子系统提示。
这两个系统调用是否有根本不同
所有系统调用(列于系统调用(2)...) 是不同的。
另请阅读高级Linux编程和操作系统:三个简单的部分(两者均可免费下载)。
答案2
由于您正在命名函数,我们假设您已经知道调用mmap()
文件需要一个 fd,该 fd 通常(但并非总是)使用open()
.
除非您使用 O_DIRECT,否则在像 Linux 这样具有“统一缓冲区高速缓存”的内核中,read()
并write()
在由 映射的同一页高速缓存上进行操作mmap()
。然而,这忽略了每种方法的性能权衡,因此这似乎不是一个非常有用的答案。
除了获得一本书之外,谷歌还找到了关于 mmap 和常规 IO 与页面缓存的简短描述。没有提到性能成本的mmap()
, 根据引用莱纳斯·托瓦尔兹的话您可能已经看过了。