您的位置:首页 > 理论基础

操作系统精髓与设计原理-计算机系统概述

2016-11-15 14:59 573 查看
本文若未注明均摘抄自《操作系统精髓与设计原理》:William Stallings著,陈向群、陈渝译,机械工业出版社出版第六版

1 计算机系统概述

关键词
地址寄存器变址寄存器局部性辅助存储器
高速缓存输入输出内存段指针
高速缓存槽指令多道程序设计空间局部性
中央处理单元指令周期处理器
条件码指令寄存器程序计数器栈帧
数据寄存器终端可编程I/O栈指针
直接内存存取中断驱动I/O可重入过程系统总线
命中率I/O模块寄存器时间局部性

1.1 基本构成

需要权衡的瓶颈包括是内存读取瓶颈,指令行并行处理瓶颈,和散热瓶颈。而散热瓶颈被认为是最难以跨越的。[1]

[1] Why CPUs Aren’t Getting Any Faster

处理器的一种功能是和存储存取交换数据,为此他通常使用CPU内部的两个寄存器

存储器地址寄存器(MAR Memory Address Register)

存储器缓冲寄存器(MBR Memory Buffer Register)

同理

输入输出地址寄存器(I/O Address Register)

输入输出缓冲寄存器(I/O Buffer Register)

用于在输入输出模块和处理器间交换数据

1.2 处理器寄存器

用户可见寄存器:可减少使用汇编语言的程序员对内存的访问次数,对高级语言来说,由编译器优化负责决定那些变量应该分配给寄存器,一些高级语言(如C)允许程序员建议编译器把哪些变量保存在寄存器中。

控制和状态寄存器:包括IR等用户不可见寄存器

1.2.1 用户可见寄存器

通常包括数据寄存器,地址寄存器和条件码寄存器

数据寄存器(Data Register):很大程度上是通用的,大多数数据操作都可以使用,除了浮点数运算使用专门的寄存器。

地址寄存器(Address Register):存放待加工使用的地址,如下面的例子:

变址寄存器(Index Register):通过给基址加偏移量获得最终地址

段指针(Segment Pointer):存储器被划分成段,一个存储器由段号段内偏移组成,这样的寻址方式需要一个寄存器保存段的基地址(起始地址),可能存在多个该类(段指针)寄存器。

栈指针(Stack Pointer):如果对用户可见的栈进行寻址,则有一个专门的寄存器指向栈顶(关键字:运行栈),在程序的每个过程调用中,处理器状态寄存器中的数据将被转移运行栈中,等到过程调用完成后再恢复回去(关键字:函数现场恢复),因此过程便可以自由的使用这些状态寄存器

1.2.2 控制和状态寄存器

有多种处理器的寄存器用于控制处理器的操作。大部分此类寄存器是用户透明的,其中一部分可被在控制态(或称为内核态)下执行的某些机器指令所访问。

程序计数器(Program Counter):包含将取指令的地址

指令寄存器(Instruction Register):包含最近取的指令内容

程序状态字(特殊标志位寄存器 Program Status Word, PSW):包含状态信息,如中断访问状态和内核/用户态标志。

条件码(Condition code 也称标记):为操作结果设置的位,如算数中产生正、负、零或溢出,在算数指令执行后,也会设置条件码

1.3 指令的执行

处理器执行的程序是由一组保存在存储器中的指令组成。一个单一的指令需要的处理成为一个指令周期。如下图所示,两个步骤分别称为取指阶段执行阶段

1.3.1 取指令和执行指令

在典型的处理器中,PC(Program Counter)保存下一次要取的指令地址,除非有其他情况,否则处理器在每次取指令后总是递增PC,这样下次就能取到下一条指令

graph LR
开始-->取下一条指令
取下一条指令-->执行指令
执行指令-->停止
执行指令-->取下一条指令


基本指令周期

取到的指令被放置在一个被称为IR(Intruction Register) 的处理器寄存器中,一个指令由操作码和地址码组成,其中操作码将指定处理器将要执行的操作,这些操作大体可分为以下四类:

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

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

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

控制:某些指令可以改变执行顺序,例如从149取到的某指令指示PC指针变为182,则在下一指令周期中,取指令将从182开始,而非150。

1.3.2 I/O模块

在某些情况下,允许I/O模块直接与内存发生数据交换,这个操作称为直接内存存取(Direct Memory Access, DMA)

1.4 中断

类别说明
程序中断在某些条件下由指令执行的结果产生,如算术溢出、除数为0、试图执行一条非法的机器指令以及访问到用户不允许的存储器位置
时钟中断有处理器内部的计时器产生,允许操作系统以一定规律执行函数
I/O中断由I/O控制器产生,用于发信号通知一个操作的正常完成或各种错误条件
硬件故障中断有诸如掉电或存储器奇偶错误之类的故障产生


1.4.1 中断和指令周期

用户程序调用WRITE处,设计的I/O程序仅包括准备代码和真正的O/I命令,在这些为数不多的几条指令执行之后,控制返回到用户程序继续执行,此时外部设备忙于从计算机存储器接收数据并打印。而这些外部I/O操作和用户程序中指令的继续执行是并发

图1.5中用“×”表示发生中断的点,但事实上中断可以在主程序中的任何位置发生,而不是在一条指定的指令处

另注,如果用户程序在由第一次调用产生的I/O操作完成之前就到达了第二次WRITE调用,则用户程序在这一点挂起,直到前面的I/O操作完成后才继续新的I/O操作。



1.4.2 中断处理



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

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

吃力气对终端进行测定,确定存在未响应的中断,并给提交中断的设备发送确认信号,确认信号允许该设备取消它的中断信号。

处理器需要为吧控制权转移到中断程序做准备,首先需要保存从中断点恢复当前程序所需要的信息,要求最少信息包括程序状态字(PSW)和保存在程序计数器中的吓一跳要执行的指令地址,他们被压入系统控制栈(运行栈,见附录1B)。在典型情况下,中断程序一开始就在栈中保存全部寄存器内容,其他必须保存的状态信息将在第3章讨论。

保存被中断程序的所有状态信息并在以后恢复这些信息是十分重要的。

1.4.3 多个中断

当处理多个中断并列的时候,比较好的方法是定义中断优先级,允许高优先级的中断打断低优先级的中断处理程序的运行



1.4.4 多道程序设计

如果完成I/O操作的时间远远大于I/O调用期间用户代码的执行时间,则在大部分时间处理器是空闲的,解决这个问题的方法是允许多到用户程序同时处于活动状态。

当一个程序被中断是,控制权转移给中断处理程序,一旦中断处理程序完成,控制权可能并不立即返回到这个用户程序,而可能转移到其他待运行企鹅具有更高优先级的程序。

这种多道程序轮流执行的概念叫做多道程序设计,第二张将进一步对此进行讨论。

1.5 存储器的层次结构

计算机的存储器设计目标可以归纳成三个目标:容量大小、速度快慢、加个高低

应当认识到,这三个目标是相互制衡的

存储时间越快,每位价格越高

容量越大,每位加个越低

容量越大,速度越慢

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



这种存储器的层次结构能够成功的关键在于底层访问频率递减。当地以及存储器的存取次数所占比例较高时,总的平均时间更接近与第一级存储器的存取时间而不是第二级。

在程序执行期间,处理器的指令数据访存呈现”簇”状这也是保证处理器访问存储器的频率逐层递减的条件。典型的程序中,一旦程序进入一个循环或子程序执行,短时间内处理器主要访问存储器中固定的簇。

外部的,非易失性存储器也称为二级存储器(Secondary memory)或复制存储器(auxiliary memory),硬盘还可用作内存的扩展,即虚拟内存(Virtual memory),这方面内容将在第8章讲述

高速缓存通常对程序员透明,或者说是对处理器透明,高速缓存用于在内存和处理器的寄存器之间分段移动数据,以提高数据的访问性能,是自治的。

1.6 高速缓存

1.6.1 动机

处理器在取指令是至少访问一次存储器,其速度显著受制于存储周期的限制,理想情况下,内存的构造技术可以采用与处理器中的寄存器相同的技术,但成本太高,解决办法是利用局部行原则,即在处理器和内存之间提供一个容积小而速度快的存储器,称作高速缓存

1.6.2 高速缓存原理

高速缓存包含一部分内存数据的副本,这些副本被以包含K个字的“块”为单位在高速缓存和内存间传输,高速缓存中有C个存储槽(Slot, 也称为Line),每个槽可以容纳一个块,由于高速缓存的存储槽数目远少于存储器中块的数目,因此一个槽不可能唯一或永久的对应一个块。

每个槽中都有一个标签以表示当前存储的是哪一个块,标签通常是地址中较高的若干位,表示以这些位开始的所有地址(都被包括在该块中)。





1.6.3 高速缓存设计

当一个新块被读入高速缓存时,有映射函数确定这个块将占据那个高速缓存单元,设计映射函数要考虑两方面的约束

首先要尽可能减少被替换掉的块在不久将来还会被用到的可能性,映射函数就应该变得灵活

其次,映射函数的复杂程度决定了确定某个指定块是否位于高速缓存内的功能电路将变得复杂

当一个新块被加入到高速缓存时,如果高速缓存已满,那么替换算法就要试图替换在过去一段时间被使用次数最少的缓存,这个策略叫做(Least-Recently-Used, LRU)算法。

1.7 I/O通信技术

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

A1 两级存储器的性能特性

内存高速缓存机制是计算机系统结构的一部分,他有硬件实现,通常对操作系统是不可见的。

局部性

两级存储器提高性能的基础是局部性原理,这个原理声明存储器的访问表现出簇聚性。在很长的时间内,使用的簇会发生更替,但在短时间内,处理器基本上至于存储器中的固定的几个簇打交道。

局部性原理很有效,原因是:

除了分支和调用外,程序都是顺序的

在循环的过程中,计算被限制在程序中很小的相邻部分中

对于数组一类的容器,连续引用==相邻内存访问

1B过程控制

控制过程中调用和返回最常用的技术是使用栈。

栈的实现

栈也称作下推表或后进先出(LIFO)。一种典型的方法是,在内存中为栈保留一块连续的单元,大多数时候,块中只有一部分填充着栈元素,剩余的部分供栈增长时使用。正确操作需要三个地址,这些地址通常保存在处理器寄存器中

栈指针:永远指向最后入栈的元素,在向栈中添加(PUSH)或删除(POP)元素时,将+1或-1

栈底:保留块中的低端

栈界限:保留块中的顶端,如果栈指针超过栈界限,将发生栈溢出错误

过程调用和返回

为一次过程调用保存的整个参数集合,包括返回地址,被称为栈帧(stack frame)

可重入过程

可重入过程是指程序的代码的一份副本可以在同一段时间内被多个用户共享使用。可重入过程有两个必要特征:

程序代码不能修改自身(执行次序无关)

可以被中断(执行时间无关),由一个正在中断的程序调用,再返回该过程时仍能正确执行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息