计算机内存到底是如何工作的?令人惊讶的是,它仍然与巴贝奇(Babbage)设计其分析引擎或IBM 360访问核心内存的方式大致相同。那么我们所有的程序都存放在哪里?
我们已经了解了“”。通常,内存被描述为存储设施,通过使用地址存储和检索数据。这是准确的,但不完整。计算机内存是一种机制,即如果您向其提供地址,它会为您提供以前使用该地址存储的数据。
微妙的区别在于,整个过程必须是自动化的,这给早期的计算机制造商带来了两个问题。首先是如何构建可以存储所有数据的东西,其次是如何使用合适的地址自动存储和检索数据。
例如,一组鸽子洞样式的邮箱通常被用作存储模型。一封信来了,有人把它放在正确的盒子里。然后,当有人想要检索字母时,他们会寻找正确的名称,然后将所有物品从盒子中取出。这不是计算机内存的模型。如果是这样,信件将在没有任何帮助的情况下进入正确的框中,并且他们将在知道名称后立即找回自己。
可工作的内存设备是将数据和地址相关联,中间没有任何一个基于另一个才能找到的神秘中间物。
那就是建立一个内存设备,你有两个问题:
- 可能需要很长时间的存储数据
- 提供寻址能力,以便基于某个地址检索出存储在其中的数据。
奇怪的是,从一开始,如何实现计算机内存就非常明显并且相对容易。这些数字以自然的方式存储在齿轮上,并且想出一个机械系统来解决内存寻址问题也相对容易。
当我们进入电子时代时,麻烦才真正开始。第一台电子计算机使用的阀门非常擅长放大和切换,虽然相对容易看到如何使用它们来建立逻辑门,但利用它们来创建存储器,似乎并不明显。
内存的动态化和静态化
实际上,在1919年,在任何大型的基于阀门的计算机启动之前,这个问题已经或多或少地得到了解决。 两位英国物理学家,埃克尔斯(Eccles)和约旦(Jordan)发明了使用两个阀门的电路。 两条触发线可用于打开一个阀门,另一个关闭阀门。 经过更多的工作,他们发明了整个两气门回路系列,这取决于一个气门关闭另一个气门的动作。
来自埃克莱斯和乔丹的专利
这些电路之一就是“双稳态锁存器”,它只有一条输入线,可以是高电平或低电平,还有一条“启用”或“锁存”线。当锁存线为低电平时,双稳态锁存器的输出跟随输入变化,但是当锁存线为高电平时,无论输入如何,输出都固定在其最后一个值。
您可以将其视为存储器的动作-当锁存器为高电平时,双稳态会记住施加到其上的输入。 一个简单的电路却是早期大多数高速计算机内存的基础。 后来,同一电路被转换为晶体管,然后被转换为集成电路。
这种布置的唯一问题是,每个存储位都需要两个阀或晶体管-在任何给定时间,一个打开,另一个关闭。
晶体管内存元件
做相同工作的现代方法是使用单个晶体管在单个电容器上保持电荷。 如果电容器已充电,则存储1,如果不是0,则存储该电荷。唯一的问题是电荷会泄漏掉,并且如果您读取存储位置,则读取操作会清除掉所有电荷。
为了克服这些问题,必须定期读取存储位置,然后再用其内容重新写入存储位置。 因此,单晶体管布置被称为“动态”存储器,而双晶体管布置被称为“静态”存储器。
更多存储空间
这一切都很好,但是即使单个晶体管也很昂贵,而且如果您要存储大量数据,则需要更便宜,容量更大的产品。如果您使用的阀门太大,耗电且经常出故障,则此问题会更加严重。尽管基于使用阀门和晶体管等电子组件的存储是最明显的存储形式,但工程师长期以来一直需要寻找其他方法来提供更大的存储量。
早在Eckert(ENIAC的设计师之一,最早的电子计算机之一)就想到使用延迟线。
基本思路是拿一长管水星,一端放一个扬声器,另一端放一个麦克风。一端注入的声波要花费一段时间才能到达另一端,因此您可以将脉冲流存储在电子管中。这里的问题是必须将脉冲再循环,并且只有当特定的比特从电子管中出来并返回扬声器时,您才能取回或存储该特定的比特。
这给早期的程序员带来了各种各样的问题。确实,艾伦·图灵(Alan Turing)唯一的真实计算机ACE的机器代码包含了要存储或检索的脉冲定时值。他甚至想出了相对于延迟线中循环脉冲来优化程序的方法,这使他提升了艺术水平。
在延迟线时代之后,更明显的是电子方法开始占据主导地位。
当威廉姆斯发明一种基于CRT(阴极射线管)的循环存储系统时,延迟线确实获得了苟延残喘的机会。这个设想是将位以点(像素)形式存储在电视管的表面上,并使用光电传感器来拾取它们的存在与否。这是个好主意,效果很好,但灯管笨重且昂贵。
核心存储器
在大规模集成电路使RAM(随机存取存储器)芯片普及之前,最好的存储器形式就是核心存储器。 这是另一个简单的想法,但是花了很长时间才完成工作。 杰伊·佛雷斯特(Jay Forrester)想到了使用绕线的磁环或“芯”。 使用磁芯的磁化方向存储钻头。 每个核心只存储一位,而最初的核心内存很昂贵,并且占用了大量空间。
到1970年代,核心存储器已经发展到可以在看起来像小型车的东西中实现1MByte的地步! 后来,核心存储器使微型计算机成为可能,其大型主内存在16 KB或更大的范围内。
在 32×32 矩阵上存储 1024 位数据的后期核心存储器。
核心存储器的有趣优势之一是,即使断电,它也可以保留其内容。例如,早期的小型计算机可以在晚上关闭,而您可以在早晨回来,并期望从您离开程序的地方开始!在需要这种持久性和鲁棒性的地方,有时仍会使用核心存储器。
还有其他一些奇怪的方法来存储数据。例如,冯·诺依曼(Von Neumann)尝试使用“ Selectron”阀–一种充满气体的放电管,可将碎屑存储为微小的霓虹灯。冯·诺依曼(Von Neumann)的计算机将使用40 x 4KB的Selectron,但这种选择制造起来很昂贵,而且随着时间的推移,可靠性越来越差。
最终,核心存储器接管了早期存储器,而晶体管内存又以静态和动态RAM芯片的形式接管了它,这正是我们今天所使用的。
在台式机中,大部分内存是使用以SIMM(单列直插式内存模块)形式打包的动态RAM(DRAM)构建的。使用静态RAM(SRAM)芯片实现的内存量少得多,即高速缓存,因为它比动态RAM快。
寻址
所以现在我们知道了内存是如何工作的。 好吧,直到某一点; 我们仍然还真的不知道寻址和数据检索的工作方式。 有很多不同的技术可用于存储信息,但是如何处理数据往往以相同的通用方式工作。
特别是使用静态或动态RAM甚至磁芯都没关系,基本的寻址方法是相同的。
每个存储元件或单元可以存储一位,并且具有数据输入线,数据输出线,读/写线和选择线。 选择线激活单元格,而读/写线告诉它要么输出其内容,要么存储其输入内容。
一个通用的基本记忆元件
接下来发生的情况是,单元格通过水平和垂直选择线(行和列选择)组织成一个网格。每个行和列选择的交集处都有一个单元格。仅当单元格的行和列选择都在高电平时才选择该单元格。所有单元的数据输出连接在一起,并且与所有输入和读/写控制线相同。这意味着存储器阵列只有一个公共输入和输出以及一条读/写线。
内存阵列
现在假设您要在数组中的特定位置存储1。数据放置在数据输入行上,并且“读/写”行设置为低电平以指示您要写入阵列。 最后,将适当的行和列选择设置为高,以选择所讨论的单元格,并且只有该单元格才能将数据存储在数据线上。
特定位置存入1
要从阵列读回数据,您只需要在“读/写”行设置为高电平时执行相同的操作,以表明您要检索有问题的位置。仅所选单元将任何内容输出到公共数据输出行。
从阵列中的特定位置读取数据
听起来很简单!好消息是,这正是典型的RAM芯片的工作方式。为了简化起见,我们所做的一切就是忘记了诸如定时、电压和其他工程因素之类的细节。确实,如果您查看RAM芯片的图片,您甚至可以看到矩形网格和所描述的连接线。
一个RAM芯片-您可以在中间区域看到两个内存阵列
实际上,CPU对行和列选择的使用是隐藏的。原因是效率低下。例如,如果您使用单个位地址,则理论上可以选择两个存储位置–位置0和位置1。如果使用两位地址,则可以选择四个位置– 00、01、10和11使用行和列选择,您需要两行来选择一个单元格,三行来选择两个单元格,四行来选择四个单元格,五行来选择六个单元格,依此类推。
因此,如果将内存位置指定为二进制地址而不是行列选择,则将CPU连接到内存需要较少的地址线。
因此,处理器通过提供二进制地址来指定要使用的存储单元。一些简单的布尔逻辑,地址解码,然后将地址转换为行和列选择,并且存储器仍然有效并且效率很高。
地址行转换为行/列选择
请注意,目前我们只看单个存储芯片,这种排列只能存储单个位。如果要存储一个字节,则需要八个这样的芯片,每个芯片一个,以及八个数据输入和八个数据输出线。八条数据线被分组为数据输入总线和数据输出“总线” – 总线只是一组导线。早期的计算机确实确实有用于输入和输出的单独总线,但是今天的计算机只有一条统一的数据总线,可用于输入或输出。
如果您想要的存储空间超过了八个芯片组所能提供的容量,那么您就必须添加另一个八个芯片组和一些其他地址解码逻辑来选择正确的存储库。来自处理器的地址线通常称为地址总线,现在我们有了简单但现代的计算机的基本体系结构。
数据和地址总线
一些设计使用单个双向数据总线,但这主要是实现和电子工程的问题。
这都是非常简单的,但是您可以看到它在实践中是如何变得越来越复杂。但是,使用二进制地址可以解释为什么1KByte是1024字节而不是1000或者其它任何合理的K。
要了解为什么这是很自然的原因,请先问问自己,使用一条地址线可以寻址多少个存储单元?
答案2.使用两条地址线可以寻址4.使用三个地址线可以寻址8,如果继续进行下去,则会发现以下自然存储大小:
地址 大小
1 2
2 4
3 8
4 16
5 32
6 64
7 128
8 256
9 512
10 1024
请注意,使用十个地址线,您可以寻址1024个存储单元的魔法数,而这是使用该系统可以获取的最接近的1000个单元-因此1K = 1024。
如果您遵循相同的理由,那么再添加十个地址行将使您能够寻址1K x 1K的存储单元,我们称其为1MByte,即1024×1024或1048576字节。除非您意识到它是2到1百万的最接近幂,否则它是一个奇数。
请注意,通常以1000×1024为单位测量磁盘存储容量,这会使磁盘存储的数据似乎超过了实际容量 – 我想知道为什么?