计组-存储系统学习笔记
存储系统
存储器分类
按存取方式分类:
随机存储器(RAM): 存储器中的任何一个存储单元都可随机存储取,但内容断电即失,分为动态随机存储器(DRAM)和静态随机存储器(SRAM)。SRAM比DRAM更快,且不要进行刷新,但也更贵了,所以一般cache由SRAM组成,主存(内存)由DRAM和ROM(BIOS)组成。
只读存储器(ROM): 能随机读出而不能写入(一般做好的时候,就把内容写进去了,用户不能再写),内容断电不失,主要组成外存。广义的ROM是“只读”的,但现在也有很多可擦除,可多次重写的ROM,即用户可写。
存取时间: 存取时间是从启动存储器到完成了一次操作的时间(读或写操作)所以可以分为读出时间和写入时间。
存取周期: 这个是包括了存取时间,还要加上对此存储元的恢复时间,如从第一次开始读或写存储器开始计时,到下一次可以再一次访问(读或写)的时间结束的时间间隔。所以存取周期是大于存取时间的。
DRAM的地址复用技术:主存(内存)会由DRAM和ROM(BIOS)组成,以前对于DRAM都是线性存储的,这样会导致长宽比过大,且地址线过多,因此一般会采用地址复用技术,如果有1024个地址,则线性存储需要10个地址线,但如果存储为矩阵形式分为行和列,只需要5根地址线,先输入5位代表行,后输入的代表列,不过这样片选线也就需要2位了。
程序局部性
时间局部性:如果一个内存的位置被访问了,过不了多久,又会访问这个内存地址,就代表有良好的时间局部性
空间局部性:如果一个内存的位置被访问了,下一次访问的是它附近地址内存位置,就代表有良好的空间局部性。
对于高位交叉编址:因为是顺序存放地址的,即相邻地址的内容很大可能性是存放在同一块存储体中,这样就导致顺序访问时,下一次访问要等待上一次访问后的恢复时间(即要一个完整的存储周期)。这样对空间局部性十分不友好。
比如有4块存储模块(所以2位代表模块号),使用地址0000H,0001H分别访问,高2位代表模块号,所以这个两个连续的地址都是访问第0块(第一个)存储模块,那么第二次访问的时候就要等待第一次访问的完整的存储周期时间。
但如果是低位交叉编制因为是低2位代表存储模块号,所以两次分别访问的是第0块和第1块,这样如果是顺序访问,第一次访问完后,在第0块进行恢复的时间时,cpu可以直接对第1块进行访问,这样等待时间只是一次存取时间了。
MAR的位数决定了主存地址空间的大小。
MDR的位数即和存储字长一样。
主存和CPU的连接
位扩展(字增长):多个存储芯片的地址端,片选端和读写控制端相应并联,数据端分别引出,在某一个时刻会选中所有的芯片。
字扩展(字数增加):增加存储器中字的数量,多个存储芯片相联,某个时刻,通过译码器和片选线相连选中一个芯片。
字位同时扩展:一般先进行位扩展,从而有多个存储芯片为一组,然后再以组为单位进行字扩展。
磁盘存储器
对于磁盘的存取时间=寻道时间+延迟时间(旋转定位到扇区的时间)+传输时间。存取最小单位为一个扇区(即一块),其中存取一个扇区的平均延迟时间为旋转半周的时间(定位扇区最小可能不用转,最大即转一圈,所以平均为半转的时间)。
cache
cache的存在是基于程序局部性原理,将活跃的数据(经常访问的)保存至cache中
cache与主存之间的映射:首先要根据cache的行(块,槽)的大小(位数)来划分出主存应该有多少块对应大小相等的块,这样也说明了cache和主存之间的映射是以行(块)的大小为单位,而cache和CPU的交互一般是以机器字长(一字)为单位。
直接映射:主存的内存块号对cache的行数进行取余运算。直接映射算法中主存地址通过中间b位确定访问cache中的第几行,然后前a位标记位数和cache中保存的标记位进行比较,如果一致即成功映射,当然一般还会有一个有效位(判断当前数据是否有效)。
全相联映射:为实现这种方式,一般使用相联存储器。
组相联映射:首先根据有多少组进行直接映射,然后组内进行全相联映射。假设cache有n行,如果是2路组相联即代表每组有2行共n/2组,如果是1路组相联即变为了直接映射的算法,如果是n路组相联,代表共1组即变为了全相联映射算法。
cache和主存之间的数据调度是由硬件自动完成的,对所有程序员都是透明的。
cache每行的位数分布:cache是以行(块,槽)为存储单元(即和主存交换数据的最小单元)但为了和主存地址对应上,所以cache每行不止需要保存数据位,还需要保存一些标志位,如有效位,脏位(有无对此内容进行修改,一般是回写法需要),标记位(即确定当前行保存的数据是对应于主存中的那一块)。
对于标记位,如果是直接映射:标记位位数为=主存块号位数-cache行号位数。
如果是全相联映射:标记位位数为=主存块号位数。
如果是组相联映射:标记位位数为=主存块号位数-cache组号位数。
例题
个人解题:主存地址32位,按字节编制,所以主存容量2的32次方字节,每块32字节所以主存有2的27次方块,cache数据区32KB,所以有2的10次方行,因为按直接映射所以27-10=17位标志位,回写法所以要有1位脏位,还有1位有效位,最后加上32X8位的数据,这样每行位数:17+1+1+32X8=275
下图总结了对应3种不同的映射算法,主存地址的划分:
虚拟存储器
主存和辅存共同构成了虚拟存储器,主要是为了解决主存的容量问题。
虚拟存储器将主存和辅存的地址空间统一编址,在此环境下,用户编程涉及的地址是虚拟地址(逻辑地址),cpu在获取虚拟地址后,要将虚拟地址转换为物理地址(主存地址),如果是按照请求页式访问(且有TLB快表)的话,就先将虚拟页号与TLB进行对照,若有则直接将虚拟地址转为物理地址,若未命中,就访问主存中的页表(慢表)如果有,即转换为物理地址,如果还是未命中,就代表缺页,这时就要从磁盘中读出一页然后存入主存中,如果主存已经满了,还要通过替换算法,进行页替换。将虚拟地址转换为物理地址(主存地址)后将主存地址按照组相联映射(或其他两种)算法,查看cache中是否有此块,若有则直接访问,获取此地址的内容,若未命中,则直接访问主存。
虚拟存储器中采用的算法是全相联映射(因为这种命中率最高),且因为CPU是不会直接访问磁盘(外存)的,所以如果缺页,就一定要先将页存储至主存中,然后CPU再访问主存。
对于虚拟地址转为物理地址(主存地址),如果虚拟是采用页式的话,因为页内地址虚拟地址和物理地址是一样的所以不需要改变,需要改变的是高位的页号,即直接通过TLB或页表中虚拟页号对照的页框,进行拼接,将虚拟地址中的虚拟页号直接改为页表中对应主存的页框号即可。
TLB(快表)采用高速相联存储器,速度快来源于硬件本身,相联存储器按内容访问是直接通过硬件来实现的,从而可以并行比较,速度就快了,并不是依赖于算法。而慢表(存储于主存中)对于查找的速度是依赖于查找算法的。
虚拟地址空间和主存实际物理地址的转换,是通过软(操作系统OS)硬件结合实现。对应用程序员透明的,但对系统程序员是不透明的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了