计算机系统结构

一、计算机系统的运行

  一个现代通用计算机系统由一个 CPU 和多个设备控制器组成,它们通过一条公共总线连接到一起,而这条公共总线提供了对共享存储器的访问能力 。每个设备控制器负责某种特定类型的设备(如磁盘驱动器、音频设备和视频显示器)。CPU 和设备控制器能够同时运行,并且相互竞争总线周期。为确保对共享存储器访问的有序性,需要提供一个存储控制器以同步对存储器的访问。

  计算机开始运行(如开启电源或者重新启动)时需要首先运行一个初始化程序。这个初始化程序(或者说是引导程序)往往很简单。它通常存储在计算机硬件中的只读存储器(如固件或 EEPROM)内。从CPU寄存器到设备控制器再到内存,引导程序初始化系统的各个方面。引导程序必须要知道如何装入操作系统并开始运行它。因此,引导程序必须要为操作系统内核分配内存空间并将其装入内存。操作系统此时才开始运行第一个进程(比如:“init”) ,然后等待事件的发生。

  事件通常由硬件或软件中断触发产生。硬件随时会通过系统总线向 CPU 发送信号的方式触发一个中断。软件可能会运行一个特殊的操作触发一个中断,这个特殊的操作被称为系统调用(也称之为监督程序调用)。 现代操作系统是中断驱动的。如果没有进程运行、没有 I/O 设备运行并且没有用户响应,操作系统将停下来等待事件的发生。事件几乎总是通过中断或自陷发出信号产生。自陷(也称为异常)是一种由软件产生的中断,它由错误(如除以零或无效内存访问)或用户程序请求操作系统执行特殊的服务引起。操作系统的中断驱动的特性定义了系统的一般架构。针对每种类型的中断,操作系统中独立的代码段定义了应该执行什么样的操作。操作系统提供了中断服务程序,由它来负责处理中断。 当 CPU 接收到中断信号时,它会停止当前的工作并立即转向一个确定地点。这个地点通常存储了该中断服务程序的入口地址;处理完成后,CPU恢复被中断的计算。

  中断是计算机体系结构中的重要组成部分。每种计算机都有自己的中断机制,但是有些功能是共同的。中断必须要将控制移交给适当的中断服务程序。一个简单的方法是调用一个通用程序来检查中断信息;然后再调用具体的中断服务处理程序。然而,中断必须要得到快速处理,预定义中断数目是可行的,这样就可以使用一个指向中断处理程序的中断向量表。于是通过这个表间接调用中断程序,就不再需要中间程序了。通常,中断向量表存储在内存的低字节(前 100 位,大致如此) 。这些位置存储了各种设备的中断服务进程地址。这个地址队列(或者说是中断向量)指向由中断请求给定的唯一的设备号,并向中断设备提供中断服务程序地址。MS-DOS 和 UNIX 在中断的工作方式上有所不同。

  中断体系结构还必须保存被中断的指令的地址。许多老式的设计简单的将中断地址存储在一个确定地点或由设备号索引的地点。更新近的体系结构将返回地址存储在系统堆栈中。如果中断处理程序需要改变处理器状态(如通过修改寄存器值) ,它须要显式的保存当前状态,然后在返回之前将其还原。在中断服务结束后,存储的返回地址将被装载到程序计数器中,此时被中断的计算重新开始,就像是中断没有发生过一样。
  依据底层处理机提供的功能,有多种方式可以请求系统调用。不管用的是什么方式,它是进程请求操作系统服务的方法。系统调用往往采用自陷到中断向量指定地点的方式。通常可以执行通用的 trap 指令来产生一个自陷,而有些系统(如 MIPS R2000 家族)有一个专门的 syscall 指令。

 

二、I/O结构

1、I/O中断

  每个设备控制器都有本地缓冲存储器和一系列用于特殊用途的寄存器,开始IO操作时,CPU先给设备控制器中的响应的寄存器赋值,然后设备控制器会读取寄存器,以决定下一步的操作,当读取到读指令时,它就将数据读取到本地缓冲存储器,数据传输完毕,设备控制器就会通过中断通知CPU。当用户进程请求IO时会有两种情况,一种是同步IO,即知道IO操作完成后将控制返回给用户进程;另外一种是异步IO,即不等待输入输出结束,立即返回控制。

