IO相关的知识点:输入输出控制方式

前言:

博主最近在温习操作系统原理相关的知识点,分享给那些志同道合的朋友,某些地方如果存在争议的,欢迎加Q讨论。计算机的知识实在是太多太多了,像个无底洞,不专门做学术研究,博主觉得对它的了解还是适可而止。

简介:

我们都知道计算机分为五大基本部件:运算器、控制器、存储器、输入设备和输出设备。其中,IO设备主要是由设备控制器和设备本身共同组成,其中设备控制器是集成在电路板上的一块芯片或者一组芯片,主要用于接收,识别从cpu发来的命令,并控制IO设备工作。每个控制器都有少量的用于通信的寄存器,每个寄存器表现为一个IO端口(1-65535),这些所有的寄存器组合成为设备的IO地址空间。在有些计算机当中,设备的寄存器被直接映射进操作系统的地址空间,因此操作系统可以直接通过IO端口与硬件交互,由后端对应的设备驱动将其转换为对应的特定操作。在另一些计算机中,如果没有映射方式,通常虚拟化为cpu的io指令,然后供驱动程序对硬件进行读写操作。今天我们来讨论一下cpu是如何管理外围设备的输入输出的。

输入输出控制方式

一般而言,CPU管理外围设备的输入输出控制方式有5种:程序查询方式、程序中断方式、DMA方式、通道方式、外围处理机方式,前两种方式由软件实现,后三种方式由硬件实现。

程序查询方式(忙等)

程序查询方式是早期计算机中使用的一种方式,CPU与外围设备的数据交换完全依赖于计算机的程序控制。

在进行信息交换之前,CPU要设置传输参数、传输长度等,然后启动外设工作,与此同时,外设则进行数据传输的准备工作;相对于CPU来说,外设的速度是比较低的,因此外设准备数据的时间往往是一个漫长的过程,而在这段时间里,CPU除了循环检测外设是否已准备好之外,不能处理其他业务,只能一直等待;直到外设完成数据准备工作,CPU才能开始进行信息交换。

这种方式的优点是CPU的操作和外围设备的操作能够完全同步,硬件结构也比较简单。但是,外围设备的动作通常很慢,程序进行循环查询白白浪费了的CPU时间,数据传输效率低下。

程序中断方式

即当CPU进行主程序操作时,外设的数据已存入输入端口的数据寄存器;或端口的数据输出寄存器已空,由外设通过接口电路向CPU发出中断请求信号,CPU在满足一定的条件下,暂停执行当前正在执行的主程序,转入执行相应能够进行输入/输出操作的子程序,待输入/输出操作执行完毕之后CPU即返回继续执行原来被中断的主程序。

中断处理示意图如图7-2所示,由图可见,CPU只是在外围设备A、B、C的数据准备就绪后,才去执行对应的中断服务程序,进行数据交换;而当低速的外围设备准备自己的数据时,CPU则照常执行自己的主程序。从这个意义上说,CPU和外设的一些操作是异步并行进行的,因而与串行进行的程序查询方式相比,计算机系统的效率的确是大大提高了。

CPU只有在当前一条指令执行完毕后,即转入公操作时,才会受理外围设备的中断请求。

为了在中断服务程序执行完毕以后,能够正确地返回到原来主程序被中断的地方(断点)继续执行,必须把程序计数器PC的内容,以及当前指令执行结束后CPU的状态(包括寄存器的内容和一些状态标志位)都保存到堆栈中去,这些操作称为保存现场;在中断服务程序执行完毕后,需要执行恢复现场操作,从堆栈中恢复PC内容和CPU状态,以便从断点处继续执行主程序。

中断处理过程是由硬件和软件结合来完成的,中断周期由硬件实现,而中断服务程序则由机器指令序列实现。

附:中断处理分为两个半部:中断上半部(tophalf),中断下半部(bottom half)。中断是一个十分霸道的东西,处理器一旦接收到中断,就会打断正在执行的代码,调用中断处理函数。但是正在执行的代码比产生中断的代码更重要怎么办呢,于是就有了上下半部之说,上半部尽可能快的响应中断,下半部处理比较复杂的过程。

如果一个任务对时间十分敏感或者如果一个任务和硬件有关,或者如果一个任务要保证不被其他中断打断,将其放在上半部;其他所有任务,考虑放在下半部

DMA方式

