前言
I/O系统的功能就是:隐藏具体细节,并且提高对IO设备的利用率,确保对设备的安全、共享使用,并提供给用户程序简单接口进行使用;
一、硬件层面
1.1 I/O设备
IO设备大致分为两类:块设备和字符设备;
功能:完成具体的操作;(对磁盘的读写操作)
1.2 I/O控制器
接受CPU发来的命令,去控制I/O设备,为了将处理机能够从繁杂的设备控制事务中解脱出来;
设备控制器的基本功能:
- 接受和识别命令
- 数据交换
- 标识和报告设备的状态
- 地址识别
- 数据缓冲区
- 差错控制
操作系统不与设备打交道,只通过设备控制器来操作设备;
二、用户层I/O软件
2.1 系统调用:
为使进程能够有条不紊地使用I/O设备,且保护设备的安全性,操作系统提供系统调用完成相应操作;
write(int fd, const void *buf, size_t count);
2.2 库函数:
在C语言中提供很多库函数,对具体系统调用进行屏蔽,提供更为简单的库函数供用户使用;
fwrite(const void *buffer, size_t size, size_t item_num, FILE *pf),
工作步骤:
在用户层,用户程序通过调用C语言提供的库函数(共享区),传递相应参数等,进入系统调用,交由设备无关性软件处理;
用户层IO软件和设备无关性软件的接口:系统调用
三、设备无关性软件
3.1 目的:
为了方便应用程序使用I/O设备,不局限于使用某个具体的设备,使得编写访问文件的程序与具体设备无关;
3.2 作用:
主要涉及两个方面:
(1)向用户层提供统一接口:系统调用
(2)执行所有设备的共有操作:
3.2.1 对独立设备的分配和回收
在考虑设备的固有属性、分配算法、安全性后
(1)应用程序使用逻辑设备名请求I/O设备,系统根据设备类别从系统设备表(SDT)中依次找出第一个可供使用的设备(DCT)
(2)再到设备控制表DCT中找出与该设备链接的控制器控制表COCT,并查询设备控制器运行状态,如忙则挂在该控制器的等待队列,否则将该控制器分配给进程;