2、DMA结构

  当从一个终端输入设备读入数据时,输入的第一个字符会被发送到计算机,当接收到这个字符时,连接在该终端上的异步通信(或串行端口)就会向CPU发送一个中断,CPU接收到中断后就会执行一些指令(如果 CPU 正在执行某个指令,那么中断就要等待该指令执行完毕) 。保存这个中断指令的地址,并将控制转移给中断服务程序。

  中断服务程序要存储一些CPU寄存器值,然后检查最近的输入输出有没有产生错误,再从设备中读取字符存在缓冲器中,调整指针和计数变量以读取下一个值。下一步中断服务程序将在内存中设置一个标志,向操作系统的其他部门表示接收到了输入。其它的部分则负责处理缓冲器中的数据,并将字符传送给请求数据的程序 。然后,中断处理程序恢复刚才保存的寄存器内容并将控制返回给被中断的指令。

  直接内存访问DMA技术则是将整个数据块放到内存中,整个过程没有CPU干预,只是在数据块放到内存之后发送一个中断。CPU的基本操作是相同的。一个用户程序或者操作系统本身可能请求数据传输。操作系统从缓冲池中为数据传输指定一个缓冲器(一个空缓冲区用于输入,一个满缓冲区用于输出)。 (根据设备类型,一个缓冲器典型的大小在 128 到 4,096 字节之间。 )下一步,设备驱动程序(操作系统的一部分)将源地址、目标地址和传输数据长度设置到 DMA控制器的寄存器中。然后,DMA控制器命令开始 I/O 操作。当 DMA控制器执行数据传输时,CPU 可以自由的执行其它的任务。因为存储器一次通常只能够传输一个字,DMA控制器从 CPU中“窃取”了存储周期。在进行 DMA传输时,周期挪用(cycle stealing)降低了 CPU的执
行速度。传输结束后 DMA控制器就向 CPU发出中断。

 

3、存储器结构

  计算机程序只能在主存储器(RAM)中运行,RAM和处理器内部寄存器是唯一能被处理器直接访问的大块存储空间,它由存储器队列组成。每个字都有自己的地址,通过调用load(一次将一个字从RAM移动到CPU某个寄存器)或者是store指令(将寄存器内容转移到RAM)对具体的地址进行读写。除了load\store指令外,CPU自动从RAM读取指令执行

  冯诺依曼计算机体系结构中,一个指令周期首先从内存中读取指令,然后将指令读取到指令寄存器中,解码该指令,也有可能从内存中读取操作数放到寄存器中。内存地址序列是由正在运行的程序产生

4、RAM

  通常IO指令允许在IO设备寄存器与内存之间进行数据传输,为了提高效率,许多计算机系统采用了内存映象 I/O。内存的一部分地址范围被留出来并映射到设备寄存器中。对设备寄存器的访问就可以通过读写内存地址实现。

  CPU中的寄存器的访问时间通常是一个 CPU时钟周期。大多数 CPU能够以每个时钟跳变一个或多个操作的速率完成对指令的解码并实现对寄存器内容的简单操作。主存储器就不同了,它通过存储总线进行数据传输。内存的访问通常需要花费多个 CPU时钟周期才能完成,这样,因为缺乏完成指令所需的数据,处理器通常需要停止运行(stall) 。由于要频繁的访问内存,这种情形简直忍无可忍。解决方法是在 CPU和主存储器间添加快速存储器。一个缓冲存储器可以调节 CPU 和内存间的速度差异,它被称为高速缓冲存储器

5、一致性

  假设一个文件B中有一个整数A,值为1,要进行加法操作,这时,加法操作进程就需要从磁盘上的B文件中将整数A读到内存中,然后将A存入cache(高速缓冲存储器)和CPU内部寄存器中。这时A就存在三个不同的地方了,如果加法操作在内部寄存器中完成A的值就被改变了这时必须将改变后的A值写回到磁盘中A的值才相同。在单任务计算环境中,这种策略并不困难,因为总是要将 A拷贝到最高层的存储器中进行访问。然而,在一个多任务的环境中,CPU往返于多个进程。如果同时有几个进程要访问 A,那么每个进程都必须要获
得最近更新的 A的值,这一点必须要非常的小心。 在多处理机环境中就更为复杂了,除了要维护内部寄存器之外,每个 CPU还有一个本地 cache。这样,多个 cache 中可能会同时保留一个 A的拷贝。因为各个 CPU并发运行,所以我们必须要确保某个 cache 中的 A的更新要立即反映到其它的 cache 中。这被称为超高速缓存相关性,通常是一个硬件问题(在操作系统层面之下)。

 

posted @ 2015-12-08 17:50  orlion  阅读(1642)  评论(0编辑  收藏  举报