您的位置:首页 > 其它

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

2016-06-29 13:39 435 查看


1.3.1 取指令和执行指令

        
指令寄存器(InstructionRegister,IR)放置取到的指令。指令中包含确定处理器要执行的操作位,处理器解释指令并执行对应的操作。大体上,这些操作可分为4类:

处理器-存储器:数据可以从处理器传送到存储器,或者从存储器传送到处理器。

处理器-I/O:通过处理器和I/O模块间的数据传送,数据可以输出到外部设备,或者从外部设备输入数据

数据处理:处理器可以执行很多与数据相关的算术操作或逻辑操作。

控制:某些指令可以改变执行顺序。例如,处理器从地址为149的存储单元中取出一条指令,该指令指定下一条指令应该从地址为182的存储单元中取,这样处理器要把程序计数器设置为182.因此,在下一个取址阶段中,将从地址为182的存储单元而不是地址为150的存储单元中取指令。

假设有一台机器具备图1.3中列出的所有特征,处理器包含一个称为累加器(AC)的数据寄存器,所有指令和数据长度均为16位,使用16位的单元或字来组织存储器。指令格式中有4位操作码,因而最多有16种不同的操作码(由一位十六进制数字表示),操作码定义了处理器要执行的操作。通过指令格式的余下12位,可以直接访问的存储器大小为4096(4k)个字(用三位十六进制数表示)。



图1.4描述了程序的部分执行过程,显示了存储器和处理器的寄存器的相关部分。给出的程序片段把地址为940的存储单元中的内容与地址为941的存储单元的内容相加,并将结果保存在后一个单元中。这需要三条指令,可用三个取址阶段和三个执行阶段描述:



PC中包含第一条指令的地址为300,该指令内容(值为十六进制数1940)被送入指令寄存器IR中,PC增1。注意,此处理过程使用了存储器地址寄存器MAR和存储器缓存寄存器MBR。为简单起见,这些中间寄存器没有显示。

IR中最初的4位(第一个十六进制数)表示需要加载AC,剩下的12位(后三个十六进制数)表示地址为940.

从地址为301的存储单元中取下一个指令(5941),PC增1

AC中以前的内容和地址为941的存储单元中的内容相加,结果保存在AC中

从地址为302的存储单元取下一条指令(2941),PC增1

AC中的内容被存储在指令941的存储单元中。

1.3.2  I/O函数


        
I/O模块可以直接与处理器交换数据。正如处理器可以通过指定存储单元的地址来启动对存储器的读和写一样,处理器也可以从I/O模块中读取数据或向I/O模块写入数据。

        
在某些情况下,允许I/O模块直接与内存发生数据交换,以减轻在完成I/O任务过程中的处理器负担。此时,处理器允许I/O模块具有从存储器中读或向存储器中写的特权,这样I/O模块与存储器之间的数据传送无需通过处理器完成。I/O模块对存储器发出读或写的命令,而免去了处理器负责数据交换的任务,这个操作称为直接内存存取(Direct
Memory Access,DMA).

 

1.4 中断

        
所有计算机都提供允许其他模块(I/O、存储器)中断处理器正常处理过程的机制。图表1.1列出最常见的中断类别。



        
这里给出个实例,假设一个1GHzCPU的PC机,大约每秒执行10亿条指令。一个典型的硬盘的速度是7200转/分,这样大约旋转半转的时间是4ms,处理比这要快4百万倍。

        
图1.5a显示了这种事件状态。用户程序在处理过程中交织着执行一系列WRITE调用。竖实线表示程序代码段,代码段1、2和3表示不涉及I/O指令序列。WRITE调用要执行一个I/O程序,此I/O程序是一个系统工具程序,由它执行真正的I/O操作。此I/O程序由三部分组成:

图中标记为4的指令序列用于为实际的I/O操作做准备。这包括赋值将要输出到特定缓存区的数据,为设备命令准备参数。

实际的I/O指令。如果不使用中断,当执行此命令时,程序必须等待I/O设备执行请求的函数(或周期性地检查I/O设备的状态或轮询I/O设备)。程序可能通过简单地重复执行一个操作的方式进行等待,以确定I/O操作是否完成



图中标5的指令序列,用于完成操作。包括设置一个表示操作成功或失败的标记。

虚线代表处理器执行的路径;也就是说,这条线显示了指令执行的顺序。当遇到第一条WRITE指令之后,用户程序被中断,I/O程序开始执行。在I/O程序执行完成之后,WRITE指令之后的用户程序立即恢复执行。

