-
用户空间请求
系统调用:应用程序通过系统调用(如 read() 或 write())请求对文件或设备进行读写操作。
文件描述符:操作通过文件描述符进行,该描述符在应用程序打开文件时获得。 -
VFS(虚拟文件系统)
路径解析:VFS 负责解析文件路径并找到对应的文件 inode。
权限检查:VFS 检查文件的权限,确保当前用户有权限进行读写操作。
缓存检查:VFS 检查页缓存(page cache)以确定请求的数据是否已经在内存中。 -
页缓存
读操作:
如果数据在页缓存中,直接返回数据给用户空间。
如果不在缓存中,VFS 发起从磁盘读取数据的请求。
写操作:
数据首先写入页缓存(写回机制),然后异步地刷新到磁盘。
使用脏页(dirty pages)标记缓存中需要写回的数据。 -
块设备层
I/O 调度:请求被发送到块设备层,I/O 调度器对请求进行排序和优化,以提高性能。
合并请求:相邻的 I/O 请求可能会被合并以减少磁盘寻道时间。 -
驱动程序
设备驱动:I/O 请求被传递给相应的设备驱动程序,驱动程序负责与硬件设备进行通信。
DMA(直接内存访问):在可能的情况下,DMA 用于将数据直接从内存传输到设备,减少 CPU 负担。 -
硬件设备
硬盘控制器:硬件设备接收到请求后执行实际的读写操作。
数据传输:数据从磁盘传输到内存(读操作)或从内存传输到磁盘(写操作)。 -
完成处理
中断处理:操作完成后,设备驱动程序通过中断通知内核。
缓存更新:对于写操作,页缓存中的脏页被标记为干净。
通知用户空间:最终,系统调用返回,用户空间应用程序被通知操作已完成。
优化与特性
预读(Read-ahead):内核可能会提前读取数据到缓存中,以提高读取性能。
写回缓存(Write-back Cache):写操作通常是异步的,数据先写入缓存然后再写入磁盘。
I/O 调度算法:不同的 I/O 调度算法(如 CFQ、Deadline、NOOP)可以根据工作负载选择以优化性能。
流程如下: