IO介绍-下
中断
中断向量表
中断优先级
多中断源的处理方式
- 屏蔽中断
- 嵌套中断
- 根据优先级
- 高优先级的抢占式中断源
中断处理程序
- 检测是否有未响应的中断信号:每当设备完成一个字符或者是一个数据块的读入或者输出,设备控制器就向CPU发送一个中断信号。请求CPU将设备读取出来的数据转存到内存缓冲区中,或者是将输出的数据传送给设备控制器。程序每当执行完当前指令后,CPU都要检测是否有未响应的中断信号。若没有,继续执行下一条指令。如果有,就停止原有进程的执行,准备转去执行中断处理程序,为把CPU的控制权交给中断处理程序做准备。
- 保护被中断进程的CPU环境:把控制权交给中断处理程序之前,需要先保护被中断的进程的CPU环境,以便后面能恢复运行。首先保存的是从中断现场恢复到当前进程运行所需要的信息。通常是由硬件自动将CPU状态子和保存在程序计数器中的下一条指令的地址保存在中断保留栈中。然后将包括所有CPU寄存器(通用寄存器、段寄存器等)内容都压入中断栈中。因为中断处理时可能会用到这些寄存器。
- 转入相应的设备处理程序:由CPU对各个中断源进行测试,以确定引起本次中断的IO设备,并向提供中断信号的设备发送确认信号。在该设备收到确认信号后,就立即取消它所发送的中断请求信号。然后,将相应的设备中断处理程序的入口地址装到程序计数器中。这样,当CPU运行时,就可以自动转向中断处理程序了。
- 中断处理:对不同的设备,有不同的中断处理程序。这样的程序首先是从设备控制器中读取出设备的状态,先判断本次中断是否能正常完成,还是异常结束中断。如果是正常的完成中断,中断程序就可以做结束处理了。假设是一次字符设备的读取操作,则来自输入设备的中断是表明该设备已经读入了一个字符数据了,并将它放到了数据寄存器中。此时中断处理是将该数据传送到CPU,再将它存入缓冲区中,并修改缓冲区对应的指针,让指针指向一下个内存单元。如果还有命令,可以再向控制器发送新的命令,进行新一轮的数据传送。如果是异常中断,就需要根据发生的异常的原因做相应的处理。
- 恢复CPU现场并退出中断。当中断处理完成后,需要恢复CPU现场。退出中断。但是,这时候是否能返回到被中断的进程,取决于以下两种因素:
- 本中断是否采用了屏蔽中断,如果是,就会返回被中断的进程
- 采用的是嵌套的中断方式,如果没有更高优先级的中断IO请求,在中断完成后就会返回被中断的进程;如果有更高优先级的IO中断,就要继续处理更高优先级的中断。
设备驱动程序
设备驱动程序的功能
- 接受与设备无关的软件发送过来的命令和参数,并将命令中的抽象要求转换成和设备有关的底层的操作序列。
- 检查用户的IO请求的合法性,了解IO设备的状态,传递相关参数,设置设备的工作方式。
- 发出IO命令,如果空闲,就启动IO设备,完成指定的操作。如果设备忙碌,就将请求挂到设备的队列上等候
- 及时响应由设备控制器发来的中断请求,并根据它的中断类型,调用相应的中断处理程序进行处理。
设备驱动程序的特点
- 驱动程序实现了和设备无关的软件,它是和设备控制器之间通信和转换的程序。
- 驱动程序和设备控制器以及IO设备的硬件特性相关,对于不同类型的设备,应配置不同的驱动程序。可以为相同的多个中断设置一个终端驱动程序。
- 驱动程序和IO设备采用的IO控制方式紧密相关,通常是中断驱动和DMA方式
- 由于驱动程序与硬件紧密相关,所以其中一部分必须用汇编语言来写。目前很多驱动程序基本都是固化在ROM中
- 驱动程序允许可重入。一个正在运行的驱动程序经常会调用一个完成以后又调用一次。
设备处理方式
- 为每一类设备设置一个进程,专门用来执行这类设备的IO操作。比如为同一个类型的打印机设置一个打印的进程。这种方式适合使用大的系统
- 在整个系统中设置一个IO进程,也可以设置一个输入进程和一个输出进程,分别处理系统的输入和输出的
- 不设置专门的设备处理进程,只为各类设备相应的设备设置相应的设备驱动程序,供用户或者系统调用。目前微小型机器都是使用这种方式的。
设备驱动程序的处理过程
- 将抽象的要求转换成具体的要求:通常是在每一个设备控制器中都含有若干个寄存器,分别用于存储命令、参数和数据的等。因为上层发送的都是抽象命令。
- 对服务请求进行校验:检查上层用户发来的命令是否是设备能执行的。比如,向打印机设备读取数据这是一个典型的错误。一上来在软件层面就能发现的错误类型。
- 检查设备状态:通常在每一个设备控制器中都有状态寄存器。驱动程序在启动设备之前,要先吧状态寄存器中的内容读入到CPU的某一个寄存器中。通过不同的位标记设备的状态。这个状态位,不只是表示忙闲的状态,还有已经读取完成,读取就绪,写入就绪,写入完成等状态。
- 传递必要的参数:在确定设备处于接收(发送)就绪状态后,便可以向控制器的相应的寄存器传输数据和控制本次数据传输有关的参数。
- 启动设备:有了前面的准备工作,然后就可以向设备控制器中的命令寄存器传送相应的控制命令。最终都是通过状态寄存器来确认是否完成了操作,是否能进行下一步操作了。
IO设备的控制方法
轮训的编程方式
可中断的编程方式
直接存储器访问方式(DMA方式)
- 数据传输的基本单位是数据块:CPu和IO设备之间的,每次传送的至少一个数据块。
- 所传输的数据是直接从设备到内存的,或者是从内存到设备的
- 仅在传送一个或多个数据块的开始和结束时,才需要CPU干预。整块数据的传输是在控制器的控制下完成的。所以,DMA方式又进一步提高了CPU和IO设备并行的操作程度。
DMA控制器的组成
- 命令、状态寄存器CR,用于接收从CPU发来的IO命令,或有关控制信息,或设备状态
- 内存地址寄存器MAR,在输入时,它存放把数据从设备传送到内存的起始目标地址,在输出时,它存放由内存到设备的内存源地址。
- 数据寄存器DR:用于暂存从设备到内存,或从内存到设备的数据
- 数据计数器DC:存放本次CPU要读或写的字数
DMA工作过程
IO通道控制方式
通道程序
- 操作码:它规定了操作是读操作,还是写操作,还是控制操作
- 内存地址:标明字符送到内存或者是从内存取走的时的首地址
- 计数:表示本条指令所要读写的数据字节数
- 通道程序结束位P:表示通道程序是否结束。P=1 表示本条指令是通道程序的最后一条指令
- 记录结束标识位R: R=0 表示本通道指令与下一条指令所处理的数据是同属于一个记录。R=1 表示这是处理某记录的最后一条指令了。
与设备无关的IO软件
以物理设备名使用设备
逻辑设备名
逻辑设备名到物理设备名的转换
解:
公有操作
- 设备驱动程序的统一接口
- 缓冲管理
- 差错控制
- 暂时性错误:比如因为电源波动,或者网络传输等暂时性错误,可以通过重新来解决。
- 永久性错误:比如磁盘上少数的盘块遭到破坏而失效,只需要将坏盘块记录下来,放到一个坏盘块表中,以后不在使用即可。就不用换磁盘。
- 对独立设备的分配和回收
- 独立于设备的逻辑数据块
设备分配
设备分配中的数据结构
- 设备类型:type
- 设备标识符:devicedid
- 设备状态:等待/不等待 忙
- 指向控制器表的指针:凡是因为请求本设备没有到得到满足的进程,都要在这里排队
- 重复执行次数或时间:重试上限,如果超过上限还不成功,就认为是失败了
- 设备队列的队首指针:
控制器控制表COCT
通道控制表CHCT
系统设备表SDT
设备分配考虑因素
- 设备的固有属性
- 独占属性:
- 共享设备
- 虚拟设备
- 设备分配算法
- 优先级
- 先来先服务
- 分配安全
- 安全分配方式:一旦进程已获取某种设备后便阻塞,不能请求任何资源,而阻塞时又不保持任何资源。
- 不安全分配方式
用户层的IO软件
系统调用
spooling技术
- 输入井和输出井
- 输入缓冲区和输出缓冲区
- 输入进程和输出进程
- 井管理程序
- 将独占设改成成了共享设备:比如打印机
- 实现了虚拟设备功能
缓冲区管理
- 解决cpu和设备速度不匹配问题
- 减少对cpu中断频率
- 解决数据粒度不一样问题
- 提高CPU和设备之间的并行
- 单缓冲
- 双缓冲
- 环境缓冲
- 缓冲池
IO介绍-下的更多相关文章
- 如何使用开源库,吐在VS2013发布之前,顺便介绍下V2013的新特性"Bootstrap"
如何使用开源库,吐在VS2013发布之前,顺便介绍下VS2013的新特性"Bootstrap" 刚看到Visual Studio 2013 Preview - ASP.NET, M ...
- 【python】-- 事件驱动介绍、阻塞IO, 非阻塞IO, 同步IO,异步IO介绍
事件驱动介绍 一.前言 通常,我们写服务器处理模型的程序时,有以下几种模型: (1)每收到一个请求,创建一个新的进程,来处理该请求: (2)每收到一个请求,创建一个新的线程,来处理该请求: (3)每收 ...
- java.io 包下的类有哪些 + 面试题
java.io 包下的类有哪些 + 面试题 IO 介绍 IO 是 Input/Output 的缩写,它是基于流模型实现的,比如操作文件时使用输入流和输出流来写入和读取文件等. IO 分类 传统的 IO ...
- 介绍下Java内存区域(运行时数据区)
介绍下Java内存区域(运行时数据区) Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域.JDK 1.8 和之前的版本略有不同. 下图是 JDK 1.8 对JV ...
- 下面就介绍下Android NDK的入门学习过程(转)
为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大. 2. 在NDK中调用第三方C/C++库,因为大部分的开源库 ...
- 百亿级别数据量,又需要秒级响应的案例,需要什么系统支持呢?下面介绍下大数据实时分析工具Yonghong Z-Suite
Yonghong Z-Suite 除了提供优秀的前端BI工具之外,Yonghong Z-Suite让用户可以选购分布式数据集市来支持实时大数据分析. 对于这种百亿级的大数据案例,Yonghong Z- ...
- 我也介绍下sizeof与strlen的区别
本节我也介绍下sizeof与strlen的区别,很简单,就几条: 1. sizeof是C++中的一个关键字,而strlen是C语言中的一个函数:2. sizeof求的是系统分配的内存总量,而strle ...
- Netty之WebSocket和四种IO介绍
Netty简介 一.什么是netty? 高性能 事件驱动 异步非堵塞 基于NIO的客户端,服务器端编程框架 稳定性和伸缩性 二.Netty的使用场景 高性能领域 多线程并发领域 异步通信领域 ...
- 介绍下Shell中的${}、##和%%使用范例,本文给出了不同情况下得到的结果。
介绍下Shell中的${}.##和%%使用范例,本文给出了不同情况下得到的结果.假设定义了一个变量为:代码如下:file=/dir1/dir2/dir3/my.file.txt可以用${ }分别替换得 ...
- DevOps|1024程序员节怎么做?介绍下我的思路
1024,祝每个程序员小哥哥小姐姐节日快乐. 因为在研发效能部门,我支持过几次 1024 程序员节的活动,所以经常有朋友问我1024 程序员节怎么做,本篇就是简单介绍下我的思路,希望对你有用. 102 ...
随机推荐
- SpringMVC —— RESTful案例
案例:基于RESTful页面数据交互
- RTThread内对##连接符和#转字符串这俩符号的使用
早就知道这俩符号的意思,最近翻看代码又看到了,仍然觉得熟悉又陌生,主要是自己平时写代码对这俩符号用的比较少.于是特地做个实验,加深下理解.可记的东西不多,这篇随笔算是随手一写吧. 上实验代码: 来源: ...
- 课时05:Linux必备系统命令
- WeiXin.Export.20220726
用 QuestPDF操作生成PDF更快更高效! Blazor Server 应用程序中进行 HTTP 请求 开源WPF控件库-AdonisUI FastTunnel-开源内网穿透框架 AI 之 Ope ...
- 使用composer创建项目时报错:Composer could not find the config file?
使用composer创建项目时报错:Composer could not find the config file:C:\Composer ....? 一般报这个错就是composer安装的时候配置了 ...
- 世界第一!华为云图引擎服务GES大幅刷新世界纪录
近日,国际关联数据基准委员会(Linked Data Benchmark Council,以下简称LDBC)公布了社交网络测试交互式负载(SNB INTERACTIVE WORKLOAD,以下简称为S ...
- 开源项目更新|WPF/Uno Platform/WinUI 3三个版本的《英雄联盟客户端》
哈喽大家好! 我们是中韩Microsoft MVP夫妇 Vicky&James^^很高兴能加入博客园和大家分享我们的技术! 自2008年以来,我们一直深耕于WPF技术,积累了丰富的经验.这 ...
- iOS之动画(transform和UIView动画)学习
1.transform 形变 这个是UIView的属性,继承UIView的控件都具有这个属性 UIImageView *imageview=[[UIImageView alloc]init]; ima ...
- 安装并运行tomcat8
ps:tomcat7对应 jdk 1.7 tomcat8对应 jdk 1.8 注意要对应自己的项目选择下载tomcat版本 1. 软件商城搜索安装 tokcat 找到自己的tomcat的端口 8023 ...
- 使用 KubeSphere 部署高可用 RocketMQ 集群
作者:老Z,云原生爱好者,目前专注于云原生运维,KubeSphere Ambassador. Spring Cloud Alibaba 全家桶之 RocketMQ 是一款典型的分布式架构下的消息中间件 ...