![原始 I/O 是否绕过驱动程序提供的部分或大部分服务?](https://linux22.com/image/143942/%E5%8E%9F%E5%A7%8B%20I%2FO%20%E6%98%AF%E5%90%A6%E7%BB%95%E8%BF%87%E9%A9%B1%E5%8A%A8%E7%A8%8B%E5%BA%8F%E6%8F%90%E4%BE%9B%E7%9A%84%E9%83%A8%E5%88%86%E6%88%96%E5%A4%A7%E9%83%A8%E5%88%86%E6%9C%8D%E5%8A%A1%EF%BC%9F.png)
操作系统概念,作者:Abraham Silberschatz,2012 年 9 日 说
原始输入/输出绕过所有文件系统服务,例如文件 I/O 需求分页、文件锁定、预取、空间分配、文件名和目录。
...
很遗憾,没有操作系统服务然后在此设备上执行。
原始 I/O 是否也会绕过驱动程序提供的部分或大部分服务?
原始 I/O 会绕过驱动程序提供的哪些类型的服务?如果我理解斯蒂芬这里和这里正确地说,原始 I/O 不会绕过驱动程序向只能顺序寻址的设备提供的随机访问权限,而是绕过驱动程序提供的缓冲区/缓存?
它是否会将设备驱动程序更改为更原始的、服务更少的驱动程序?
open()
请注意,您可以通过 with执行原始 I/O O_DIRECT
。
谢谢。
答案1
我不认为他的意思和O_DIRECT是同一个意思;我认为他指的是访问块设备,例如 /dev/sda。打开 /dev/sda 将绕过“文件锁定、预取、空间分配、文件名和目录” - 因此它绕过了文件系统,但没有绕过块设备驱动程序。
答案2
O_DIRECT
绕过缓存。它不会绕过驱动程序。
在块设备上使用O_DIRECT
会绕过内核“缓冲区高速缓存”。 “缓冲区缓存”不是驱动程序的一部分。
O_DIRECT
在常规文件(即不是设备特殊文件的文件)上使用是绕过内核“页面缓存”的请求。 “页面缓存”不是文件系统的一部分,但它也不是驱动程序的一部分。
在较旧的操作系统上,文件 IO 可能会缓存在两个位置 - 页面缓存和缓冲区缓存。如果是这种情况,O_DIRECT
应该绕过这两个缓存。
在 Linux 和许多其他现代类 Unix 系统上,缓冲区缓存实际上可能依赖于页面缓存。它们被描述为具有统一缓冲区高速缓存。一个重要的特性是它避免了在两个不同的地方缓存文件 IO。因此它可以更有效地使用内存。不同的人似乎使用相互矛盾的定义。有人说没有buffercache,只有pagecache。
即使操作系统避免在两个不同的地方缓存文件IO,它也可能无法保证用于文件IO的缓存与访问块设备文件时使用的缓存一致。
(O_DIRECT
无法在 Linux 上工作tmpfs
,因为tmpfs
它只不过是页面缓存和目录缓存的包装器。有人建议tmpfs
可以允许O_DIRECT
成功,并简单地忽略它,以提高兼容性。因此我不会说这O_DIRECT
可以保证绕过页面缓存。)