人机交互类:键盘、鼠标、打印机
存储设备:移动硬盘、光盘
网络通信设备:调制解调器
低速设备:键鼠
中速设备:打印机
高速设备:磁盘
块设备:磁盘等以块为单位传输
字符设备:键鼠,以字节为数据传输单位
用于实现对I/O设备的控制
I/O控制器可能对应多个设备
数据寄存器、控制寄存器、状态寄存器可能有多个,且有对应地址
若这些寄存器占用内存地址的一部分,称为内存映像I/O
若采用I/O专用地址,即寄存器独立编址
内存映像I/O方便操作,而寄存器独立编制则需要设置专门指令并指明寄存器的地址和控制器的编号
由于程序直接控制方式CPU利用率低,忙等,提出了中断驱动方式
引入中断机制,在CPU发出指令后,将等待I/O进程阻塞,先切换到别的进程执行
当I/O完成后,控制器向CPU发出一个中断信号,CPU检测到后会保存当前进程的运行环境信息,转去执行中断处理程序处理中断
处理中断时,CPU从I/O控制器读一个字的数据传送到CPU寄存器,再写入主存。
接着CPU恢复等待I/O的进程的运行环境,然后继续执行
CPU在每个指令周期末尾检查中断,中断处理过程中需要保存、恢复进程的运行环境,频繁发生中断也会降低系统性能
避免了CPU轮询,切换别的进程执行,CPU和I/O并行工作,但每次传输都需要CPU介入,频繁中断会消耗较多CPU时间
中断驱动解决了程序直接控制方式,但每次只能读写一个字会造成CPU频繁切换
DMA直接存储器存取,用于块设备
数据传送单位是块,不再是以字为单位
数据在设备和内存间传送,无需CPU介入
仅当传送开始和结束时才需要CPU干预
CPU指明此次要进行的操作,说明要读入数据的大小、数据存放在内存上的位置、数据在外部设备上的地址
控制器根据CPU提出的要求完成数据的读写工作,整块数据的传输完成后,才向CPU发出中断信号
控制器从设备读取数据也是一个一个字读取并存到DR,DR存满时才放入内存
缺点:CPU每发出一条I/O指令,只能读写一个或多个连续的数据块,如果要读写多个离散存储的数据块,或者要将数据分别写到不同的内存区域时,CPU要分别发出多条I/O指令,多次中断才能完成
通道控制是用来解决连续存储问题
CPU告诉通道要执行的任务所在的内存地址,通道去取出任务,做完后发消息给CPU
用户层实现了与用户交互的接口,使用提供的封装系统调用的库函数对设备进行操作
用户层软件将用户请求翻译成格式化I/O请求,并通过系统调用请求操作系统内核的服务
设备独立性软件,又称设备无关性软件,与设备硬件特性无关的功能都在此层实现,提供六大功能
LUT 可以在整个系统中只设置一张,但只适合单用户操作系统
也可每个用户设置一张LUT,每个用户使用的逻辑设备名可重复,适用于多用户操作系统,系统在用户登录时为其建立管理进程,LUT存放在用户管理进程的PCB
不同设备的驱动程序不同,因为内部结构不一样,空闲字不同、数据寄存器数量不同等等…
负责对硬件设备的具体控制,将上层命令转化为特点设备的指令,设置设备寄存器、检查设备状态等
为了避免人工影响I/O速度,引入了脱机技术:磁带等
假脱机SPOOLing使用软件模拟脱机
独占设备、共享设备、虚拟设备
先来先服务、优先级高优先、短任务优先
安全分配:进程获得设备后阻塞直到I/O将进程唤醒,不会死锁,但进程和I/O串行
不安全分配:发出I/O请求,系统为其分配I/O设备,进程可继续执行,之后还可发出I/O请求,只有I/O请求不满足时才堵塞,实现了I/O和进程并行,但可能死锁
静态分配:进程运行前分配所有资源,运行结束后归还资源
动态分配:进程运行时动态申请设备资源
根据进程请求的物理设备名查找系统设备表SDT
根据SDT找到DCT,若设备忙碌则将进程PCB挂到设备等待队列,不忙碌时将设备分配给进程
根据DCT找到COCT,若控制器忙碌则将进程PCB挂到控制器等待队列,不忙碌则将控制器分配给进程
根据COCT找到CHCT,若通道忙碌则将进程PCB挂到通道等待队列,不忙碌时则将通道分配给进程
缺点在用户编程时需要使用物理设备名,编程困难,且拓展麻烦
若请求的物理设备正在忙碌,即时有同类型设备,进程也必须阻塞
设置逻辑设备法LUT建立逻辑设备名和物理设备名之间的映射关系
用户进程第一次使用设备时使用逻辑设备名向操作系统发出请求,操作系统根据逻辑设备名来查找系统设备表,找到空闲设备分配给进程,并在LUT添加表项
当用户进程再次通过相同逻辑设备名请求设备,则系统通过LUT得知对应物理设备
多用户操作系统中LUT是每个用户一张
单用户操作系统中LUT是只有一张
缓冲区可以解决CPU和I/O设备间速度差异,避免每输出一个字就要向CPU发送一次中断信号
对比
两台机器单缓冲则只能在同一时刻内只能单向传输
两台机器双缓冲则可实现双向数据传输
需要收容输入时,从空缓冲队列取出空缓冲区,冲满数据后将缓冲区挂到输入队列队尾
需要提取输入时,从输入队列取出缓冲区,取空后将空缓冲区挂到空缓冲队列队尾
其他以此类推