操作系统第五章

北战南征 提交于 2019-12-02 06:51:05

输入输出设备分为块设备(硬盘)和字符设备(鼠标,键盘)

硬盘的输入输出以磁盘块(扇区)为单位

鼠标键盘以字符为单位,通过中断机制输入

-----------------------------------------------------------------------------------------------------------------------------------------------

IO设备由 机械部件和电子部件 两部分组成,电子部件就是电路板,也就是IO控制器。IO控制器作为CPU控制IO设备机械部件的中介。它含有控制寄存器(存放CPU命令的参数),状态寄存器(设备是否能进行读写操作),数据寄存器(数据中转站)。由于IO控制器中含有多个寄存器,当CPU发出命令后,IO控制器要进行地址转换(由IO控制器的IO逻辑部分完成),找到对应的寄存器。

IO控制器由三部分组成,分别为 CPU与控制器的接口,IO逻辑,以及控制器与设备的接口

CPU与控制器的接口: 数据寄存器,状态寄存器,控制寄存器位于这里

IO逻辑: CPU 通过控制线告诉IO逻辑指令类型,通过地址线告诉IO逻辑要操作的设备地址,IO逻辑通过访问控制寄存器和状态寄存器得出指令。如果是输出指令的话,IO逻辑将数据寄存器中的数据 转移到 控制器与设备的接口。

控制器与设备的接口:输出命令的话,它只需要输出数据,同时返回设备状态。如果是输入命令的话,将数据以及设备状态通过IO逻辑转移到寄存器中,CPU从寄存器读入。

当然,控制器与设备的接口还要向设备发出控制信号。如屏幕显示信号

一个IO控制器可能同时控制多个IO设备。

寄存器有两种编址方式,一种是内存映射(与内存统一编址),操作方便。另一种是寄存器独立编址,需要指明IO控制器编号。 ps:寄存器比内存贵,快

-----------------------------------------------------------------------------------------------------------------------------------------------------

IO控制方式有四种,分别是

程序直接控制方式: 假如是读指令,CPU发出指令后,要一直等待IO完成后将状态寄存器改变,以通知CPU可以进行读操作,读到CPU寄存器中,再到内存中去。CPU需要一直轮询等待慢速的IO

这种控制方式是以字节为单位的,且数据流向是 内存--CPU--IO控制器。CPU利用率低

----------------------------------------------------------------------------------------------------------------------------

中断驱动方式

当CPU发出读写指令后,不再等待,将等待进程阻塞,转而执行其他进程,直到状态寄存器满足条件后,发出中断请求,CPU每执行完一条指令后就会检查中断,当发现中断后,读取一个字节(注意,仍然只能读一个字节,所以只有鼠标键盘能采用这种方式)。

中断处理需要开销,保存恢复现场。

这种方式的IO仍然需要经过CPU

----------------------------------------------------------------------------------------------------------------------------

DMA(Direct Memory Access)方式

主要用于块设备,以块为单位,且不再需要CPU中转数据。当整个块IO结束后才发出中断。

CPU发出命令后转而执行其他任务,由DMA控制器(一种IO控制器)负责完成读写操作

值得关注的是,DMA控制器中的MAR(Memory Address Register),存放的是数据在内存中的位置(DMA方式不需要CPU中介,直接在IO控制器和内存间传递,IO控制器与内存是通过系统总线直接相连的)

 

注意,DMA方式并不是直接将整个块读入,它也是一个一个字节读入的,只是在整个块读完之后才发出中断。

这种方式还可以一次传送多个连续的块(必须是连续的块),这些块都读入后才发出中断

DMA方式缺点: 对于离散的多个块 必须使用多条指令来读

------------------------------------------------------------------------------------------------------------------------------------------

通道控制方式

通道是一种硬件,能完成通道指令

CPU只需要告诉通道 它所要执行的指令在内存中的位置,由通道负责IO。这些通道指令说明了访问哪个IO设备,数据要放在内存中的什么位置。

一次完成一组数据块的读写,同样不需要经过CPU中转数据。

一个通道可以控制多个IO控制器,而一个IO控制器可以控制多个IO设备

--------------------------------------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------------------------

IO软件层次结构

