操做系统精髓与设计原理(原书第6版)——学习笔记(4)



1.7 I/O通讯技术

         对于I/O操做有三种可能的技术:可编程I/O、中断驱动I/O、直接内存存取(DMA)。编程

1.7.1 可编程I/O

         使用可编程I/O操做时,I/O模块执行请求的动做并设置I/O状态寄存器中相应的位,它并不进一步通知处理器,尤为是它并不中断处理器。所以处理器在这行I/O指令后,还要按期检查I/O模块的状态,以肯定I/O操做是否已经完成。数组

         若是使用这种技术,处理器负责从内存中提取数据以用于输出,并在内存中保存数据以用于输入。I/O软件应该设计为由处理器执行直接控制I/O指令的操做,包括检测设备状态、发送读命令或写命令和传送数据,所以指令集中包括如下几类I/O指令:缓存

  • 控制:用于激活外部设备,并告诉它作什么。例如,能够指示磁带倒退或前移一个记录。数据结构

  • 状态:用于测试与I/O模块及其外围设备相关的各类状态条件。函数

  • 传送:用于在存储器寄存器和外部设备间读数据或写数据。性能

1.19a给出了使用可编程I/O的一个例子:从外部设备读取一块数据到存储器,每次读一个字的数据。对读入的每一个字,处理器必须停留在状态检查周期,直到肯定该字已经在I/O模块的数据寄存器中。这给流程图说明该技术主要缺点:耗时,处理器老是处于没有用的繁忙中。测试

1.7.2 中断驱动I/O

         处理器给模块发送I/O命令,而后继续作其余一些有用的工做。当I/O模块准备好与处理器交换数据时,它将打断处理器的执行并请求服务。处理器和前面同样执行数据传送,而后恢复处理器之前的执行过程。spa

         I/O每块的角度,对于输入操做,I/O模块从处理器中接收一个READ命令,而后开始从相关的外围设备读数据。一旦数据被读入该模块的数据寄存器,模块经过控制线给处理器发送一个中断信号,而后等待直处处理器请求该数据。当处理器发出这个请求后,模块吧数据放到数据总线上,而后准备下一次的I/O操做。
        
从处理器的角度,对于输入操做,处理器发一个READ命令,而后保存当前程序的上下文,离开当前程序,去作其余事情。在每一个指令周期的末尾,处理器检查中断。当发生来自I/O模块的中断时,处理器保存当前正在执行的程序的上下文,开始执行中断处理程序处理此中断。操作系统

         1.19b给出了使用中断驱动I/O读数据块的例子。中断驱动I/O比可编程I/O更有效,这是由于它消除了没必要要的等待。可是,数据中的每一个字不论从存储器到I/O模块仍是从I/O模块到存储器都必需要经过处理器处理,这致使中断驱动I/O一样很耗时。设计

1.7.3 直接内存存取

         中断驱动I/O和可编程I/O这两种方式,都须要处理器主动干预在存储器和I/O模块之间的数据传送,而且任何数据传送都必须彻底经过处理器。所以它们有两方面的固有缺陷:

  • I/O传送速度受限于处理器测试设备和提供服务的速度。

  • 处理器忙于管理I/O传送的工做,必须执行不少指令以完成I/O传送

当须要移动大量的数据时,就须要使用直接内存存取(DMA来提升传送效率。DMA能够由系统总线中一个独立的模块完成,也能够并入到I/O模块中。不论采用哪一种形式,该技术的工做方式:当处理器要读或写一块数据时,它给DMA模块产生一条命令,发生如下信息

  • 是否请求一次读或写

  • 涉及的I/O设备的地址

  • 开始读或写的存储器单元

  • 须要读或写的字数

以后处理器继续其余工做。处理器把这个操做委托给DMA模块,由该模块负责处理。DMA直接与内存器交互,传送整个数据块,每次传送一个字。这个过程不须要处理器参与。当传送完成后,DMA模块发送一个中断信号给处理器。所以只有在开始传送和传送结束时处理器才会参与。(图1.19c

附录1A 两级存储器的性能特征

         在本章中,经过使用高速缓存做为内存和处理器间的缓存器,创建了一个两级内部存储器。这个两级结构经过开发局部性,相对于一级性能获得了很大的提升。

         其余两级存储器方法:虚拟存储器和磁盘高速缓存(见表1.2)也使用了局部性,而且至少有一部分是由操做系统实现。

局部性

         局部性原理声明存储器访问表现出簇聚性。在很长的一段时间中,使用的簇会变化,但在很短的时间内,处理器基本上只与存储器访问中的一个固定的簇进行数据传输。

         局部性原理是颇有效的,缘由以下:

  1. 除了分支和调用指令,程序执行都是顺序的,而这两类指令在全部程序指令中只占一小部分。所以,大多数状况下,要取得下一条指令都是紧跟在取到的上一条指令以后的。

  2. 不多会出现很长的接二连三的过程调用序列,继而是相应的返回序列。相反,程序中过程调用的深度窗口限制在一个很小的范围内,所以在比较短的时间中,指令的引用局限在不多的几个过程当中。

  3. 大多数循环结构都由相对比较少的几个指令重复若干次组成的。在循环过程当中,计算被限制在程序中一个很小的相邻部分中。

  4. 在许多程序中,不少计算都涉及处理诸如数组、记录序列之类的数据结构。在大多数状况下,对这类数据结构的连续引用是对位置相邻的数据项进行操做。

空间局部性时间局部性是有区别的。空间局部性指执行涉及不少簇聚的存储器单元的趋势,这也反映了处理器顺序访问指令的倾向,同时,也反映了程序顺序访问数据单元的倾向,如处理数据表。时间局部性指处理器访问最近使用过的存储单元的趋势,例如当执行一个循环,处理器重复执行相同的指令集合。

两级存储器的操做

         在两层存储器结构中也使用了局部性特性。上层存储器(M1)比下层存储器(M2)更小、更快、成本更高(每位),M1用于临时存储空间较大的M2中的部份内容。当访问存储器时,首先视图访问M1中的项目,若是成功,就能够进行快速访问;若是不成功,则把一块存储器单元从M2中复制到M1中,在经过M1进行访问。因为局部性,当一个块取到M1中时,将会有不少对块中单元的访问,从而加快整个服务。

         为书名访问一项的平均时间,不只要考虑两级存储器的速度,并且包括能在M1中找到给定引用的几率。为此有:

         其中,T3=(系统)平均访问时间、T1=M1(如高速缓存、磁盘高速缓存)的访问时间、T2=M2(如内存、磁盘)的访问时间、H=命中率(访问可在M1中找到的次数比)。

1.15显示了平均访问时间关于命中率的函数。能够看出,命中率越高,总的平均访问时间更接近M1,而不是M2.

相关文章
相关标签/搜索