[转帖]存储器系统

存储器,系统 · 浏览次数 : 0

小编点评

**页面式虚拟存储器** 页面式虚拟存储器是一种将程序逻辑结构划分的虚拟存储器。它比逻辑独立的实体拥有更高的组织效率,便于编译、管理、修改和保护。 **段式虚拟存储器** 段式虚拟存储器是一个将程序逻辑结构划分的虚拟存储器,其中每个段都有其独立的页表。每个段的页表记录该段的长度、装入位和页内地址等信息。 **页面替换算法** 页面替换算法是用于页面替换的算法,它选择一个缺页的最佳页面来替换缺页。常见算法包括LRU算法、LFU算法、FIFO算法和Cache替换策略。

正文

https://juejin.cn/post/6844903472341450765

 

基础概念

  • 存储器容量:取决于寻址方式,16位机能产生16位地址,因此能在2^16=64K个存储器单元中寻址,同理,32位机能使用包含4G个单元的存储器。
  • MAR(存储器地址寄存器)和 MDR(存储器数据寄存器):通过这两个寄存器实现处理器和存储器之间的数据传输。如果MAR的长度是k位,MDR的长度是n位,那么存储器部件可以包含2^k个可编址单元,在一个存储周期中,n位数据在处理器和存储器之间传输(在包含k条地址线和n条数据线的处理器总线上完成)
  • Read/^(Write)控制线:处理器从存储器读地址时,先把存储单元的地址装进MAR,然后把R/^(W)线设成1(读信号);写入数据时,先把要写入的存储单元地址装入MAR,并把数据装入MDR,再把R/^(W)线设成0(写信号)。
  • MFC(存储器功能完成控制线):读取数据的过程中,R/^(W)线设成1后,存储器做出响应,把指定位置的数据放到数据线上,并发送MFC信号确认这个操作,收到MFC信号,处理器就把数据线上的数据装入MDR寄存器。
  • 块传输:读写操作访问主存中一个连续的存储单元地址时采用。只需要将块的第一个单元地址发送到存储器中。
  • 存储器延迟:指向或从存储器传输一个字的数据所要花费的时间。读写单个字的时候可以用来标志存储器的性能,但对于一块数据还依赖与后继字节的传输速度以及块的大小。
  • 存储器带宽:单位时间能传输的位或字节的数量。
  • 衡量存储器的速度:
    • 存储器访问时间:读信号和MFC信号之间的时间。
    • 存储器周期时间:相继两个存储器操作考试时刻之间的最小时间延迟,如两个读操作之间的时间。一般比访问时间长。
  • 随机访问存储器(RAM):任何存储单元的读写访问都能在固定时间段(与地址无关)内完成,主要与连续存储设备(如磁带)区分开。
  • 主存储器:简称主存,是计算机系统的主要存储器,用来存放计算机正在执行的大量程序和数据,主要由MOS半导体存储器组成。
  • 外存储器:简称外存,是计算机系统的大容量辅助存储器,用于存放系统中的程序、数据文件及数据库。与主存相比,外存的特点是存储容量大,位成本低,但访问速度慢。目前,外存储器主要有磁盘存储器、磁带存储器和光盘存储器。
  • 高速缓存:一个容量小、速度快的存储器,插在容量大、速度慢的主存与处理器之间,用来缓解计算机处理器处理指令和数据的速度比从存储器中获取指令和数据速度快的问题。
  • 虚拟存储器:现代计算机系统中,物理主存空间没有处理器生成的地址所能跨越的空间大,无法将所有程序一次性放入主存,因此通过虚拟存储器技术实现在执行中把将要执行的程序块和数据块自动移入主存。
  • 虚拟地址(逻辑地址):使用虚拟存储器技术时处理器产生的地址(与物理存储器的存储位置不同)。
  • 存储器管理部件:用来实现虚拟地址空间到数据实际所在的物理存储器上的映射。
  • CS(芯片选择):在多芯片存储器系统中选择一个给定的芯片。
  • MOSC(Metal-Oxide-Semiconductor Capacitor)金氧半电容,一种两端控制的半导体元件。

半导体随机存储器

