计算机操作系统学习(五、输入输出管理)
目录
一、IO设备概述
二、IO控制器的组成
1.概述
2.主要过程
三、IO控制器的主要方式
1.程序直接控制方式
2.中断驱动方式
3.DMA方式
4.通道方式
四、IO的软件层次IO
五、IO调度和保护
1.IO调度
2.IO保护
六、假脱机技术,
七、设备分配的数据结构
八、缓冲区管理
(1)单缓冲
(2)双缓冲
(3)循环缓冲
(4)缓冲池
一、IO设备概述
对于IO设备需要理解的就是,IO设备通过总线挂在到计算机上,计算机通过不同的协议给IO设备通讯从而读写IO设备。比如,网卡,磁盘,键盘鼠标等。
二、IO控制器的组成
1.概述
上面提到,计算机和IO设备之间交互,需要通讯。有些通信可以硬件实现的,比如硬件SPI,当然也可以软件实现。CPU配置好IO控制器之后,把需要发送的数据和内容告诉这个IO硬件(也就是IO控制器),之后这个IO控制器自动使用对应的协议发送出去。总结就是,IO控制器是接受CPU指令,之后硬件实现协议。
2.主要过程
比如用户进程要向磁盘里面写一些东西。
首先进程调用相关函数,由用户态转化成内核态,可以访问相关外设。
之后呢,调用相关外设的驱动,这些驱动会配置IO控制器,比如配置IO控制器使用什么协议,通信频率是多少。
之后CPU可以向IO控制器发送写指令,之后通过地址线可以知道写到哪里,通过控制线可以知道写还是读。
CPU写数据的时候,把数据放到数据寄存器,之后通过IO逻辑发送出去。
CPU读数据的时候,从数据寄存器中读数据。CPU如果有很多读写指令,还可以缓存到控制寄存器里面,之后IO控制器从这个寄存器取指令执行。
CPU可以通过状态寄存器来感知到当前接口状态,处于空闲还是繁忙。
IO逻辑接口三根线,分别传数据,状态(空闲还是忙碌),控制(读还是写)。
三、IO控制器的主要方式
1.程序直接控制方式
当读数据的时候,通过地址总线告诉IO逻辑要读数据了。此时状态寄存器肯定是free。
之后IO逻辑从对应的接口读数据,此时状态寄存器变成busy。
之后cpu一直不断的检测状态寄存器的状态,如果变成free,那么读取完毕。
这样导致cpu一直死等状态寄存器,比较浪费资源。
2.中断驱动方式
与上面不同的是,状态寄存器从忙碌到free,会产生一个中断,所以cpu在数据读取的过程中可以干其他事情。
缺点是每次读几个字节,中断频繁产生,这样其实不断的保存现场和恢复现场,比较浪费资源。
3.DMA方式
DR:数据寄存器
DC:数据计数器
MAR:内存地址
CR:控制寄存器(负责读还是写)
在DMA使用之前,会配置好DC和MAR,DC表示我要读多少字节,每成功读一个字节,这个--,-到0触发中断,说明读完一次了。
之后MAR的地址从开始连续的++,不断的把数据读到内存里面。
缺点是,只能连续读取。优点是,CPU配置完DMA就不管这事了,比较省CPU。
4.通道方式
通道也是个小型CPU,可以这样理解。
工作的时候呢,CPU告诉通道,我要在一个地址是读还是写。
之后通道按照上面的方式呢,和设备交互。
交互完成之后呢,触发中断,告诉CPU完成任务了。
四、IO的软件层次IO
用户层软件:就是比如WPS这种,用户程序。
设备独立性软件:主要负责设备的分配与回收。下面有详细解释。
设备驱动软件:设备是需要驱动的,驱动是告诉与设备 的通讯方式,比如SPI还是IIC。驱动被下载到电脑里面,每个驱动都有对应的设备,找到设备之后,选择对应的驱动,如果驱动没安装,那么设备也无法使用。
之后有了驱动,有了设备。之后CPU就可以发送指令,IO执行对应的协议,就可以和设备通讯,控制设备了,读写完成之后,产生中断,告诉进程,读写完毕。
五、IO调度和保护
1.IO调度
以读取磁盘数据为例。可能同一时间有很多磁盘读取的任务,那么如何安排这些任务呢,让磁盘读写的效率最高,就和华为软挑一样。IO调度由设备独立性软件负责,简单理解,相当于对IO任务排个顺序了。
排好顺序之后哦,就调用驱动,总线发送信息,一步一步的执行任务了。
2.IO保护
IO设备就是文件。从文件读取内容,相当于读设备,从文件写内容,相当于写设备。
比如打印机相当于一个文件,向打印机文件写数据,相当于发送信息给打印机。
比如键盘相当于一个文件,向键盘文件读数据,相当于读取键盘数据。
所以可以像操作文件一样操作设备,给设备设置权限,加密码啥的。
六、假脱机技术,
如果由很多进程都需要使用打印机,当一个使用打印机的时候,其他进程就阻塞,就等着,这样不太好。我们想要其他进程也可以继续执行其他的。
所以就专门再设计一个进程Spooler,当进程A使用打印机的时候,他告诉Spooler,我要打印什么什么。之后就去做其他事情了。之后进程B使用打印机的时候就告诉Spooler,打印什么什么,之后也去做其他的事情了。(怎么告诉? 实际上是进程之间的通讯嘛,本质是共享内存)
之后Spooler就维护了一个任务队列,Spooler从共享内存里面把数据读到磁盘里面。之后当运行的之后,再把磁盘的任务读出来,一个一个的运行。
七、设备分配的数据结构
系统会维护一个SDT,这个每个表目里面都由设备的类型,是什么驱动啊等信息,之后他还标识了这个设备的设备控制表的入口。
之后设备控制表也有当前设备的相关信息啊,当分配设备的时候,如果设备不够用了,那么就把他放到设备队列指针里面。
通过控制器表可以找到当前设备的控制器,查看控制器的相关信息。如果控制器处于忙碌,那么就把当前任务放到控制器队列里面。
之后通过设备控制器表还可以找到通道控制表。这个也是记录了通道的相关信息。之后如果申请通道时资源不够,那么把任务放到通道队列里面。
通过通道控制表还可以找到挂在这个通道下的控制器。
八、缓冲区管理
(1)单缓冲
(2)双缓冲
先往M1写,M1被处理的过程中,可以继续向M2写,这样提高了效率。
(3)循环缓冲
搞了一个循环队列,告诉从那个缓冲区读,从那个缓冲区写。他的缓冲区多了,那样其实效率肯定又高了一点。
比如,缓冲1数据满了,进程没来得及处理,之后不断的向缓冲2,3,4,5写数据。写完了进程来处理了。比双缓冲省时间了,因为双缓冲只能写俩,之后就等待进程,这个可以写5个。
(4)缓冲池
反正就是有一个空闲的内存
当输入数据的时候,把这个空闲内存搞出来一部分加入到输入队列,之后存数据,当进程读完数据之后,把这个内存重新放到空队列。
当输出数据的时候,把从空队列里面搞出来一部分,放数据,之后数据发给IO设备之后,把这个内存释放掉,重新放回空队列。