大话操作系统之I/O

I/O设备管理

什么是I/O设备

I/Oinput/output 就是(输入/输出)

操作系统作为系统资源的管理者,不仅要对主机内部设备如CPU,内存,外存等设备进行管理,还需要对主机外部设备进行管理。
I/O设备通常是指外部设备,例如鼠标,键盘即为输入型设备,显示器即为输出型设备;但I/O设备也包含内部设备例如,外存(磁盘),网卡等;(鼠标,键盘为字符型设备,输入输出以字符为单位,采用中断驱动的方式。磁盘为块设备,输入输出以磁盘块大小为单位)

类UNIX系统中将外设抽象为一种特殊的文件,用户可以用与文件操作相同的方式对外部设备进行操作。write写入数据,read读出数据。

I/O设备控制器

CPU是无法直接控制I/O设备的机械部件的,必须通过控制I/O控制器,再由I/O控制器来操作I/O设备间接的实现CPUI/O设备的操作。

I/O控制器的功能

在这里插入图片描述

  1. 接收和识别CPU发出的I/O指令
    CPU发来的read/write命令,I/O控制器会有相应的控制寄存器来存放命令参数

  2. CPU报告设备的状态
    I/O控制器会有相应的状态寄存器,用于记录I/O设备的当前状态。例如忙碌,空闲,故障,以便让CPU知晓。

  3. CPUI/O设备数据交换中转
    I/O控制器中会设置相应的数据寄存器,输出时,用于暂存CPU发来的数据,之后再由I/O控制器传送给机械设备,输入时,用于暂存机械设备发来的数据,之后CPU从数据寄存器中取走数据。

  4. 地址识别
    类似内存地址,为了区分不同I/O设备,的输入和输出。也需要给各个寄存器来划分地址,I/O控制器,通过CPU发来的地址来判断,CPU要调用读/写那个寄存器。

    I/O控制方式

    程序直接控制方式

    程序直接控制方式,完成一次I/O读写操作流程见下图:
    在这里插入图片描述

CPU执行程序完成一次I/O设备,读/写操作的步骤:

  1. CPU执行程序通过控制总线向I/O控制器接口发送读操作,I/O控制器运行命令,启动设备,并将设备状态寄存器设为1(未就绪,因为CPU的速度比I/O设备块,所以CPU得等待I/O设备)。
  2. CPU执行 轮询检查程序,检查I/O控制器的状态寄存器的状态。(其实就是在不断的执行程序循环,若状态一直是1,说明设备还没准备好输入数据,于是CPU会不断的轮询执行检查程序)
  3. 输入设备准备好数据后将数据传给I/O控制器,并报告自身状态。
  4. I/O控制器将输入的数据存放到,数据寄存器,并修改状态寄存器状态为0(已就绪)。
  5. CPU执行的轮询程序,发现状态寄存器的设备状态已就绪。即可将数据寄存器的内容,读入到CPU寄存器,再把CPU寄存器中的内容放入内存。(例如用scanf输入命令参数,参数最后还是要赋值给内存程序中的变量,相反如果执行printf打印命令,需要将内存中的变量输出到显示设备中)。

非阻塞I/O模型:
因为CPU在当前进程上一直在执行轮询检查I/O状态。所以放到这道作业的执行上过程上来讲是非阻塞的

非阻塞I/O模型特点:
CPU干预率:很频繁,CPU和I/O设备只能串行工作,CPU需要一直轮询检查,长期处于"忙等"状态。
缺点:cpu利用率低。
数据传送单位:每次读/写入一个字
读操作数据流向:I/O设备->CPU->内存
写操作数据流向:内存->CPU->I/O设备
同步异步:同步执行模式。
关键词:轮询。

中断驱动方式

正式因为程序直接控制方式,程序执行需要一直忙等导致CPU利用率底下等问题,我们引入的中断机制。中断驱动方式完成一次读写操作流程如下图:
在这里插入图片描述

在中断驱动模式下,CPU执行程序完成一次I/O读写操作步骤:

  1. CPU通过控制总线向I/O控制器接口发送读命令,CPU将等待I/O的进程阻塞。切换到别的进程进行执行。
  2. I/O控制器接受CPU命令,启动I/O设备,准备数据。
  3. 外设准备好数据,将数据传送给I/O控制器,I/O控制器向CPU发送中断信号。
  4. CPU检测到中断信号,保存当前执行进程运行上下文环境,转去执行中断处理程序去处理该中断。
  5. CPU从I/O控制器中的数据寄存器读取一个字的数据传送到CPU寄存器,再写入内存中。接着CPU恢复执行因等待I/O数据阻塞的进程的上下文运行环境,然后继续执行。
    注意:cpu会在每个指令周期末尾检查中断;中断处理过程需要保护,恢复进程的运行环境,这是需要一定时间开销的。如果中断发生的频率太高,也会降低系统性能。