半导体存储器出现在20世纪60年代,速度快,成本低,取代了磁芯存储器。

  1. 组织结构:
    • 结构图:
    • 结构特点:阵列形式、每个单元存储一位(bit)。一个单元行组成存储器中一个字,所有单元行通过一条公共的线连接。图中包含8个字,每个字包括4位,称为8x4的结构,一共需要11条引线,其中地址线3条,数据线4条,控制线2条(CS和R/^(W)),还有2条线用于 电源支持 和 接地。
  2. 静态随机存储器(SRAM):
    • 特点:

      利用双稳态触发器来保存信息,只要不断电信息就不会丢失。

      集成度低,成本高,功耗较大,通常作为Cache的存储体。
    • 存储单元:

      结构:两个反相器交叉耦合形成一个锁存器,通过两根晶体管(起开关作用,在字线的控制下打开或关闭)分别连接到两根位线上


      工作原理:字线低电平时晶体管断开,锁存器保存;读操作时,字线激活,闭合开关,如果bit被设置为与单元状态相同的状态,^bit被设置为相反的状态,位线一段的读出/写电路检测状态并设置输出;写操作时,先把适当的值放到bit,把其补值放到^bit,然后激活字线,位线上需要的信号由读出/写电路产生。
  3. 动态随机存储器(DRAM):
    • 特点:

      利用MOS电容存储电荷来保存信息,使用时需要不断给电容充电才能保持信息。

      动态存储器电路简单,集成度高,成本低,功耗小,但需要反复进行刷新(Refresh)操作,工作速度较慢,适合作为主存储器的主体部分。
      存储单元:

      结构:电容器 和 晶体管(与字线和位线相连) 构成


      工作原理:存储信息时,晶体管打开,电压加到位线(图中垂直)上,使电荷存到电容中,之后关闭晶体管,这时电容会开始漏电。读操作时,选中的晶体管打开,连接到位线上的传感放大器检测电容上的电荷是否高于某个阀值,若高于,则将位线上的电压提高成满电压(同时将电容器电荷充满),否则将位线拉成低电平,保证电容没有电荷,因此读操作时会自动刷新。
    • 组织结构及工作原理:
      读写操作期间,行地址首先被加载,芯片响应在 行选通地址(RAS)输入线 上的脉冲信号,把行地址装入行地址锁存器中,选中行上的所有单元被读取和刷新。列地址随后被加载到地址引脚,然后在列地址选通(CAS)信号控制下被装入列地址锁存器。为了让RAS和CAS信号从高电平变成低电平时使地址锁存,这两个信号被设计成低电平有效。此外,为了减少外部连接的引脚数,行地址和列地址采用多路复用。

    • 同步动态随机存储器(SDRAM):操作直接与时钟信号同步,不需要CAS线上提供外部产生的脉冲去选择连续的列,芯片内部用列计数器和时钟信号来提供需要的控制信号。有内置的刷新电路,其中一部分是刷新计数器,提供要刷新的行地址。
    • 双倍数据速率SDRAM(DDR SDRAM):存储器单元阵列被组织成两个存储体,每个可以单独访问。一个给定块中连续的字被存储到不同的存储体中,实现在一个时钟信号的连续边沿上传输两个字。

只读存储器

只读存储器ROM是一种存储固定信息的存储器,其特点是在正常工作状态下只能读取数据,不能即时修改或重新写入数据。电路结构简单,且存放的数据在断电后不会丢失,特别适合于存储永久性的、不变的程序代码或数据,计算机中的自检程序就是固化在ROM中的。ROM的最大优点是具有不易失性。

  1. 掩模只读存储器(MROM):又称固定ROM。这种ROM在制造时,生产厂家利用掩模(Mask)技术把信息写入存储器中,使用时用户无法更改。
  2. 可编程只读存储器(Programmable ROM):是可由用户一次性写入信息的只读存储器,一经写入就不能再更改。
  3. 光擦可编程只读存储器(EPROM):其中的内容可以用特殊的装置进行擦除和重写。EPROM出厂时,其存储内容为全“1”,用户可根据需要改写为“0”,当需要更新存储内容时,可将原存储内容擦除(恢复为全“1”),以便写入新的内容。
  4. 电擦可编程只读存储器(EEPROM或E2PROM):可以用电气方法将芯片中的存储内容擦除,擦除时间较快,甚至可以在联机状态下操作。
    EEPROM既可使用字擦除方式又可使用块擦除方式,使用字擦除方式可擦除一个存储单元,使用块擦除方式可擦除数据块中所有存储单元。
  5. 闪速存储器(Flash ROM):一种块擦写型存储器,是一种高密度、非易失性的读/写半导体存储器。在某种低电压下,其内部信息可读不可写,在较高的电压下,其内部信息可以更改和删除。

高速缓存

