计算机系统概述

文章目录

  • 基本构成
  • 处理器寄存器
  • 指令的执行
  • 取指令和执行指令
  • 中断
  • 中断和指令周期
  • 多个中断
  • 高速缓冲存储器

基本构成

我们所熟知的计算机,其内部由处理器,存储器和输入输出部件组成,每类部件有一个或者多个模块。这些部件以某种方式互联,从而实现计算机执行程序的主要功能。

  • 处理器(Processor):它控制着计算机的操作,执行数据处理功能。当只有一个处理器时,称为中央处理器(CPU)。
  • 存储器(Memorizer):顾名思义就是存储数据和程序,一般分为两种,一种是主存储器(Main memory),此类存储器一般是容易丢失数据的(易失性),他会随着计算机的关闭而清空主存储器的内容;另一种则是磁盘存储器(disk memory),与主存储器不同的是,当计算机关机的时候,磁盘存储器中的内容不会丢失。
  • 输入/输出设备(I/O modules):在计算机和外部环境之间移动数据,外部环境由各种外部设备组成,输入设备有键盘,鼠标,网卡,扫描仪,书写板,输出设备有网卡,显示器,打印机。(网卡即是输入设备也是输出设备,因为用户需要加载别人的数据,别人也需要加载其他用户的数据)

处理器寄存器

处理器寄存器包括一组寄存器,他们提供一定的存储能力,比主存储器访问速度快,但是却比主存储器容量小。
他一般有两个功能:

  1. 用户可见的寄存器:优先使用这些寄存器可以使机器语言和汇编语言的程序员减少对主存储器的访问次数。对于高级语言而言,优化编辑器负责决定哪些变量应该分配给寄存器,哪些变量应该分配给主存储器。一些高级语言©允许程序员建议编辑器把哪些变量保存在寄存器中。

一般分为:

  • 数据寄存器(data register):可以被程序员分配给各种函数,某些情况下他们是通用的,可以被执行数据操作的任何机器指令使用(add,mov,div,mul…),但对于浮点数运算和整数运算使用的寄存器都是分开的,各自使用各自的寄存器。
  • 地址寄存器(address register):包含数据和指令的主存储器地址,或者包含用于计算完整地址或有效地址的地址区域。既然存在地址,那么一定会有寻址这个过程,地址寄存器的寻址方式有那么几种索引寄存器(index register):索引寻址是通过基址加变址的方式来获得一个有效地址(分页式)
  • 段指针(segment pointer):对于分段寻址,存储器被分成了长度不等的段。通过段号和段内偏移量来确定一个地址(分段式)。
  • 栈指针(stack pointer):利用栈指针始终指向栈顶元素的规则,对地址进行寻址(push,pop)。
  1. 控制和状态寄存器:用来控制处理器的操作,且主要被具有特权的操作系统例程使用,用来控制程序的执行。需要依靠:存储器地址寄存器(MAR),存储器缓冲寄存器(MBR),I/O 地址寄存器(I/O AR),I/O 缓冲寄存器(I/O BR),程序计数器(Program Counter,PC):下一步程序需要的指令的地址,指令寄存器(Instruction Register,IR):当前正在执行的指令的内容。

所有的处理器设计还包括一个寄存器或者一组寄存器,通常称为程序状态字(Program Status Word,PSW),它包含状态信息。PSW通常包括条件码和其他状态信息,如中断允许/禁止位和管理/用户模式位。

  • 条件码(condition code,也称为标记):是由处理器硬件为操作结果设置的位。就像算术运算中产生正数,负数,溢出的结果,常见的条件码有:进位标志(CF),零标志(ZF),符号标志(SF),溢出标志(OF)等等。
  • 修改条件码的方式:算术指令,可以改变操作数就一定可以改变条件码;CMP指令,右操作数减左操作数但不回送结果,也可以改变条件码;TEST指令,两操作数相与,也可以改变;还有特定的CLC(CF标志位清零),STC(CF标志位置1)。
  • 条件码寄存器不可以直接读取,需要依靠set指令,jump指令或者cmov条件传送指令(根据条件码决定是否进行mov操作)。

