计算机无法保存无限小数,会造成精度损失,例如:3 x (1/3) =
0.9999999~
字长相同的定点数与浮点数,浮点数虽然扩大了表示范围,但精度降低了
(10^3 也占空间)
[1000 0001]原→[1111 1110]反
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反
[1000 0001]原→[1111 1110]反→[1111 1111]补
对于计算机, 加减乘数已经是最基础的运算, 要设计的尽量简单. 计算机辨
别"符号位"显然会让计算机的基础电路设计变得十分复杂! 于是人们想出了将
符号位也参与运算的方法. 我们知道, 根据运算法则减去一个正数等于加上一
个负数, 即: 1-1 = 1 + (-1) = 0 , 所以机器可以只有加法而没有减法, 这样计算
机运算的设计就更简单了.
真值,将机器码将符号位转换为正负号,如:0000 0001→ +000 0001
机器码是带符号位的二进制数,最高位为符号位,0 为正,1 为负
计算结果超过了数的表示范围,例如,4bit表示的范围是 0-15(无符号),
表示 16 时就会溢出
0.0123456 保留四位小数,怎么样计数精度更高?
M是尾数,r是M的进制数,E是阶码:1.56 x 10^3
小数转换二进制会有精度损失,因为小数会转换成无限长度的二进制数
10110=1x2^4+0x2^3+1x2^2+1x2^1+0x2^0
11110xxx-10xxxxxx-10xxxxxx-10xxxxxx
1110xxxx-10xxxxxx-10xxxxxx
UTF-8 字节流格式,首字节有多少“1”代表用了多少字节
英文字符会产生冗余,ASCII 只用一个字节表示英文字符,而 Unicode 需要
更多字节,但实际使用到字节却很少
CPU 选取指令、译码、执行,重复这个过程直到程序结束
以字节为基础单元组成的字节块,计算机以此字节快做处理单元,64 位机一
次计算可以处理 64位即 8字节,32 位机一次计算处理 32 位即 4字节
CPU 几乎完全不参与I/O,由 PPU 独立执行
完全通过程序控制主机与外设之间的信息传送,外设和主机不能同时工作,需
要 CPU 全程参与,直到信息传输完毕之前,CPU 不能执行其他进程
数据交换不经过 CPU,外设直接与内存交换数据,DMA 在进行I/O 前会询问
CPU 是否开始执行
子程序的嵌套级数由堆栈大小决定,因为程序的调用到结束就是堆栈入栈到出
栈的过程,调用的程序越多,栈帧就越多。中断服务程序的嵌套级数一般由中
断的优先级决定。
服务时间不同:调用子程序的时间及空间都是确定的,而中断时随即发生
实现:子程序调用完全由软件实现,而中断需要硬件与软件配合实现
服务对象不同:子程序只为主程序服务,而中断服务程序与主程序一般没什么
关系
CPU 启动 I/O 后不必立即停止当前进程,外设接到启动命令后进入准备阶
段,准备完成后通知 CPU,CPU 会中断当前进程并记录断点,为 I/O 操作提
供服务,服务结束后回到断点处继续执行。一定程度上实现了并行。
外设会主动通知 CPU 执行输入输出操作,不需要 CPU 全程参与
中断判优:前提是多个中断源同时发送中断请求,此时需要判断优先响应哪个
中断源的请求
中断屏蔽:通过程序控制,有选择的接受部分中断请求,屏蔽另一部分中断请
求,也就是设置优先级
允许/禁止中断:如果当前正在执行的进程优先级很高或其他原因不能中断当
前进程,成为允许/禁止中断
关中断:响应中断请求后,停止接收中断请求,此时需要保护正在执行程序的
状态,以便 CPU 结束中断服务后恢复原程序执行。此过程不允许被打断
退出中断:实际上就是关中断,这个过程不能被打断,CPU 会恢复断点和现
场(重新设置程序计数器的值,恢复原程序执行过程中保存在寄存器中的值)
现场:保存各个寄存器中该程序的信息,如程序状态字、中间结果、操作数、
指令等
中断嵌套:有中断1,中断2,中断2的优先级更高;CPU 在执行中断1的过程
中接收到中断2的中断请求,此时,中断中断1,转去执行中断2;待中断2执
行结束之后,再恢复中断1的执行;中断1执行完成,最后恢复原程序执行。
开中断:做好执行中断程序的准备后,开放中断请求的接收,应当允许更高级
的中断请求中断低级的中断请求,先响应优先级更高的中断请求
判别中断源:识别中断源,将程序计数器的值变更为中断程序的地址入口,准
备执行中断程序
用来完成输入输出操作,如最基本的输入设备(键盘、鼠标),最基本的输出
设备(显示器、打印机)
信号格式转换,CPU 中的信号是二进制,而外设可能使用其他类型的信号
数据缓冲,CPU 每次处理一个字的数据,但部分外设是串行收发数据,也就
是一次收发一个 bit,因此I/O接口要实现数据缓冲,将 CPU 传来的数据先缓
存起来再串行发送给外设
其中1,3,5步骤都是与外部的交互,也就是内存;而2,4则在内部完成
将程序计数器(PC)的值送到存储器地址寄存器(MAR),并送至地址总线
(AB);由控制单元经控制总线(CB)向存储器发送读命令;从内存中取出
指令经数据总线(DB)送至存储器数据寄存器(MDR);将存储器数据寄存
器(MDR)中的内容送到指令寄存器(IR)中;程序计数器的值加一,为执
行下一条指令做准备
有操作数的指令,还需要计算操作数存放地址并读取操作数
完成指令规定的各项动作,形成稳定的运算结果,并将其保存(通用寄存器组
保存结果、状态寄存器更新状态)
概念:CPU 是整个计算机的核心,它包括运算器和控制器
保存从内存读取的数据或向内存写出的数据,CPU 与 内存之间的数据中转站
保存由算术逻辑运算指令或测试指令得到的结果建立的各种信息,如符号标志
SF、溢出标志OF、为零标志ZF
保存操作数(源操作数、目的操作数、中间结果)以及各种地址信息
时间控制:对各种操作加以时间上的控制,为每条指令按时间顺序提供控制信
号
中断处理:对计算机运行过程中出现的异常情况和特殊情况进行处理
每个设备与中央仲裁器之间控制线互相独立,中央仲裁器可以直接得知发送请
求的是哪个设备,响应速度快。如果多个设备同时发送请求,由中央仲裁器内
部的排队电路决定给哪个设备发送 BG 信号。
如果某个设备损坏,那么该设备之后的设备接收不到 BG 信号
所有设备通过一条控制线路向中央仲裁器发送总线请求信号 BR,中央仲裁器
通过该控制线路向所有设备发送总线授权信号 BG,BG 会依次经过连接总线
的设备并询问是否需要使用总线,该信号会找到离中央仲裁器最近并且发送了
总线请求信号的设备(优先级)。一旦某一个主设备获得了总线控制权,那么
BS线就会告诉其他设备。
以上两种方式的共同点是,所有设备使用同一条线路发送总线请求信号。整个
链式查询的总线中,有三种不同的总线,数据线,地址线,控制线。控制线又
由三个线组成:BR,BS,BG
所有设备通过多条地址线和一条控制总线与中央仲裁器相连,中央仲裁器中有
计数器,计数器从任意值(可以设置)开始,中央仲裁器向地址值与程序计数
器值相同的设备发送 BG 信号,询问该设备是否请求总线使用权,如果没有计
数器值加一,如果有就由该设备使用总线。另外,可以通过设置计数器值的方
式调整各设备的优先级。
概念:为解决多个设备同时竞争总线控制权的问题,以某种方式选择其中一个
设备作为总线的下一次使用者
概念:各模块之间传送信息的通路,总线并不是只有一条线路,也可以是一类
线路的总称
同一时刻只有一个设备发送的信息可以在总线上传输,不可以多个设备同时使
用;如何保证?(总线仲裁)
总线上可以挂接多个设备,各设备之间交换信息都可以通过总线来完成
RISC:精简指令系统,减少指令数量精简指令功能,通过指令的组合完成复
杂的功能
CISC:复杂指令系统,增加指令数量并为指令实现更复杂的功能,采用微程
序控制,尽量减少指令的组合执行
地址码字段:说明被操作数据的地址(包括操作数地址、子程序入口地址、运
算结果保存地址)
操作码字段:说明指令应执行什么性质的操作和具有什么功能
指令集:一台计算机所有的指令的集合,也就是指令系统
指令集至少包括以下几种类型的指令:数据传输类、运算类(算术运算类、逻
辑运算类、移位指令)、程序控制类(转移指令、子程序调用指令、返回指
令)、输入/输出类
cache 未命中时,内存会把数据传入 CPU 和 cache;内存未命中时,虚拟存
储器会将数据传入内存,不能直接送入 CPU
cache 解决系统运行速度问题,虚拟存储器解决内存容量的问题
cache 由硬件实现,虚拟存储器由 OS 和硬件一起实现
依据都是程序访问的局部性原理,将相对活跃的数据放入相对高速的部件中
缺点:需要查两次表,增加了性能上的开销,但是在这里以时间换空间是值得
的
优先:结合了段式与页式,大幅提高了内存空间的利用率
程序逻辑分段,段内再分页。每个程序对应一个段表,每段对应一个页表
空间局部性:如果某个存储单元被访问,那么随后其附近的存储单元很可能会
被访问。即程序在一段时间内访问的地址可能集中在一个范围内。
时间局部性:如果程序中的某条指令被执行,那么该指令随后很可能再次被执
行;如果某个存储单元被访问,那么该存储单元随后很可能再次被访问。产生
时间局部性的原因是程序往往存在大量循环操作
基本思想:内存与磁盘的动态交换。操作系统将正在使用的部分保存在内存
中,其他部分留在磁盘,在需要时再从磁盘中读取,不用的数据再返回给磁
盘。
缺点:每个段大小不同,也可能会出现空闲内存无法利用的情况;过大的段调
入时会比较麻烦,因为要移动其他段的位置甚至直接将段置换出内存
标志位(该段在内存中是否被修改过?如果没有修改就无需写回给磁盘,有助
于降低数据总线压力,提高系统性能)
存取权限位(读、写、执行)如果是代码,可以读可以执行、如果是数据,可
以读可以写等等
N:将无用实段置换,要么直接回收要么写回磁盘,留出足够大的连续空间供
虚段 S 使用
Y:整理内存空间,留出足够大的连续空间供虚段 S 使用
Y:(过程1)1.从虚拟内存中读取段 S;2.修改段表;3.唤醒暂停的进程
保存程序的磁盘空间称为程序空间,在程序空间中,程序的存储也是以页或段
或段页为基本单元的。
主存空间按程序的逻辑划分为段,段的大小不相同,程序以段为单位进入内存
如果程序运行过程中发生缺页,并且主存已满,就需要从主存中调出一页送入
磁盘的对换区。将哪个页面调出由置换算法决定
理论上系统应该将不会再访问或很长时间不再访问的页置换出去
置换算法直接影响系统性能,不合适的算法可能导致进程发生“抖动”,刚被
置换出去的页马上又被访问,需要重新读取。导致系统频繁更换主存中的页。
缺点:程序所需空间几乎不可能刚好是页的整数倍,最后一页的剩余空间无法
被利用,造成空间浪费;一次调取多页也会给程序运行造成麻烦(不详细)
通过消息系统通知缓存更新(数据库触发器、消息队列等)
数据更新不频繁时,可以设置缓存有效时间,超时的数据会被清除,需要时再
次请求服务器,可以在一定程度上减少脏数据产生
数据一旦放入缓存中,客户端取数据就会从缓存中获取,如果服务器中的数据
发生变化,那么此时从缓存中取到的数据就是脏数据。所以,我们必须保证缓
存中的数据与服务器中的数据同步更新。
更新策略(保证 主存 与 cache 之间的数据一致性)
Cache 中保存的数据是主存中某一部分的拷贝,至于是哪一部分,跟替换策
略有关
地址总线输入主存地址,先检查 Cache 中是否有目标数据,如果有,则将主
存地址映射为 Cache 地址,数据总线返回数据。
如果未命中,则通过主存地址在主存中检索,数据总线返回数据,并根据替换
策略给 Cache 复制一份数据
LRU(least recently used):最近最少使用
FIFO(first in,first out):先进先出算法
替换策略(替换 cache 中保存的数据):提高 Cache 的命中率
问题3:char c = ‘a’,变量 c 保存的是指向对象的指针,那么计算机如何
得知要从指针开始读取多少字节? 根据变量类型
特点:简单直接快速,但不灵活,冲突高(区1块1与区2块1同时使用 Cache
的块1)
主存分为多个等大的区,一个区与 cache 大小相同
区分为多个等大的块,主存中的块与 cache 中的块大小相同
区表存储器:维护一个目录列表,用来保存 cache 第 N 块保存哪一区的第 N
块
问题2:容量为 64(2^6) 块的 cache 采用组相连映射,字块大小为 128B
(2^7),每4块为一组,若主存容量为 4096(2^12) 块,且以字节编址,那
么主存地址是多少位?主存区号是多少位? 十九位,六位
问题1:某32位计算机,cache 容量为 16KB(16 * 1024 = 2^14),cache
块的大小为 16B,若主存与 cache 地地址映射采用直接映射的方式,则主存
地址为 1234E8F8(十六进制)的单元装入的 cache 地址为? 后十四位
特点:冲突率低,但映射关系复杂,速度慢,成本高(需要遍历记录表找到正
确的块)
允许主存某区某块映射 Cache 中任意一块,而不是块1 只能映射 块1
记录表不仅要记录区号,还要维护主存块与 Cache 块的映射关系
一组中,2块、4块、6块、8块、16块的划分称为:2路、4路、6路、8路、
16路组相连映射。
减小了全相连映射的映射范围,进而减小了映射关系表的遍历范围,相比直接
映射冲突率更低,相比全相连映射速度更快
第 N 区的第 N组对应 Cache 中的第 N 组,第 N 组的第 N 块则可以对应
Cache 第 N 组中的任意一块
地址总线输入-先检查 cache,再检查主存,最后检查辅存-数据总线输出
多种类型的存储器形成层次结构,逻辑上与CPU 寄存器越“近”的存储器就
“越快越小”
存储单元中的数据只能被覆盖(delete),存储单元中的数据只能被复制
(get)
对象/函数所占空间往往需要多个连续存储单元,该对象所使用的第一个存储
单元的地址即起始地址,又叫做指针
如果没有缓存,前端每次请求资源都需要访问服务器,浪费流量,服务器压力
大