自顶向下依次是 用户层软件,设备独立性软件,设备驱动软件,中断处理程序。和计算机网络模型神似

printf是用户层软件提供的,它会使用系统调用接口,发出write系统调用

设备独立性软件也叫做系统调用处理层

设备独立性软件要完成的功能:

设备独立性软件要完成逻辑地址到物理地址的转换

LUT逻辑设备表 

逻辑设备名  --  物理设备名 -- 驱动程序入口地址(不同的物理设备的驱动程序不一样,驱动程序随着设备提供)

生活中,插入鼠标键盘手机时,总会提示正在安装驱动程序,这就是随着设备提供的设备驱动程序。

驱动程序以独立线程方式存在,只有设备驱动程序才能访问设备硬件

 

IO控制器发出中断请求后,中断处理程序从IO控制器中读出设备状态,找到相应的中断处理程序并执行。和设备驱动程序一样,中断处理程序也可以操作硬件。

---------------------------------------------------------------------------------------------------------------------------------------------------

只要是操作了硬件的,涉及到中断的肯定是中断处理程序完成的,没有涉及到中断的肯定是设备驱动程序完成的

-----------------------------------------------------------------------------------------------------------------------------------

IO核心子系统

指的是设备独立性软件,设备驱动程序,中断处理程序 这三层

IO核心子系统要完成的功能有 IO调度,设备保护,假脱机技术,设备分配与回收,缓冲区管理

值得注意的是,假脱机技术虽然是IO核心的任务,却是在用户层实现的

IO调度: 磁盘调度算法就是一种IO调度,IO调度与进程调度类似

设备保护:类似于文件保护

-------------------------------------------------------------------------------------------------------------------

所谓假脱机技术(spooling)就是用软件来实现脱机技术,脱机技术就是先用纸带机将程序预输入到输入磁带,输出时先预输出到输出磁带,这样CPU就不必等待慢速的纸带机了,只需要与磁带打交道即可。

脱机指的就是: 输入输出不再需要主机干预,由外围控制机去负责输入输出。

输入时:即使CPU在忙碌,也可以先输入到输入磁带中

输出时:即使纸带机忙碌,也可以先输出到输出磁带中

假脱机技术:

在磁盘中设置输入井和输出井,充当输入磁带和输出磁带

输入进程和输出进程 充当外围控制机

从外围设备输入时,先将数据放到输入井里,由输入进程负责将输入井里的数据传给CPU

进行输出时,数据先放到输出井里,由输出进程负责将输出井的数据传给输出设备

需要注意的是缓冲区的存在,输入设备要经过内存的输入缓冲区才能将数据预输入到磁盘的输入井

输出井的数据要经过内存的输出缓冲区才到输出设备

“共享”打印机的实现:

打印机是非共享设备,在一个宏观时间段内不能被分配给多个进程

当CPU发出打印请求后,在假脱机管理进程的控制下,即使打印机忙碌,也可以先将要打印的数据(用户进程的数据)放入磁盘的输出井中(经过内存缓冲区),同时还会生成打印请求表(含有打印数据的位置),将打印请求表挂在假脱机队列末尾,之后再由输出进程处理打印请求表。输出进程将磁盘输出井的数据经内存缓冲区传给打印机设备。

每当有进程要求使用打印机时,就为这个进程分配输出井中的存储空间,从而实现虚拟共享

--------------------------------------------------------------------------------------------------------------------------------

缓冲区

缓冲区可以是寄存器也可以是内存,但是寄存器很贵,只有像快表这种访问频率极高的才会使用寄存器作为缓冲区。

设备独立性软件的功能之一   ——   缓冲区管理,缓冲区指的就是内存缓冲

缓冲区的四个作用

1 缓和CPU与IO设备速度矛盾

2 减少CPU中断频率,对于字符型IO设备,每次输入都要产生中断,但如果使用缓冲区的话,可以等缓冲区满了以后再发出中断

3 解决数据粒度不匹配 进程可能一次要输出一个块,但是IO设备一次只能输出一个字符,这样的话使用缓冲区就可以从CPU接收块,然后缓冲区一个字符一个字符的给IO设备。

单缓冲:

缓冲区非空时不能往缓冲区里放数据,缓冲区不满时不能从里面取出数据。

