缓存IO流程
(1)上层发起系统调用读取磁盘文件,此时发起调用的线程被阻塞,等待结果的返回
(2)操作系统检查PageCache中是否有需要的数据
(3)如果有,无需再从磁盘拷贝,线程阻塞结束
(4)如果没有,将数据从磁盘拷贝到PageCache,线程阻塞结束
对于大文件来说,如果使用PageCache的话,会把PageCache的大部分热点数据淘汰,在高并发场景下,这对于其他任务是不利的。
在IO过程中进程等待IO结果的返回,进程被阻塞,这对于进程是不利的
异步IO
进程发起系统调用读取数据后,进程继续执行其他任务,无需等待结果的返回。
当内核将磁盘控制器缓冲区中的数据拷贝到进程缓冲区后,进程将接收到内核的通知,再去处理数据;
对比
异步 I/O 并没有涉及到 PageCache,所以使用异步 I/O 就意味着要绕开 PageCache。
绕开 PageCache 的 I/O 叫直接 I/O,使用 PageCache 的 I/O 则叫缓存I/O。通常,对于磁盘,异步 I/O 只支持直接 I/O。
在高并发的场景下,针对大文件的传输的方式,应该使用异步 I/O + 直接 I/O来替代零拷贝技术。
异步I/O情况下,需要CPU将数据从磁盘控制器缓存区传输到进程缓冲区,CPU用于传输数据了。