在学习I/O Schedulers的过程中,我阅读了一些Linux内核中I/O Schedulers的文档。特别是对于 Kyber Scheduler,有一些令人困惑的事情。在以下链接的文章中(https://lwn.net/Articles/720675/),Kyber Scheduler 有两个主队列,一个用于同步请求,一个用于异步请求。在那篇文章中,它说
发出读取请求的进程通常无法继续,直到该请求完成且数据可用,因此此类请求被视为同步。
我认为同步和异步请求取决于CPU和设备驱动程序,而不是各种I/O操作。
对于这个问题有什么想法吗?
答案1
这更像是“概念上的同步”,或者可能是“在比您所考虑的抽象级别更高的抽象级别上同步”。程序读取数据是为了以某种方式处理它,因此在获得该数据之前,它无法进行处理:因此读取必须是同步操作。
另一方面,只要其他操作将“看到”数据等同于写入最终目的地,则可以推迟写入请求。换句话说,任何读取操作都必须首先检查写入缓存中是否存在它们要读取的数据的修改版本,如果存在,则从缓存中“读取”。