指令的执行

处理器执行程序是由一组保存在存储器中的指令组成的,指令的处理有两个步骤,处理器先从存储器中一次读取一条指令,然后执行读取到的指令,执行完毕之后再继续取指令的步骤,一直循环下去。所以说程序是由不断重复的取指令和执行指令的过程组成的。
一个单一的指令需要的处理称为一个指令周期,那么一个指令周期可以分为两步,分别是取址阶段和执行阶段,仅当机器关机,发生某些未发现的错误或者遇到关机的程序指令使,程序执行才会停止。
计算机系统概述_第1张图片

取指令和执行指令

在每个指令周期开始的时候,处理器从存储器中取一条指令。这是程序计数器会自动+1,以便保存下一次要取的指令的地址,除非有特殊情况,否则处理器总在每次取指令后总是递增PC,使得处理器可以按照顺序取得下一条指令。
取到的指令放在处理器的一个寄存器中,这个寄存器称为指令寄存器。指令中包含确定处理器将要执行的操作的位,处理器解释指令并执行对应的操作。

  • 处理器-存储器:数据通过处理器传送到存储器,或者从存储器传送到处理器。
  • 处理器-I/O:通过处理器与I/O模块间的数据传送,数据可以输出到外部设备,或者从外部设备输入数据。
  • 数据处理:处理器可以执行关于数据的算式操作或者逻辑操作(+,-,*,/).
  • 控制:有些指令可以改变执行顺序。如果处理器从地址为109的存储单元取一条指令,而该指令指令的下一条指令应该从地址为150的存储单元中取,那么PC就会设置成150,而不是顺序递增的110,那么在下一个取址阶段中,会从150存储单元而不是110存储单元中取指令。
    计算机系统概述_第2张图片

上图可用三个取指阶段和三个执行阶段描述:

  1. PC中包含第一条指令的地址300,该指令的数值(0x1940)被送入指令寄存器IR中,PC增加1。此过程是容量存储器地址寄存器(MAR)和存储器缓冲寄存器(MBR)。
  2. IR中最初的4位(第一个16进制数)表示需要加载的AC(累加器),剩下的12位(后三个16进制数)表示地址940.
  3. 从地址是301的存储单元中取下一条指令(5941),PC增1。
  4. AC中以前的内容和地址为941的存储单元中的内容相加,结果保存在AC中。
  5. 从地址为302的存储单元中取下一条指令(2941),PC增1。
  6. AC中的内容被存储在地址为941的存储单元中

中断

中断的分类

  • 程序中断:在某些条件下由指令执行的结果产生,例如算术溢出,除数是0,或者常识执行一条非法的机器指令以及访问到用户不允许的存储器位置。
  • 时钟中断:有处理器内部计时器产生,允许操作系统以一定的规律执行函数。
  • I/O中断:由I/O控制器产生,用于发信号通知一个操作的正常完成或各种错误条件。
  • 硬件失效中断:像停电,或者存储器奇偶错之类的故障0
    计算机系统概述_第3张图片

在一段程序中,我们每次调用函数的过程就是一个产生中断的过程,每产生一次中断,其实就相当于执行一次其他函数的过程。在汇编语言中,我们可以用的寄存器有限(AX,BX,CX,DX…),那么每次执行中断运行其他程序,如果不进行寄存器数据保护,就会造成当中断执行完毕返回原程序的时候,寄存器中的数据不再是原本程序执行位置的数据,可能会发生变化,所有我们每次执行中断之前,都要先对原程序寄存器中的数据进行保护(可以用压栈和弹栈的方式)。
另外,由于完成I/O操作可能花费的时间比较长,I/O程序需要挂起等待中断操作完成,因此用户程序会在WRIRE调用处停留相应的时间(可长可短),直至中断I/O程序执行完毕。

中断和指令周期