阻塞IO模型:
因为CPU在发送I/O指令以后,可以阻塞当前进程,切换执行其他进程。当前作业执行过程是阻塞的。CPU并没有在这个进程上进行忙等。
CPU干预率:每次I/O之前,完成之后需要CPU介入,等待I/O完成之前,CPU执行其他进程。CPU利用率明显提高,
缺点:每个字在I/O设备和内存之间传输都需要经过CPU,频繁的中断处理会消耗较多的CPU时间。
数据传送单位:每次读/写入一个字
读操作数据流向:I/O设备->CPU->内存
写操作数据流向:内存->CPU->I/O设备
同步异步:同步执行模式。(此进程处于"闲等",进程并没有去做其他事情或者完成)
关键词:中断。

DMA方式

因为中断一次只能从I/O设备读取一个字,并且得通过CPU再到内存,导致浪费CPU资源。因此引入了DMA方式(Direct Memory Access,直接存储器存取,主要用于块设备的I/O控制)
具体步骤不在赘述;相较于中断做出了一下改进。

  • 数据传送单位是磁盘块,不在是以一个字为单位;
  • 数据流向是从设备直接流向内存,或者从内存直接到设备,不需要CPU作为"快递小哥"
  • 仅在传送一个或者多个块的开始和结束时需要CPU干预,进一步提升效率。

DMA控制器也是I/O控制器的一种,和一般I/O控制器的区别在于数据的传输不进过CPU了。系统将数据从I/O外设读入到内存的任务交给DMA控制器去做,DMA控制器把输入数据一个字一个字的放到DR数据寄存器中,等DR数据达到一个或者规定的多个块以后再由DMA控制器写入内存,DMA控制向CPU发出中断指令;唤起进程执行后续处理。数据传输效率和CPU利用率大幅提高。
在这里插入图片描述

通道控制模式

通道控制模式是DMA模式的升级版,可以一次性传输一组数据,由通道硬件支持。
通道:一种硬件,可以理解为是一个弱鸡版的CPU,通道可以识别并执行一系列通道指令,也就是CPU把把任务清单交给通道。通道接管I/O。
简单理解一下下图不再赘述。
在这里插入图片描述

缓冲区

进行I/O操作的时候,由于CPU速度快,I/O设备速度慢,如果CPU每次都向I/O设备输出一个字符,就得产生中断,等待I/O设备,导致大量中断CPU利用率低,为了解决数据传输速度不匹配的问题,需要在内存中开辟一块存储空间作为缓冲区。

缓冲区的作用
CPU输出数据的时候,可以把数据快速入缓冲区,之后就可以做别的事情了,慢速的I/O设备可以慢慢的从缓冲区中取走数据,等I/O完成以后再向CPU发出中断信号。CPU在此期间可以做更多的事情,同时提高了CPU与I/O设备直接的并行性。

在这里插入图片描述

单缓冲

用户进程请求磁盘读入若干块的数据,若采用单缓冲策略,操作系统会在主存中为,其分配一个缓冲区。

注意:

  • 当缓冲区非空时,不能往缓冲区输入数据,只能从缓冲区输出数据。
  • 当缓冲区为空时,不能从缓冲区输出数据,可以往缓冲区输入数据,但是必须把缓冲区充满以后,才能从缓冲区把数据输出。

管道通信中的"管道"其实就是缓冲区。要实现双向传输,必须设置两个管道。

缓冲池

缓冲池由系统中共用的缓冲区组成,这些缓冲区按使用情况可以分为:空缓冲队列,装满输入数据的缓冲队列(输入队列),装满输出数据的缓冲队列(输出队列)。

另外可以根据一个缓冲区实际运算中扮演的功能不同,又设置了四种工作缓冲区:

  • 用于收容输入数据的工作缓冲区(hin)
  • 用于提取输入数据的工作缓冲区(sin)
  • 用于收容输出数据的工作缓冲区(hout)
  • 用于提取输出数据的工作缓冲区(sout)
    在这里插入图片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章