计算机如何工作?[关闭]


59

这真是令人尴尬的问题...我拥有计算机科学学位(第二个学位正在进行中)。我已经担任全职.NET开发人员近五年了。一般来说,我似乎能胜任我的工作。

但是我不知道计算机如何工作!

拜托,让我呆一秒钟。快速搜索“计算机的工作原理”会产生很多结果,但是我很难找到一个真正能够满足我所寻找内容的工具。我意识到这是一个巨大,巨大的问题,因此,如果您能给我一些关键词或一些指导,那么我是真的。

我知道有组件...电源,主板,内存,CPU等...,我对它们的工作有一个“总体思路”。但是我真的不明白您如何从Console.Readline().NET(或Java或C ++)这样的代码行中真正地完成工作

当然,我隐约意识到MSIL(对于.NET),并且JIT编译器发生了一些魔术,它变成了本机代码(我认为)。有人告诉我Java很相似,而C ++削减了中间步骤。

我已经完成了一些大型机的组装,这是几年前的事了。我记得有一些指令和一些CPU寄存器,我写了代码。。。然后发生了一些魔术。。。我的程序可以运行(或崩溃)。据我了解,“仿真器”将模拟您调用指令时发生的情况,并会更新CPU寄存器。但是,是什么使这些指令以它们的方式起作用?

这会变成电子问题而不是“计算机”问题吗?我想我没有任何实际的理由来理解这一点,但是我觉得我应该能够。

(是的,这就是当您带一个小孩花一天时间时发生的事情。花了他们大约10分钟的时间和五次反复的问“为什么?”,您才意识到自己不知道多少)



20
我建议使用Charles Petzold

这不是一个Emulator。它是一堆真正的半导体电路,具有数百(数千)条输入和输出线以及数十亿个逻辑门。该Emulator用于唯一教学目的。
rwong 2011年

1
我认为标题应该更改为更具体/更翔实。这实际上是一个非常有用的问题,但是乍一看,它看起来完全荒谬,就像小孩最初问的那样。将其更改为“高级软件命令如何连接到低级硬件响应?”之类的内容。
2011年

2
嗨,罗布(Rob),用现在的措词来说,这是无可救药的,很快就变成了书推荐问题和扩展讨论:我们都不想在这两个地方。如果您可以集中精力并就当前面临的问题提出一些具体问题,请随时提出有关问题。

Answers:


139

我将从可能相关的最低级别开始(我可以从更低的级别开始,但是它们可能根本无关紧要),从原子,电气,晶体管,逻辑门,集成电路(芯片/ CPU)开始),然后在Assembly上完成(假设您熟悉较高级别的知识)。

在一开始的时候

原子

原子是由电子,质子和中子组成的结构(它们本身由基本粒子组成)。电子和计算机中原子中最有趣的部分是电子,因为电子是可移动的(即电子可以相对容易地移动,而不像质子和中子更难移动)并且它们可以自由浮动而不被固定在内部一个原子。

通常,每个原子都有相等数量的质子和电子,我们称其为“中性”状态。碰巧,原子有可能失去或获得额外的电子。称处于这种不平衡状态的原子分别是“带正电”的原子(质子比电子多)和“带负电”的原子(电子比质子多)。

电子是不可破坏的和不可破坏的(在量子力学中不是这样,但这与我们的目的无关);因此,如果一个原子失去电子,附近的一些其他原子必须接收多余的电子,或者电子必须释放为自由浮动的电子,相反,由于电子是不可构造的,因此要获得额外的电子,一个原子必须将其从附近的原子上吸除。或来自自由浮动电子。电子的力学是这样的,如果在带正电的原子附近有一个带负电的原子,那么一些电子将迁移,直到两个原子都具有相同的电荷。

电力

电流只是电子从具有大量负电荷原子的区域到具有大量正电荷原子的区域的流动。某些化学反应会导致一种情况,我们有一个带有许多带负电荷的原子的节点(称为“阳极”),而另一个节点带有许多带正电荷的原子(称为“阴极”)。如果我们用一根导线连接两个带相反电荷的节点,则大量的电子将从阳极流向阴极,这种流动就是我们所说的“电流”。

并非所有的导线都能同样容易地传输电子,电子在“导电”材料中的流动比在“电阻”材料中的流动容易得多。“导电”材料的电阻低(例如,电缆中的铜线),“电阻”材料的电阻高(例如,橡胶电缆绝缘)。一些有趣的材料称为半导体(例如硅),因为它们可以轻松改变其电阻,在某些情况下半导体可能充当导体,而在其他情况下可能变成电阻器。

