web-dev-qa-db-ja.com

コンピュータはどのように機能しますか?

これはほとんど恥ずかしい質問です...私はコンピュータサイエンスの学位を取得しています(2番目のコースも進行中です)。私はほぼ5年間、フルタイムの.NET開発者として働いてきました。私は一般的に私がやっていることに長けているようです。

しかし、コンピュータの仕組みがわかりません!

少しの間、私と一緒に裸になってください。 「コンピュータのしくみ」の簡単なグーグルはたくさんの結果を生み出しますが、私が探しているものに本当に答えたものを見つけるのに苦労しました。これは非常に大きな質問であることを理解しています。本当に、キーワードや方向性を教えていただければ。

コンポーネント、電源装置、マザーボード、RAM、CPUなどがあることを知っています。そして、それらが何をしているかについての「一般的な考え」がわかります。しかし、.NET(またはJavaまたはC++))のConsole.Readline()のようなコード行からどのように行くのか本当に理解しておらず、実際にdoもの。

確かに、私は漠然とMSIL(.NETの場合)を知っており、JITコンパイラでいくつかの魔法が発生し、それがネイティブコードに変わると思います(私はそう思います)。 Javaも同様で、C++が中間ステップをカットアウトします。

メインフレームの組み立てをいくつか行いました。それは数年前のことです。いくつかの命令といくつかのCPUレジスタがあったことを覚えています、そして私はコードを書きました...そしてその後、いくつかの魔法が起こりました...そして私のプログラムは動作しました(またはクラッシュしました)。私が理解していることから、「エミュレータ」は、命令を呼び出したときに何が起こるかをシミュレートし、CPUレジスタを更新します。しかし、それらの指示が彼らがするように機能するのは何ですか?

これは「コンピュータ」の質問ではなく、電子機器の質問に変わりますか?これを理解するための実用的な理由はないと思いますが、私は理解できるはずです。

(はい、これは小さな子供と1日を過ごすときに何が起こるかです。あなたが知らないことを理解するのに、「なぜ?」と尋ねるのに約10分と5回の反復が必要です)

59
Rob P.

私は、関連する可能性のある最低レベルから開始します(さらに低いレベルから開始することもできますが、それらはおそらくあまり関係がありません)。Atomから、電気、トランジスタ、ロジックゲート、集積回路(チップ/ CPU)まで)、アセンブリで終了します(私はあなたがより高いレベルに精通していると思います)。

初めに

Atom

Atom は、電子、陽子、および中性子(それ自体が 素粒子 で構成される)で構成される構造です。コンピュータとエレクトロニクスのatomの最も興味深い部分は electrons です。これは、電子が移動可能であるため(つまり、移動がより困難な陽子や中性子とは異なり、比較的簡単に移動できるため)、それらは、アトム内に保持されることなく、それ自体で自由に浮遊できます。

通常、各原子は同じ数の陽子と電子を持ち、これを「中性」状態と呼びます。偶然にも、atomが余分な電子を失ったり獲得したりする可能性があります。この不平衡状態の原子は、それぞれ「正に帯電」atom(電子よりも陽子が多い)と「負に帯電」atom(陽子よりも電子が多い)であるといいます。

電子は構築不可能であり、破壊不可能です(量子力学ではそうではありませんが、それは私たちの目的には関係ありません)。したがって、atomが電子を失うと、近くにある他のatomが余分な電子を受け取るか、電子が自由に浮遊する電子に放出されなければなりません。逆に、電子は構成できないため、余分な電子を得るために、 atomは近くの原子から、または自由浮遊電子からそれを吸収しなければなりませんでした。電子の力学では、正に帯電した原子の近くに負に帯電したatomがある場合、一部の電子は両方の原子が同じ電荷を持つまで移動します。

電気

Electricity は、負に帯電した原子が非常に多い領域から、正に帯電した原子が非常に多い領域への電子の流れです。特定の化学反応により、多くの負に帯電した原子を持つノード(「アノード」と呼ばれる)と、多くの正に帯電した原子を持つノード(「カソード」と呼ばれる)が存在する状況が発生する可能性があります。反対に帯電した2つのノードをワイヤーで接続すると、電子の塊が陽極から陰極に流れます。この流れを「電流」と呼びます。

