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

来源:互联网 发布:多益网络策划笔试 编辑:程序博客网 时间:2024/05/22 10:58


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模块准备好与处理器交换数据时,它将打断处理器的执行并请求服务。处理器和前面一样执行数据传送,然后恢复处理器以前的执行过程。

        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.

 

 

0 0
原创粉丝点击