电流总是倾向于流经电阻最小的材料,因此,如果阴极和阳极用两条线连接,一根具有很高的电阻,而另一根具有非常低的电阻,则大部分电子将流过低电阻电缆,并且几乎没有一个流过高电阻材料。

中世纪

开关和晶体管

开关/触发器就像普通的电灯开关一样,可以在两根电线之间放置一个开关以切断和/或恢复电流。晶体管的工作原理与电灯开关完全相同,不同之处在于晶体管不是物理连接和断开电线,而是通过根据基节点中是否有电来改变其电阻来连接/断开电流,正如您可能已经猜到的那样。 /知道,晶体管是由半导体制成的,因为我们可以将半导体更改为电阻器或导体以连接或断开电流。

NPN双极结晶体管(BJT)是一种常见的晶体管,具有三个节点:“基极”,“集电极”和“发射极”。在NPN BJT中,只有当“基本”节点被充电时,电流才可以从“发射器”节点流到“收集器”节点。当基极不带电时,实际上没有电子可以流过,而当基极带电时,电子可以在发射极和集电极之间流动。

晶体管的行为

(我强烈建议你通过阅读这个,然后再继续,因为它可以解释比我更好的互动图形)

假设我们在其基极和集电极处将一个晶体管连接到电源,然后在其集电极附近连接输出电缆(请参见http://www.spsu.edu/cs/faculty/bbrown/web_lectures中的图3)/晶体管/)。

当我们既不向基地也不向集热器供电时,由于没有电可谈论,所以根本没有电流流动:

B   C  |  E   O
0   0  |  0   0

当我们给集电极而不是基极加电时,由于基极变成了高电阻材料,所以电流无法流到发射极,所以电会逸出到输出线:

B   C  |  E   O
0   1  |  0   1

当我们给底座而不是集电极加电时,由于集电极和发射极之间没有电荷差,所以电流也不会流动:

B   C  |  E   O
1   0  |  0   0

当我们同时在基极和集电极上施加电流时,会使电流流过晶体管,但是由于晶体管现在的电阻小于输出导线的电阻,因此几乎没有电流流过输出导线:

B   C  |  E   O
1   1  |  1   O

逻辑门

当我们将一个晶体管(E1)的发射极连接到另一个晶体管(C2)的集电极,然后在第一个晶体管(O)的基极附近连接输出时(请参见http://www.spsu.edu中的图4)/ cs / faculty / bbrown / web_lectures / transistors /),那么会发生一些有趣的事情。假设我们总是向第一个晶体管(C1)的集电极通电,因此我们只使用晶体管(B1,B2)的基节点:

B1   B2   C1   E1/C2  |  E2   O
----------------------+----------
0    0    1    0      |  0    1
0    1    1    0      |  0    1
1    0    1    0      |  0    1
1    1    1    1      |  1    0

让我们总结一下表格,以便我们仅看到B1,B2和O:

B1   B2  |  O
---------+-----
0    0   |  1
0    1   |  1
1    0   |  1
1    1   |  0

,如果您熟悉布尔逻辑和/或逻辑门,您应该注意到这正是NAND门。而且,如果您熟悉布尔逻辑和/或逻辑门,您可能还知道NAND(以及NOR)在功能上完整的,即仅使用NAND,则可以构造所有其他逻辑门以及其他内容表。换句话说,您可以仅使用NAND门来设计整个计算机芯片。

实际上,大多数CPU都是(或过去是?)仅使用NAND设计的,因为它比NAND,NOR,AND,OR等组合的制造成本更低。

从NAND派生其他布尔运算符

我不会描述如何制作所有布尔运算符,只有NOT和AND门,您可以在其他地方找到其余的。

给定一个NAND运算符,那么我们可以构造一个NOT门:

Given one input B
O = NAND(B, B)
Output O

给定一个NAND和NOT运算符,那么我们可以构造一个AND门:

Given two inputs B1, B2
C = NAND(B1, B2)
O = NOT(C) // or NAND(C,C)
Output O

我们可以用类似的方式构造其他逻辑门。由于“与非”门功能齐全,因此也可以构造具有2个以上输入和1个以上输出的逻辑门,在此我将不讨论如何构造这样的逻辑门。

启蒙时代

从布尔门构建图灵机

CPU只是图灵机的一个更复杂的版本。CPU寄存器是Turing Machine的内部状态,RAM是Turing Machine的磁带。

图灵机(CPU)可以做三件事:

  • 从磁带读取0或1(从RAM读取存储单元)
  • 更改其内部状态(更改其寄存器)
  • 向左或向右移动(从RAM读取多个位置)
  • 将0或1写入磁带(将存储单元写入RAM)

为了达到我们的目的,我们正在使用组合逻辑来构建Wolfram的2状态3符号图灵机(现代CPU将使用微代码,但是它们比我们的目的要复杂得多)。

Wolfram(2,3)图灵机的状态表如下:

    A       B
0   P1,R,B  P2,L,A
1   P2,L,A  P2,R,B
2   P1,L,A  P0,R,A

我们要将上面的状态表重新编码为真值表:

Let I1,I2 be the input from the tape reader (0 = (0,0), 1 = (0,1), 2 = (1,0))
Let O1,O2 be the tape writer (symbol encoding same as I1,I2)
Let M be connected to the machine's motor (0 = move left, 1 = move right)
Let R be the machine's internal state (A = 0, B = 1)
(R(t) is the machine's internal state at timestep t, R(t+1) at timestep t+1)
(Note that we used two input and two outputs since this is a 3-symbol Turing machine.)

      R  0          1
I1,I2
(0,0)    (0,1),1,1  (1,0),0,0
(0,1)    (1,0),0,0  (1,0),1,1
(1,0)    (0,1),0,0  (0,0),1,0

The truth table for the state table above:

I1  I2  R(t) | O1  O2  M   R(t+1)
-------------+--------------------
0   0   0    | 0   1   1   1
0   0   1    | 1   0   0   0
0   1   0    | 1   0   0   0
0   1   1    | 1   0   1   1
1   0   0    | 0   1   0   0
1   0   1    | 0   0   1   0

我并不是真的要构造这样的逻辑门(我不确定如何在SE中绘制它,它可能会很大),但是由于我们知道NAND门在功能上完整的,所以我们有一种方法找到一系列将实现此真值表的与非门。

Turing Machine的一个重要属性是可以使用仅具有固定状态表的Turing Machine来模拟存储程序计算机。因此,任何通用图灵机都可以从磁带(RAM)中读取其程序,而不必将其指令硬编码到内部状态表中。换句话说,我们的(2,3)Turing Machine可以从I1,I2引脚(作为软件)读取其指令,而无需在逻辑门实现中(作为硬件)进行硬编码。

微码

由于现代CPU的复杂性不断提高,仅使用组合逻辑来设计整个CPU变得越来越困难。现代CPU通常被设计为微码指令的解释器。微代码是嵌入在CPU中的一个小程序,CPU用来解释实际的机器代码。该微代码解释器本身通常使用组合逻辑进行设计。

寄存器,缓存和RAM

我们忘记了上面的东西。我们如何记住某事?我们如何实现磁带和RAM?答案是在称为电容器的电子组件中。电容器就像可充电电池,如果电容器被充电,它将保留多余的电子,并且还可以将电子返回到电路中。

要写入电容器,我们用电子填充电容器(写入1)或排空电容器中的所有电子,直到其为空(写入0)。要读取电容器的值,我们尝试对其放电。如果在尝试放电时没有电流流过,则表明电容器为空(读为0),但是如果我们检测到电流,则必须对电容器充电(读为1)。您可能会注意到,读取电容器会耗尽其电子存储,现代RAM具有定期对电容器充电的电路,因此只要有电,它们就可以保留其内存。

CPU中使用了多种类型的电容器,CPU寄存器和更高级别的CPU高速缓存是使用实际上是由晶体管构建的非常高速的“电容器”制成的(因此几乎没有“滞后”来读取/写入)。它们),称为静态RAM(SRAM);主存储器RAM使用较低的功率制成,但使用的电容器较慢且便宜得多,这些电容器称为动态RAM(DRAM)。

时钟

CPU的一个非常重要的组成部分是时钟。时钟是定期“滴答”以同步处理的组件。时钟通常包含具有众所周知且相对恒定的振荡周期的石英或其他材料,并且时钟电路会维持并测量该振荡以维持其时间感。

CPU操作时钟滴答之间进行,读/写滴答之间进行以确保所有组件在中间状态下同步移动且不会相互踩踏。在我们的(2,3)图灵机中,时钟滴答之间的电流通过逻辑门计算出输入的输出(I1,I2,R(t));然后时钟滴答声中,磁带写入器将O1,O2写入磁带,电机将根据M的值移动,并且内部寄存器从R(t + 1)的值写入,然后,磁带读取器将读取当前磁带并将电荷放入I1,I2,并且内部寄存器被重新读回到R(t)。

与外围设备交谈

请注意(2,3)图灵机如何与其电动机连接。这是CPU如何与任意硬件接口的非常简化的视图。任意硬件都可以侦听或写入用于输入/输出的特定电线。在(2,3)图灵机的情况下,它与电动机的接口只是一条单线,指示电动机顺时针或逆时针旋转。

在该机器上没有说的是,电动机必须具有另一个与机器内部的“时钟”同步运行的“时钟”,才能知道何时开始和停止运转,因此这是同步数据传输的一个示例。另一种常用的替代方法是,异步传输使用另一条线(称为中断线)在CPU和异步设备之间传递同步点。

数字时代

机器代码和汇编

汇编语言是机器代码的人类可读助记符。在最简单的情况下,汇编代码和机器代码之间是一对一的映射;尽管在现代汇编语言中,某些指令可能会映射到多个操作码。

程式语言

我们都熟悉这不是吗?


ew,终于完成了,我在短短4个小时内就输入了所有这些内容,因此我确定某个地方有一个错误(我主要是程序员,而不是电气工程师或物理学家,因此可能有些地方公然错误)。请如果发现错误,请立即提出@yell或自行修复(如果您有代表)或创建补充答案。


37
真棒 ”不能做到正义。这个答案肯定是英雄
njd 2011年

1
原子部分不正确吗?通常,它们电离形成带电原子,而不是保持中性,以便具有完整的外部子壳。
备用

3
+1,如果可以的话,+ 1000。我真正感到惊讶的是,为什么我喜欢这个领域,是因为答案中的大量信息甚至还没有开始触及使现代PC工作的惊人技术深度。
quentin-starin 2011年

哇靠。棒极了。我希望我可以做的不止一次。
Rob P.

3
+1虽然我觉得我应该注意现代硬件不是完全通过NAND门完成的。有门,是的,但是它们确实非常复杂,并且仅(通常)近似于NAND逻辑。约束几乎是物理上的。首先将物理门组装成逻辑模块,该逻辑模块可以是经典的NAND,但通常更多(例如,触发器或半加法器)。允许的门的确切集合取决于所使用的逻辑样式和制造工厂的约束条件。并非每个晶圆厂都能建造一切。(Aaargh!我开始记住细节!帮助!)
Donal Fellows

12

从南德到俄罗斯方块只需12个步骤

我认为这绝对适合您:

从Nands到Tetris,只需12个步骤


感谢您的链接,现在观看。这些谈话是否有中心索引,或者您只是偶然在某个地方的博客上看到此话题?
2011年

我不确定,这一点是在我一天冲浪时出现的
-Darknight

他错过了第13步-硅片。
工作

感谢您发布!这基本上是课程大纲的摘要,该课程的纲要是作者在以色列IDC的视频讲座中演讲的内容,并且基于他的书-我在回答中张贴了该书的链接。
littleadv

这个网站是相同的材料吗?因为它看起来比仅仅一个大型视频nand2tetris.org
震撼了2013年

10

如果您已经完成组装,那么实际上只剩下两三层需要理解:

  • 逻辑门,这是通过移动电子实现逻辑的方式-在这里确实成为电子问题
  • CPU和系统设计,这是构成逻辑门以形成CPU并与RAM和外围设备连接的方式。现代CPU非常复杂,但是如果您希望了解事物的基本工作原理,那么看看像Z80这样的经典简单CPU就足够了。
  • 微码,这是解释汇编指令并将其转换为寄存器和逻辑电路的硬件级动作的方式。

最后一个(微码)对我来说是“单击”的原因,因为它填补了电子和代码之间的空白。


也许我缺少微码。我参加了逻辑门和CPU /系统设计课程,并在汇编中编程,并且学习了有关二进制命令的所有知识(并且在所有这些课程中都做得不错),但是我仍然无法告诉您它们如何完美地结合在一起。我将不得不研究微码。
Casey Patton

@Casey:很有可能确实是您所缺少的。对我而言,学习(并编写一些)微代码正是我的目的:好的,现在我了解了计算机的工作方式。当然,它们已经变得如此复杂,以至于您仍然可以轻松地遇到似乎难以理解的情况,但是我非常相信,只要您有能力,坚持不懈并投入足够的时间,任何这种情况都可以理解。
Michael Borgwardt

7

可以在此处找到CS本科课程提纲的示例,该课程准确说明了您所要求的内容(IDC.AC.IL课程CS101)。它基于麻省理工学院出版社的这本书:“ 计算系统的要素:从第一原理构建现代计算机 ”。


1
+1提及“计算系统的元素”。这是一本很棒的书,应该准确回答“计算机如何工作?”的问题。
Cedric

您介意进一步解释这些资源的用途吗?为什么建议您在回答所提出的问题时使用这些资源?在Stack Exchange上不太欢迎使用“仅链接的答案”
gnat


4

我强烈推荐Charles Petzold 编写的Code。这本书既是历史课程,又是如何构建计算机的技术概述。该书首先介绍了简单的电报开关,然后介绍了晶体管的工作原理,然后介绍了逻辑门,可编程计算机以及更复杂的东西。它的写法也很好,有足够的好奇心的人都可以抓住它。


3

列出您可能需要了解的所有内容以充分了解您需要了解的内容将太困难(而且太长了!)。可以真正回答所有这些问题的著名著作出自Andrew Tanenbaum:《结构化计算机组织》

本书实际上使您从办公桌上的物理计算机一直走到逻辑门和布尔代数,然后显示了示例体系结构来指导您了解在这种系统中实际发生的一切。

(请注意:这是很昂贵的,因为它约有800页。仅购买二手版本或更旧的版本可能会很好。概念没有改变。)


2

好吧,这么多话要问我猜。

几乎越来越多的代码减少到更复杂的较低级别的代码。向下到汇编级代码,带有推入和移动寄存器..等...

然后,硬件将采用此代码并对其执行操作。多数情况下,硬件实际上会针对操作方式有自己的说明。因此,可能有一个简单的指令,例如PUSH,其中寄存器(内存位置)获得的值是1或2或其他。

绝对是计算机问题。还有一个编程。一些程序员对将采用您的代码并使其执行某些功能的硬件进行编程,尽管它的级别很低。这也是一个电子问题。


1

有设备。

然后是与这些设备交互的设备驱动程序。用C编写的零件,通常是汇编零件。

操作系统在一端与应用程序软件交互,在另一端与设备驱动程序交互,以与实际硬件进行通信。

如果您真的有兴趣,为什么不做Linux内核黑客学习呢?


感谢您的回答和建议。这听起来像一个好主意!
Rob P.

1

事物的核心是电子学问题,尽管任何CS学位的调查课程都应涵盖其基本知识。所有硬件都基于在组件级别编程到其中的门进行​​操作。这些是最基本的逻辑运算:NOT,AND,OR,XOR,NAND,NOR。每个门都有特定的功能:

NOT门需要一个输入值,并产生一个输出值,它得到一个0或1,并输出相反。

AND门有两个输入值,并产生一个输出值,它得到的0和1,并输出0的任意组合为任何组合,除了两个1,为此它输出1。

或”门的工作原理与“与”门很相似,但对于每个0和1的组合,除两个零(对于其输出为0)之外,它都会产生1。

异或”门再次类似于“与”门和“或”门,但是当两个输入相同时它将产生0,而当两个输入不同时将产生1。

与非”门与“与”门逻辑相反,“ 或非”门与“或”门逻辑相反。

换句话说,在硬件级别,所有这些都归结为最基本的二进制逻辑表达式。所有其他一切只是从较高级别的编程到较低级别的编程直至到达最后一层的过渡。


+1下一级是如何使用这些逻辑门进行顺序动作。关键组件是触发器。组装逻辑门以形成一个ALU,一些用于寄存器的触发器,一个时钟,然后得到一个CPU。
mouviciel 2011年

@mouviciel您忘记了多路复用器。
starblue 2011年


1

虽然我发现有些人可以在不了解硬件的情况下完成CS课程,但我认为这很惊人,但我认为课程完全可能只专注于理论作为数学的一个分支,而不是工程和实施细节。SICP的古老演讲(在1980年代发表)似乎是这样的。

在二十年前的我的CS课程中,第一年需要阅读较早版本的Computers:从Logic到Architecture
这样的事情应该填补空白。

另外,麻省理工学院的开放课件应该有帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.