编程高手必学的内存知识 (编程内存工作原理)

我们发现了为什么可以将计算机内存比作“鸽子洞”,甚至包含了如何构建您自己的内存设备的指令。

计算机内存的概念是计算机整体思想的基础。它最清楚地提出了计算机制进行实际计算的方式,这种方式比计算的其他方面更清晰。内存存储数据、检索数据 - 但纸质笔记本也是如此, 而它不是计算机? 真正发生的事情是微妙的(但并不是所有程序员都了解它),这才是真正了解计算本质的关键。在这个稍微异想天开的记忆原理的叙述中, 一切都会被揭示出来...

当你最终明白计算机如何工作的那个时候,你会发现很难重拾这个惊人的时刻。我不是说对某台电脑的理解,它的特殊性等,而是对这个奇妙的技巧是如何工作以及它是多么简单的一般性理解。

现在令人担忧的是,有些读者在很多年前已经经历过了这一刻,却忘记了它给他们带来的乐趣。有些读者会认为他们已经掌握了它,而实际上并没有。最后当然有读者知道他们根本不知道我在说什么!

这一切都会使这个庞大的交流问题变得更加糟糕,因为要给你基础理论,我别无选择,只能谈论它的特定实现。

让我举一个简短的例子说明这种世界观不匹配的情况。这个问题与思考人类的工作方式非常相似。你可以把人类想象成一种机器,在机器中,一个微小的人生活在其中——大概是在头脑中。微小的人用眼睛向外看,用杠杆拉回偏离,使真正的人类正常工作。这是人类如何工作的霍蒙库卢斯理论。它显然是无稽之谈,因为你最终只会有一个无限的递归,不断小的人拉着越来越小的杠杆。然而,人类的工作并不是通过让另一个较小的人类生活在里面。

存储程序原理及讲解,内存编程实例讲解

詹妮弗·加西亚的《霍蒙库鲁斯的无限递归》

在计算机方面,只有在错误远没有那么明显的情况下,才会使用同样的解释。人们经常通过想象电路内的一个小家伙来描述计算机是如何工作的,通过小家伙看看必须做什么和正在做什么。当然,这不是计算机的工作方式,甚至还不紧密。事实上,这种论点完全隐藏了计算机实际工作的奇妙方式,并使初学者迷惑。

让我举一个例子。很久以前,在一个做事方式有所不同的国家,在用电脑能够控制阀门、让住在巨大的建筑(每栋楼一台电脑)里的人们保暖的日子里,我参加了一个"年轻人的讲座"。这些讲座都是计算机方面的新(当时)艺术和科学。尽管仅在几周前编写了我的第一个六行Fortran程序,但我对这门学科的了解却很少。

讲座很有趣,它有很多赏心悦目的"灯笼幻灯片"(一种早期的LCD投影单元),并且讲师用棍子(像激光笔但用木头制成)指着黑板(像是白板,但是是黑色)。

我发现整件事真的很有趣,但在讲师讲解电脑内存是如何工作的时候,我坐起来的次数最多。我对内存知之甚少-在计算机执行之前,这是我的六行Fortran程序所在的位置-因此,这是我了解它如何工作的机会。

讲师展示了一个大型木制建筑的幻灯片,类似于书柜,但被分成几个小隔间,他称之为"鸽子洞",是的,你可以看到一群鸽子可能想在那里居住。

然后,他继续描述每个鸽子洞如何有一个"地址",这使人们能够将鸽子存放在特定的"位置",然后"检索"它。"这就是电脑内存的工作原理" - 是我记得的最后一句话。

存储程序原理及讲解,内存编程实例讲解

我震惊地离开了讲座,跌跌撞撞地回家了。我认为我好几个月没有从这个想法中恢复过来了,并且可以肯定的是,Fortran编程再也不是一样了-可能直到今天。现在我猜测,您可能会以为我感到震惊是由于他们把鸽子保存在计算机中吗?