すべてのワイヤが同じように簡単に電子を伝達できるわけではありません。電子は、「抵抗性」のある材料よりも「導電性」の材料の方がはるかに簡単に流れます。 「導電性」の材料は電気抵抗が低く(ケーブルの銅線など)、「抵抗性」のある材料は電気抵抗が高い(ゴム製ケーブルの絶縁など)。一部の興味深い材料は、半導体(シリコンなど)と呼ばれます。これは、抵抗を簡単に変更できるためです。特定の条件下では、半導体が導体として機能し、他の条件では抵抗に変わることがあります。

電気は常に抵抗が最も小さい材料を流れることを好みます。そのため、カソードとアノードが2つのワイヤーで接続されている場合、1つは非常に高い抵抗を持ち、もう1つは非常に低い抵抗を持ち、電子の大部分は低抵抗ケーブルを通って流れます。高抵抗材料を通過するものはありません。

中世

スイッチとトランジスタ

スイッチ/フリップフロップは通常のライトスイッチに似ています。スイッチを2本のワイヤーの間に配置して、電気の流れを遮断したり復元したりできます。トランジスタは、ライトスイッチとまったく同じように機能しますが、物理的にワイヤを接続および切断する代わりに、トランジスタは、ベースノードに電気があるかどうかに応じて抵抗を変更することにより、電気の流れを接続/切断します。/know、トランジスタを半導体で作るのは、電流を接続したり切断したりするために、半導体を抵抗器または導体に変えることができるからです。

トランジスタの一般的なタイプである NPNバイポーラジャンクショントランジスタ (BJT)には、「ベース」、「コレクタ」、「エミッタ」の3つのノードがあります。 NPN BJTでは、「ベース」ノードが充電されている場合にのみ、「エミッタ」ノードから「コレクタ」ノードに電気が流れます。ベースノードが充電されていない場合、実質的に電子が流れることができず、ベースノードが充電されている場合、電子はエミッタとコレクタの間を流れることができます。

トランジスタの挙動

(私がインタラクティブなグラフィックスで私よりよく説明できるので、続行する前に this を一読することを強くお勧めします)