求解单缓冲情况下,处理一块数据所需的时间 

求解这种问题,只需要考虑从初始状态开始,到下一次变成初始状态所需的时间即可(这里的初始状态设为工作区满,缓冲区空)

分两种情况,情况一: T>C 时间为T+M

注意,C时间后CPU处理完进程工作区数据,由于缓冲区未满,缓冲区不能传送数据给进程工作区

第二种情况:T<C

T时间后,缓冲区满,但由于进程工作区还没空,所以不能从缓冲区传数据到进程工作区

因此,单缓冲情况下,平均处理一个块的用时为 max(T,C)+M

-----------------------------------------------------------

双缓冲

两个缓冲区,假设初始状态为 缓冲区一满,缓冲区二空,进程工作区空

情况一:T>C+M

T时间内块设备一直在填充缓冲区2,T时刻 缓冲区二满,缓冲区一空,进程工作区空(等价于初始状态)

情况二:

T<C+M 难以分析再次回到初始状态的时间

但是可以看出,每经过C+M时间就有一个数据被处理

综上,双缓冲情况下,平均每个块的处理时间为 max(T,M+C)

---------------------------------------------------------------------------------------

单缓冲时,只能单双工通信,不能全双工,这是由缓冲区的特性决定的

使用双缓冲,则可以实现全双工通信

回忆进程通道的方式之管道通信,管道其实就是缓冲区

循环缓冲区

in指针指向空缓冲的第一个

out指针指向满缓冲区的第一个

缓冲池

四个缓冲区,分别用来 收容输入数据,提取输入数据,收容输出数据,提取输出数据

1 输入进程请求输入数据: 空缓冲队列头 作为 收容输入数据的缓冲区,充满后挂到输入队列队尾

2 计算进程想要取得一块数据 : 从输入数据的头读入,输入数据的头变空,挂到空缓冲队列队尾

3 4 过程类似,略去

--------------------------------------------------------------------------------------------------------------------------

设备分配中的安全性:

安全分配:不会造成死锁,进程需要阻塞等待IO结束(破坏了请求和保持条件,只有当手里的资源用完了之后才回去请求新的资源)

不安全分配:发出IO请求后,进程不需要等待IO结束,而是接着执行,可以再申请IO设备。可以使用银行家算法来避免不安全状态(分配IO设备资源之前计算分配掉的话会不会造成银行家问题的破产)

设备的分配方式

静态分配:进程运行前分配所有需要的资源。此过程中不需要再请求

动态分配:动态请求资源

-------------------------------------------------------------------

一个通道对应多个IO控制器,一个IO控制器可以控制多个设备

设备控制板DCT的表项:

指向控制器表的指针:向上寻找IO控制器

设备队列的队首指针: 排队等待该设备的进程PCB队列

控制器控制表表项:

指向通道表的指针:向上寻找对应的通道

 

 

系统设备表记录了设备中的全部设备,每个表明中含有 设备控制表 这一项

设备分配的步骤:

给定物理设备名,检索系统设备表,找到对应的表目,找到设备控制表

检测设备控制表的状态信息,如果空闲则分配给进程,如果忙碌则将进程挂到该设备的阻塞队列中。同时将对应的IO控制器控制表也分配给进程

同样的,也要检查IO设备表是否忙碌,同样决定分配或是挂起。并找到通道控制表

只有设备,IO控制器,通道都分配成功,设备分配才成功。

-----------------------------------------

使用物理设备名很不灵活,而且限定了IO设备,因此对上面的过程做改进:

用户只提供逻辑设备名,根据逻辑设备名 查找 系统设备表,逻辑设备名其实就是设备类型,查找系统设备表中任何一个设别类型相符的设备就可以分配给进程。同时还要在逻辑设备表LUT中添加一个逻辑设备名--物理设备名--驱动程序入口地址表项。

如果第二次以请求同样的逻辑设备名,那么直接在逻辑设备表里找到,就知道是哪个物理设备以及对应的驱动程序了

可以为每个用户建立一张逻辑设备表,这样不同用户可以采用同样的逻辑设备名。类似于多用户的文件系统

-----------------------------------------------------------------------------------------------------------

本章完毕

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!