1.4.1  中断和指令周期

        
处理器可以在I/O操作的执行过程中执行其他指令。考虑图1.5b所示控制流,用户程序到达系统调用WRITE处,但涉及的I/O程序仅包括准备代码和真正的I/O命令。在执行完指令后,控制返回到用户程序。在这期间,外部设备从计算机存储器接收数据并打印。这种I/O操作和用户程序中指令的执行是并发的。

        
当外部设备准备好从处理器接收更多的数据时,该外部设备的I/O模块给处理器发送一个中断请求信号。这时处理器做出响应,暂停当前程序,转去处理服务于特定I/O设备的程序,这个程序称作中断处理程序。在对该设备的服务响应完成后,处理器恢复原先的执行。图1.5b中“X”表示发生中断的点。PS:中断可以在主程序中的任何位置发生,而不是在一条特定的指令处。

        
从用户程序的角度看,中断打断了正常执行的序列。当中断处理完后,在恢复执行(见图1.6)。用户程序并不需要为中断添加任何特殊的代码,处理器和操作系统负责挂起用户程序,然后在同一个地方恢复执行。



        
为适应中断产生的情况,在指令周期中要增加一个中断阶段,如图1.7所示(与图1.2对照)。



        
在中断阶段中,处理器检查是否有中断发生,即检查是否出现中断信号。如果没有中断,处理器继续运行,并在取指周期取当前程序的下一条指令;如果有中断,处理器挂起当前程序的执行,并执行一个中断处理程序。这个中断程序通常是操作系统的一部分,它确定中断的性质,并执行所需要的操作。

        
为进一步理解在效率上的提高,图1.8,它是关于图1.5a和图1.5b中控制流的时序图。图1.5b和图1.8假设I/O操作的时间相当短,小于用户程序中写操作之间完成指令的时间。二更典型的情况是,特别是对比较慢的设备如打印机来说,I/O操作比执行一系列用户指令的时间要长的多,图1.5c显示了这类时间状态。这种情况,用户程序在由第一次调用产生的I/O操作完成之前,就达到了第二次WRITE调用。如果使用户在这一点挂起,当前面的I/O操作完成后,才能继续新的WRITE调用,也才能开始一次新的I/O操作。图1.9给出了在这种情况下使用中断和不使用中断的时序图,可以看到I/O操作在未完成时与用户指令的执行有所重叠。



1.4.2 中断处理

        
中断激活了很多事件,包括处理器硬件中的事件以及软件中的事件。图1.10显示经典型的序列,当I/O设备完成一次I/O操作时,发生下列硬件事件:

设备给处理器发出一个中断信号

处理器在响应中断前结束当前指令的执行,如图1.7

处理器对中断进行测定,确定存在未响应的中断,并给提交中断的设备发送确认信号,确认信号允许该设备取消它的中断信号

处理器需要为把控制权转移到中断程序中去做准备。首先,需要保存从中断点恢复当前程序所需要的程序,要求的最少信息包括程序状态字(PSW)和保存在程序中的程序计数器中的下一条要执行的指令地址(PC),它们被压入系统控制栈中。

处理器把响应此中断的中断处理程序入口地址装入程序计数器中。可以针对每类中断有一个中断处理程序,也可以针对每个设备和每类中断各有一个中断处理程序,这取决于计算机系统结构和操作系统设计。如果有多个中断处理程序,处理器就必须决定调用哪一个,这个信息可能已经包含在最初的中断信号中,否则处理器必须给发中断的设备发送请求,以获取含有所需信息的响应。



        
一旦完成程序计数器的装入,处理器则继续到下一个指令周期,该指令周期也是从取指开始。由于取指是由于程序计数器的内容决定的,因此控制被转移到中断处理程序,该程序的执行引起一下操作:

与被中断程序相关的程序计数器和PSW被保存到系统栈中,此外,还有一些其他信息被当做正在执行程序的状态的一部分。特别需要保存处理器寄存器的内容,因为中断处理程序可能会用到这些寄存器,因此所有这些值和任何其他的状态信息都需要保存。在典型情况下,中断处理程序一开始就在栈中保存所有寄存器内容。图1.11a给出了一个简单的例子。在这个例子中,用户程序在执行地址为N的存储单元中的指令之后被中断,所有寄存器的内容和下一条指令的地址(N+1),一共M个字,被压入控制栈中。栈指针被更新指向新的栈顶,程序计数器被更新指向中断服务程序的开始。

中断处理程序现在可以开始处理中断,其中包括检查与I/O操作相关的状态信息或其他引起中断的事件,还可能包括I/O设备发送附加命令或应答。

当中断处理结束后,被保存的寄存器值从栈中释放并恢复到寄存器中,如图1.11b

最后的操作时从栈中恢复PSW和程序计数器的值,其结果是下一条要执行的指令来自前面被中断的程序。

保存被中断程序的所有状态信息并在以后恢复这些信息,非常重要,因为中断并不是程序调用的历程,它可以在任何时候发生,可以在用户程序执行过程中的任何一点上发生,它的发生是不可预测的。



