原始 I/O 是否绕过驱动程序提供的部分或大部分服务?

原始 I/O 是否绕过驱动程序提供的部分或大部分服务?

操作系统概念,作者: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可以保证绕过页面缓存。)

相关内容