当外部设备做好服务准备的时候,也就是他准备好从处理器中接收更多的数据时,外部设备的I/O模块给处理器发送一个中断请求信号。这时处理器会做出响应,暂停当前程序的处理,转而去处理服务于特定的I/O设备的程序,即中断处理器。他是操作系统的一部分,确定了中断的性质,并执行所需要的操作。
中断发生的位置是不定的,他可以在主程序的任何位置发生中断,而不是特定的一处指令。
计算机系统概述_第4张图片
从用户的角度上看,中断打断了正常程序执行的序列。当中断处理完成之后,再恢复执行主程序的时候,主程序会从发生中断的下一个位置开始正常运行下去,这是因为程序计数器总是保存着下一条指令的执行位置。
所以说为了适应中断产生的情况,指令周期中需要加入一个中断阶段。在中断阶段,处理器检查是否有中断的发生(是否出现中断信号)。如果没有出现中断,继续之前的指令周期,如果有中断产生,并且允许发生中断,就会执行一个中断处理器。
计算机系统概述_第5张图片

多个中断

如果在一个程序执行过程中可以发生多个中断,例如,一个程序可能从一条通信线中接收数据并打印结果。每完成一个打印操作,打印机就会产生一个中断,每当一个数据单元到达,通信线控制器也会产生一个中断。
数据单元可能是一个字符,也可能是连续的一块字符串,这根通信规则本身有关。
处理多个中断的两种方法:

  • 一种是当正在处理一个中断的时候,禁止再发生其他中断。就是说,在执行中断期间,处理器对其他新的类型的中断请求信号不予理睬。如果在这个期间发生了中断,通常这个中断会保持挂起,当处理器再次允许产生中断时,再由处理器检查。

所以说,这种方法就是当用户程序正在执行一个中断的时候,这是突然有一个中断产生,则立即禁止中断;当中断处理器完成后,再恢复用户程序之前允许中断,处理器再检查是否还有中断产生。处理的方式类似于队列的先进先出的特性。
这种方法的缺点就是仅仅根据中断发生的实践来决定是否需要执行该中断,没有考虑优先级的问题,如果在执行低级中断过程中突然发生一个高级中断,那么用这种方式,高级中断就会被禁止执行,这感觉有点不友好。
计算机系统概述_第6张图片

  • 另一种方法就是定义中断优先级,允许高级中断打断低级中断的中断处理器的运行。

假设一个系统有三个I/O设备:打印机,磁盘和通信线,优先级依次为2,4,5。首先发生中断的是打印机中断,用户信息被放在系统栈中并执行打印机中断服务例程(Interrupt Service Routine,ISR),然后在这个中断执行的过程中发生通信中断的请求信号,因为优先级高的问题,就会把打印机中断停止,其状态被压入栈中保存起来,转而执行通信中断。在通信中断执行时,出现了磁盘中断的请求信号,因为他的优先级低,就会被简单的挂起(放在队列中),直到通信中断执行结束再判断栈和队列中的中断信号的优先级,然后再执行相对优先级高的中断,直至结束。
计算机系统概述_第7张图片

高速缓冲存储器

我们知道主存储器(容量大,速度慢),当处理器每一次从存储器中取数据的时候,都需要从庞大的容量中进行索引,那么如果频繁的取一个数据,就会造成频繁的从存储器中取一个数据,就会造成时间的浪费,效率不高。为了解决这种问题,在cpu 和 主存储器中弄了一个高速缓冲存储器(容量小,速度快)。
计算机系统概述_第8张图片
当处理器想要读取主存储器中的数据时,先检查这个数据是否在高速缓冲存储器中。如果在,则该字节从高速冲刷存储器传递给处理器;如果不在,然后才在主存储器中查找,然后再把该数据周围固定数目的字节组成一块主存储器数据,先被读入高速缓冲存储器中,然后该数据才从高速缓冲存储器传递处理器。
由于访问的局部性现象存在,所以当一块数据被取入高速缓冲存储器来满足一次存储器访问时,很可能之后会与多次访问的数据就是该数据周围的数据。

你可能感兴趣的:(Linux,操作系统)