不,那不是全部。造成创伤的真正原因是,我看到了一组鸽子洞可被描述为一种可以存储和检索事物的内存。我还可以看到我的书包起着相同的作用。我还可以看到,如果我在房间里打开灯,它“记住”了我做过的事实。所有这些显而易见的深奥方法都没有帮助我理解计算机,尤其是计算机内存的工作方式。然而,知道清楚的人认为它做到了,它应该而且会。

在他看来,一组鸽子洞的图片清楚地代表了计算机内存的功能原理-但对我而言,这只是一组鸽子洞,而且它怎么可能成为更大的物体的一部分,这仍然是一个谜。这里确实有比储存鸽子更大的想法。

在花了很多年的时间思考了为什么计算机存储器的信鸽模型不起作用之后,答案是由Babbage和他出色的机器提供的。

当巴贝奇从他的差分引擎(被形容为一种特殊用途的计算器)转移到他的真实计算机,即分析引擎时,他发明的东西之一就是“内存原理”。

人们以前曾使用过鸽子洞来存储和检索东西,但这并不意味着他们已经发明了计算机内存。 Babbage的机器需要存储十进制数字,熟悉鸽子的人都可以轻松解决此问题的第一部分。

他所做的只是拿起一堆轮子,而存储在他的存储位置中的数字仅由轮子的位置给出-单位轮子,十进制轮子等等。

通过拥有多于一堆的轮子,他的机器可以存储不止一个值。如果调用第一个堆栈A,第二个堆栈B,依此类推,那么存储和检索数字就是说“在A中存储10”,“在C中检索值”等等。您可以看到,就像鸽子洞一样,每个存储位置都有一个地址,A,B,C等,以及一个存储的值。

存储程序原理及讲解,内存编程实例讲解

分析引擎任何地方都没有鸽子。

存储程序原理及讲解,内存编程实例讲解

早期打孔卡

这是通常是计算机内存帐户驻留的地方 - 这就是人们经常使用鸽子洞和其他类似的类比来解释它的原因。但是,它可能遗漏了计算机内存最重要的功能,这使其与众不同,而且远远超出了一系列的“鸽子洞”。

内存原理

要了解内存原理,我们必须回到我的六行Fortran程序,并仔细考虑它的工作方式。实际上,Fortran有点先进。我们真正需要的是机器代码,我们不妨使用巴贝奇的机器代码。

他的机器将指令存储在打孔卡上,作为孔的图案。每张卡都是一条指令。现在考虑一张保存说明的卡:

在B中存储10

从表面上看,这类似于将鸽子放置在特定孔中的说明,但不仅限于此。

卡上打的孔不仅意味着“ B中存储10”,机器实际上做了。

想象一下,放在卡上的是一组杆。杆上有孔的地方,因此移动。杆进出孔的运动使机器进行特定的操作,并选择将要存储数字的轮堆。

在“在B中存储10”的情况下,指定车轮叠堆B的孔将使杆掉落,从而将其物理地移动到适当的位置,从而使齿轮(仅齿轮)与齿轮啮合。指定“存储”操作的孔将设置机器,以使齿轮由处理器驱动,指定10的杆将使其旋转正好十次。

我将让您发挥想象力,弄清楚如何实现最后一台机器,但是您应该能够看到这是可能的。还要注意,存储的数字实际上是添加到车轮堆栈中的,而不仅仅是传输的。事实证明,在大多数计算机实现中,添加值要比存储值容易。只要程序员记得清除,即设置为零,在添加该位置之前的位置就等于存储操作。

这就是为什么执行算术的某些专用存储器位置曾经(现在仍然)称为“累加器”的原因-它们求和或累加存储在其中的所有数字。

如果您想弄清楚“B中的值加载到A”操作如何工作的细节,我相信您会发现,从B检索数据只是沿相反方向驱动齿轮的问题,直到存储在B中的值减少到零为止。当然,可以配置相同的齿轮以正向驱动轮组A,因此将存储在B中的内容添加到A。“从B中减去A”指令可以是……

停止!这变得越来越详细。我无意构建分析引擎,但我们有可能遗漏这一点。