トランジスタのベースとコレクタを電源に接続し、そのコレクタの近くに出力ケーブルを配線するとします( http://www.spsu.edu/cs/facultyの図3を参照)。/bbrown/web_lectures/transistors / )。

電気をベースにもコレクターにも適用しない場合、次に説明する電気がないため、電気はまったく流れません。

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

論理ゲート

1つのトランジスタ(E1)のエミッタを別のトランジスタ(C2)のコレクタに接続し、最初のトランジスタ(O)のベース近くに出力を接続する場合( http:// wwwの図4を参照) .spsu.edu/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

Lo and behold、ブール論理および/または論理ゲートに精通している場合、これがまさにNANDゲートであることに気付くはずです。ブールロジックやロジックゲートに精通している場合は、NAND(およびNOR)が 機能的に完全 、つまりNANDのみを使用していることを知っているかもしれません。ゲートと残りの真理値表。つまり、NANDゲートのみを使用してコンピュータチップ全体を設計できます。

実際、NAND、NOR、AND、ORなどの組み合わせを使用するよりも製造コストが安いため、ほとんどのCPUはNANDを使用して設計されています(または使用されていましたか?)。

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

同様の方法で他の論理ゲートを構築できます。 NANDゲートは機能的に完全なので、2つ以上の入力と1つ以上の出力を持つロジックゲートを構築することも可能です。そのようなロジックの構築方法については説明しません。ここの門。

悟りの時代

ブールゲートからのチューリングマシンの構築

CPUは、チューリングマシンのより複雑なバージョンです。 CPUレジスタはチューリングマシンの内部状態であり、RAMはチューリングマシンのテープです。

チューリングマシン(CPU)は3つのことを実行できます。

  • テープから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ゲートが機能的にであることを知っているのでcompleteの場合、この真理値表を実装する一連のNANDゲートを見つける方法があります。

チューリングマシンの重要な特性は、固定状態テーブルのみを持つチューリングマシンを使用して stored-program computer をエミュレートできることです。したがって、すべてのUniversal Turing Machineは、命令を内部状態テーブルにハードコードする必要がなく、テープ(RAM)からプログラムを読み取ることができます。言い換えると、私たちの(2,3)チューリングマシンは、論理ゲート実装で(ハードウェアとして)ハードコードされる代わりに、(ソフトウェアとして)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)チューリングマシンでは、betweenクロック刻みの電気が論理ゲートを通過して、入力(I1、I2、R(t))からの出力を計算します。およびinクロックが刻み、テープライターはO1、O2をテープに書き込み、モーターはMの値に応じて移動し、内部レジスターは値から書き込まれますR(t + 1)の場合、テープリーダーは現在のテープを読み取り、I1、I2に電荷を入れ、内部レジスタはR(t)に再度読み取られます。

周辺機器と話す

(2,3)Turing Machineがそのモーターとどのように連動するかに注意してください。これは、CPUが任意のハードウェアとどのようにインターフェースするかを示す非常に簡略化されたビューです。任意のハードウェアは、入力/出力の特定のワイヤをリッスンまたは書き込みできます。 (2,3)チューリングマシンの場合、モーターとのインターフェースは、モーターに時計回りまたは反時計回りに回転するよう指示する1本のワイヤーです。

このマシンで言及されていないのは、モーターは、実行の開始と停止のタイミングを知るために、マシンの内部「クロック」と同期して実行される別の「クロック」を備えていなければならないということです。これが 同期データ送信 。もう1つの一般的に使用される代替の非同期伝送では、割り込みラインと呼ばれる別のワイヤーを使用して、CPUと非同期デバイス間の同期ポイントを通信します。

デジタル時代

機械コードとアセンブリ

アセンブリ言語は、人間が読める機械コードのニーモニックです。最も単純なケースでは、アセンブリとマシンコードの間に1対1のマッピングがあります。最近のアセンブリ言語では、一部の命令が複数のオペコードにマッピングされる場合があります。

プログラミング言語

私たちは皆、これに精通していますね。


ふう、ようやく完成し、たった4時間ですべて入力したので、どこかに間違いがあると確信しています(私は主にプログラマーであり、電気技師でも物理学者でもないので、明らかに間違っていることがいくつかあります)。間違いを見つけた場合は、担当者がいる場合や補足的な回答を作成する場合は、@ yellを指定するか、自分で修正してください。

139
Lie Ryan

Nandからテトリスへ12ステップ

これはあなたにとって完全に完璧だと思います:

Nandから12ステップのテトリスへ

12
Darknight

アセンブリを完了した場合、理解する必要があるのは実際には2つまたは3つの層だけです。

  • 論理ゲート 、これは、電子を移動することによって論理がどのように実装されるかを示します-ここでは電子工学の質問になります
  • CPUとシステムの設計、つまり論理ゲートを構成してCPUを形成し、RAMおよび周辺機器と接続する方法です。最近のCPUは非常に複雑ですが、基本的にどのように機能するかを理解するために、 Z8 のような古典的なシンプルなCPUを見るには十分です。
  • マイクロコード 。これは、アセンブリ命令が解釈され、ハードウェアレベルのレジスタおよびロジック回路のアクションに変換される方法です。

最後の1つ(マイクロコード)は、エレクトロニクスとコードの間のギャップを埋めたため、「クリック」した理由です。

10

あなたが質問した内容を正確に説明するCS学部コースのシラバスの例は次のとおりです ここ(IDC.AC.ILコースCS101) 。これはこれに基づいていますMITプレスブック: " コンピューティングシステムの要素:第一原理から現代のコンピューターを構築する "。

7
littleadv

この質問に完全に答えるには、1冊の本が必要です。幸いなことに、誰かがその本をすでに書いています。これは、Charles Petzoldによって コード:コンピュータハードウェアおよびソフトウェアの隠された言語 と呼ばれています。それは非常に有益で非常に面白い読み物です。

7
Bill the Lizard

Charles Petzoldによる Code を強くお勧めします。この本は、歴史のレッスンであり、コンピュータを構築する方法の技術的な概要でもあります。簡単な電信スイッチの説明から始めて、本はトランジスタがどのように機能するか、次に論理ゲート、プログラム可能なコンピュータ、より複雑なものに至るまでを示しています。また、非常によく書かれており、おそらく十分な好奇心を持つ人なら誰でも理解できるでしょう。

4
Doug T.

知っておくべきことを十分に理解するために知っておく必要のあるすべてのものをリストアップするのは、非常に難しく(長く)なるでしょう。これらすべての質問に実際に答える有名な本は、Andrew Tanenbaumによるものです Structured Computer Organization

この本は、実際に机上の物理的なコンピュータから論理ゲートとブール代数まであなたを連れて行き、そしてそのようなシステムですべてが実際にどのように起こるかをガイドするアーキテクチャの例を示します。

(1つの注意:800ページ以下であるため、非常に高価です。おそらく、中古版または古い版を入手するだけで十分です。コンセプトは変わりませんでした。)

3
Deckard

まあそれを言って、私が推測することを尋ねるにはたくさんのボールが必要です。

ほとんどのコードはさらに複雑になり、より複雑な下位レベルのコードにまで削減されます。レジスターをプッシュして移動することで、アセンブリー・レベルのコードに移動します。

次に、ハードウェアがこのコードを受け取り、それに作用します。ほとんどの場合、ハードウェアは実際に、実行方法に関する独自の指示を持っています。したがって、レジスタ(メモリ位置)が1や2などの値を取得するPushなどの簡単な命令があるかもしれません。

それは間違いなくコンピュータの問題です。また、プログラミングの問題もあります。一部のプログラマーは、コードを取得して非常に低いレベルではあるものの何かを実行させるハードウェアをプログラムします。また、電子機器の問題です。

2
Ross

誰かがハードウェアを理解せずにCSでコースを完了することができるのは驚異的ですが、コースは、工学や実装の詳細ではなく、数学の分岐としての理論のみに集中できたのではないかと思います。由緒ある [〜#〜] sicp [〜#〜] 講義(1980年代に提供されたもの)は次のように見えました。

20年前の私のCSコースでは、初版の Computers:Logic to Architecture の初版を読む必要がありました。
このような何かがギャップを埋めるはずです。

代わりに、MITの Open Courseware に役立つものが必要です。

1
njd

デバイスがあります。

次に、これらのデバイスと対話するデバイスドライバーがあります。通常、Cで記述された部分、Assemblyでの部分。

OSは、実際のハードウェアと通信するために、一端でアプリケーションソフトウェア、他端でデバイスドライバーと対話します。

あなたが本当に興味があるなら、なぜLinuxカーネルをハッキングして詳細を調べてみませんか?

1
Fanatic23

これの基本は電子工学の質問ですが、この基本はCSの学位の調査コースでカバーされているはずです。すべてのハードウェアは、コンポーネントレベルでプログラムされたゲートに基づいて動作します。これらは論理演算の最も基本的なものです:NOT、AND、OR、XOR、NAND、NOR。各ゲートには特定の機能があります。

[〜#〜] not [〜#〜]ゲートは1つの入力値を取り、1つの出力値を生成します。0または1を取得し、その逆を出力します。

[〜#〜] and [〜#〜]ゲートは2つの入力値を取り、1つの出力値を生成し、0と1の任意の組み合わせを取得し、2つの組み合わせ以外の任意の組み合わせに対して0を出力します。 1を出力します。

[〜#〜] or [〜#〜]ゲートはANDゲートのように機能しますが、0と1のすべての組み合わせに対して1を生成します。 0。

[〜#〜] xor [〜#〜]ゲートもANDとORゲートの両方に似ていますが、両方の入力が0の場合、0が生成されます同じで、両方の入力が異なる場合は1。

[〜#〜] nand [〜#〜]ゲートはANDゲートの論理的な反対であり、[〜#〜] nor [〜#〜]ゲートはORゲートの論理的な反対。

つまり、ハードウェアレベルでは、すべてが最も基本的な2項論理式になります。他のすべては、この最後の層に到達するまでの、より高いレベルのプログラミングからより低いレベルのプログラミングへの移行です。

1
MaQleod

機械語命令で高級言語にプログラムを変換する部分については、どのコンパイラーブックでもその要件を満たす必要があります。たとえば ドラゴンブック です。

「命令の実行方法」の部分について コンピューターの構成と設計:ハードウェア/ソフトウェアインターフェイス が請求書を満たしているはずです。

1
AProgrammer