操作系统之IO管理
欢迎光临我的博客[http://poetize.cn],前端使用Vue2,聊天室使用Vue3,后台使用Spring Boot
IO系统结构
设备的分类
按数据组织分
块设备:
信息的存取总是以数据块为单位。
它属于有结构设备,如磁盘等。
磁盘设备的基本特征是传输速率较高,以及可寻址,即对它可随机地读/写任一块。
字符设备:
其传输的基本单位是字符。
它属于无结构类型,如交互式终端机、打印机等。
它们的基本特征是传输速率低、不可寻址,并且在输入/输出时常釆用中断驱动方式。
按使用特性
1) 人机交互类外部设备:
用于同计算机用户之间交互的设备,如打印机、显示器、鼠标、键盘等。
这类设备数据交换速度相对较慢,通常是以字节为单位进行数据交换。
2) 存储设备:
用于存储程序和数据的设备,如磁盘、磁带、光盘等。这类设备用于数据交换,速度较快,
通常以多字节组成的块为单位进行数据交换。
3) 网络通信设备:
用于与远程设备通信的设备,如各种网络接口、调制解调器等。
其速度介于前两类设备之间。网络通信设备在使用和管理上与前两类设备也有很大不同。
按设备的共享属性分类:
独占设备,在一段时间内只允许一个用户(进程)访问的设备,即临界资源。
共享设备,在一段时间内允许多个进程同时访问的设备,当然,每一时刻仍然只允许一个进程访问,如磁盘(可寻址和可随机访问)。
虚拟设备,通过虚拟技术将一台设备变换为若干台逻辑设备,供若干个用户(进程)同时使用。
IO管理的目标和任务
(1)依照用户的请求,控制设备的各种操作,完成io设备和内存的数据交换:
设备的分配和回收:查看设备的状态,调用相关的分配策略,进行设备的分配。
运行设备驱动程序:用户通过设备驱动程序完成对设备的控制。
设置中断处理:设备完毕后,向cpu发出中断。
(2)建立方便统一独立于设备的接口
方便性:对用户提供了方便的接口,使的控制外部设备的时候不考虑复杂的物理特性。
(3)充分利用各种技术(通道。中断,缓冲等)提高cpu与设备。设备与设备之间的并行工作能力。
IO控制方式
(1)轮询方式:不断的查看io设备的状态信息,然后做出回应。
在程序直接控制方式中,由于CPU的高速性和I/O设备的低速性,
致使CPU的绝大部分时间都处于等待I/O设备完成数据I/O的循环测试中,造成了 CPU资源的极大浪费。
(2)中断的方式:当设备完成操作时候,对cpu发出中断。
允许I/O设备主动打断CPU的运行并请求服务,从而“解放”CPU,使得其向I/O控制器发送读命令后可以继续做其他有用的工作。
从I/O控制器的角度来看:
I/O控制器从CPU接收一个读命令,然后从外围设备读数据。
一旦数据读入到该I/O控制器的数据寄存器,便通过控制线给CPU发出一个中断信号,表示数据已准备好,然后等待CPU请求该数据。
I/O控制器收到CPU发出的取数据请求后,将数据放到数据总线上,传到CPU的寄存器中。
至此,本次I/O操作完成,I/O控制器又可幵始下一次I/O操作。
从CPU的角度来看:
CPU发出读命令,然后保存当前运行程序的上下文(现场,包括程序计数器及处理机寄存器),转去执行其他程序。
在每个指令周期的末尾,CPU检查中断。
当有来自I/O控制器的中断时,CPU保存当前正在运行程序的上下文,转去执行中断处理程序处理该中断。
这时,CPU从I/O控制器读一个字的数据传送到寄存器,并存入主存。
接着,CPU恢复发出I/O命令的程序(或其他程序)的上下文,然后继续运行。
中断驱动方式比程序直接控制方式有效。
但由于数据中的每个字在存储器与I/O控制器之间的传输都必须经过CPU,这就导致了中断驱动方式仍然会消耗较多的CPU时间。
(3)DMA:不用通过cpu,内存和IO设备直接进行数据交换。
在I/O设备和内存之间开辟直接的数据交换通路,彻底“解放” CPU。DMA方式的特点是:
基本单位是数据块。
所传送的数据,是从设备直接送入内存的,或者相反。
仅在传送一个或多个数据块的开始和结束时,才需CPU干预,整块数据的传送是在DMA控制器的控制下完成的。
(4)通道控制方式:I/O通道是指专门负责输入/输出的处理机。
I/O通道方式是DMA方式的发展,它可以进一步减少CPU的干预。
即把对一个数据块的读(或写)为单位的干预,减少为对一组数据块的读(或写)及有关的控制和管理为单位的干预。
同时,又可以实现CPU、通道和I/O设备三者的并行操作,从而更有效地提高整个系统的资源利用率。
例如,当CPU要完成一组相关的读(或写)操作及有关控制时,只需向I/O通道发送一条I/O指令,
给出其所要执行的通道程序的首地址和要访问的I/O设备。
通道接到该指令后,通过执行通道程序便可完成CPU指定的I/O任务,数据传送结束时向CPU发中断请求。
I/O通道与一般处理机的区别是:
通道指令的类型单一,没有自己的内存,通道所执行的通道程序是放在主机的内存中的,也就是说通道与CPU共享内存。
I/O通道与DMA方式的区别是:
DMA方式需要CPU来控制传输的数据块大小、传输的内存位置,而通道方式中这些信息是由通道控制的。
另外,每个DMA控制器对应一台设备与内存传递数据,而一个通道可以控制多台设备与内存的数据交换
轮询,中断,DMA
DMA
DMA与中断的区别
IO软件设计与层次结构
(1)用户级IO软件:用户执行输入输出系统调用,对IO数据进行格式化。
(2)设备无关的软件层
(3)设备驱动层
(4)中断处理层:当IO操作完成的时候,唤醒设备驱动程序进程,进行中断处理。
为了使复杂的I/O软件具有清晰的结构,良好的可移植性和适应性,
在I/O软件中普遍釆用了层次式结构,将系统输入/输出功能组织成一系列的层次,每一层都利用其下层提供的服务,
完成输入/输出功能中的某些子功能,并屏蔽这些功能实现的细节,向高层提供服务。
1) 用户层I/O软件:
实现与用户交互的接口,用户可直接调用在用户层提供的、与I/O操作有关的库函数,对设备进行操作。
一般而言,大部分的I/O软件都在操作系统内部。
但仍有一小部分在用户层,包括与用户程序链接在一起的库函数,以及完全运行于内核之外的一些程序。
用户层软件必须通过一组系统调用来获取操作系统服务。
2) 设备独立性软件:
设备独立性也称设备无关性,使得应用程序独立于具体使用的物理设备。
为了实现设备独立性而引入了逻辑设备和物理设备这两个概念。
在应用程序中,使用逻辑设备名来请求使用某类设备;
而在系统实际执行时,必须将逻辑设备名映射成物理设备名使用。
使用逻辑设备名的好处是:
增加设备分配的灵活性。
易于实现I/O重定向,所谓I/O重定向,是指用于I/O操作的设备可以更换(即重定向),而不必改变应用程序。
为了实现设备独立性,必须再在驱动程序之上设置一层设备独立性软件。
总的来说,设备独立性软件的主要功能可分以为以下两个方面:
执行所有设备的公有操作。包括:
对设备的分配与回收;
将逻辑设备名映射为物理设备名;
对设备进行保护,禁止用户直接访问设备;
缓冲管理;
差错控制;
提供独立于设备的大小统一的逻辑块,屏蔽设备之间信息交换单位大小和传输速率的差异。
向用户层(或文件层)提供统一接口:
无论何种设备,它们向用户所提供的接口应该是相同的。
例如,对各种设备的读/写操作,在应用程序中都统一使用read/write命令等。
3) 设备驱动程序:
与硬件直接相关,负责具体实现系统对设备发出的操作指令,驱动I/O设备工作的驱动程序。
通常,每一类设备配置一个设备驱动程序,它是I/O进程与设备控制器之间的通信程序,常以进程形式存在。
4)中断处理程序:
用于保存被中断进程的CPU环境,转入相应的中断处理程序进行处理,
处理完并恢复被中断进程的现场后,返回到被中断进程。
中断处理层的主要任务有:
进行进程上下文的切换。
对处理中断信号源进行测试。
读取设备状态和修改进程状态等。
由于中断处理与硬件紧密相关,对用户而言,应尽量加以屏蔽,故应放在操作系统的底层,系统的其余部分尽可能少地与之发生联系。
5) 硬件设备:
I/O设备通常包括一个机械部件和一个电子部件。为了达到设计的模块性和通用性,一般将其分开:
电子部件称为设备控制器(或适配器),在个人计算机中,通常是一块插入主板扩充槽的印刷电路板;
机械部件则是设备本身。
设备控制器的主要功能为:
接收和识别CPU或通道发来的命令,如磁盘控制器能接收读、写、查找等命令。
实现数据交换,包括设备和控制器之间的数据传输;通过数据总线或通道,控制器和主存之间的数据传输。
发现和记录设备及自身的状态信息,供CPU处理使用。
备地址识别。
I/O子系统概述
由于I/O设备种类繁多,功能和传输速率差异巨大,需要多种方法来进行设备控制。
这些方法共同组成了操作系统内核的I/O子系统,它将内核的其他方面从繁重的I/O设备管理中解放出来。
I/O核心子系统提供的服务主要有I/O调度、缓冲与高速缓存、设备分配与回收、假脱机、设备保护和差错处理等。
高速缓存与缓冲区
1. 磁盘高速缓存(Disk Cache)
操作系统中使用磁盘高速缓存技术来提高磁盘的I/O速度,对高速缓存复制的访问要比原始数据访问更为高效。
例如,正在运行的进程的指令既存储在磁盘上,也存储在物理内存上,也被复制到CPU的二级和一级高速缓存中。
不过,磁盘高速缓存技术不同于通常意义下的介于CPU与内存之间的小容量高速存储器,
而是指利用内存中的存储空间来暂存从磁盘中读出的一系列盘块中的信息。
因此,磁盘高速缓存在逻辑上属于磁盘,物理上则是驻留在内存中的盘块。
高速缓存在内存中分为两种形式:
一种是在内存中开辟一个单独的存储空间作为磁速缓存,大小固定。
另一种是把未利用的内存空间作为一个缓沖池,供请求分页系统和磁盘I/O时共享。
2. 缓冲区(Buffer)
在设备管理子系统中,引入缓冲区的目的主要有:
缓和CPU与I/O设备间速度不匹配的矛盾。
减少对CPU的中断频率,放宽对CPU中断响应时间的限制。
解决基本数据单元大小(即数据粒度)不匹配的问题。
提高CPU和I/O设备之间的并行性。
其实现方法有:
釆用硬件缓冲器,但由于成本太高,除一些关键部位外,一般不釆用硬件缓冲器
釆用缓冲区(位于内存区域)。
根据系统设置缓冲器的个数,缓冲技术可以分为:
1) 单缓冲
在设备和处理机之间设置一个缓冲区。
设备和处理机交换数据时,先把被交换数据写入缓冲区,然后需要数据的设备或处理机从缓冲区取走数据。
如果两台机器之间通信仅配置了单缓冲。那么,它们在任一时刻都只能实现单方向的数据传输。
2) 双缓冲
I/O设备输入数据时先装填到缓冲区1,在缓冲区1填满后才开始装填缓冲区2,
与此同时处理机可以从缓冲区1中取出数据放入用户进程处理,
当缓冲区1中的数据处理完后,若缓冲区2已填满,则处理机又从缓冲区2中取出数据放入用户进程处理,
而I/O设备又可以装填缓冲区1。双缓冲机制提高了处理机和输入设备的并行操作的程度。
3) 循环缓冲
包含多个大小相等的缓冲区,每个缓冲区中有一个链接指针指向下一个缓冲区,
最后一个缓冲区指针指向第一个缓冲区,多个缓冲区构成一个环形。
循环缓冲用于输入/输出时,还需要有两个指针in和out:
对输入而言,首先要从设备接收数据到缓冲区中,in指针指向可以输入数据的第一个空缓冲区。
当运行进程需要数据时,从循环缓冲区中取一个装满数据的缓冲区,并从此缓冲区中提取数据。
out指针指向可以提取数据的第一个满缓冲区。输出则正好相反。
4) 缓冲池
由多个系统公用的缓冲区组成,缓冲区按其使用状况可以形成三个队列:
空缓冲队列,
装满输入数据的缓冲队列(输入队列),
装满输出数据的缓沖队列(输出队列)。
还应具有四种缓冲区:
用于收容输入数据的工作缓冲区、
用于提取输入数据的工作缓冲区、
用于收容输出数据的工作缓冲区、
用于提取输出数据的工作缓冲区。
当输入进程需要输入数据时,便从空缓冲队列的队首摘下一个空缓冲区,把它作为收容输入工作缓冲区,
然后把输入数据输入其中,装满后再将它挂到输入队列队尾。
当计算进程需要输入数据时,便从输入队列取得一个缓冲区作为提取输入工作缓冲区,
计算进程从中提取数据,数据用完后再将它挂到空缓冲队列尾。
当计算进程需要输出数据时,便从空缓冲队列的队首取得一个空缓冲区,作为收容输出工作缓冲区,
当其中装满输出数据后,再将它挂到输出队列队尾。
当要输出时,由输出进程从输出队列中取得一个装满输出数据的缓冲区,作为提取输出工作缓冲区,
当数据提取完后,再将它挂到空缓冲队列的队尾。
缓冲
单缓冲
双向缓冲
双缓冲
循环缓冲
缓冲池
高速缓存与缓冲区对比
I/O性能问题
解决IO性能问题有两个方法:
使cpu利用率尽可能不被IO降低
使cpu尽可能摆脱IO
我们可以使用缓冲技术减少或缓解速度差异,同时使用异步IO来使cpu不等待IO。
还可以使用DMA、通道等IO部件来让cpu摆脱IO操作。
同步I/O流程
应用程序被阻塞直到IO操作完成。
在IO处理过程中,cpu处于空闲等待状态
而在处理数据的过程中,不能同时进行IO操作
异步I/O
Windows提供两种模式的IO操作:异步和同步
通过异步IO,应用程序可以启动一个IO操作,然后在IO请求执行的同时继续处理
基本思想:填充IO操作时间等待的cpu时间
异步I/O的基本思想
系统实现:
通过切换到其他线程保证cpu利用率。
用户实现:
将访问控制分成两段进行
发出读取指令后继续做其他操作
当需要用读入的数据的时候,再使用wait命令等待其完成
不引入线程切换,减少开销