利用程序访问的局部性原理,把程序中正在使用的部分(活跃块)存放在一个小容量的高速Cache中,使CPU的访存操作大多针对Cache进行,从而解决高速CPU和低速主存之间速度不匹配的问题,使程序的执行速度大大提高。最先需要的数据项应该被放入高速缓存,同时最好将临近的多个项也放入。

  1. 地址映射
    • 直接映射:



      主存块直接映射到Cache上,每个主存块只有一个固定位置可存放,容易产生冲突,只适合大容量Cache采用。
    • 相联映射:



      主存块可以放置到高速缓存中任何一个位置上,Cache的利用率高,块冲突概率低,只要淘汰Cache中的某一块,即可调入主存的任一块。但是,由于Cache比较电路的设计和实现比较困难,这种方式只适合于小容量Cache采用。
    • 组相联映射:



      将直接映射和相联映射结合起来使用,高速缓存被分成组,主存块可以被映射到特定组中的任意位置。
  2. 替换算法:
    • LFU(Least Frequently Used,最不经常使用)算法:将一段时间内被访问次数最少的那个块替换出去。每块设置一个计数器,从0开始计数,每访问一次,被访块的计数器就增1。当需要替换时,将计数值最小的块换出,同时将所有块的计数器都清零。不能严格反映近期访问情况,新调入的块很容易被替换出去。
    • LRU(Least Recently Used,近期最少使用)算法:把CPU近期最少使用的块替换出去。这种替换方法需要随时记录Cache中各块的使用情况,以便确定哪个块是近期最少使用的块。每块也设置一个计数器,Cache每命中一次,命中块计数器清零,其他各块计数器增1。当需要替换时,将计数值最大的块换出。实现起来比较复杂,系统开销较大,保护了刚调入Cache的新数据块,具有较高的命中率,可达90%。
    • 随机替换算法:不管Cache的情况,根据一个随机数选择一块替换出去。随机替换算法在硬件上容易实现,速度快。但是降低了命中率和Cache工作效率。
  3. 写操作策略:
    • 写回法(Write-Back):当CPU写Cache命中时,只修改Cache的内容,而不是立即写入主存;只有此块被换出时才写回主存。这种方法写Cache和写主存异步进行,减少了访问主存的次数,但是存在数据不一致的隐患。实现这种方法时,每个Cache块必须配置一个修改位,以反映此块是否被CPU修改过。
    • 全写法(Write-Through):当写Cache命中时,Cache与主存同时发生写修改。使用这种方法写Cache和写主存同步进行,因而较好地维护了Cache与主存的内容一致性。实现这种方法时,Cache中的每个块无需设置修改位以及相应的判断逻辑,但由于Cache对CPU向主存的写操作没有高速缓冲功能,从而降低了Cache的功效。
    • 写一次法(Write-Once):结合写回法和全写法的写操作策略,写命中与写未命中的处理方法与写回法基本相同,只是第一次写命中时要同时写入主存,以便于维护系统全部Cache的一致性。
  4. 预取:通过预取指令使地址指向的数据被装入高速缓存,避免读失效时处理器暂停引发的开销。最好在处理器执行不会引发失效指令时开始预取,这样主存访问就能与处理器运算重叠。预取也可以通过硬件实现,这需要增加用于发现存储器引用模式并根据这个模式预取数据的电路。
  5. 无锁定高速缓存:能支持多个未响应失效的高速缓存,允许处理器在高速缓存响应失效时仍能访问他(传统的高速缓存在预取操作完成前会阻止其他对高速缓存的访问,在它响应一次失效时称他为被锁定了)。一次只能响应一个失效,因此需要引入用于跟踪所有未响应失效的电路。

虚拟存储器