DMA方式是一种完全由硬件执行I/O交换的工作方式。在这种方式中,DMA控制器从CPU完全接管对总线的控制,数据交换不经过CPU,而直接在主存和I/O设备之间进行。DMA控制器向主存发出地址和控制信号,并且以中断方式向CPU报告传送操作的结束。DMA方式控制简单,适用于高数据传输率设备进行成组传送。

DMA方式的主要优点是速度快,由于CPU不参加传送操作,因此省去了CPU取指令、取数、送数等操作,也没有保存现场、恢复现场之类的工作。而且,主存地址的修改、传送字个数的计数等也不由软件实现,而是用硬件线路直接实现的。所以,DMA方式能够满足高速I/O设备的要求,也有利于CPU效率的发挥,一般用于高速传送成组数据。

DMA方式的工作过程如下:首先,当要求通过DMA方式传输数据时,DMA控制器向CPU发出请求,CPU释放总线控制权,交由DMA控制器管理;然后,DMA控制器向外设返回一个应答信号,外设与主存开始进行数据交换;最后,当数据传输完毕后,DMA控制器把总线控制权交还给CPU。在这种方式下,DMA控制器与CPU分时使用总线,其时间图如图7-7所示。

在DMA方式中,批量数据传送前的准备工作,以及传送结束后的处理工作,仍由CPU通过执行管理程序来承担,DMA控制器只负责具体的数据传送工作。博主前面转载了几篇关于DMA相关知识点的,有兴趣的同学可以翻翻博客。

通道方式

DMA方式的出现减轻了CPU对I/O操作的控制,使得CPU的效率显著提高,而通道出现则进一步提高了CPU效率。

通道是一个具有特殊功能的处理器,又称为输入输出处理器(IOP),是计算机系统中代替CPU管理控制外设的独立部件。它有自己的指令和程序,专门负责数据输入输出的传输控制,而CPU在将“传输控制”功能下放给通道后只负责“数据处理”功能。这样,通道与CPU分时使用主存,实现了CPU内部运算与I/O设备的并行工作。它分担了CPU的一部分功能,可以实现对外围设备的统一管理,完成外围设备与主存之间的数据传送。

通道的基本功能是执行通道指令,组织外围设备和主存进行数据传输,按I/O指令要求启动外围设备,向CPU报告中断等。

CPU通过执行I/O指令以及处理来自通道的中断,实现对通道的管理。来自通道的中断有两种,一种是数据传送结束中断,另一种是故障中断。

通道使用通道指令控制设备控制器进行数据传送操作,并以通道状态字接收设备控制器反映的外围设备的状态。因此,设备控制器是通道对I/O设备实现传输控制的执行机构。

通道方式大大提高了CPU的工作效率,然而这种效率的提高是以增加更多的硬件为代价的。

外围处理机方式

外围处理机(Peripheral Processor Unit,PPU)方式是通道方式的进一步发展。

PPU基本上独立于主机工作,它的结构更接近于一般的处理机,甚至就是微小型计算机。在一些系统中,设置了多台PPU,分别承担I/O控制、通信、维护诊断等任务,从某种意义上说,这种系统已经变成了分布式多机系统。

综上所述,计算机外围设备的输入/输出方式如图7-1表示。其中,程序查询方式和程序中断方式适用于数据传输率比较低的外围设备,而DMA方式、通道方式和外围处理机方式则适用于数据传输率比较高的外围设备。

结尾:以后我也会慢慢更新虚拟化以及大数据方面的东西,不过这些也是先从原理出发,再到实践,以及经验分享

时间: 2024-12-18 18:54:32

IO相关的知识点:输入输出控制方式的相关文章

输入输出控制方式

 通常,如果外部设备要与存储器进行数据交换,则必须通过CPU执行输入输出指令以及存储器读写指令来完成的.一般而言,CPU管理外围设备的输入输出控制方式有5种:程序查询方式.中断方式.DMA方式(直接内存存取).通道方式.外围处理机方式,前两种方式由软件实现,后三种方式由硬件实现. 一,程序实现 1. 程序查询方式 程序查询方式是要CPU不断使用指令检测方法来获取外设工作状态.CPU与外围设备的数据交换完全依赖于计算机的程序控制,在进行信息交换之前,CPU要设置传输参数,长度等,然后启动外设工

IO相关2(文件输入输出)

除了继承自 iostream 类型的行为之外,fstream 中定义的类型还增加了一些新的成员来管理与流相关的文件.我们可以对 fstream,ifstream 和 ofstream 对象调用这些操作,但不能对其他 IO 类型调用这些操作: 1 fstream fstrm;//创建一个未绑定的文件流.fstream是头文件fstream中定义的一个类型 2 fstream fstrm1(s);//创建一个fstream,并打开名未s的文件.s可以是string类型或者是一个指向c风格字符串的指针