1.4.3 多个中断

        
处理多个中断有两种方法。第一种方法是当正在处理一个中断时,禁止再发生中断。禁止中断的意思是处理器将对任何新的中断请求信号不予理睬。如果在这期间发生了中断,通常中断保持挂起,当处理器再次允许中断时,再由处理器检查。因此,当用户程序正在执行并且有一个中断发生时,立即禁止中断;当中断处理程序完成后,在恢复用户程序之前再允许中断,并且由处理器检查是否还有中断发生。这种方法所有中断都严格按顺序处理(图1.12a)。

        
这种方法的缺点是没有考虑相对优先级和时间限制的要求。例如,当来自通信线的输入到达时,可能需要快速接收,以便为更多的输入让出空间。如果在第二批输入到达时第一批还没有处理完,就有可能由于设备的缓冲区装满或溢出二丢失数据。

 

         

    第二种方法是定义中断优先级,允许高优先级的中断打断低优先级的中断处理程序的运行(图1.12b)。例如,假设一个系统有三个I/O设备:打印机、磁盘和通信线,优先级依次为2、4和5,图1.13给出了可能的顺序[TANE06]。用户程序在t=0时开始,在t=10时发生一个打印机中断;用户信息被放置到系统栈中并开始执行打印机中断服务例程(Iterrrupt
Service Routine,IRS);当这个例程仍在执行时,t=15时发生了一个通信中断,由于通信线的优先级高于打印机,必须处理这个中断,打印机ISR被打断,其状态被压入栈中,并开始执行通信IRS;当这个程序正在执行时,又发生了一个磁盘中断(t=20),由于这个中断的优先级比较低,它被挂起,通信ISR运行直到结束。

        
当通信ISR完成后(t=25),恢复以前关于执行打印机ISR的处理状态。但是,在执行这个例程中的任何一条指令前,处理器必须完成高优先级的磁盘中断,这样控制权转移给磁盘ISR。只有当这个例程也完成时(t=35),才恢复打印机ISR。当打印机ISR完成时(t=40),控制最终返回到用户程序。



1.4.4 多道程序设计

        
假设处理器执行两道程序。一道程序从存储器中读数据并放入外部设备中,另一道是包括大量计算的应用程序。处理器开始执行输出程序,给外部设备发送一个写命令,接着开始执行其他应用程序。当处理器处理很多程序时,执行顺序取决于它们的相对优先级以及它们是否在等待I/O。当一个程序被中断时,控制权转移给中断处理程序,一旦中断处理程序完成,控制权可能并不立即返回到用户程序,而可能转移到其他待运行的具有高优先级的程序。最终,当原先被中断的用户程序变为最高的优先级时,它将被重新恢复执行。这种多道程序轮流执行的概念称作多道程序设计。

1.5 存储器的层次结构

        
 计算机存储器的设计目的可以归纳成三个问题:多大的容量?多快的速度?多贵的价格?“多大的容量”的问题从某种意义上来说是无止境的,存储器有多大的容量,就可能开发出相应的应用程序使用它。“多快的速度”的问题相对易于回答,为达到最佳的性能,存储器的速度必须能够跟得上处理器的速度。当处理器正在执行指令时,我们不希望它会因为等待指令或操作数而暂停。最后一个问题,对一个实际的计算机系统,存储器的价格与计算机其他部件的价格相比应该是合理的。

        
在任何时候,实现存储器系统会用到各种各样的技术,但各种技术之间往往存在着以下关系:

存取时间越快,每一个“位”的价格越高。

容量越大,每一个“位”的价格越低。

容量越大,存取速度越慢。

设计者面临的困难时很明显的,由于需求是较大的容量和每一个“位”较低的价格,因而设计者通常希望使用能够提供大容量存储的存储器技术。但是为满足性能要求,又需要使用昂贵的、容量相对比较小而具有快速存取时间的存储器。

解决这个难题的方法是,不依赖于单一的存储组件或技术,而是使用存储器的层次结构。一种典型的层次结构如图1.14所示:



当沿着这个层次结构从上往下看,会得到以下情况:

每一个“位”的价格递减

容量递增

存取时间递增

处理器访问存储器的频率递减

因此,容量较大、价格较便宜的慢速存储器是容量较小、价格较贵的快速存储器的后备。这种存储器的层次结构能够成功的关键在于低层访问频率递减。

假设处理器存取两级存储器,第一级存储器的容量为1000个字节,存取时间为0.1μs;第二级存储器包含100000个字节,存取时间为1μs。假如需要存取第一级存储器中的一个字节,则处理器可以直接存取此字节;如果这个字节位于第二级存储器,则此字节首先需要转移到第一级存储器中,然后再由处理器存取。为简单起见,我们忽略了处理器用于确定这个字节是在第一级存储器还是在第二级存储器所需时间。如图1.15给出反映这种模型的一般曲线模型。



        
此图表示了二级存储器的平均存取时间是命中率H的函数,H定义为对较快存储器(如高速缓存)的访问次数与对所有存储器的访问次数的比值,T1是访问第一级存储器的存取时间,T2是访问第二级存储器的存取时间。可以发现,当第一级存储器的存取次数所占比例较高时,总的平均存取时间更接近于第一存储器的存取时间而不是第二级存储器的存取时间。

        
例如,假设有95%的存储器存取(H=0.95)发生在高速缓存中,则访问一个字节的平均存取时间可表示为:



        
此结果非常接近于快速存储器的存取时间。因此仅当条件a)到d)使用时,原则上可以实现该策略。通过使用各种技术手段,现有的存储器系统满足条件a)到c),而且条件d)通常也是有效的。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: