- 在第一次阅读时分享一些记录。本文原为导图,我直接粘在这里 可读性一般,需要导图的朋友可以私,希望可以帮到大家快速搭起这本书的知识结构。
计算机组成与设计:硬件、软件接口 ####计算机概要和技术 **引言** **计算机系统的八个思想** 摩尔定律的设计 预测完成时的工艺水平 采用抽象简化设计 分层次,模块化 指令集是实现机器代码的抽象 加速高概率事件 把优化放在高概率事件上 通过并行提高性能 硬件多核,算法并行 通过流水线提高性能 并行多级流水 通过预测 预测处理器指令,预测指令 存储器层次 cache 通过冗余来提高性能 冗余部件提高可靠性,容灾备份 **程序概念** 系统软件 操作系统:监控计算机资源 处理输入输出操作 内存外村外村 为多个应用程序共享计算机资源提供服务 编译程序 将高级语言翻译成机器语言(汇编语言:助记符形式) 加载程序 汇编程序 助记符被翻译成二进制机器语言 高级语言编译成汇编语言(低级语言),然后汇编成机器语言,然后硬件操作 **硬件概念** 组成部件 输入部件 将数据写入存储器 输出部件 从内存中读取数据 存储器 处理器:从存储器中获得指令和数据 运算器 执行算术部分 控制器 向其他部件发出命令信号 它拆了个 显示器 液晶显示 动态矩阵显示 触摸屏 集成电路(芯片):集成存储器阵列等 处理器 中央处理单位(cpu微处理器) 运算器 控制器 缓存cache 作为DRAM的缓存,相比 集成度低(小)访问快 SRAM 寄存器堆:一系列状态单元可以通过提供寄存器号码来读写 浮点协处理器 存储器芯片 RAM DRAM 构成内存:承载程序的指令和数据 并访问内存,访问时间不受位置影响 相关介绍 静态RAM ROM 只能读取、存储监控程序汇编程序等 与主存的接口 数据安全 易失性存储器:DRAM 主存储器 非易:闪存DVD、磁盘 二级存储器,外存 (回忆外存,) 软硬件之间抽象出一个关键接口:指令集体系统结构 指令 寄存器 存储访问 IO等 操作系统对IO存储等进行了封装,我们称基本指令集和操作系统接口为应用二进制接口 **处理器和存储器制造技术** 晶体管 集成电路 超大型集成电路。。 **性能** 概念 响应时间:执行任务的总时间,包括硬盘访问、内存访问、IO、操作系统费用,CPU执行时间 吞吐率:带宽,任务数在单位时间内完成 CPU执行时间:执行任务需要花费CPU的时间 用户CPU时间:程序本身花在CPU时间 系统CPU时间:在操作系统中花费时间执行任务 时钟周期:时钟驱动硬件事件,时间间隔成为时间周期 时钟频率:时钟周期倒数 CPI:执行每个指令所需时钟周期的平均值,CPI与指令类型有关 ICP:取指并执行多个指令时, 计算 CPU执行时间=CPU时钟周期数×时钟周期时间 CPU执行时间=CPU时钟周期数/时钟频率 CPU时钟周期数=CPI×指令数 性能关注点 系统性能:空载系统响应时间 CPU性能:用户CPU时间 I/O性能 软硬件对性能的影响 算法影响指令数,可能CPI 编程语言,编程,指令集体系 **功耗** **i7基准** **谬误** MIPS=指令数/(执行时间×10^6) #####指令 **引言** 指令集 问题 如何用硬件表示 与高级语言的关系 编程语言和编译优化对程序性能的影响?? MIPS指令集 操作数 寄存器 存储器字 汇编语言 算术 数据传输 逻辑 条件分支 无条件跳转 存储程序概念 以数字形式存储在存储器中的各种类型的指令和数据的概念 **操作计算机硬件** 设计原则: 简单来自规则 高级语言编译成MIPS e.g. 高级语言性能? **计算机硬件的操作数** MIPS寄存器的操作数 大小32位 设计原则:越小越快 (大量寄存器延长时钟周期) 受指令格式位数限制 寄存器也叫字,基本访问单位 add $t0.$s1.$s2 变量寄存器 临时寄存器 存储操作数 数据操作指令(高级语言编译成汇编语言) 概念:命令在寄存器和存储器(主存内存)之间移动数据 指令 取数指令 lw 操作码 目标寄存器 偏移量 基址寄存器(存放数组的起始地址即基址,偏移量 基址计算得存储器地址) e.g. 当基地址太大时,不适合偏移 存数指令 sw(相反,将数据从寄存器复制到存储器) 操作码 目标寄存器偏移量基址寄存器 e.g. 注意 与基地址相比,字节地址节地址 存储器或磁盘由物理特性决定,字节地址0 1 2 3... ,每个字节存储8位。加上高级语言的偏移量 实际的字节地址不是加一个 MIPS也是按字节编址,不过MIPS技术里最小的访问单位是字(寄存器),MIPS中一个字=四字节,所以字节地址是4倍数(对齐限制) 使用最左端地址,所以是0 4 8 12... :磁盘中每4×从寄存器中存储了8位数据,MIPS32位的寄存器与磁盘中的某32有一定的对应关系 因为存取指令地址是二进制,DRAM容量为2进制,gebibytes(2^30) terabytes(2^30) 充分利用寄存器 寄存器中保持常用变量,寄存器溢出不常用 数据在寄存器中更容易使用???;吞吐率高,速度快,编译器应该有效地使用,优化?? 常数或立即数操作数 加立即数 addi $s1.$s1.4 避免取数指令,快速执行 支持负常数,。。.-1 根据使用概率确定的常数来加速高概率事件 数据传输指令可视为操作数为0的加法,所以寄存器$zero为0 **有符号数和无符号数** 概念 二进制数:由计算机的高低电信号反映1或0 二进制数字的存储位置用最低有效位(右)和最高有效位确定 MIPS有32个字,表示0~2^32-1 ,如何解决语言操作系统程序以外的移除???? 区分正负数法 符号和幅值表示法 有符号:二进制补码 前导位为0 正数 从0到2^31-1 1 负数 到2^31-1时,加一成-2^31 ,加到-1...) 补码负数的二次幂表示:-2^31 2^i ,所以最后加到-1 十进制可以通过二次幂计算 计算结果溢出,前导位不正确 处理二进制补码数的方法 反码 x x反=-1:基于事实结果11111..,即-1 反码中保留±0:1000... 0000... 扩展符号,恢复部分隐藏的扩展位 无符号数取指令时,寄存器操作不同 字节加载 无符号,左无符号 符号,符号扩展 比如-1,最低有效位为1 填充其他位置符号位1-1 MIPS提供两个字节加载 无符号:1bu 有符号:1b ,左侧24个填充符号位置 **计算机中指令的表示** 机器指令 寄存器名字-->寄存器数字-->机器语言 指令格式 R: 655556 I:6 5 5 16 十六进制表示二进制,避免二进制字符串冗长 MIPS字段 MIPS字段命名(操作码) 寄存器操作数 地址码) R:算术指令格式 op:操作码 表示操作和格式的手段 rs:五位,数字寄存器的第一个源操作 rt:第二个 rd:目标寄存器 shamt:位移量 funct:功能,指明op具体的字段操作变式 I:数据传输指令格式 设计原则:适当的折衷方案 取字指令获得的常数按R太小,所以设计了I 许多指令使用这种类型,确保指令长度相同,格式相同 格式 op:指示区分指令 rs:基址寄存器 rt:寄存器指取数结果的寄存器 constant or address P56 MIPS指令编码表 MIPS汇编语言翻译成机器语言 R add sub AND OR slt I lw sw 存储程序概念 指令以数字的形式表示 和数据一样,存储在存储器中的程序可以读写 **逻辑操作,P58指令** sll 左移 shamt 移位量 移i位==原数×2^i srl 右移 and,andi 按位与 源操作数,某些位置0 or,ori 按位或 在一定位置1 按地取反 nor 为保证格式一致,MIPS中用nor代替not **决策指令** 指令(分支,跳转) 跳转 条件分支指令 beq $s1.$s2. L 等级转移到标签为L的句子执行 不等分支:bne $s1$s2
无条件分支指令jump简写j:j Exit (无条件跳转到Exit标签)
标签
赋值语句等可编译成一条指令,将标签命名放在指令前
循环
从一个标签开始循环,最后跳回这个标签
e.g.
基本块:没有分支、分支目标/分支标签的指令序列
判断语句除了beqbne还有大小比较,出于简单性原则没有提供“小于则分支”
小于则置位
slt $t0.$s3.$s4
小于则三个寄存器置1
0
立即数小于则置位
slti $t0,$t1,1
t1大于1则t0置1
否则置0
MIPS编译器通过slt、slti、beq、bne和固定值0创建比较条件(例题P63)
最高有效位
区分正负
将有符号数作为无符号处理,是检验0≤x<y的低开销方法(下标越界)
sltu $t0.$s1.$s2
将有符号数当作无符号数处理,如果s1<s2 此时也说明了s1非负数
例题P63
beq $t0.$Zero.标签名
$s1≥$s2或者$s1是负数则跳转到标签名
case/switch
借助条件判断将switch转化为if-then-else
转移地址表
由标签对应地址构成的数组
jr
**计算机硬件对过程的支持**
引言
过程:根据提供的参数执行任务的存储的子程序,它是软件实现抽象的方法 (参数传递数值并返回结果,可作为程序数据间的接口)
程序遵循的六个步骤
将参数放在过程可以访问的位置
将控制权转交给过程
获得过程所需的存储资源
执行需要的任务
将结果的值放在调用程序可以访问的位置
将控制返回初始点(一个过程可由程序中的多个点调用)
硬件支持
寄存器是计算机中保存数据最快的位置,MIPS将寄存器划分
$a0~$a3 传递参数的参数寄存器
$v0~$v1: 用于返回值的值寄存器
$ra 用于返回起始点的返回地址寄存器(即程序计数器PC+4 或跳转的指令地址)
跳转和链接指令 jal:跳转到下一条指令的同时将下一条指令的地址(PC+4)保存在寄存器$ra中
寄存器跳转指令 jr
过程
使用更多的寄存器
例题
临时寄存器add t0,a0,a1 处理临时寄存器保存的值
保存过程中使用的寄存器(栈中建立3个字的空间)
addi $sp,$sp,-12 (空间?)
将t0中的值压栈 sw $t0,0($sp)
弹栈恢复原寄存器中的值
lw $t0,0($sp)
返回地址跳转 jr $ra:程序接下来要执行的位置
栈结构用于寄存器换出
为栈指针提供29号寄存器$sp,栈指针以字为单位调整大小指向栈中最新分配的地址以实现对寄存器的保存和恢复
$t0~$t9: 10个临时寄存器,在过程调用中不被调用者保存
$s0~$s7: 8个保留寄存器,一旦被使用由被调用者保存恢复
即上面t0是不需要压栈的,而t0进一步使用后结果存放在变量中是需要保存的 使用$s0..
嵌套过程(套娃)
嵌套过程中重复使用临时寄存器会产生冲突
解决:将必须被保留的寄存器压栈
调用者将调用后还需要的参数寄存器、临时寄存器压栈
被调用者将返回地址寄存器和使用的保存寄存器压栈
栈指针$sp随着栈中寄存器个数调整
P68递归例题
fact标签:为要保存的字调整栈,并sw(压栈)
将参数寄存器中的值压栈到存储器
压栈返回地址
与立即数1置位后比较决定是否跳转标签L1
不跳转顺序执行
返回值1置入值寄存器并返回
弹之前保存栈,由于n小于1此时没有对应弹栈保存的过程实体
跳转到返回地址
L1标签
存数寄存器立即数加-1
跳转到fact标签
跳转后的下一条指令是fact的返回位置(现在恢复旧的返回地址、参数和栈指针)
乘法指令 $v0存着当前寄存器的值 再乘上旧参数的值
最后fact再次跳转到返回地址
存储位置取决于
数据类型
存储方式
动态
静态:全局指针寄存器$gp
P69 过程调用保存和不保存的寄存器
栈指针通过被调用者减去再加上相同数量保存
其他寄存器通过栈指针保存恢复
在栈中为新数据分配空间
除了寄存器、返回地址还需要保存局部的数组或结构体,用来保存的片段称为过程帧
$栈指针指向栈顶 $帧指针指向给定过程中保存的寄存器和局部变量的值
指针的使用???
在堆中为新数据分配空间
内存空间的分配
栈由内存高端开始向下增长,-立即数而后压栈
内存低端第一部分保留
自低向上第二部分是代码段:包含源文件中例程对应的机器语言代码 pc-》0040 0000(16)
再向上是静态数据段: $gp全局指针初始化为1000 8000(16) ,通过正负16位偏移量访问数据来访问的存储常量或其它静态变量
再往上是存放的动态数据结构称为堆,向上生长 允许栈堆此消彼长
C语言通过显示的函数在堆上分配、释放空间
malloc分配空间并返回指向它的指针
free释放指针指向的堆空间
相比于Java的自动分配回收有 内存泄漏、悬摆指针的隐患
P71MIPS寄存器约定
zero v01 a03 t07 s07 t89 gp sp fp ra
P71迭代消除递归提高性能
**人机交互**
**MIPS中32位立即数和寻址**
32位立即数
编译器或汇编程序必须把大的常数分解成小的常数再合并到一个寄存器。立即数字段大小限制,在存取指令中对存储器地址还是立即数指令中对常数都可能带来问题
加载32位常量
lui $s0.61 则高16位00000000 0011 1101 低16位置0
ori $s0.$s0.2304 该寄存器的低16位0000 1001 0000 0000
注意
addi复制高16位
立即数逻辑或把0读到高16位中
分支和跳转中的寻址
跳转:j 10000 2 10000:实际操作码2占二进制6位,10000占26位
条件分支指令:bne $s0.$s1.Exit 6位操作码5位操作数5位操作数16位跳转的分支标签地址
现实中为了让程序大于2^16使用PC作为增加地址的寄存器,分支指令地址计算: 程序计数器=寄存器+分支地址
大概率分支跳转距离小于16条指令,使用PC有当前指令可以作为增加地址的寄存器 转移到距当前指令正负2^15个字的位置。 寻址附近指令是加速大概率事件的例子
PC相对寻址:一种寻址方式,将PC(准确来说是下一条指令:即上指+4)和常数相加作为寻址结果 ,是字地址
注意
26位字地址可以表示28位字节地址,跳转范围扩大4倍
PC32位,28位来自跳转指令,4位保持不变
程序超过256mb寻址界限,跳转必须替换为寄存器跳转指令???
例题
机器语言描述分支偏移
80000 每条指令差4个字节 80004 80012
跳转是相对于下一条指令添加相应字节或采用完整地址对应于相应标签
远距离分支转转移:插入一个跳转到分支目标的无条件跳转,由分支目标决定是否跳过该无条件跳转
MIPS寻址模式总结
立即数寻址:操作数是位于指令自身中的常数
寄存器寻址:操作数是寄存器
基址寻址:操作数在内存中,其地址是指令中基址寄存器和常数的和
PC相对寻址:地址是PC和指令中16位地址左移两位的和
伪直接寻址:跳转地址由指令中26位字段左移两位和PC高4位组成
处理远距离分支跳转??!
对于大型程序进行64位地址扩展2.18节
机器语言解码:通过逆向工程将机器语言恢复到汇编
16进制转2进制,找到操作码
由操作码决定指令类型,将二进制指令按该指令类型字段重新排列
通过funct字段确定指令
在确定寄存器
**并行与指令:同步**
并行的任务往往是需要相互协作的,例如任务1读操作前需要知道写任务完成,才能安全读回数据
即任务之间需要synchronize,否则发生数据竞争
数据竞争:对于同一个地址有来自不同线程的访问请求可能有协作前后的关系,可能发生数据竞争导致数据错误
计算机中同步机制依赖硬件提供的同步指令,可由用户调用
同步机制的实现
通过加锁解锁同步操作创立一个仅允许单个处理器操作的区域——互斥区
多处理器实现同步需要一组硬件原语提供对存储单元进行原子读和原子写的能力,这些原语被程序员用来建立同步库
原子交换原语(寄存器中的一个值与存储器中的一个值交换)建立同步机制
锁单元:存储器中的某个单元表示锁变量:0位解锁 1加锁
处理器尝试对锁单元加锁:用一个寄存器中的1与锁单元的值交换,
这样该锁单元为1 返回值(锁单元原值)是1的话表示被其它处理器占用
为0的话表示锁是自由的加锁成功,此时锁单元被修改成1
操作的原子性保证了交换原语实现同步
交换操作是不可分割的,并且由硬件对两个同时进行的交换操作进行排序
即两个处理器同时置位同步变量,第二个返回1 加锁失败
原子存储器要求存储器读写操作都是有单条不可被中断的指令完成
一种方法是采取指令对,第二条指令返回一个标志值表明这对指令是否是原子执行
处理器的原子操作都是在这对指令之前或之后完成
MIPS处理器中这一指令对包含一条叫做链接取数的特殊取数指令和一条叫做条件存数的特殊存数指令
优点:用来构造同步原语用于并行编程模型中
**翻译并执行程序**
编译器
将源程序转换成机器能理解的符号形式的汇编语言程序
汇编器
将汇编语言指令转换成等价的机器语言指令move-》add ,通过符号表(匹配标记名和指令所在内存字的列表)将机器语言指令转成二进制形式
将汇编语言程序转换成目标文件(包括机器语言指令、数据和指令正确放入内存所需信息)
目标文件头
代码段
静态数据段
重定位信息
符号表
调试信息
链接器
把各个独立汇编的机器语言程序组合起来并且解决所有未定义的标记,最后生成可执行文件
步骤
将代码和数据模块象征性放入内存
决定数据和指令标签的地址
修补内部和外部引用
加载器
将磁盘中的目标程序装载到内存中
动态链接库
在程序执行过程中才被链接的库例程
启动一个java程序
**以一个C程序排序作为完整的例子**
**数组与指针**
####算术运算
**引言**
实数的表示、算数、在硬件中如何实现、以及如何在指令集中表示
**加法和减法**
例题
从右到左执行加/减后进位 ,-6 也可+-6的补码
分支主题
**乘法**
**除法**
**浮点运算**
**并行性和计算机算数**:子字并行
**实例:x86中流处理SIMD扩展和高级向量扩展**
**加速:子字并行和矩阵乘法**
####处理器
**引言**
计算机性能影响因素
编译器和指令集---指令数目
处理器实现方式---时钟周期长度,CPI
一个基本的MIPS实现
核心子集
存储器访问指令
lw、sw
算术逻辑指令
add、sub、AND、OR、slt
分支指令
beq、bne、j
试着体会
通过这个子集说明建立数据通路、控制单元的关键原理,也体现了简单源于规整的设计思想
指令集决定实现的多个方面
实现策略如何影响时钟速度、CPI
实现概述
组成
控制器
程序计数器PC
控制器中的寄存器,存放了下一条指令所在单元的地址
为了进程连续执行,执行指令同时确定下一条地址
取,执行指令时CPU自动对PC加“指令字节数”
遇到转移指令(如JMP),PC值从指令寄存器中的地址字段取得
CU控制单元
控制单元,指令的操作码部分给CU(目的是经译码后,由cu上面的控制信号控制相应部件去执行指令要求的各种操作)
IR 指令寄存器,存放当前欲执行的指令字段(指令码+地址码)
主存储器
MAR 主存的地址寄存器用来读道取主存时缓存地址
PC中的地址码
取出的指令的地址吗
MDR 主存数据寄存器用来缓存从主存中读取的数据(包括指令)
存储体cache???
运算器
ALU算术逻辑单元,A通过指令字段的不同指令(指令码)执行不同的操作(类似数据多选器,操作由控制信号决定)
ACC累加器
MQ
数据选择器
-->PC:PC+4或分支目的地址
-->MAR、MDR:数组来自ALU(算数)还是数据存储器(取数)
-->ALU:输入来自寄存器堆(算数、分支指令时)还是指令的偏移量字段(存取指令)
实现指令
相同的前两步
取指令:根据PC存放的指令地址将指令由内存取到指令寄存器
根据指令字段内容
操作码给CU,确定该指令的操作信号
操作数:选取一个或两个寄存器,取到寄存器操作数
1:取字指令
2:其他大多数指令
地址码给MAR
后续步骤
(除JMP外,其他指令都要)使用算数逻辑单元ALU,不同指令执行不同的操作
存 ALU计算地址
算 ALU执行计算
分 ALU进行比较
不同
存储:访问内存以读取和存储
sw
取数指令将存储器中的数据写入MDR
算数指令将ALU中的数据写入MDR
分支指令根据ALU的比较结果决定是否改变下一条指令地址,不修改默认指令地址+4
e.g.取数操作,P246给出了后续章节介绍
**逻辑设计的一般方法**
设计必须要决定机器的逻辑实现以及机器时钟
数据通路功能部件的两种逻辑单元
组合单元:处理数据值
输入决定输出,例如ALU,与门
存储单元:存储状态
带有内部存储状态,时序的,例如指令存储器、数据存储器,寄存器,触发器
至少两个输入,一个输出
一输入写入单元的数据值
一输入决定写入的·时钟信号
输出提供前一个时钟信号写入单元的数据值,由输入和内部状态共同决定
时钟方法
规定信号可以读写的时间
例如边沿触发时钟:在时钟跳变开始状态单元1接受允许接收信号然后输出,经由组合逻辑在另一次时钟跳变开始时稳定传输给状态单元2
这两次时钟跳变的时间差即为时钟周期长度
有效:写控制信号表示逻辑真时可写入
**建立数据通路**
数据通路部件
部件种类
PC,是一个32位的寄存器,在时钟周期末被写入新的地址
指令存储器(本书中区别于IR),组合逻辑 包含了整个取指过程
寄存器堆
处理器中的32个通用寄存器,包含状态单元
(在写控制信号有效时,随时读入)可通过指定相应的寄存器号进行读写
数据存储器
Add
组合单元,使来自指令数据通路的PC+4以指向下条指令
ALU
对从寄存器堆读出的数据进行运算
符号扩展单元
不同指令所需要的数据通路部件
存、寄之间 存取指令
出现了存储器,数据存储器单元 (本书中却别与MDR)符号扩展单元, 地址计算时也使用ALU
寄、ALU之间:算数逻辑决策
R命令知寄存器堆最少有两个读端口,一个写端口
R I需ALU、寄存器堆,注意计算时16位偏移地址做符号扩展
beq:3操作数
2寄存器,比较操作数
1用来计算分支目标地址
分支发生
分支未发生
计算地址还需要符号扩展、加法器、寄存器堆提供的两个操作数
延迟的
创建一个简单的数据通路:取数、分支、R、访存数据通路(+跳转??)
注意
P251 a)定义的指令存储器功能远大过指令寄存器IR
取指令过程集中在了这个部件中
具体取指过程:PC-MAR-内存-MDR-IR
数据存储器(区别于数据寄存器MDR)功能更为复杂在包含了MAR-内存-MDR,然后读数据->右侧选择器为1,再写入寄存器
R指令操作绕过了数据存储器到了最右边的数据选择器,左侧数据选择器为0,右侧选择器也为0
访存指令:将基址和符号扩展后的地址在ALU中计算,此时左侧数据选择器为1
上侧Add完成分支地址计算,然后和一般情况+4 做一次选择
这个图省略了控制单元CU、跳转数据通路
**一个简单的实现机制**
ALU控制
4位的ALU控制信号定义了6种有效输入
取字、存储 :加法计算
beq: 减法
R:由funct字段决定执行与、或、减、加、小于则置位
ALU控制单元
以funct字段、2位ALUOp字段为输入
输出4位的控制信号,p260真值表
多级译码
主控制单元生成ALUOp作为输入
再由控制单元生成真正的ALU信号
主控制单元的设计
铺垫
指令格式
R
add、sub、AND、OR、slt
I
取数、存储
相等则分支指令
P276 7种1位控制信号作用和2位ALUOp控制信号,进一步引出控制单元CU
PCSrc:将分支信号和ALU的0相“与”
其他信号由控制单元只根据操作码确定
这9位信号由控制单元的六位31:26输入信号设置
数据通路的操作
按6位操作码设置的控制信号p265
e.g.加入控制单元的数据通路
执行指令顺序
R
取指令,PC自增
根据25:21、 20:16指令字段读取寄存器,同时根据31:26主控制单元计算出各控制信号状态
ALU根据funct字段确定ALU功能,对从寄存器堆读出的数据进行操作
ALU结果根据指令15:11位选择目标寄存器写入寄存器堆(写入是因为第二步RegWrite为1)
取数
指令存储器取指,PC自增
根据指令的25:21读取寄存器的值
ALU将读出来的值和15:0地址相加
两地址计算结果存放在数据存储器(具体在MAR?)
从内存中读出到MDR再写入到寄存器堆,目标寄存器由指令的20:16指出
相等则分支
取指令,PC自增
从寄存器堆读出寄存器存储的
ALU将两数相减。PC+4的值与符号扩展并左移2位后的指令低16位相加,得到分支目标地址
分支主题
右上角选择器决定PC值
控制的结束
单周期实现
+跳转指令
当前PC+4的高4位
跳转指令的26位立即数字段
26位左移2,低位00补
单周期的低性能引出下节通过重叠多条指令的流水线
流水线概述
what
多任务并行进行,重叠指令形象叙述是,通过增加指令的吞吐率提高性能
像单周期模型选择最坏情况作为时钟周期一样流水级也选择部件运行最耗时的时间
指令执行时间=指令执时(单)/流水线级数
面向流水线的指令集设计???P277
指令长度相同
MIPS只有几种指令格式
存储器操作数仅出现在存取指令
操作数在存储器中对齐
P281 每条指令最多只写一个结果并在流水线的最后一级执行
五级流水
IF:取指令
ID:指令译码或寄存器堆读取
EX:指令执行阶段,例如ALU计算等
MEM:表示存储器访问
WB:写回寄存器
左侧阴影写入,右读出,无:资源不使用
流水线冒险:下一个时钟周期中下一条指令不能执行
结构冒险
硬件不支持多条指令在同一时钟周期内执行
数据冒险P280
无法提供指令执行所需数据(数据依赖更早一条还在流水线指令)导致不能在预定时钟周期内运行
解决:前推(旁路),从内部寄存器中提前取出数据,注意 目标步骤晚于原步骤(上EX左于下EX)
前推将结果从前面指令直接发送到后面指令,旁路把寄存器堆中的结果直接传递到需要的单元
特别的:取数-使用型数据冒险
解决:流水线阻塞
控制(分支)冒险
取分支指令后接着取下一条但流水线不知道下一条的地址(分支指令刚取出还要计算下一个跳转到的指令地址)
解决
取分支指令后立即插入一个周期的流水线阻塞(或者叫气泡)
硬件分支预测器:加入足够多硬件使流水线第二级能测试寄存器、计算分支地址并更新到PC
分支预测:预测分支结果并立即沿预测方向执行
延迟分支:把不影响分支的指令放到分支后面代替起泡隐藏分支延迟
流水线概述小结
流水线是一种在顺序指令流中利用指令间并行性的技术
P192理解程序性能
流水线增加了同时执行的指令数目以及指令开始和结束的速率
**流水线数据通路及其控制**
数据通路
单时钟周期的数据通路可将指令分5阶段,即5级流水线
IF:取指令 PC-MAR-存储器-MDR-IR
ID:指令译码,读寄存器堆 操作码-CU 地址码-MAR 操作数指明ALU操作的寄存器号或取数后写回的
EX:执行或计算地址 CU控制ALU执行相关操作(如计算地址结果放到MAR)
MEM: 数据存储器访问 (在EX得出地址后访存,取出来放到MDR)
WB:写回(MDR-》操作数相应的寄存器)
包括两个反向流动通路
写回到寄存器堆
会导致数据冒险
PC的下一个值
会导致控制冒险
多级流水,在这5部分之间添加保存数据的寄存器MARMDR等实现共享部分数据通路
控制指令是逐级往后传递,在本级没有用到的控制字直接传递给下一级的状态寄存器(指令字段一步步给CU MAR等),给数据通路中的每一个组件加上控制信号 P195 下
图示法表示单周期、多周期流水线
流水线控制
9种控制信号
P204
**数据冒险:旁路与阻塞**
**控制冒险**
**异常**
####开发存储器层次结构
**引言**
程序访问方式具有局限性
时间局限性:例如循环,刚被访问的数据项可被再次访问
空间局限性:例如数组,某数据项被访问后,地址相近的数据项可能很快被访问
局限性应用
利用这种局部性将存储器组织成存储器层次结构:多存储器层次组成,存储器的访问容量和访问时间随离处理器的距离增加而增加
自然数据也被组织成这种层次化结构,常访问的数据放在离处理器更近的位置
一些概念
块/行:存储信息交换的最小单位 ; 命中率,缺失率
命中时间:访问存储所需时间包括判断是否命中
缺失代价:访问块、数据逐层传输、数据插入缺失层和将信息传给请求者的时间
**存储器技术**
SRAM技术:靠近处理器的cache
静态随机存取存储器是一种存储阵列结构的简单集成电路
有一个读写端口,存储单元由晶体管组成,访问任何数据时间固定
DRAM技术:主存储器即内存
以存储块方式组织,每个块上有许多行,每次pre后打开一个块act发送一个行地址将整行数据传送到缓冲器
存储单元通过在电容上保存电荷的方式存储数据,存储的每一位都是用一个晶体管实现读写电荷
需要周期性刷新(读出后写回)所以称为动态
采用两级译码结构:一个读周期后紧跟一个写周期的方式一次刷新一整行
SDRAM使用时钟对存储器和处理器保持同步,在时钟控制下以突发方式传送连续数据
闪存:非易失存储器,个人设备二级存储器
电可擦除的可编程只读存储器 EEPROM
写操作可使存储位损耗
磁盘存储器:容量最大 最慢
寻道:磁头移动到磁道
旋转延时:等待待访问扇区转动到读写头下面
**cache的基本原理**
引言
看一个简单cache:处理器每次请求一个字,cache中每个块由一个字组成
cache中保存了最近访问的数据项,在其中访问一个字(选择cache中的块)有几个问题
怎么知道一个字是否在cache中?命中/缺失
让每个字在cache中都有确定的位置
直接映射:让每个字的主存地址对应到cache中一个确定地址
映射方法:索引=块地址mod(cache中块数) 如果块数是2的m幂 取主存地址后m位(不考虑字节偏移时)作为cache索引(索引即cache块号)
不在则调入,在的话如何找到数据项
在cache中增加一组标记,包含主存地址高位的地址信息
有效位:标识一个块是否还有一个有效数据
cache的局部性以及预测技术
cache访问
主存地址低位作为cache索引来选择块,高位作为标记域和块中的标记进行比较
初始为空有效位为N,第一次缺失调入,再次请求即可命中,当同索引不同标记会替换较早访问的字
回顾:地址存在一个寄存器(字)中在MIPS中即一个32位的地址 1字=4字节=32位 为了指定1个字中的某个字节需要最后两位作为字节偏移 还有两位被忽略
cache块中的位数等
cache缺失处理
cache缺失:数据不在cache中,需要到低层次存储中调入,此时引起流水线阻塞 与中断不同还会引起整个处理器阻塞
处理步骤
PC原始值(PC-4)送到存储器
通知主存执行一次读操作,并等待主存访问完成(此时CPU阻塞)
将取回的数据写入cache,从ALU得到高位写入标记位,设置有效位
重新执行
写操作处理
写直达:写操作同时写到cache和下一层次存储器(内存),保证数据一致; 数据写入cache并标记,标记不匹配则有写缺失问题
写分配:分配cache中一块,从主存取回数据,重写该块
写不分配:更新主存中一部分而不写入cache
写缺失的一个解决办法是 写缓冲:在写cache和写缓冲(一个等待写入主存数据的缓冲队列)完成后,再写入内存
写回:写到cache中的值被修改后这个块数据要被替代时写回到主存中
内置FastMATH处理器
读操作流程
将PC中地址或ALU地址送到适当的cache
cache发出命中信号,块索引域选择出请求的字发送到数据线上
cache发出缺失信号,地址送到主存,主存返回数据时写入cache再读出
分离cache:一级cache由两个独立的cache组成,并行工作
小结
本节介绍了每个块只有一个字的直接映射cache,每个字被明确的写入一个位置并且有单独的标记。
为了保持cache和内存的一致性,可以使用写直达或写回机制
较大的块可以降低缺失率提高cache效率,同时也带来缺失代价的增加
**cache性能的评估和改进**
引
CPU时间=(CPU执行时钟周期数+存储器阻塞时钟周期数)×时钟周期
存阻时主要是因为读写操作时cache缺失导致的数据块重新存取的阻塞
存时=(读写的次数/程序数)×缺失率×缺失代价+写缓存阻塞
计算cache性能、平均存储器访问时间
通过更灵活的放置块来减少cache缺失
全相联:存储器中的块可以放在cache中任何一个位置,这需要检索所有的项,检索由一个与cache中每个项相关的比较器并行完成
组相联cache:块可以放置到cache中的部分位置。n组组相联:cache中很多组,每个组n各块,根据索引域,块直接映射到唯一一个组全相联到组内的任意位置。
索引到组:(块号)mod(cache中的组数)
每个组内所有块都要被检索
优缺点:降低缺失率,增加命中时间
cache缺失和相联度
在cache中寻找一个块
组相联或直接映射cache地址组成: 标记 索引 块偏移 (全相联没有索引)
直:索引选择块,标记用来比较是否为请求的数据项,字节偏移量用来选择字
组:索引位选择组,标记位和选中的组中的块进行比较来选择块,块偏移为请求数据的地址
所以硬件上,n组组相联需要n个比较器和一个n选一多路选择器
提高相联度也就减少组数,增加每组块数、并行查找的比较次数 相应引起索引位标记位数的变化
替换块的选择
最近最少使用替换策略
计算各种相联下cache总组数和总的标记位数:先求直,组 组相联度加倍 索引位-1 标记位+1
使用多级cache结构减少缺失代价
二级cache处理一级cache的缺失
大数组,随着排序项的增加 基数比快排指令数要少但时钟周期数却多,主要是因为基数排序的平均cache的缺失率急速增加
cache优化:在某个块被替换前重复使用块内数据。如此有了基数排序优化版
通过分块进行软件优化
分块算法:对子矩阵(块)进行操作,在数据被替换出前对装入cache的数据最大限度的访问
小结
**可信存储器层次**
失效的定义
系统的两种服务状态
服务实现:交付的服务和需求相符 失效-》中断
服务中断:交付的服务和需求不符 恢复-》实现状态
可靠性:一个系统或模块能持续提供用户需求的服务的度量,即开始到失效的时间间隔(平均无故障时间MTTF)。
年失效率AFR:在指定MTTF后,一年内器件失效比率
可用性:系统正常工作在两次中断间隔中所占比例,=MTTF/(MTTF+MTTR)
服务中断使用维修平均时间(MTTR)来度量
失效间隔平均时间MTTF+MTTR
可提高MTTF的三种方案
故障避免
故障容忍
故障预报
纠正一位错、检测两位错的汉明编码(冗余技术构造可信的存储器)
两个等长二进制数的汉明距离是两个数对应位置不同的位的数量
错误检测编码:检测出数据中的错误
汉明使用奇偶校验码进行错误检测
**虚拟机**
引言
虚拟机的定义包括所有基本的仿真方法,方法提供标准的软件接口如Java虚拟机
它在二进制指令系统结构(ISA)的层次上提供一个完整的系统级环境,这样的系统虚拟机让用户觉得在使用包括OS副本在内的整个计算机
虚拟机监视器VMM:支持虚拟机的软件,决定如何将虚拟资源映射到物理资源,共享了底层硬件。
功能
提供保护
软件管理:提供一个可以运行完整软件堆的抽象
硬件管理:允许多个软件堆共享硬件
处理器虚拟化开销取决于工作量
IO密集型负载通常是操作系统密集型的,会执行许多系统调用和特权指令,导致很高的虚拟化开销
IO密集型负载也是IO限制性的,在等待IO时,处理器处于空闲状态,掩藏虚拟化开销
虚拟机监视器的必备条件
VMM给客户软件提供软件接口,分开每个客户端状态并将自己从客户端软件中隔离
需求
客户软件在虚拟机上的运行和本地相同
客户软件不能直接改变本地硬件上的运行情况
包含系统级、用户级处理器模式
特权级指令集只能在系统模式下使用
指令集系统结构对虚拟机的支持
保护和指令集系统结构
**虚拟存储器**
引言(主要讨论固定大小的块的页式存储,还有一种可变长度块的段式管理P293)
一种将主存用作(磁盘实现的)辅助存储器的高速缓存(充当cache)的技术
作用
允许云计算在多个虚拟机之间共享存储器
为了共享必须在虚拟机之间进行保护,多进程共享处理器、主存但不读写其他进程
主存存放众多程序中活跃的部分(局部性,就像cache放一个程活跃部分),并确保每个程序只能读写划分给它的那部分主存
虚拟存储器实现程序地址空间到物理地址的转换,加强各程序空间之间的保护
多对一的地址转换实现共享
消除小而受限的主存容量对程序设计的影响
自动管理由主存、辅存构成的两级存储器层次结构
一些概念
和cache原理相同,
页
虚拟存储器、物理存储器都被划分成页
块被称为页, 缺页:访问的页不在主存中
地址转换
处理器产生的虚拟地址结合软硬件转换成物理地址,映射到主存进而访问
地址
虚页号转换成物理页号,页偏移不变构成低位部分
偏移域的位数决定页数的大小(多少),虚拟地址可寻址的页数可比物理页数多
特别情况
无法映射:物理页不在内存,虚页无法映射到物理页
多对一:多个虚拟地址指向同一物理地址,实现程序共享数据
重定位将虚拟地址映射到不同物理地址,也就是允许将程序加载到主存中的任意位置而不需要连续的块
页缺失代价是重大的,那如何设计
页足够大
设计降低缺页率的组织结构,允许存储器中的页全相联方式放置
通过软件选择置换页
虚拟存储器采用写回机制管理写操作
页的存放和查找
通过算法降低缺页率,
使用全相联方式放置页
问题:全部检索是不实际的
解决:通过页表来定位页
页表:保存虚拟和物理地址之间转换关系的表,页表保存在主存中,通过虚页号索引找到对应的物理页号
页表寄存器:指向页表首地址
页表有1位有效位,虚拟地址中的虚页号确定页表中的物理页号 ,物页+虚地的页偏移=物理地址
页表、程序计数器、寄存器确定了一个虚拟机状态,该状态称为进程。OS加载一个进程的状态,令进程活跃(占据处理器)并激活计数器,进程从计数器保存的值开始运行
使用分离的页表分别保护进程
进程的地址空间以及它在主存中所能访问的数据都由页表定义
OS加载页表寄存器用来指向它想激活的进程的页表,负责分配物理内存、更新页表
不同的进程使用相同的虚拟地址并指向不同的物理内存,因此有不同的页表
缺页故障
虚拟页有效位关闭,异常机制将控制权转给OS,OS在下一级存储找到该页调回
OS如何将页面调回
OS在创建进程时会在磁盘或闪存上为进程所有页面创建空间(交换区)
创建一个数据结构(可以是页表中一部分)记录每个虚拟页对应在磁盘上的位置
创建一个数据结构跟踪记录使用每个物理页的是哪些进程和哪些虚拟地址,替换时OS遵循LRU查找最近最少使用的页
映射过程
页表将虚拟存储器中每一页映射到主存或磁盘的某一页
有效位开启,页表提供物理页号(存储器中该页的首地址)
有效位关闭,页表项存有交换区中的某一地址 等待OS调回
虚拟地址与页表项数、容量
减少页表所需存储量的技术P296
关于写
写回:对存储器中的页进行写操作,并在该页被替换出去时再被复制到磁盘中
页表中增加一个脏位:当页中的字被写过,脏位被置位 OS选择替换某一页时,脏位指明该脏页需要被写回到磁盘
加快地址转换:TLB
TLB快表:用于记录最近使用地址的映射信息的快速缓存,位于处理器中的cache 这样就依靠了页表的访问局部性,避免一次页表的访问提高性能
TIB
构成
虚页号
有效位
脏位
引用位
标记
物理页面地址
访问时查找虚页号
命中:物理页号形成地址,引用位被置位,写操作的话脏位置位
缺失需要判断
转换缺失:页在主存中,处理器将页中的变换装载到TLB中并重新访问
缺页:页不在主存,处理器调用OS的异常处理,将缺失的地址变换写到主存
处理缺失时从TLB中选取一项替换
被替代项的引用位、脏位复制回页表项,写回只发生在替换 而不是所有的写操作
内置FastMATH TLB
TLB和cache实现了从虚拟地址到数据项的转换 P299
TLB是全相联的,所以虚页号需要与每个TLB标记比较
TLB命中,物理页号+页偏移=物理地址 作为cache的索引
cache索引到数据项,物理地址标记域和cache项的标记相同 且cache有效则cache命中
cache索引+块偏移+字节偏移确定数据RAM中的字 (标记和数据RAM分开的)
一次读、写请求的步骤 P300
TLB缺失时
硬件把访问的页号保存在一个特殊的寄存器,并产生一次异常,该异常请求OS通过软件处理缺失
TLB缺失程序用虚拟地址的页号以及能指出活跃进程页表地址的页表寄存器来检索页表
最终OS将页表中的物理地址放到TLB中
集成虚拟存储器、TLB和cache
存储器层次结构操作的可能情况
TLB命中,那么页表缺失是不可能的
页表命中,那么cache缺失是不可能的
虚拟寻址cache
虚拟存储器中的保护
保护机制使虚拟存储器实现多进程共享一个内存,同时为这些进程和OS提供存储保护
为了使OS保护虚拟存储,硬件需要
需要至少支持两种模式,并指出当前运行进程是用户还是OS进程(又叫超级用户管理进程)
提供一部分处理器状态,用于指示处理器是处于用户态/管理态的用户/管理模式位、页表指针以及TLB
提供能让处理器在用户态和管理态下相互切换的机制
用-》管:由系统调用异常处理机制完成
OS协助进程间以受限的方式共享信息
写访问位把共享限制为只读,并且该位只能被OS修改
进程1想读2的内容,2让OS在1的地址空间中为一个虚拟页生成页表项指向2共享的物理页,在1TLB缺失时访问页表
上下文切换时如何进行数据保护
没有TIB,页表寄存器转向新进程的页表
有TLB,因为进程使用同一个虚拟空间并且为了保护原来进程的数据就要清除它的表项并通过TLB缺失加载新进程的表项
增加进程标识符和任务标识符来扩展虚拟地址空间
在进程标识符和页号同时匹配才发生TLB命中
任务标识符确保一个进程只能获得自己的数据
处理TLB缺失和缺页
缺失的两种情况、注意
页在主存,只需从主存取出页表项装入TLB
缺页:页不在主存,异常机制中断活跃进程将控制权传给OS来解决缺页,然后恢复执行被中断的进程
注意
异常程序计数器EPC保存该引起缺页的指令的程序计数器的值
缺失或缺页异常必须在访存发生的一个时钟周期末尾被判定 P304
在第一个异常正处理,另一异常发生会重写EPC,如何解决?
禁止异常:第一次异常发生时处理器设置管理态模式位禁止其他异常发生
使能异常
OS知道引起缺页的虚拟地址需完成的步骤
虚拟地址查找页表项并在磁盘上找到被访问的页的位置
选择替换一个物理页;该物理页被修改过则需要先写回到磁盘
启动读操作,将被访问的页从磁盘上取回到所选择的物理页的位置
恢复原先引起缺页的进程状态,并执行从异常返回的指令。该指令将处理器从核心态转换成用户态并恢复程序计数器的值,用户接着执行引起缺页的指令
TLB缺失处理程序 P305、306
小结
虚拟存储器是管理主存和磁盘之间数据缓存的一级存储器层次,允许单个程序扩展空间,允许多个活跃进程共享内存
降低代价
降低缺失率的技术
增大页的容量以便利用空间局部性降低缺失
使用页表实现的地址转换采用全相联方式,这样虚拟页可以放在主存中任意位置
OS使用类似LRU和访问位技术来选择替换哪一页
写回机制并且通过脏位跟踪页是否发生改变 来降低写磁盘代价
好处
虚拟存储器
提供地址转换,允许对主存进行受保护的共享(只有OS才能改变地址变换防止用户修改页表,OS还能协助进程间受控制的共享:通过页表中的访问位实现)
TLB 加快地址转换,提高访问速率
cache、虚拟存储器、TLB都建立在一组相同的原理和策略基础上??
**存储器层次结构的一般框架**
一个块可被放在何处
根据直接映射、组相联、全相联机制将块放置到存储器层次的较高层结构
降低缺失率:竞争同一位置产生的缺失减少
同一容量数据cache增加相联度能降低缺失率
同一相联度增加cache容量能降低缺失,大容量后再增加缺失率降低不明显
如何找到一个块
取决于块存放机制
直接相联:通过索引定位,比较1次
组相联:索引组、查找组中数据, 相连的度
全相联
查找所有cache项,cache容量
独立的查找表,0
虚拟存储器使用全相联原因
全相联的优越性,但缺失代价大
允许软件通过替换策略降低缺失率
很容易被索引而不需要额外的硬件或查找
组相联映射常用于cache和TLB,更注重缺失率的降低
当cache缺失时替换哪一块
替换
全相联:所有的块都可被替换
组相联:选择某一组中的块
直接映射:1
全/组cache的替换策略
随机法,可使用硬件协助 对 如MIPS支持对TLB缺失的随即替换
最近最少使用: 被替换的快是最久没有被使用的
写操作如何处理
写直达
优点
缺失比较简单,代价小,因为不需要把整个块写回到较低层次存储系统中
为了可行性,写直达cache需要一个缓冲区 比写回易于实现
写回
优点
处理器以cache而不是存储器能接受的速度写单个的字 (写得更快)
多次写只需对存储器较低层次进行一次写操作
块被写回系统可利用高宽带充分传输
一种理解存储器层次结构行为的直观模型
3C模型
强制缺失:对从来没在cache出现的块第一次访问时
容量缺失:cache容纳不了一个程序所有的块,某些块被替换又被调入而产生的缺失
冲突确实:组/直接映射的cache中,多个块竞争同一个组而引起cache缺失
结构设计对缺失率、性能的影响
增加cache容量
减少容量缺失,可能增加访问时间
提高相联度
减少冲突缺失,可能增加访问时间
增加块容量
由于空间局部性所以能降低缺失,,增加确实代价
**使用有限状态机来控制简单cache**
一个简单的cache
P314
有限状态机FSM:支持控制一个花费多个时钟周期的操作
由一组输入和输出,以及下一状态函数和输出函数组成的 时序逻辑函数
下一状态函数将当前状态和当前输入映射为一个新的状态(这个状态会保存在组合逻辑中,也会输出作为下一状态到寄存器),即确定了下一状态的组合函数
输出函数将当前状态和当前输入映射为一组确定的输出(数据通路控制输出)
实现
一个保持当前状态的临时寄存器
一个组合逻辑,它由ROM或PLA可编程逻辑阵列来实现
输出是下一状态号和当前状态的优先控制信号
输入是当前的状态以及用来决定下一状态的一些输入(cache数据通路的输入,状态寄存器保存的上一次输出)
一个简单的cache控制器的有限状态机
4个状态
空闲
标志比较
写回
分配
P317 图5-40,从这个模型扩展到多个状态以改进性能