10.3 输入输出的控制方式

计算机组成 10 输入输出设备 10.3 输入输出的控制方式 现在看来,跟外界交互也没有那么复杂嘛.跟以前与存储器的交互差不了多少,我给一个地址,得到一个数:或者给一个地址,写进去一个数,这样就跟外设进行交互了.这么说也不是不对,最简单的情况确实是这样的.那我们也不妨从这最简单情况开始说起吧. CPU控制外设进行输入输出的方式主要有三种. 程序控制方式 中断控制方式 直接存储器访问方式 那我们先来看第一种程序控制方式.我们还是用这个并行接口作为例子,来讲解程序控制方式是如何工作的. 程序控制方式

MongoDB权威指南学习笔记4---查询相关的知识点

1 find find({查询条件},{"key":1,"email":1})  后面表示返回哪些键 2 可用的比较操作符 $lt , $lte,$gt,$gte 比如db.users.find({"age":{"$gte":18,"$lte":30}}) 3不等于 find(...{"key":{"$ne":"value"}} 4 in find

如何提升爬虫性能相关的知识点

如何提升爬虫性能相关的知识点 爬虫的本质是伪造socket客户端与服务端的通信过程,如果我们有多个url待爬取,只用一个线程且采用串行的方式执行,那只能等待爬取一个url结束后才能继续下一个,这样我们就会发现效率非常低. 原因:爬虫是一项IO密集型任务,遇到IO问题就会阻塞,CPU运行就会停滞,直到阻塞结束.那么在CPU等待组合结束的过程中,任务其实是呈现出卡住的状态.但是,如果在单线程下进行N个任务且都是纯计算的任务的话,那么该线程对cpu的利用率仍然会很高,所以单线程下串行多个计算密集型任务

shu_1171 十->二进制转换(输入输出控制)

http://202.121.199.212/JudgeOnline/problem.php?cid=1079&pid=19 分析:主要是输出格式控制 "对于每个n,以11位的宽度右对齐输出n值": 即包括该数在内一共11位,右对齐为printf的默认方式,所以用 %11d  来解决. 另外, 输出左对齐与右对齐,需在指定输出长度的时候才有意义: 如无指定长度,则输出从行首开始,有多长输出多长: 左对齐: %-11d 实例: #include <stdio.h> i

Python的线程&amp;进程&amp;协程[1] -&gt; 线程 -&gt; 多线程的控制方式

多线程的控制方式 目录 唤醒单个线程等待 唤醒多个线程等待 条件函数等待 事件触发标志 函数延迟启动 设置线程障碍 1 唤醒单个线程等待 Condition类相当于一把高级的锁,可以进行一些复杂的线程同步控制.一般Condition内部都有一把内置的锁对象(默认为RLock),对于Condition的使用主要有以下步骤: 建立两个线程对象,及Condition对象; 线程1首先获取Condition的锁权限,acquire(); 线程1执行需要完成的任务后,调用等待wait(),此时,线程1会阻

CSS3相关实用知识点

本文讲解CSS3相关实用知识点 CSS3相关实用知识点目录 边框设置 颜色设置 背景设置 渐变使用 超出文本设置 阴影设置 CSS3变换设置 过渡设置 动画设置 多列布局 BoxSizing设置 弹性布局 滤镜函数 媒体查询 resize元素 outline偏移 其他的@规则使用 边框 边框圆角 border-radius: 10px; 边框图片设置 border: 20px solid transparent; border-image: url(./2.jpg) 7 31 round; 颜色

项目一:第十二天 1、常见权限控制方式 2、基于shiro提供url拦截方式验证权限 3、在realm中授权 5、总结验证权限方式(四种) 6、用户注销7、基于treegrid实现菜单展示

1 课程计划 1. 常见权限控制方式 2. 基于shiro提供url拦截方式验证权限 3. 在realm中授权 4. 基于shiro提供注解方式验证权限 5. 总结验证权限方式(四种) 6. 用户注销 7. 基于treegrid实现菜单展示 2 常见的权限控制方式 2.1 url拦截实现权限控制 shiro基于过滤器实现的   2.2 注解方式实现权限控制 底层:代理技术     3 基于shiro的url拦截方式验权   <!-- 配置过滤器工厂 --> <bean id="