一个容量非常大的存储器的逻辑模型,借助于磁盘等辅助存储器来扩大主存容量。当计算机系统的物理主存空间没有处理器生成的地址所能跨越的空间大时,由操作系统把主存和辅存这两级存储系统管理起来,实现自动覆盖。一个大作业在执行时,其一部分地址空间在主存,另一部分在辅存,当所访问的信息不在主存时,则由操作系统而不是程序员来安排I/O指令,把信息从辅存调入主存。

  1. 页式虚拟存储器:
    • 每页长度固定的,建立方便,新页调入也容易但是由于程序不可能正好是页面的整数倍,最后一页的零碎空间将无法利用而造成浪费。
    • 以页为基本单位的虚拟存储器,虚存地址到实存地址的变换是通过存放在主存中的页表来实现。
    • 不是逻辑上独立的实体,这使得程序的处理、保护和共享都比较麻烦。
    • 虚存地址由高位的逻辑页号和低位的页内地址组成。实存地址由高位的物理页号和低位的页内地址组成。虚存地址到实存地址的变换是通过主存中的页表实现。页表中,对应每一个虚存逻辑页号有一个表项,表项内容包含该逻辑页所在的主存页面地址(物理页号),用它作为实存地址的高字段,与虚存地址的页内地址字段相拼接,产生完整的实存地址,访问主存,过程如图:

    • 快表和慢表:

      用途:快表由硬件组成,比页表小得多,存放当前最常用的页表信息,作为慢表部分内容的副本。存储在一个小容量的快速存储器中,该存储器是按内容查找的相联存储器,可按虚页号名字进行查询,迅速找到对应的实页号。

      查询过程:查表时,由逻辑页号同时去查快表和慢表。当在快表中有此逻辑页号时,就能很快地找到对应的物理页号送入实主存地址寄存器,从而做到虽采用虚拟存储器但访主存速度几乎没有下降;如果在快表中查不到,那就要花费一个访主存时间去查慢表,从中查到物理页号送入实存地址寄存器,并将此逻辑页号和对应的物理页号送入快表,替换快表中应该移掉的内容。

  2. 段式虚拟存储器:
    • 按照程序的逻辑结构划分的,各个段的长度因程序而异,容易在段间留下不能利用的零碎空间,造成浪费。
    • 具有逻辑独立性,所以易于实现程序的编译、管理、修改和保护,也便于多道程序共享。
    • 段表:需要一个段表。段表一般驻留在主存中,其中每一行记录了(虚拟)段号、装入位、段起点和段长等信息。结构如图:
    • 访问过程:CPU根据虚地址访存时,首先将段号与段表的起始地址相拼接,形成访问段表对应行的地址,然后根据段表的装入位判断该段是否已调入主存。若已调入主存,则从段表读出该段在主存中的起始地址,与段内地址(偏移量)相加,得到对应的主存实地址。

  3. 段页式虚拟存储器:把程序按逻辑单位分段,再把每段分成固定大小的页。主存空间也划分为若干个同样大小的页。虚存和实存之间以页为基本传送单位,每个程序对应一个段表,每段对应一个页表。虚地址包含段号、段内页号、页内地址三部分。CPU访问时,首先将段表起始地址与段号合成,得到段表地址,然后从段表中取出该段的页表起始地址,与段内页号合成,得到页表地址,最后从页表中取出实页号,与页内地址拼接形成主存实地址。
  4. 页面替换:
    • 常用算法:LRU算法、LFU算法、FIFO算法
    • 与Cache替换策略的不同:

      缺页至少要涉及一次磁盘外存存取,读取所缺的页,因缺页损失要比Cache未命中大得多。

      页面替换是由操作系统软件实现的,而Cache的块替换则是由硬件实现的。

      页面替换的选择余地很大,属于一个进程的页面都可替换。

磁性硬盘

磁盘系统中存储介质由安装在一个轴上的一个或多个磁盘组成,每个盘上覆盖着一层磁性薄膜,通常两面都有。盘放在一个旋转的驱动器上,使磁性表面在读写磁头附近移动,各个磁盘旋转速度统一,每个磁头包括一个磁轭和一个磁性线圈。👉视频:How a Hard Drive works

  • 磁盘:装配的盘体
  • 磁盘驱动器:电机装置,旋转磁盘和移动读写磁头。
  • 磁盘控制器:控制系统运作。
  • 写操作:磁性线圈施加适当极性的电流脉冲将数字信息存储到磁性薄膜上,这使磁头下的薄膜区域的磁化方向与施加的磁场同向。
  • 读操作:磁性薄膜相对磁轭的运动导致磁头附近的磁场发生变化,在磁性线圈中感应出电压。由控制电路检测到的电压正负判断磁膜的磁化状态。
  • 相位编码(曼彻斯特编码):如果二进制状态0、1用磁化两个相反状态表示,那么只有在位流中0变成1或者1变成0时磁头才能感应出电压,而一长串的0或1只有在这个串的开头和结尾才能产生感应电压。为了判断存储的连续的0或1的个数,必须用一个时钟提供同步信息。而相位编码把时钟信息结合到数据中,使每个位都有磁性变化发生。
  • 读写过程:读写磁头与转动的盘面保持一个很近的距离,以此来获得较高的位密度和可靠的读写操作。当磁盘以一个稳定的速度旋转时,在盘面和磁头之间会产生一个空气压力,迫使磁头远离盘面(可用弹簧装置抵消这个力,缓解可能造成的起伏)。
  • 温彻斯特技术:将盘体和磁头放在一个密封的、对空气进行过滤的外壳中,使里面不存在灰尘微粒。这样,磁头可以离磁化轨迹表面更近,数据也就能以更高的密度存放,磁道之间的距离也越近。
  • 磁盘的组织结构:磁盘的盘面被分成同心的磁道,每个 磁道 又分成 扇区(扇形的),各个表面上相同磁道的集合形成逻辑上的柱面。数据位顺序存在每个磁道中,每个扇区通常包含512个字节。数据前面有一个扇区头,包含(标志)寻址信息,用来在选定的磁道上找到需要的扇区。数据后由纠错码(ECC)组成附加位,用来检测读写时可能发生的错误。两个扇区之间存在一个扇区间隙。

