直接贴王道的课件(懒得画图)
从上图可以看出:
举个例子,假如不存在主存,CPU 运算的快,就需要不断地从主存里面取数据(执行load指令),但是主存读取完有个恢复时间,所以cpu不能一直持续的从主存里面取数据,也可以说CPU运算完了主存还处在恢复时间,那CPU就得等主存恢复完毕才可以继续读取,这个等待时间CPU就空闲着了,为了缓解这种情况,引入了Cache。Cache集成在CPU内部。
问老师的得到一些拓展(膜拜:
我们现在都讲计算机多少核之类的,每个核里面有自己独立的一套寄存器,每个线程运行在一个核心上且只能操作自己核心的寄存器。核之间相互独立,且经过逻辑封装后对开发者不可见。
从图里可以看出,核内
存在运算器、寄存器之类的部件,数据从主存写入Cache,再读到核内进行运算,算完后在写回Cache,再写回主存。
稍作了解即可
随机存取存储器(RAM)读写任何一个存储单元的时间相同,顺序存取存储器(SAM)的读写时间与存储单元的位置有关,直接存取存储器(DAM)有两者的特性,相联存储器(CAM)根据内容找到存储单元进行读写。
RAM是随机存储器,ROM是只读存储器
内存和Cache是易失性存储器,断电后里面的数据就丢失了,磁盘、硬盘之类的是非易失性存储器,断电后的数据不会丢失。
以前是机械硬盘,所以开机比较慢,我记得我小学时候家里电脑开机要三四分钟,现在换成固态硬盘SSD了,开机基本几十秒,快的十几秒就行,这是因为开机时要运行操作系统和一些软件,那就要把他们调入主存,而固态硬盘读写速度比机械硬盘快几倍,所以现在开机速度比以前快了,当然这只是开机速度一个方面,别的方面肯定也有优化。BIOS之类的集成在主板上。
一些概念直接贴王道课件了
建议去听王道的课。视频里会讲半导体元件是怎么存储0和1的。
贴王道的课件,懒得画图
MAR里放的是一个地址,输入译码器,译码器翻译一下得到使得某根线“有效”(存储体中红色的线,选通线),之后那根线“指向”的存储单元表示的数据通过数据线(存储体中绿色的线)被传到MDR里面。
CPU通过数据总线和MDR连接,进而从MDR里取走数据。数据总线的宽度=存储字长
CPU通过地址总线和MAR连接,进而向MAR里写数据,再通过控制总线等一些机制实现取出数据
问老师得到的回答:
如果一定要细致分析的话,和任何组件直接相连的都只有总线,组件通过把数据放到总线上和从总线取数据来完成数据传输,类似于水管系统和水管上的蓄水槽的关系,蓄水槽通过开关接口来完成取水和放水.
存储芯片上有很多的针脚,这些针脚的作用是连接外部电路,如连接对应的地址线、数据线、读写线等。
现在计算机按字节编址,寻址方式也有很多种,如按字节寻址、按字寻址、按半字寻址等等。
从图中可知:由总容量可以看出地址线数目,不同的寻址方式单元数目和每个单元的大小也不同。
ChatGPT:
DRAM(动态随机存取存储器)采用的是栅极电容,SRAM(静态随机存取存储器)采用的是双稳态触发器。
之前提到我们采用刷新的策略来保证存储信息的正确性。
图中提到了一般是2ms需要刷新一次,通过硬件进行刷新,每次刷新一行存储单元,图中给出了三种方案,分别是每次读写后都刷新,集中一段时间刷新,在2ms内每行刷新一次即可,其中第三中方案的效率最高,比如CPU需要用到第4行存储单元,此时不需要第5行存储单元,于是我们可以蹭着这个时候刷新第5行的存储单元,缩短了死时间但没有消除。唯一没有死时间的是第一种分散刷新,但是效率最高的是第三种。
之前提到,MAR里存储的地址信号给到译码器,译码器解码后找到一根选通线施加高电平,即选中了这根线所在的存储单元。
所以如果地址线有3根,就是23=8个地址,需要8根选通线来联系存储体,如果扩大到20根地址线,就需要220这么多根线来联系存储体达到寻址的目的。
显然这样的成本很大,于是存储体编址时分为了行地址和列地址,比如8位的地址0x11223344,那1122作为行地址,3344作为列地址,于是我们只需要24+24这么多的选通线,比起之前28是一个很大的优化。那20位的地址就只需要211次方,显然2048根线比起211能节省很多。
那地址是同时送到行和列地址的译码器吗,其实不是,而是先把行和列地址放入到一个缓冲区里面,再用同一批线先后将行地址和列地址送入相对应的译码器,这样优化后只需要以前一半的地址线即可完成工作,比如8位地址需要8根地址线,现在优化后只需要4根地址线,线更少了延迟也会更低。
地址复用减少了地址线的数目,本质是行列地址走同一批线送入译码器。而地址线减半,芯片的金属引脚数目也可以减半。
现在其实用的都是SDRAM,比如我们常听见的DDR4内存条之类的,是RAM技术的进化版本,更快更好。
不是只能读的才可以算是ROM,现在的SSD等技术都是基于ROM发展起来的,可以称作是ROM的升级版
问同学得到的回答:闪存和固态也是rom,是rom技术升级版,在课本上学到的rom是1990年左右生产的rom,固态和闪存是2010年生产的rom,本质不变,技术更新
直接贴王道的课件
MROM(Mask Read-Only Memory):厂家按客户需求定制,可靠性高,成本高,在生产中写入信息,任何人无法修改,适合批量定制。
PROM (Programmable Read-Only Memory):用户可以用专用的PROM写入信息,写过一次后就不可更改。
EPROM (Erasable Programmable Read-Only Memory):允许用户写入,并用特殊方法擦除信息,修改次数有限。分为UVEPROM和EEPROM,UVEPROM是用紫外线擦除,紫外线照射半小时后全部擦除,EEPROM是电擦除,用电可以擦除特定的字。
闪速存储器(Flash Memory):如U盘、SD卡,可多次快速的擦除重写,由于闪存需要先擦除再写入所以写的速度比读的慢,此外闪存的每个存储元都只要一个MOS管,所以芯片也比较小
SSD:就是我们现在讲的固态硬盘,也是基于闪存技术发展起来的,速度快,功耗低,成本高
U盘和固态硬盘都是闪存存储器的一种。U盘通常采用NAND闪存,而固态硬盘则通常采用NAND闪存或者更高速的3D XPoint技术等。虽然它们都属于闪存存储器,但它们的设计和用途有很大的区别。U盘通常用于存储和传输数据,而固态硬盘则用于计算机的主要存储设备,用于安装操作系统和存储应用程序和文件等。此外,固态硬盘的读写速度和稳定性通常比U盘更高。
启动系统得借助BIOS程序,开机时RAM由于断电没有数据,所以BIOS程序需要被集成在ROM上,所以理解上可以说主存是由RAM和ROM组成的。一般来说会把ROM设计在低地址,RAM设计在高地址。
与ChatGPT的对话
CPU通过总线与主存储器相连,中间会借助一些寄存器,比如MAR和MDR,总线又分为数据总线和地址总线。
位扩展扩展的是主存的存储字长
以下图为例,当存储芯片的存储字长为1位时,存储芯片每次只能通过数据总线传输1位,而从图中可以看出数据总线的容量有8位(D0-D7),所以为了提高数据传输的效率,我们采用位扩展的方法,让第二块芯片也连接数据总线,使得第二块芯片读出的那一位也被输出到数据总线里面,此时通过数据总线就传输了两位数据,同理再连接6块芯片,那数据总线每次就能传输8位了,此时就可以把8个8KX1位的存储芯片看作1个8KX8位的芯片。我简单理解成通过位扩展把数据总线的位数占满了,提高了传输效率。
下面这张图和上面表达的意思是一样的
字扩展扩展的是主存容量
建议去看王道视频,里面讲的比较详细
以下图片选法为例,数据总线被占满了,地址线空了三根。下图的CPU具有216的编址能力,而存储芯片只有213个存储地址,所以我们可以通过一个38译码器和总线再连接7个存储芯片(加上本身就是一共8个),译码器的作用是每次只选中一个存储芯片,而通过图中的地址可以看出,通过译码器存储地址可以是连续的,连续的地址便于存取。此时一共就有了216个地址,充分利用了CPU的寻址能力。
上面是片选法,利用译码器每次唯一选中一个存储芯片,好处是地址连续,还有一种是线选法。
下面的就是线选法,图中的A13和A14分别连在两块芯片上,与片选法不同的是这种办法不能保证只有一块芯片被选中,比如图中的两块芯片同时被选中,就一共有十六位会被输出到数据总线中,而数据总线的位数是8位,所以数据会“碰撞”出错,而且相对于片选法地址也不是连续的,所以在实际情况下字扩展都会选择片选法。
线选法和片选法的比较
线选法 | 片选法 |
---|---|
电路简单 | 电路复杂 |
地址不连续 | 地址连续 |
n条线n个选片信号 | n条线2n个选片信号 |
既扩展了存储字长也扩展了容量
38译码器里有个部分叫使能端,当使能端有效时译码器才生效,如图中的G1、G2A、G2B,当这三个全部有效时译码器生效,因为在最开始电路信号可能不稳定,这个设计可以等电路信号稳定后再让译码器生效,即保证了信号的有效性。
CPU现在MAR和MDR里准备好数据,然后送出地址信号,因为最开始电流可能不稳定,所以等地址信号稳定后再使得MREQ有效,之后译码器生效选中某块芯片工作。
图中左下角有个时序图,地址信号生效后过一段时间CPU让译码器生效即CS信号生效,芯片被选中工作后就可以通过数据总线传输数据,所以CS信号生效后过了一段时间数据总线里出现数据并稳定下来,数据稳定下来后地址信号失效。
简单来说,送出地址信号,信号稳定后选中芯片,数据总线里数据稳定后地址信号失效。
两个问题
双端口RAM可供两个核访问,有以下几种情况:
出现冲突时让双端口RAM的某一端关闭(置忙),让另一端先用,也可以说两个端口排个队,具体做决策和电路有关。
多模块存储器说白了就是多个主存。
看下面这张图得从多位交叉编址和低位交叉编址入手。可以看出高位交叉编址在一个存储器里的地址是连续的,而低位交叉编址的地址在多个存储器里是连续的。由于存取周期包括存取时间和恢复周期,处于恢复周期时CPU不能读写,所以低位交叉编址可以使得存储器处于恢复周期时CPU能够存取另一块芯片,有点“异步”的思想,而从两种编址方式的时序图也可以看出,低位交叉编址的效率更高。
而每个存储器之间都是独立的,所以相互之间可以并行运行,也可以交叉运行。
为什么探讨的是“连续访问”的情况?因为我们存放的数据大多都是连续的。
低位交叉编址这种情况下CPU像”流水线“一样的去读写存储器,在宏观上是并行的,微观上是串行的,有点像进程调度。为了使得“流水线”不间断,应满足m>=存取周期/存取时间,m为存储体的数量。
确定一个地址属于第几个存储体:由于地址被划分为体内地址和体号,所以看体号即可。(比如四块存储器,就以低两位为体号即可)。
即每个存储单元存储多个字(一般一个存储单元都只存储一个字),然后这多个字一次性被读取,好处是快,缺点是可能会取到冗余的数据,因为不能单独取某个字。
多体并行存储器分为高位交叉编址和低位交叉编址,由于低位交叉编址效率更高,所以后面提到的多体并行存储器都指低位交叉编址的多体存储器,当存储体的数量m>=存取周期T/存取时间r时,可以达到最高的效率,即CPU存取一个字都只需要存储时间r.
而单体多字每次可以取m个字,所以存取一个字的时间等于字的存取周期T/m。
比如存取周期为4r,存取时间为r时:若采用有4个存储体的多体并行存储器,则存取一个字的时间为r。若采用4个字的单体多字存储器,存取一个字的时间也约为r。所以两者的效率其实差不多。
我们组双通道内存时就是用到的就是低位编址的多体并行存储器,两个内存采用频率和容量一样的,频率不同会发生降频,容量不同时会有部分编址以单通道的形式访问。
磁盘上涂了磁性介质,并通过了一些物理知识,如电磁感应等待来存储0和1。
正面
背面
图形比话好理解
从上面每个扇区存储的信息相同,且每条磁道扇区数相同,显然可以推出每条磁道能存储的信息相同
图中的60道/cm就是道密度,表示1cm(单位长度)内有多少条磁道
600bit/cm表示位密度,表示1cm(单位长度)内存储信息的多少。
面密度=道密度 × \times ×位密度
寻道时间:存取时磁头要先找到数据在哪条磁道上,磁头是一个机械装置,一般由马达驱动(可以b站找机械硬盘工作的视频)
旋转延迟时间:找到磁道后要去找到对应的扇区
传输时间:传输数据花费的时间,就是划过扇区的时间
比如我规定单位时间为1s,磁盘1秒能转60圈,即60转/秒,即1s内可以读60条磁道这么多的数据,记每条磁道能够存储的信息大小为D,那数据传输率就是60D。那推广到磁盘1秒转r圈,每条磁道能够存储的信息大小为D,数据传输率=D × \times ×r
先确定是哪个磁盘,即驱动器号,然后寻道找到对应的磁道,再确定是哪个盘面(使用哪个磁头),再找到对应的扇区进行存取。
磁盘是串行读写的,同一时刻只能读或者只能写。但是不代表计算机一刻只能运行一个任务,操作系统会调度好,让我们运行多任务时看起来有“并行”的效果
RAID是廉价冗余磁盘阵列,即采用多块磁盘保证数据的安全。RAID0就不做任何措施,而RAID1就直接完全备份一份数据,如果其中一份数据坏了也不要紧,但是需要两倍的容量来存放原来的数据,这样可能有点浪费,所以下面的RAID2、RAID3等都采用了不同的方案为了在容量和安全上取得一个平衡,在保证数据安全的前提下也不会浪费很多存储空间。
王道的思维导图:
要知道RAM、ROM、SAM、DAM是什么,RAM典型的就是主存,ROM比如光盘,SAM比如磁带,DAM比如磁盘。
存储器分级是为了解决速度、容量、价格之间的矛盾
CAM是相联存储器,存储方式是内容指定方式和地址指定方式
一般地址指定方式的存储器都是随机访问的,即读写存储单元的时间与位置无关,直接根据地址找到存储单元即可。
主存与辅存之间的数据调动仅对应用层程序员透明,主存与辅存之间的数据调动由硬件和操作系统完成。
Cache的命中率低时需要从主存中读取数据,所以提高Cache的命中率可以提高系统性能。Cache的命中就是CPU能否在Cache里拿到自己想要的数据。
S R A M 芯片的引脚的最小数目 = 地址线 + 数据线 + 片选线 + 读写控制线 SRAM芯片的引脚的最小数目=地址线+数据线+片选线+读写控制线 SRAM芯片的引脚的最小数目=地址线+数据线+片选线+读写控制线
D R A M 芯片的引脚的最小数目 = 地址线 ( 地址复用技术 ) + 数据线 + 行选通 + 列选通 + 读写控制线 DRAM芯片的引脚的最小数目=地址线(地址复用技术)+数据线+行选通+列选通+读写控制线 DRAM芯片的引脚的最小数目=地址线(地址复用技术)+数据线+行选通+列选通+读写控制线,行选通线可以充当片选线,所以不用加上片选线,特别注意地址复用技术(题目说了是DRAM没指明地址复用技术也默认采用了地址复用技术)
DRAM的刷新策略中只有分散刷新不存在死时间,因为分散刷新把刷新的那部分时间算到存取周期里了,相当于延长了存储周期(读完了还要等这一行刷新完了才算一个存取周期)。集中刷新存在死区,异步刷新缩短了死时间,减少了内存访问延迟(可以一直连续的访问)
EPROM可改写但是不能作为随机存储器,改写次数有限。
DRAM存储一个比特位需要1个MOS管和一个电容,SRAM存储一个比特位需要6个MOS管,所以相同体积下DRAM可以存储更多的信息,故DRAM的集成度更高
一次完整的刷新过程只需要占用一个存储周期,刷新相当于读取,读出来后借助刷新放大器放大后再存回去,刷新放大器每次可以选择一行进行刷新,所以刷新一行的时间相当于读取一个存储单元,即一次完整的刷新过程只需要占用一个存储周期。
题目里的多体交叉存储器没有指明是高位多体交叉存储器就默认是低位交叉存储的。
地址的后几位就能看出这个地址属于第几块芯片,连续访存同一块地址芯片可能发生访存冲突
DRAM的行缓冲区的大小等于一行存储单元的大小
SDRAM是一种同步动态随机存取内存,它可以与计算机的系统时钟同步,从而提高内存的运行速度,也是一种DRAM。
低位多体交叉存储器可以做到一直读取,连续存取m个字所需的时间为 T + ( m − 1 ) r T+(m-1)r T+(m−1)r,T是存取周期,r是存取时间。读取最后一个字所需的时间是T,要等最后一个字恢复完毕才算一个完整的存取周期。
高位多体交叉存储器不能很好的满足程序的局部性原理,满足程序的局部性原理的意思是可以连续访问,因为程序的局部性原理指的是CPU刚刚访问了某个地址,后面CPU的访问多半会在这个地址附近,所以能连续访问的存储体可以更好的满足这种特性,所以低位交叉存储器能满足程序的局部性原理。
字扩展时地址总线的低位先接入存储芯片,高位用来接译码器产生片选信号。(注意字位同时扩展时,不能单看容量来判断需要几根地址线接入译码器,比如4K$\times$4位的芯片构成16KB的存储器,从容量上看一共需要8块存储芯片,但是它还需要位扩展(2个存储芯片并联在一起完成位扩展,相当于分组了),所以字扩展只需要四块芯片接入译码器,也即只需要两个地址线即可。
字位扩展可以抽象为一个矩阵(王道课件里给的是立体图),位扩展等同于行(并联在一起),字扩展等同于列(串联在一起)。
字扩展,位扩展和字位扩展,下面的图来自于这篇博客,说明了位扩展是并联。
算地址时注意按字编址的字是多大,一般告诉你存储字长,计算机字长都相当于告诉你按字编址的字是多大。
减小存储芯片的刷新开销就是减少存储阵列的行数,行数越少刷新的次数少,开销小。
SSD固态硬盘的写速度相对慢,因为要电擦除再写,易磨损(可以理解为擦除次数有限),这是题目里的话。实际使用时我觉得写速度不慢了,而就算有磨损也可以用很多年了,但题目这么说就这么选/doge。
磁盘数据传输速率是的KB里的K是103。
扇区的存取时间 = 寻道时间 + 旋转时间 + 传输时间 + 控制器延迟 扇区的存取时间=寻道时间+旋转时间+传输时间+控制器延迟 扇区的存取时间=寻道时间+旋转时间+传输时间+控制器延迟,就是找到磁道的时间+找到扇区的时间+读取扇区的时间+控制器的延迟。
其中旋转时间就是转半圈的时间,因为计算时取了平均。
有时不会给控制器延迟,给出转速我们就知道了旋转时间,知道转速和一个磁道上的扇区数就知道了单位时间可以读多少个扇区也就知道了读一个扇区的传输时间。
RAID是将多个物理盘组成一个逻辑盘,RAID0没有任何措施,RAID1-5加入了冗余和校验的方法保证数据安全。冗余比如镜像,校验比如奇偶校验。
自己理解可能有误,请大佬斧正。