I/O系统概述
I/O系统概述
复习定位
I/O系统是计算机系统中变化最慢的部分——但效率却是系统整体性能的关键瓶颈。CPU的处理速度与I/O设备(磁盘、键盘、网卡)之间存在巨大的速度差距——操作系统的I/O子系统必须通过各种技术(缓冲、缓存、排队、中断)来弥补这个差距——使慢速I/O不拖垮整个系统。
I/O设备的分类
- 块设备(Block Device)——数据以固定大小的块为单位(如磁盘扇区——512B-4KB)——可以随机访问——使用
read/write系统调用。典型:硬盘、SSD、USB闪存。 - 字符设备(Character Device)——数据以字符流式传输——不可随机定位——只能顺序读取。典型:键盘、鼠标、串口、终端。
- 网络设备——网络接口——数据通过socket接口与内核网络栈交互——使用特殊的
send/recv系统调用——不映射到文件系统挂载点。
I/O控制方式
程序直接控制(轮询)——CPU循环检测某个I/O设备的状态寄存器——直到设备准备好数据——然后CPU通过IN/OUT指令逐字节传输数据——期间CPU不能做其他事——效率极低。
中断驱动方式——CPU向设备发出读命令后——切换做其他进程——设备完成I/O操作后发出中断信号——CPU响应中断——在中断处理程序中与设备交换数据。提高了CPU利用率——但每个字节/块传输触发一次中断——高吞吐场景下中断次数太多CPU用于中断处理的时间开销占很大比重(如高速网卡每秒处理数十万个包)。
DMA方式——直接存储器访问——CPU初始化DMA控制器(指定源地址/目的地址/长度)——DMA控制器自己搬运数据——完成后发中断通知CPU。CPU在DMA传输期间可以执行其他任务——无需逐字节参与I/O。现代磁盘和网卡都使用DMA。
I/O软件层次
用户级I/O库 (printf, scanf, fread)
↓
设备无关的OS I/O层 (统一的open/read/write接口——设备文件)
↓
设备驱动程序 (理解具体硬件的操作方式——向控制器写命令)
↓
中断处理程序 (响应硬件中断)
↓
硬件设备 (磁盘控制器、网卡、USB控制器)设备独立性——用户程序通过open("/dev/sda")——操作系统将其转换为对块设备驱动的调用——用户无需关心硬件细节。新设备只要安装对应的驱动即可通过同一组接口工作。
缓冲与SPOOLing
缓冲——硬件速度和CPU处理速度的差异——操作系统在内存中分配缓冲区——一次从设备读入大量数据到缓冲区——然后程序从缓冲区逐次读取——减少I/O次数。
SPOOLing(假脱机)——将独占的设备(如打印机)通过磁盘缓冲变成可共享的虚拟设备。多个用户同时发送打印任务——SPOOLing系统将每个任务作为一个文件保存到磁盘——打印机依次打印——用户不必等待打印机空闲。
复习检查
为什么DMA比中断驱动I/O更适合高速数据传输——中断驱动每个字节触发一次中断——CPU在大量中断中不能做其他任务——DMA只需初始化时CPU参与一次——传输完成一次中断——CPU利用率更高。
设备独立性的实现——新加入的设备安装驱动后——通过VFS提供的同一组
open/read/write接口——用户程序可以像操作普通文件一样操作设备——不需修改上层应用。缓冲机制如何提高I/O性能——程序一次读入一块(比如4KB)到缓冲区——后续的读请求从缓冲区读取——减少了实际I/O的次数——但需要管理缓冲区的大小和替换。
SPOOLing如何将独占设备(打印机)变成共享设备——多个进程的输出定向到磁盘上的打印队列文件——而不是直接到打印机——等待SPOOLing守护进程依次将队列文件发送到打印机——进程不必等待其他用户的打印完成才能启动自身的打印。
块设备和字符设备的区别在
ls -l输出中如何区分——块设备文件brw-rw----——字符设备文件crw-rw----——块设备使用DMA和缓冲池而每设备有自然的"快速随机访问"属性——字符设备如键盘则没有随机读写的概念。