是否深陷原码反码补码的漩涡无法自拔,掌握overflow的概念就可以挣脱

up主 饭神来了 408补习班第八期
int 在计算机中是有限的整数序列
既然是有限的,那就必然有溢出(Overflow)
溢出因为bit的位数是固定的

引入负数/有符号数的二进制表示后:
存在两个问题

They are called complements because complementary bits are set.If they are added, all bits are necessarily set:
把比特位填满
0101 +1010 =1111

Adding 1 to the sum of a number and its complement necessarily results in a 0 due to overflow
通过+1溢出得到0
(0101 + 1010 ) + 1 = 1111 +1 = 1 0000 (0)
这完美利用了溢出的方式实现了对一个数负数的表示

And if x+y=0,y must equal -x

补码的引入是为了解决负数的计算,利用了溢出(overflow)的概念使得正数+负数=0
有符号数以及无符号数对于二进制数的映射
拆解
对于有符号数可以看成一个最大的负数加上一个正数,
如1010

第三章 存储系统

408大纲

层次结构

主存-辅存之间交换 由硬件和操作系统完成 系统程序员需要完成操作系统的页面置换算法

分类

  1. 按照层次分类
  2. 按存储介质分类
  3. 按存取方式分类
  4. 按信息的可更改性
  5. 按信息的可保存性

性能指标

存储器芯片基本结构

SRAM和DRAM

DRAM用于主存(现过时,通常采用SDRAM

ROM

详细内存布局表

地址范围 类型 用途
0x0000~0x03FF ROM BIOS/固件存储
0x0400~0x7FFF RAM 程序运行和数据存储
0x8000~0x8FFF VRAM 显存
0x9000~0xFFFF I/O 外设 I/O 映射

多模块存储器

读取周期
T = r + 3r
读取时间(总线传输周期)r 恢复时间3r 读取时间r 恢复时间3r

多体并行存储器

体号 体内地址
00 000
体内地址 体号
000 00
适合连续访问存储
mT/r,线

单体多字存储器
只能CP一次读一整行,会有冗余信息

主存储器和CPU的连接

单块存储芯片的数据字长<数据总线宽度
位扩展 一个8K x 1位的存储芯片,代表这个芯片有8K个存储单元 每个存储单元存储1bit
假设数据总线宽度为8位,D0D7这时一个存储芯片只能连接一位,比如D0,这时再拿七个一样的存储芯片链接到D1D7,这时这八个存储芯片组合起来就变成了一个8K x 8位的存储芯片,存储芯片的位数从1位拓展到了8位,称为位扩展

字扩展 一个8K x 8位的存储芯片,位数已经和总线的位数相同了,这时数据总线的性能以及最高了,不需要拓展位,要拓展存储器的存储字数
假设CPU的地址总线有16位A0A15,而这个存储芯片有8K个存储单元,要寻址8K个存储单元(213个)需要13位地址线,但地址总线有16位,就存在三位的浪费,如果像位扩展一样把地址线数据线连到同一根总线上,CS(chip select)信号都为一,多个芯片就会同时向数据总线发信号,会会造成信号冲突(位扩展时一个芯片对应了一个(或多个)单独的数据总线),如果把剩下的三根地址总线A13A15连到存储芯片的CS片选信号上,如果A13A15同时有两根及以上的信号为1,还是有多个芯片收到片选信号,向数据总线发送信号,造成数据冲突。
这时如果是有两个存储芯片进行字扩展,指定A13A14只能为01或10,这样不会造成数据冲突,称为线选法,但是开头只能是10 01,00和11的情况就被浪费掉了,如果CPU有n位多余的地址总线,则能连接n个存储芯片。
改进一下,把一根多余的A,连接到两个片选信号上,但其中一个加上非门(1,2)译码器,这时一位A就能链接两个存储芯片,再拓宽思路3根线可以表示23=8个数,因此可以用3-8译码器把3个A连到8个存储芯片上
以这个原理译码器命名规则应该是n2n译码器、

结合一下还有字位同时扩展

译码器 除了n2n个引脚外可能还会有使能信号引脚,如果有多个使能引脚,例如74ls138有三个,两个低电平有效一个高电平有效,CPU可以使用译码器的使能端控制片选信号生效时间,CPU MREQ连接使能端,cpu先送出地址信号,等一会电流稳定后再通过MREQ控制译码器使能,从而发送片选信号

磁盘存储器

外存储器 又称辅助存储器 Secondary Memory
主要使用磁表面存储器 如磁盘 磁带 磁鼓
优点

  1. 磁盘容量
    • 非格式化容量
    • 格式化容量
  2. 记录密度
    • 道密度 沿着半径方向单位长度磁道数
    • 位密度 磁道单位长度能记录的二进制代码数
    • 面密度 位密度×道密度
  3. 平均存取时间
    • 寻道时间(磁头移动到磁道)
    • 旋转延迟时间(磁头定位到所在扇区)题目没给就是转半圈所用的时间
    • 传输时间 (传输数据所花费的时间)
    • 磁盘控制器延迟(可能)
      平均存取时间是以上的总和
  4. 数据传输率
    单位时间内向主机传送数据的字节数,假设转速为r(转/s),每条磁道容量为N个字节,则数据传输率为Dr=rN
    磁盘地址
驱动器号 柱面号 盘面号 扇区号

工作过程:

  1. 寻址
  2. 读盘
  3. 写盘

固态硬盘SSD

原理:基于Flash memory ,属于电可擦除ROM,即EEPROM
组成

Cache基本原理 基本概念

局部性原理

如果程序按列优先访问二维数组,空间局部性会更差
性能分析
命中:如果cpu想要访问的数据能直接在Cache中找到
命中率H:CPU要访问的信息在Cache中的比率
缺失(未命中)率M:=1-H
tc访Cachetm访
Cache-主存系统的平均访问时间t

待解决问题

Cache 和主存映射关系

全相连映射

组相连映射

Cache替换算法

Cache被装满后应该怎么办

全相连映射 Cache全部满了才需要替换 需在全局内选择替换哪一块
直接映射 对应位置非空,直接替换
组相连映射 对应分组满了才替换 需要在分组内选择替换哪一块

随机算法
若Cache已满,随机选择一块进行替换
没有考虑到程序的局部性原理 命中率低,实际效果不稳定

先进先出算法FIFO
若Cache已满,则替换最先被调入Cache的块
仍然没考虑局部性原理,最先被调入的块也可能被频繁访问

抖动现象:频繁地换入换出的现象(刚被替换掉又被调入)

近期最少使用算法LRU
为每一个Cache块设置一个计数器,用于记录Cache块有多久没被访问了,Cache满后替换计数器最大的
手算快速方法,假设有四个Cache块,Cache未命中,看它前面出现的那三个不同的是什么,因为刚被使用,保留,剩下那一个被替换

  1. ..
  2. ..
  3. ..
    比它小的加一是因为比它大的加一没有意义
    四个Cache块只需要2个bit位计数

考虑了局部性原理,近期被使用的,在不久的将来也很有可能被再次访问,淘汰最久没访问过的
Cache命中率高,若频繁访问的主存块数>Cache块数,也有可能发生抖动

最不经常使用算法LFU least frequently used
为每一个Cache块设置一个计数器,记录每个Cache块被访问了多少次,Cache满时替换计数器最小的

需要很多个计数器
曾经经常被访问的主存块在未来不一定会被用到,如视频聊天的块,实际运行效率不如LRU