I/O系统结构:
I/O管理:
应用程序若想访问磁盘上文件,要多经过文件系统,之后通过I/O设备管理来对相应的硬件进行操作。
I/O设备管理包括:
逻辑I/O,设备驱动程序,中断服务程序
I/O设备特点:
I/O性能经常成为系统性能的瓶颈
操作系统庞大复杂的原因之一:资源多、杂,并发,均来自I/O
与其他功能联系密切,特别是文件系统
设备分类:
块设备
以数据块为单位存储、传输信息
特点:
传输速率较高、可寻址(随机读写)
字符设备
以字符为单位存储、传输信息
特点:
传输速率低、不可寻址
I/O管理的目标和任务:
目标(1) 按照用户的请求,控制设备的各种操作,完成I/O设备与内存之间的数据交换,最终完成用户的I/O请求
任务:
实现设备分配与回收
记录设备的状态
根据用户的请求和设备的类型,采用一定的分配算法,选择一条数据通路
执行设备驱动程序,实现真正的I/O操作
设备中断处理:处理外部设备的中断
缓冲区管理:管理I/O缓冲区
目标(2) 建立方便、统一的独立于设备的接口
方便性:向用户提供使用外
部设备的方便接口,使用户
编程时
统一性:对不同的设备采取
统一的操作方式,即在用户
程序中使用的是逻辑设备
逻辑设备与物理设备
屏蔽硬件细节
目标(3)
充分利用各种技术(通道,中断,缓冲,异步I/O等)提高CPU与设备、设备与设备之间的并行工作能力,充分利用资源,提高资源利用率
目标(4) 保护设备传送或管理的数据应该是安全的、不被破坏的、保密的
I/O硬件:
I/O设备一般由机械(设备本身)和电子(设备控制器)两部分组成
设备控制器作用:
(1)操作系统将命令写入控制器的接口寄存器(或接口缓冲区)中,以实现输入/输出,并从接口寄存器读取状态信息或结果信息
(2)当控制器接受一条命令后,可独立于CPU完成指定操作,CPU可以另外执行其他计算;命令完成时,控制器产生一个中断,CPU响应中断,控制转给操作系统;通过读控制器寄存器中的信息,获得操作结果和设备状态
(3)控制器与设备之间的接口常常是一个低级接口
(4)控制器的任务:把串行的位流转换为字节块,并进行必要的错误修正:首先,控制器按位进行组装,然后存入控制器内部的缓冲区中形成以字节为单位的块;在对块验证检查和并证明无错误时,再将它复制到内存中
I/O端口地址:
接口电路中每个寄存器具有的、唯一的地址,而且是个整数,所有I/O端口地址形成I/O端口空间(受到保护)
I/O指令形式与I/O地址是相互关联的, 主要有两种形式:
内存映像编址(内存映像I/O模式)
I/O独立编址(I/O专用指令)
内存镜像编址:
a,b,c代表三种不同的内存编址方式,最后一种应用了缓冲技术,即I/O端口地址映射到内存中某个区域。
分配给系统中所有端口的地址空间与内存的地址空间统一编址
把I/O端口看作一个存储单元,对I/O的读写操作等同于对内存的操作
优点:
凡是可对内存操作的指令都可对I/O端口操作
不需要专门的I/O指令
I/O端口可占有较大的地址空间
不需要特殊的保护机制来阻止用户进程执行I/O操作,但是OS必须保证那部分覅只空间不能分配给其他用户进程
可以引用内存的每一条指令也可以引用控制寄存器
缺点:
占用内存空间
I/O独立编址:
分配给系统中所有端口的地址空间完全独立,与内存地址空间无关
使用专门的I/O指令对端口进行操作
优点
外设不占用内存的地址空间,导致编程时易于区分是对内存操作还是对I/O端口操作
缺点:
1.I/O端口操作的指令类型少,操作不灵活
例子:在8086/8088中,分配给I/O端口的地址空间64K,0000H~0FFFFH,只能用in和out指令进行读写操作
2.对一个设备控制寄存器不能进行高速缓存
例如:
LOOP:TEST PORT-4 //检测端口4是否为0 BEQ READY //如果为0,转向READY BRANCH LOOP //否则,继续测试 READY:
第一次引用PORT_4将导致它被高速缓存,随后的引用将只从高速缓存中取值(因为端口已在cache中)并且不会再查询设备,之后当设备最终变为就绪时,软件将没有办法发现这一点,结果循环将永远进行下去,为避免这一情形,硬件必须针对每个页面具备选择性禁用高速缓存的能力,操作系统必须管理选择性高速缓存,所以这一特性为硬件和操作系统两者增添了额外的复杂性
I/O控制方式:
(1)可编程I/O(轮询/查询)
由CPU代表进程给I/O模块发I/O命令,进程进入忙等待,直到操作完成才继续执行
(2)中断驱动I/O
为了减少设备驱动程序不断地询问控制器状态寄存器的开销,I/O操作结束后,由设备控制器主动通知设备驱动程序
(3)DMA
对于可编程I/O:
过程:一个应用程序想从设备上读取数据,它会发送信息给设备驱动程序,设备驱动程序会检查设备状态,如果设备为空闲状态,再往设备发送控制命令,之后不断测试设备是否完成任务,完成后就把数据返回到应用程序
中断驱动I/O:
过程:
一个应用程序想从设备上读取数据,它会发送信息给设备驱动程序,设备驱动程序会检查设备状态,如果设备为空闲状态,再往设备发送控制命令,然后把设备状态记录在设备状态表中,若设备完成后就向CPU发送中断信号,CPU接收到该信号,就执行中断处理程序,若发现I/O设备本次操作正常,将CPU执行权再交给设备处理程序,其将设备中对应设备信息取出,发送给应用程序。
I/O软件组成:
分层思想:
把I/O软件组织成多个层次
每一层都执行操作系统所需要的功能的一个相关子集,它依赖于更低一层所执行的更原始的功能,从而可以隐藏这些功能的细节;同时,它又给高一层提供服务
较低层考虑硬件的特性,并向较高层软件提供接口
较高层不依赖于硬件,并向用户提供一个友好的、清晰的、简单的、功能更强的接口
I/O软件层次:
(1)用户进程层执行输入输出系统调用,对I/O数据进行格式化,为假脱机输入/输出作准备
(2)独立于设备的软件实现设备的命名、设备的保护、成块处理、缓冲技术和设备分配
(3)设备驱动程序设置设备寄存器、检查设备的执行状态
(4)中断处理程序负责I/O完成时,唤醒设备驱动程序进程,进行中断处理
(5)硬件层实现物理I/O的操作
I/O相关技术:
缓冲技术的引入:
其是操作系统中最早引入的技术
→ 解决CPU与I/O设备之间速度的不匹配问题:凡是数据到达和离去速度不匹配的地方均可采用缓冲技术
→ 提高CPU与I/O设备之间的并行性
→ 减少了I/O设备对CPU的中断请求次数,放宽CPU对中断响应时间的要求
缓冲区分类:
硬缓冲:由硬件寄存器实现(例如:设备中设置的缓冲区)
软缓冲:在内存中开辟一个空间,用作缓冲区
缓冲区管理:
1.单缓冲
2.双缓冲
3.缓冲池(多缓冲,循环缓冲):统一管理多个缓冲区,采用有界缓冲区的生产者/消费者模型对缓冲池中的缓冲区进行循环使用
例如:终端输入软件中的键盘驱动程序其任务之一:收集字符,所使用的缓冲区
I/O设备管理:
有关的数据结构:
描述设备、控制器等部件的表格:系统中常常为每一个部件、每一台设备分别设置一张表格,常称为设备表或部件控制块。这类表格具体描述设备的类型、标识符、状态,以及当前使用者的进程标识符等
建立同类资源的队列:系统为了方便对I/O设备的分配管理,通常在设备表的基础上通过指针将相同物理属性的设备连成队列(称设备队列)
面向进程I/O请求的动态数据结构:每当进程发出I/O请求时,系统建立一张表格(称I/O请求包),将此次I/O请求的参数填入表中,同时也将该I/O有关的系统缓冲区地址等信息填入表中。I/O请求包随着I/O的完成而被删除
建立I/O队列:如请求包队列
独占设备的分配:
静态分配:
在进程运行前, 完成设备分配;运行结束时,收回设备
缺点:设备利用率低
动态分配:
在进程运行过程中,当用户提出设备要求时,进行分配,一旦停止使用立即收回
优点:效率好;
缺点:分配策略不好时, 产生死锁
分时式共享设备的分配:
1.所谓分时式共享就是以一次I/O为单位分时使用设备,不同进程的I/O操作请求以排队方式分时地占用设备进行I/O
2.由于同时有多个进程同时访问,且访问频繁,就会影响整个设备使用效率,影响系统效率。因此要考虑多个访问请求到达时服务的顺序,使平均服务时间越短越好
设备驱动程序:
1.与设备密切相关的代码放在设备驱动程序中,每个设备驱动程序处理一种设备类型
2.一般,设备驱动程序的任务是接收来自与设备无关的上层软件的抽象请求,并执行这个请求
3.每一个控制器都设有一个或多个设备寄存器,用来存放向设备发送的命令和参数。设备驱动程序负责释放这些命令,并监督它们正确执行
4.在设备驱动程序的进程释放一条或多条命令后,系统有两种处理方式,多数情况下,执行设备驱动程序的进程必须等待命令完成,这样,在命令开始执行后,它阻塞自已,直到中断处理时将它解除阻塞为止;而在其它情况下,命令执行不必延迟就很快完成
设备驱动程序与外界的接口:
1.与操作系统的接口:为实现设备无关性,设备作为特殊文件处理。用户的I/O请求、对命令的合法性检查以及参数处理在文件系统中完成。在需要各种设备执行具体操作时,通过相应数据结构转入不同的设备驱动程序
2.与系统引导的接口(初始化,包括分配数据结构,建立设备的请求队列)
3.与设备的接口
驱动程序中函数:
驱动程序初始化函数(如向操作系统登记该驱动程序的接口函数,该初始化函数在系统启动时或驱动程序安装入内核时执行)
驱动程序卸载函数
申请设备函数
释放设备函数
I/O操作函数:对独占设备,包含启动I/O的指令;对共享设备,将I/O请求形成一个请求包,排到设备请求队列,如果请求队列空,则直接启动设备
中断处理函数:对I/O完成做善后处理,一般是唤醒等待刚完成I/O请求的阻塞进程,使其能进一步做后续工作;如果存在I/O请求队列,则启动下一个I/O请求
I/O进程:
专门处理系统中的I/O请求和I/O中断工作
I/O请求的进入
用户程序:调用send将I/O请求发送给I/O进程;调用block将自己阻塞,直到I/O任务完成后被唤醒
系统:利用wakeup唤醒I/O进程,完成用户所要求的I/O处理
I/O中断的进入
当I/O中断发生时,内核中的中断处理程序发一条消息给I/O进程,由I/O进程负责判断并处理中断
对于I/O进程特点:
1.是系统进程,一般赋予最高优先级。一旦被唤醒,它可以很快抢占处理机投入运行
2.I/O进程开始运行后,首先关闭中断,然后用receive去接收消息
接收消息情况:
1.没有消息,则开中断,将自己阻塞
2.有消息,则判断消息类型(I/O请求或I/O中断)
a. I/O请求
准备通道程序,发出启动I/O指令,继续判断有无消息
b. I/O中断,进一步判断正常或异常结束
正常:唤醒要求进行I/O操作的进程
异常:转入相应的错误处理程序
I/O性能:
为了使CPU利用率尽可能不被I/O降低,使CPU尽可能摆脱I/O,我们:
减少或缓解速度差距 使用 缓冲技术
使CPU不等待I/O 使用 异步I/O
让CPU摆脱I/O操作 使用 DMA、通道
异步传输(不要求立刻返回结果):
通过异步I/O,应用程序可以启动一个I/O操作,然后在I/O请求执行的同时继续处理
基本思想:填充I/O操作间等待的CPU时间
同步I/O(等待直到返回一个结果):
应用程序被阻塞直到I/O操作完成
作者水平有限,文章肯定有错还请各位指点!!!感谢!!!