目录
一、I/O软件层次
从上往下分别是:用户层、设备独立性软件、设备驱动程序、中断处理程序、硬件
用户层软件
给用户提供接口,支持各种库函数(例如prinft函数)等
设备独立性软件(设备无关性软件)
向上层提供统一的系统调用接口,如read,write等
实现设备管理
实现差错处理
实现设备分配和回收管理
数据缓冲区管理
设备驱动程序
建立逻辑设备名->物理设备名的映射管理
通过逻辑设备表(LUT)来进行管理
逻辑设备表记录设备逻辑名、设备物理名、设备驱动程序入口地址等信息
这种管理有两种方式:
整个系统只设置一张LUT表(逻辑设备表)
每个用户设置一张LUT(逻辑设备表)
不同的设备需要不同的驱动程序
因为设备的内部实现和硬件特性不一样
这些设备的驱动程序在厂家生产时,就已经提供好了
我们可以直接下载驱动程序并使用即可
中断处理程序:进行中断处理,和硬件直接打交道
二、I/O程序接口(用户进程接口)
由于底层的I/O设备有很多类型
有块设备(磁盘)、字符设备(键盘)、网络控制设备(网卡)等
块设备每一次传输单位为数据块,支持随机访问(可寻址)
但是,字符设备一次传输单位为一个字节,且不支持随机访问,只支持顺序访问(不可寻址)
因此,为了给用户提供的调用接口就必须根据设备特性不同,设计不同的接口
于是,由此,我们有三类I/O用户接口:字符设备接口、块设备接口、网络设备接口
以及设备驱动程序接口
设备类型 | 接口 | 相关系统调用 | 功能描述 |
---|---|---|---|
字符设备接口 | get/put | get 、put | 读/写一个字符 |
块设备接口 | read/write | read 、write 、seek | read/write : 读写多个字符(或数据块) seek : 修改读写指针的位置 |
网络设备接口 | socket | socket 、bind 、connect 、read/write |
|
阻塞 I/O | 进程发出 I/O 系统调用后,进入阻塞态,等待结果(如 scanf ) | 进程在等待 I/O 操作完成时阻塞,直到操作系统返回执行结果 | |
非阻塞 I/O | 进程发出 I/O 系统调用后,不阻塞,立即返回结果(如 write ) | 进程在发出 I/O 请求后立即返回,不需要等待操作完成,结果可能需要稍后获取 | |
设备驱动程序接口 | 操作系统为设备设计标准化的接口,所有设备制造商需遵循这一接口规范,以实现设备的统一管理 |
核心子系统:设备独立性软件、设备驱动程序、中断处理程序这三个属于操作系统内核层级的统称