与[转帖]存储器系统相似的内容:

[转帖]存储器系统

https://juejin.cn/post/6844903472341450765 基础概念 存储器容量:取决于寻址方式,16位机能产生16位地址,因此能在2^16=64K个存储器单元中寻址,同理,32位机能使用包含4G个单元的存储器。 MAR(存储器地址寄存器)和 MDR(存储器数据寄存器):通

[转帖]服务器体系(SMP, NUMA, MPP)与共享存储器架构(UMA和NUMA)

1 3种系统架构与2种存储器共享方式 1.1 架构概述 从系统架构来看,目前的商用服务器大体可以分为三类 对称多处理器结构(SMP:Symmetric Multi-Processor) 非一致存储访问结构(NUMA:Non-Uniform Memory Access) 海量并行处理结构(MPP:Ma

[转帖]磁盘缓存和内存缓存的区别

内存缓存 高速缓存(英语:cache,英语发音:/kæʃ/ kash [1][2][3],简称缓存),其原始意义是指访问速度比一般随机存取存储器(RAM)快的一种RAM,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。 原理 Cache一词来源于1967年的一篇电子工程期刊

[转帖]使用 Crash 工具分析 Linux dump 文件

前言 Linux 内核(以下简称内核)是一个不与特定进程相关的功能集合,内核的代码很难轻易的在调试器中执行和跟踪。开发者认为,内核如果发生了错误,就不应该继续运行。因此内核发生错误时,它的行为通常被设定为系统崩溃,机器重启。基于动态存储器的电气特性,机器重启后,上次错误发生时的现场会遭到破坏,这使得

[转帖]/etc/passwd文件 各个字段详解

转载自:https://www.sohu.com/a/320177323_505901 /etc/passwd文件: 系统用户配置文件,存储了系统中所有用户的基本信息,并且所有用户都可以对此文件执行读(r)操作。 查看文件内容: /etc/passwd文件内容非常规律,每行记录对应一个用户。 每行用

[转帖]我偷偷学了这 5 个命令,打印 Linux 环境变量那叫一个“丝滑”!

https://xie.infoq.cn/article/2acfef8d543517619c9202e4e 一、概述 在基于 Linux 和 Unix 的系统中,环境变量是一组动态命名值,存储在系统中,供在 shell 或子 shell 中启动的应用程序使用。简单来说,环境变量是具有名称和关联值的

[转帖]队列深度对IO性能的影响

https://www.modb.pro/db/43710 几年前一个客户的Oracle数据库经常HANG,老白帮他分析了一下,结论是存储老化,性能不足以支撑现有业务了。正好用户手头有个华为S5600T正好从核心系统中换下来放着没用,就把这个存储换上去了。换了新存储后,系统总体确实有所改善。数据库不

[转帖]Linux中关于库

库 1.库文件2.库的分类3.静态库和共享库的区别 1.库文件 库是一组预先编译好的方法的集合. /lib 根目录下的库文件 /usr/lib Linux系统存储库的位置一般存放在/lib 和/usr/lib(64位系统/usr/lib64) 库的头文件放在/usr/include 2.库的分类 静

[转帖]队列深度对IO性能的影响

https://www.modb.pro/db/43710 几年前一个客户的Oracle数据库经常HANG,老白帮他分析了一下,结论是存储老化,性能不足以支撑现有业务了。正好用户手头有个华为S5600T正好从核心系统中换下来放着没用,就把这个存储换上去了。换了新存储后,系统总体确实有所改善。数据库不

[转帖]一致性哈希 和 Redis 集群分槽

前言 伴随着系统流量的增大,出现了应用集群。在 Redis 中为了保证 Redis 的高可用也为 Redis 搭建了集群对数据进行分槽存放。在 Mysql数据库要存储的量达到一个很高的地步的时候,我们会对数据库进行分库分表操作。OK,到这儿先假设我们不知道什么是集群、什么是分库分表,我们先来看一个数