重要的是,您应该看到计算机内存不像是一堆鸽子。

它具有地址和存储位置,例如一组信纸孔,但是对于计算机内存,地址不仅是静态标签。

计算机内存地址实际上确实会选择它们要寻址的内存位置,这与仅带有标签的信纸孔非常不同。这更像是拥有一堆被门所覆盖的鸽子洞。在这种情况下,将鸽子存储在孔1234中的指令将自动导致该鸽子孔门打开,而没有其他门打开。然后鸽子会飞入等待的记忆位置。

从位置1234取回鸽子的指令将再次导致该门弹开,鸽子将飞出。我敢肯定,您会想象到一些狂野而绝妙的希思·罗宾逊(Heath Robinson)或鲁伯·戈德堡(Rube Goldberg)风格的机械设备,可以自动存储和取回鸽子,而我也不会幻想会拒绝您的这种乐趣!

关键是,在计算机内存中,地址不仅是无效的,而且它们的位置的静态标签是活动的选择器。计算机存储器是一种机制,其中显示地址可返回存储器的内容或允许将某些内容存储在该存储器中。

这一切与当今的现代计算机有何关系?事实证明出人意料的好。

现代计算机

我承认我们已经摆脱了鸽子,但推杆仍然在那里! 在这种情况下,推杆是从CPU电子设备中发出的数字信号-确切了解其工作原理以及一些令人着迷的事实,例如为什么兆字节恰好是1,048,576字节,请参阅内存的工作原理。

存储程序原理及讲解,内存编程实例讲解

现代内存-没有推杆,当然也没有鸽子

制作你自己的内存

有一个计算机内存如何工作的著名演示,如今的知名度已大不如从前。这是一个精彩的演示,而且很有趣。开始之前,你先要给自己找到16张明信片或类似明信片的硬纸卡,打孔器,一把剪刀和一些织针。

拿起您的明信片,在每张明信片的顶部边缘附近连续打四个孔。 孔必须排成一排,以便您在堆叠成一叠时都能看到所有孔。 如果您足够强壮,并且有足够好的打孔技巧,那么最简单的方法就是一口气打穿所有十六个孔。 接下来,您必须对每个卡进行二进制编号,将每个孔的位都写入。拿一把剪刀,将所有的零孔变成U形槽(有关说明,请参见图)。

存储程序原理及讲解,内存编程实例讲解

所有16张卡上的第一次打孔(仅显示四个)

存储程序原理及讲解,内存编程实例讲解

用二进制编号卡,然后将每个零孔剪成U形槽

将卡组放在一起时,您就做成了可以正常工作计算机内存。

如果您不相信我,我现在将告诉您如何自动访问位置。

随机排列卡片,因为选择过程并不取决于它们以任何特定顺序排列。

假设您想要与地址1010相对应的卡。

首先取一对编织针,将它们放在从右开始数的第一个和第三个孔中,即与您要置零的位置相对应的孔中。

现在一起抬起针,剩下的卡必须在所有两个位置上都置零。

那就是所有留下的卡都有x0x0之类的地址,其中x为零或一。

使用这部分纸牌重复此过程,但是现在将一根针插入左侧起的第一个位置,然后提出一部分纸牌。现在它们对应于地址10x0,因此最终您可以将针插入左侧起的第三个位置,并拿出唯一一个地址为1010的卡。

这是一个完全通用的过程,可以用相同的方式找到您要查找的任何卡。首先使用多根针拔出具有所需零的卡,然后使用一根针将卡组重复减少到具有所需零的卡组。

还有一个非常简单的过程,可用于将经过洗牌的二进制卡重新放回原位-您能推算出怎么做吗?

您的下一个项目是使用Lego或Meccano自动化此过程,并构建与多核处理器一样快的东西!

内存原理是:

1、将数据存储在一个地址中,以便以后检索

2、是一种机制,即如果向其提供地址,它会自动检索出正确的数据。换句话说,地址实际上是选择返回的数据,而不仅仅是被动标签。

存储程序原理及讲解,内存编程实例讲解