因为本文基本涵盖了《存储器》这一章的所有知识点,所以篇幅比较长,小伙伴们根据目录自行选择需要了解的部分
主要内容概括:
声明
本文是作者在MOOC上学习哈尔滨理工大学的计算机组成原理课程的学习笔记+个人理解。
电脑中的存储器是用来存储计算机信息的。存储器是电脑系统不可缺少的组成部分之一。
当今的计算机结构以存储器为中心,更是说明了存储器的重要性。
对存储器的分类方法非常多,只要大家给出一个分类标准,就可以进行分类。比如说存储介质、存储位置、作用等等。
我们的教材上给出了三种分类方法
(1)按存储介质分类
①半导体存储(非易失)
TTL(晶体管) 、MOS(金属氧化物半导体)
TTL逻辑的存储器集成度低、功耗高但是速度比较快
MOS型存储器功耗低、集成度高并且速度也不慢
现代存储器,计算机的内存主要是由MOS型半导体构成的
②磁表面存储器(非易失)
磁头、磁载体
磁表面存储器的优点:
磁表面存储器的缺点:
存取速zhidao度较慢,机械结构复杂,对工作环境要求较高。
③磁芯存储(非易失)
硬磁材料、环状元件
早期的计算机最常见的存储器是各种磁芯制成的。这种磁芯存储器已被微型集成电路块上的半导体存储器所取代。
④光盘存储器(非易失)
激光、磁光材料
(2)按存取方式分类
①存储时间与物理地址无关(随机访问)
随机存储器:在程序的执行过程中可‘读’可‘写’
只读存储器:在程序执行过程中只‘读’
②存取时间与物理地址有关(串行访问)
顺序存取存储器,比如磁带
直接存取存贮器,比如磁盘
作为一个消费者,我们当然希望存储器的速度要快、容量大并且价格低。
但是,高速存储来器价格贵,低速存储器价格便宜,如果高速存储器储存量大了,寻址就慢,发挥不了高速存储器的优势。所以,各个源层次的存储器必须达到一定的比例才能充分发挥系统的最大优势和性价比。
通常情况下,计算机里有两个非常重要的存储层次
为什么要分层?
设置主存-辅存层次主要是由于主存造价较高,且所存储的数据是有限的,但是需要保存的数据又很多,依据局部性原理,可以将不常用的数据放置在缓存中,常用的数据放在主存中,这样就相当于扩展了存储空间。总而言之,这一层次解决的是存储空间不足的问题。
在主线那几章笔记里我曾经说过为什么会出现缓存。
CPU的更新迭代速度很快,但是内存的发展很慢,这种情况下CPU和内存这两个部件就会产生一个“剪刀差”,这时推出来一个缓存器“Cache”,缓存器比内存小的多,功耗更高,速度也更快,它里面保存的信息是主存里面一些信息的副本,CPU可以直接访问缓存,通过访问缓存,缓存和主存之间也进行信息交换。
计算机如何管理这些层次?
主存与缓存的数据调度是又硬件完成的,主存与辅存的数据调度是由硬件和操作系统共同完成。
主存储器(Main memory),简称主存。是计算机硬件的一个重要部件,其作用是存放指令和数据,并能由中央处理器(CPU)直接随机存取。
数据总线、地址总线和控制总线
一种方式是把高位字节的地址作为存储器的地址
另外一种方式是把低位字节地址作为字地址
核心结构:
除了这个核心结构之外,半导体存储芯片还有许多接口,和CPU进行连接,和外设的控制器进行连接,与外部的设备进行数据交换
译码驱动方式
指给出了存储单元的地址之后,怎么去找到指定的存储单元
线选法对存储单元进行布局的时候,我们实际上是把它布局成了线性的数组
重合法进行布局的时候我们把所有存储单元布局成了一个二维的矩阵
随机存取存储器(英语:Random Access Memory,缩写:RAM),也叫主存,是与CPU直接交换数据的内部存储器。它可以随时读写(刷新时除外),而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储介质。
RAM工作时可以随时从任何一个指定的地址写入(存入)或读出(取出)信息。它与ROM的最大区别是数据的易失性,即一旦断电所存储的数据将随之丢失。RAM在计算机和数字系统中用来暂时存储程序、数据和中间结果。
所谓的“静态”,是指这种存储器只要保持通电,里面储存的数据就可以恒常保持
。相对之下,动态随机存取存储器(DRAM)里面所储存的数据就需要周期性地更新。然而,当电力供应停止时,SRAM储存的数据还是会消失(被称为volatile memory),这与在断电后还能储存资料的ROM或闪存是不同的。
静态RAM 基本单元电路
T1-T4解决了用什么样的电路存放‘0’和‘1’这个问题
T5-T6解决了我们对存储元件进行‘读’或者‘写’这样的操作
T7-T8是这一列共用的开关,这个开关叫做‘列开关’
静态RAM芯片举例
这里我只是发出来了芯片的基本结构,关于这种芯片的‘读’和‘写’操作并没有展开来说,这部分内容了解即可,有兴趣的可以再查一下资料
动态随机存取存储器,最为常见的系统内存,即DRAM。DRAM 只能将数据保持很短的时间。为了保持数据,DRAM使用电容存储,所以必须隔一段时间刷新(refresh)一次
,如果存储单元没有被刷新,存储的信息就会丢失。 关机就会丢失数据。
动态RAM 基本单元电路
左边是三管动态RAM,右边是单管动态RAM,他们存储信息的原理是一样的,都是保存在电路当中,有电是‘1’,没有电是‘0’。
动态RAM芯片举例
这里我并没有展开说,但是我觉得了解一下它的工作原理还是有必要的,感兴趣的小伙伴可以百度自行查询
为什么要对动态RAM进行刷新?
动态RAM是利用电容存储电荷的方式来保存信息
,但是它的电容做的很小,很容易会发生漏电。在一段时间之内,如果我们不对电容再次进行通电(原来保存的‘1’就会变成‘0’),电容内的信息就会丢失。
动态RAM的刷新只与行地址有关
每一次的刷新刷新的是一行的数据,而不是某一个存储单元的数据
动态RAM的刷新主要有三种方法
静态RAM用触发器存储信息,各要不断电,信息就不会丢失,不需要刷新,但静态RAM集成度低,功耗大,高速缓冲存储器(Cache)使用静态RAM
动态RAM用电容存储信息,为了保持信息必须每隔1~2ms就要对高电平电容重新充电,称为刷新,因此必须含有刷新电路,在电路上较复杂,但动态RAM集成度高,且价格便宜,适于作大容量存储器。所以主内存通常采用动态RAM
只读存储器以非破坏性读出方式工作,只能读出无法写入信息。信息一旦写入后就固定下来,即使切断电源,信息也不会丢失,所以又称为固定存储器。
ROM所存数据稳定 ,断电后所存数据也不会改变,并且结构较简单,使用方便,因而常用于存储各种固定程序和数据。
只读存储器的发展历程
1.掩模ROM(MROM)
掩膜型ROM指掩膜工艺ROM,这种ROM就是厂家把信息直接做在了ROM芯片上用户不能修改,数据只能被‘读’
行列选择先交叉处有MOS管为‘1’,无MOS管为‘0’。
2.PROM(一次性编程)
我们可以看到,这种变成方式的话,如果保存的是‘0’,熔丝处于烧断的状态,不能再一次进行连接,所以他是一种破坏性的编程。编程过程中如果哪个地方出现了问题,我们只能重新购买芯片重新进行烧写
3.EPROM(多次性编程)
它采用的基本原理就是“N型沟道浮动栅MOS电路”
如果我要对程序尽心个修改,对每一个单元电路当中存放的信息要进行重新写入的话,我们就要重新驱散这个浮动栅,浮动栅的驱散使用紫外线来做的,用紫外线直接照射。
这种方式虽然实现了多次编程,但是信息的擦去比较麻烦
4.EEPROM(多次性编程)
电可擦写可编程ROM
5.Flash Memory(闪速型存储器)
存储器容量的扩展包括三部分
CPU的数据线条数可能比芯片的数据线条数多,这种情况下我们就要做位扩展。
位扩展的目的是为了增加存储字的字长
考虑一下这个问题:
如何用 1K X 4 位的存储芯片组成 1K X 8位的存储器?
我们可以用两个1K X 4位的存储芯片采用相同的片选
,每个芯片在进行读出或者写入的时候都有4位数据,那么两个就是8位数据。
假设芯片就是2114芯片,上述一共有10根地址线、8根数据线,那么如何把他们连接到一起呢?
两个存储器每个存储器可以连接4根数据线,这样每次刚好可以向CPU传递8位数据
片选是一个单片机学科词汇,可以理解成选片。片选信号一般是在划分地址空间时,由逻辑电路产生的。在数字电路设计中,一般开路输入管脚呈现为高电平,因此片选信号绝大多数情况下是一个低电平。
字扩展就是增加存储字的数量
我们可以考虑一下,如果我们的芯片容量不同,那么我们如何进行扩展呢?
用 1K X 8位 的存储芯片组成 2K X 8位 的存储器
很容易知道,需要 2 个芯片
2K X 8位的存储器需要11根地址线,8根数据线
看一下给出的连接方式,
这样连接有一个问题,就是连个芯片不能同时进行工作,如果两个芯片同时进行工作的话,每个芯片提供8位数据,那么在数据线上就会造成混乱。
怎么保证两个芯片不冲突?
我们的做法是把 2K X 8位 的芯片把它分成两个 1K X 8位 的存储芯片,
我们可以发现这两个芯片的地址线是 A0 - A9 一共10根地址线,还多了一根A10。
这个A10 有什么用呢?
A10 就是这两个芯片的片选信号。A10 = 0 选择第一个芯片,10=1选择第二个芯片。
如何用 1K X 4位的存储芯片组成 4K X 8位的存储器?
很显然我们需要8片 1K X4 位 的存储芯片。
其实看了上面字扩展和位扩展,或许你现在有些明白字和位同时扩展这个概念了。
4K X 8位 的存储器需要12根地址线,8根数据线。
A0 - A9 直接与芯片连接构成 1K X 8位 的小存储器,剩余的两根作为片选信号线
(1)地址线的连接
CPU给出地址,存储器要根据地址找到相应的存储单元,这个存储单元在哪一个芯片当中,是哪个芯片的哪个存储单元?
(2)数据线的连接
CPU的数据线条数可能比芯片的数据线条数多,这种情况下我们就要做位扩展。
(3)读/写命令线的连接
CPU给出控制命令,我们把命令线连接到每个芯片的控制端上(只读存储器)除外,因为他只能读不能写
(4)片选线的连接
访问落在哪一个或者哪几个芯片上,就是由片选线来决定的
(5)合理选择存储芯片
一方面是ROM、RAM的合理选择
如果是保存系统程序的地方,那么我们就选择ROM,因为系统程序不是经常被改动的,保存配置信息的也用ROM。但是如果是用户的区域或者是系统运行的区域,这些区域都是可读可写的,我们就用RAM芯片
另一方面是合理选择芯片的规格,片选逻辑要尽可能简单。
(6)其他,比如时序、负载
想要详细了解数据校验的同学,请看这篇博客数据校验
存储器的校验是为了能及时发现错误并及时纠正错误。
为什么要对存储器的信息进行校验?
受元器件的质量、电路故障或噪音干扰登因素的影响,数据在被处理、传输、存储的过程中可能出现错误。
为了能够校验出信息是否正确,如何进行编码?
奇偶校验码;循环冗余校验码;
纠错和检错能力与什么因素有关?
码距越大,抗干扰能力越强,纠错能力越强,数据冗余越大,编码效率低,编码电路也相对复杂。
校验出信息出错后是如何进行纠错
在发送方对被发送的信息,基于校验位做某种运算,得到一个编码,发送给接收方,接收方会根据收到的信息和校验位再去执行与发送方相关的运算,去评测收到的这个数据是否出现了错误,如果出现了错误,能否定位并改正错误。
除了教材上讲的校验码,你还知道哪些容错编码?原理是什么?
海明校验码;
前面已经多次提到,CPU的发展速度非常快,CPU速度的提升大概以每年百分之五十的速度发展,但是存储器速度的提升是非常有限的。
由于CPU和主存储器在速度上不匹配,限制了高速计算,为了使CPU不至于因为等待存储器读写操作的完成而无事可做,可以采取一些加速CPU和存储器之间有效传输的特殊措施。
目前来说,一般的方法有三种
1.芯片技术,采用高速器件
2.采用层次结构 Cache——主存
3.调整主存结构
本章主要介绍调整主存结构的技术
先来了解一下什么是多模块交叉存储器
大存储器在一个存储周期中读出的不是一个存储单元的W位信息,二十n个字,这样在单位时间里存储器提供的信息量可提高n倍,这样组织的主存系统称为并行主存系统
适用于程序和数据在存储体内是连续存放的情况。在一个存取周期内,从同一地址取出多条指令,然后再逐条将指令送至CPU执行,这样增大了存储器的带宽,提高了单体存储器的速度。这里的单体应该就是一个模块,但是每次可以读取多个字,可以和多体进行比较。
这种方法也有问题
比如说CPU如果要向存储单元写一个长度为16的字,因为需要多次写入不同的地方,有可能会发生错位,并且需要复杂的硬件与之配合
特点: 高位交叉、顺序编址
(1) SDRAM(同步DRAM)
在系统时钟的控制下进行读出和写入,CPU无须等待
(2) RDRAM
RDRAM(Rambus DRAM)是美国的RAMBUS公司开发的一种内存,主要解决了 存储器带宽 的问题
RDRAM的数据存储位宽是16位,远低于DDR和SDRAM的64位。但在频率方面则远远高于二者,可以达到400MHz乃至更高。同样也是在一个时钟周期内传输两次次数据,能够在时钟的上升期和下降期各传输一次数据,内存带宽能达到1.6Gbyte/s。
(3) 带 Cache 的DRAM
在DRAM的芯片内继承了一个有SRAM组成的Cache,有利于猝发式读取
这种方式特别适合猝发式的读取,读第一个数据的时候,由于我们要从内存当中读取,会比较慢,但是我们读取后续的数据速度会非常快,因为数据已经缓存在了Cache当中了
猝发式读取:
只需给出块的起始地址,然后对固定块长度的数据一个接一个地读出或写入。对于CPU(主方)
完
如有错误请指正,欢迎留言评论交流!