コンピュータハードウェアの構成

コンピュータを構成する装置

コンピュータは、普通以下のような装置からなる:

中央処理装置(CPU, central processing unit)
あまり日本語で「中央処理装置」という人はいない。CPU というのが普通。 データの処理をする装置。
主記憶装置(main memory)
データを記憶する装置。実行中のプログラムを記憶しておいたり、 プログラムが作業する上で必要なデータを置くのに使う。 これもカタカナでメインメモリと言うことが多い。
補助記憶装置(auxiliary memory)
データを記憶する装置。主記憶装置よりも動作速度が遅い。 データを永続的に記憶しておくために使うのが普通の使い方。 ファイルの保存は普通ここにする。 "auxiliary memory" というのは発音しにくいせいか、 あまりカタカナでは言わない。
入力装置(input device)
コンピュータにデータや指示を与えてやるための装置。
出力装置(output device)
コンピュータからデータを取り出したり、 処理結果を表示したりするための装置。

一般に装置のことをデバイス (device) と呼ぶことが多い。

入力と出力は合わせて入出力ということも多く、 入力装置と出力装置をひっくるめて入出力装置という言葉がよく使われる。 入出力を英語で短く I/O (アイオー)と呼ぶ(Input/Output から来た言葉)。 入力装置と出力装置をかねる装置もよくある。

主記憶装置と色々な補助記憶装置をひっくるめて単に記憶装置ともいう。

主記憶装置としては、現在、シリコン(硅素、元素記号 Si、代表的な半導体である)を主な原料として製造される 半導体メモリと呼ばれるもの (特に RAM と呼ばれるもの)を使うのが普通。 くわしくはあとで。 補助記憶装置としては、 ハードディスクフロッピーディスクなどがある。 これもくわしくはあとで。 入力装置の代表例としては、 キーボードマウスがある。 出力装置の代表例としては、ディスプレイ(種類はいろいろ)、 プリンタなどがある。

他に、他のコンピュータと通信するための装置もあるが、 これは入出力装置の一種と見ることも可能。 (データの入力をしたり出力を受けとったりするのが人間でなく、 接続先のコンピュータになっているだけ。) しかし、通信装置を独立させて考えてもよい。

バス

これら装置の間で、データのやりとりをする際に、 データの通路が必要になる。 つまり、装置間の通信路であるが、 それには、バス (Bus) というものが用いられる。

バスは、複数の装置が共通に利用する通信路である。 バスには複数の導線が使われるが、それらの中には、制御用の信号線や、 データが流れる線がある。 複数のビットを同時に送れるように、 データが流れる線は複数用意されていることがある (16ビット、32ビット、64ビットなど)。 データが流れる線の本数を、 そのバスのデータ幅と呼ぶ。 データ幅が大きいほど、一度に多くのデータのやりとりができるが、 それだけバスの作りが大がかりになる。

           _______
          |       |                 バス
          |  CPU  |----------------------------------------------
          |_______|      |           |          |                |
                      ___|____    ___|___    ___|___          ___|___
                     |        |  |       |  |       |        |       |
                     | 主記憶 |  |  IF1  |  |  IF2  |        |  IFn  |
                     |________|  |_______|  |_______|        |_______|
                                     |          |                |
                                  ___|___    ___|___          ___|___
                                 |       |  |       |        |       |
                                 |  Dev1 |  |  Dev2 |        |  Devn |
                                 |_______|  |_______|        |_______|
        
        
              IF1 〜 IFn:   インタフェース
              Dev1 〜 Devn: デバイス

(インタフェースとは、 2つのものの間の通信の仲立ちをするようなものだ、 とここではとりあえず思っておけばよい。 例えば、Dev1 がハードディスクなら、IF1 はハードディスク用のインタフェース。)

上の Dev1〜Devn の中にハードディスク、キーボードなどが含まれる。 インタフェースとデバイスの間がまた別のバスになっていることもある。

単純に考えれば、バスなど使わず、 各装置を2つずつ互いに接続してしまえばよいと思うかも知れないが、 それは現実的でない。 n 個の装置から2個選んで結ぶ結び方は (1/2)×n×(n-1)で、 これは n が増えると非常に大きくなる:

          n   (1/2)×n×(n-1)
      --------------------------
          2        1
          3        3
          4        6
          5       10
          6       15
          7       21
          8       28
          9       36
         10       45
         20      190
         30      435
        …
        100     4950

また、n が少ない場合でも、 各装置に他の装置への通信路を接続する仕掛けが n - 1 個も必要でコストがかかる。 (n = 3 ですでにうっとうしい。) しかも、そんなにコストをかけても、 ほとんどの時間ほとんどの通信路が遊んでいることになるだろう。 (A が B にデータを送っている間、 A は他の C, D, E … などにはデータを送れないだろうから、 C, D, E …への通信路は遊んでしまう。) だから、共通の通信路を複数の装置で共有するのが得策。

A と B が同時にバスにデータを送り出そうとしたらどうなるか? データが混ざってしまわないか、と心配になるかも知れないが、 バスの利用を調停するしかけがしてあるので大丈夫。 A と B のどちらかは、もう一方のデータ送信が終わるまで待たされる。

また、データの行き先を間違えないような仕掛けもしてあるので、 受信するほうも大丈夫。

コンピュータの五大装置

先に挙げた CPU, 記憶装置, 入力装置, 出力装置以外に、 よくコンピュータの構成要素として 制御装置が挙げられているが、上の図では、 制御装置は CPU や各インタフェースなどの中に入っているので表面に現れていない。 また、演算装置というものを構成要素に入れている文献があるが、 それは CPU の中に入っていて、四則演算や論理演算などを実行している。 CPU の中には、制御をしている部分もあるので、 大ざっぱに言えば CPU は制御装置と演算装置からできていると見ることもできる。 よく、制御装置、演算装置、記憶装置、入力装置、出力装置の5つに分類して、 これを計算機の5大装置と呼んだりしている。

CPU

プログラムもデータも2進数で表わされるので、 プログラムもデータの一種として扱えるから、 プログラムもデータも同じように主記憶に置かれる。 これをプログラム内蔵(stored program)方式という。

プログラム内蔵方式が現れる前は、 プログラムはデータとは別に紙テープなどで外から供給された。 現在でも、プログラムを最初に入力する時は、 外から供給するしかないわけだが、プログラムの実行時には、 すでに主記憶にプログラムが入った状態になっており、 実行途中で紙テープのような装置からプログラムを読み込むことは普通しないし、 したとしても、一旦メインメモリにプログラムを入れたあと実行する。

プログラムは命令(instruction)の列になっている。 CPU は主記憶から命令を順次読み出し、命令の内容に従って処理を行なって行く。 一つの命令の実行は、大ざっぱには次のように行なわれる:

  1. 命令を主記憶から読み出す(命令のフェッチ, instruction fetch)。
  2. その命令がどのようなものか調べる (命令のデコード, instruction decode)。
  3. その命令を実行(execute)。

命令の種類によっては、(3)の実行時に、 データを主記憶から CPU へ読み込んだり、 CPU から主記憶へデータを転送したりする。 実行結果によって CPU の状態を変えたり、 現在の CPU の状態に応じて次にどこから命令を読んでくるかを変える仕掛けもある。

主記憶から読み込んだデータを入れておいたり、 CPU 内で演算をした結果を入れたりするための小さな記憶装置として、 レジスタと呼ばれるものも持っている。 レジスタはなぜか1本2本と数えることになっている。 何本のレジスタを持つかは CPU の種類ごと(製品ごと)に違うが、 数はそう多くない(せいぜい何百本か)。 レジスタは記憶容量は小さいがきわめて高速に(主記憶より高速)動作する。 レジスタ1本の記憶容量は16ビット、32ビットあるいは64ビットなどである。

主記憶

ワード

記憶の最小単位はもちろん1ビットである。 1ビットの記憶をするしかけ(メモリセル, memory cell)が主記憶内にたくさん用意されている。 しかし、1ビットずつ読んだり記録したりするのは、効率が悪いので、 普通何ビットかの単位で読み書きする。 この単位を (ワード, word)と 言っている。 (日本語訳としては「語」だが、業界の人間は皆ワードと言う。)

1ワードが何ビットかはマシンごとに違う。 例えば、1ワードが16ビット(=2バイト)のマシンや、32ビット(4バイト)、 64ビット(8バイト)のマシンがある。 普通、整数を格納するレジスタの容量がワードのサイズに等しいと思ってよい。

今日、ワードは普通1バイトの整数倍、つまり8ビットの倍数であるが、 昔は1ワードが36ビットと言ったマシンもよくあった。 (そのようなマシンでは9ビットを1バイトと呼んでいたりした。 また別のマシンでは、6ビットとか7ビットを1バイトと呼んでいたことがある。 しかし、そのようなマシンは使われなくなり、 「1バイト」という言葉も「8ビット」をさすものと皆が合意するようになった。)

現在、パソコンやワークステーションでは、 ワードのサイズが32ビットのものと64ビットのものが多い。 ワークステーションはかなり64ビットに移行したが、 パソコンはまだほとんど32ビットである。 ワードのサイズが変わるとオペレーティングシステムも作り直さないといけないので、 なかなか移行できない。

ワードのサイズが32ビットのマシンを「32ビットマシン」、 ワードが64ビットのマシンを「64ビットマシン」と区別して呼ぶ習慣がある。 といっても、 32ビットマシンの設計をひきずった「32ビット臭い」64ビットマシンもあるので、 きちんとした区別はしにくい所もある。

アドレス

主記憶にはアドレス(番地)というものがつけられている。 どの部分からデータを読むか、あるいはどの部分にデータを記録するか、 を区別するために、メモリの各部分に番地と呼ばれる数がつけられている。 読み書きは、番地を指定して行なう。 例えば、1248番地から、1バイト読み出す、など。 その時、何ビットを1かたまりにして番地をつけるかが決まっている。

                      ┌──────┐
            10000番地:│ 01110101   │
            10001番地:│ 10100010   │
            …        │ ……       │
            10100番地:│ 11010010   │

現在、最も普通に使われているのはバイトアドレッシングである。

整数と同様、アドレスも2進数で表される。

普通、1ワードが32ビットなら、アドレスにも32ビット用いる。 1ワードが64ビットなら、アドレスにも64ビット用いるのが自然だが、 48ビットくらいでもかなり大量のメモリが扱えるので、 48ビット程度しかアドレスに用いないこともある。

今、アドレスに32ビット使うマシンがあったとする。 2^32 = 4 ギガであるから、 このマシンでは、4ギガバイトのメモリを扱えることがわかる。 (ただし、バイトアドレッシングを仮定。)

昔なら、4ギガバイトは気が遠くなるほど巨大な容量だと思われた。 1980年代前半に開発されたパソコン用 OSである MS-DOS は 640KB しかメモリを管理することができなかった。 「1 MB なんていう大きなメモリはパソコンには必要ない」 などと言われていたのである。1991年になっても、 NEC の新製品にメモリが1.6 MB しか載っていなかった。 今でも 4ギガバイトは主記憶としては大きめの容量だが、 「非常に大きい」とは言えない。 現在 512 MB メモリでもおこづかい程度で買える。 8個買えばもう4GB になる。デジタルムービーを扱えば、すぐにデータが 何GB にもなる。

アドレスに64ビット使えるなら、4ギガの2乗だから、 とても使い切れないくらいメモリが使える。

サーバ機では、大量のメモリを積みたいという要求がかなりあり、 サーバ機向けには64ビットマシンが次第に普及してきている。

注: サーバとは、 何らかのサービスを提供するソフトウェアやハードウェアのこと。 サービスの種類ごとに「何々サーバ」と呼ぶ。 例えば、Web サーバとか、データベースサーバ (データの蓄積・管理・検索のサービスをする)など。 サーバ機とは、サーバ用途向けに作られているコンピュータのこと。 あるいはサーバ用途に使われているコンピュータのこと。

ちょっと IC の話

昔は電子回路を組み上げるのに、 たくさんの部品を導線で接続して行くしかなかった。 部品数が増えるとコストが非常にかかった。

ところが、半導体の薄い小片 (チップ (chip) という) に多数の素子を組み込む方法が発明されて、 状況は一変した。 そのようにして作られた回路を集積回路 (IC, Integrated Circuit) という。 (素子: 基本的な電子部品。抵抗、コンデンサ、トランジスタなど。)

半導体は、導体と絶縁体の中間の性質を持つ。 すなわち、金属などの導体ほど電気を流しやすくないが、絶縁体でもない。 半導体材料としては、普通 シリコン (硅素, 元素記号は Si) が使われている。

他の半導体としては、ゲルマニウムガリウムヒ素などがある。 ガリウムヒ素は光を出したり光に反応したりする素子によく使われている。 最近、有機物半導体も研究されている。ダイヤモンドも半導体の一種なので、 ダイヤモンドを使う研究もある。

IC のうちで、1つのチップに1000個程度以上の素子を集積したものを LSI (large scale integration) と呼んでいる。 10万個程度以上になると、 VLSI (Very large scale integration) とも呼ばれる。 1000万個程度以上だと ULSI (Ultra large scale integration) と呼ばれることになっているらしいが、あまりそう呼ぶ人を聞いたことがない。 (すでにその規模の集積回路は存在するのだが。)

今日、CPU や主記憶は IC で構成されるのが普通である。 CPU を一つの IC にしてしまったものをマイクロプロセッサ(Microprocessor)という。 MPU (Micro Processing Unit) ということも多い。

ついでながら、CPU だけでなく、 その周辺の回路 (メモリや入出力コントローラなど) も IC にいっしょに入れてしまったものを マイクロコンピュータ と言っている。 よく、短く「マイコン」と呼んでいる。 家電機器などで「マイコン内蔵」と書かれているのは、これのこと。 (もっとも、 「マイコン内蔵」という売り文句がはやったのはずいぶん昔のことだが…。 今は内蔵しているのが当たり前なくらいなので宣伝文句にならない。) 「マイコン」は和製英語なので注意。

集積回路(特に CPU)の規模を示すのに、 それが含むトランジスタ数を使うことが多い。 何万トランジスタなどという。 トランジスタは、 電気的なスイッチングを行なう素子で、 論理演算や算術演算などコンピュータに必要不可欠な回路を構成するのに使われる素子である。

例:

最近の MPU の内部の配線は、線と線の間隔が0.13ミクロンとか0.09ミクロン と言った程度。(線にも太さがあるので、ここで言う間隔とは隣あった線の中 心どうしの距離を意味する。) ここで、1ミクロン = 1マイクロメートル = 100万分の1メートル = 1000分の1ミリである。

主記憶(続)---主記憶に使われる素子の種類

大きくわけて ROMRAM がある。

ROM

ROMRead Only Memoryに由来する言葉で、 「ロム」と読む。 ROM は、その中に記録されているデータを読み出すことはできるが、 そこに新たにデータを書き込む (書かれているデータを書き換える) ことはできないような記憶素子である。 (そんなものを何に使うかについては、あとで。)

では、一体いつ中身を入れるのかというと、 ROM の製造時にデータを書き込んでしまうのである。

ROM の記憶内容は、電源を切っても消えない。

RAM

RAMRandom Access Memory に由来する言葉で、 「ラム」と読む。 普通、主記憶の大部分は RAM が占める。 「ランダムアクセス」という特徴と「随時読み出し書き込み可」という特徴を持っている。

「ランダムアクセス」とは、 記憶装置のどの部分にも (ほとんど) 同じ時間でアクセスできることである。 (記憶装置に対するアクセスとは、読み出しあるいは書き込みをする操作のこと。) 例えば、テープ装置の場合、 テープを順々に送りながら読み書きしないといけないので、 テープのどの部分にアクセスするかでアクセスに要する時間 (アクセス時間) が大きく異なってしまう。 従って、テープ装置はランダムアクセスでない。 (シーケンシャルアクセスと呼ばれる → のちほど説明。)

「随時読み出し書き込み可」とは、いつでも何度でもデータを読み出せるし、 いつでも何度でもデータを書き込めること。 (世の中には、最初に一回だけ書き込み可 (書き直し不可) で読み出しはその あと何度でもできる、という素子もある。)

ところで、 「ランダムアクセス」という特徴は半導体製の ROM も持っているので、 ROM と区別するのに RAM という言葉を使うのは本来変なはずなのだが、 RAM という言い方が定着しているのでしかたがない。 計算機業界によくあるチャランポランな用語の一つ(笑)。

現在普通に使われている RAM は半導体でできていて、 電源を切ると記憶内容は消えてしまう。 (消えるというのは、全ビットが 0 になってしまうこと。 あるいは、全ビットが 1 になるような設計をしてもよいのかも知れないが…。 とにかく、入れてあったデータは読めなくなってしまう。) 電源を切った時に消えると困るようなデータは補助記憶にしまっておく。

さらに、RAM にも種類がある。 大きくわけて、DRAM (ディーラム, Dynamic RAM) と SRAM (エスラム, Static RAM) の2種がある。 大量に使われるのは DRAM である。 DRAM は、コンデンサに電荷がたまる性質を利用して作られている。 (コンデンサというのは、金属板を2枚、 絶縁体をはさんで向かい合わせたもので、 2枚の金属板の間に電圧をかけると、金属板に電荷がたまる。 電荷を失うと、両極間の電圧は下がってしまう。)

                   │
              + +  │  + +
             ───┴───


             ───┬───
              - -  │  - -
                   │

DRAM は、非常に小さなコンデンサに電荷がたまっているかいないかの区別を 1 と 0 の区別に使うことで1ビットを記憶する。 コンデンサに電圧をかけて電荷をためたあと、 コンデンサを電気的に他から切り離しても、 しばらくの間は電荷はたまったままである。 しかし、コンデンサの電荷はほうっておくと少しずつ洩れて行くので、 記憶が消える前に一度内容を読み出して、 それを再度書き込む、という操作を定期的に行なわないといけない。 この操作をリフレッシュという。 (こういう操作が必要なので、「Dynamic」 RAM と呼ぶわけ。) リフレッシュのための回路も DRAM の中に入っている。

リフレッシュをしている間は通常のアクセスはできない (例えば、その間 CPU はメモリの内容を読んだり、 メモリに書き込みをしたりできない)。

一方、SRAM は電源が供給されている限り (リフレッシュなどしなくても) 内容が消えない記憶方式を使っている。 しかも普通 DRAM よりかなり高速である。 (メモリが高速というのは、読み出しや書き込みに要する時間が短いこと。)

しかし、SRAM を構成するには、1ビットあたり、 DRAM の約4倍の素子数が必要。 従って、容量の大きいメモリを作るには、DRAM のほうが有利。 また、SRAM は一般にDRAMよりかなり高価。 これらが主記憶に主に DRAM が使われる理由である。

ROM の用途

コンピュータ内では、ほとんどすべての処理がソフトウェア (プログラム) で行なわれている。 例えば、プログラムは、動作する時には主記憶に入っていなければならないが、 ハードディスクのような装置から主記憶にプログラムを読み込む (ロードする)のもプログラムの仕事である。 では、一番最初のプログラムはどうやって主記憶に入ればいいのだろう?

昔は人間が手で入れていたこともある。 まず、イニシャルプログラムローダと呼ばれるプログラムを手で入力する。 コンピュータ本体の操作盤にスイッチがずらっと並んでいる。 例えば、1ワードが16ビットなら、16個のスイッチが並んでいて、 それぞれのオン・オフで対応するビットの1・0を表すことにして、 1ワード分の命令を表すようにスイッチをオン・オフしたら、 「ロード(load)」というボタンを押す。 それができたら、次の命令をまたスイッチで表現して、 「ロード」ボタンを押す。これをくり返す。

              スイッチ
               15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0       ______
          オン □ ■ □ □ ■ ■ ■ □ ■ ■ □ □ □ ■ ■ □      |      |
          オフ ■ □ ■ ■ □ □ □ ■ □ □ ■ ■ ■ □ □ ■      | LOAD |
                                                                    |______|
                0  1  0  0  1  1  1  0  1  1  0  0  0  1  1  0

これは大変な作業だったので、 職人芸的な(非常にトリッキーな)ワザを使ってイニシャルプログラムローダ (IPL) をいかに短く作るかを競い合ったものであったという。 当然コンピュータをよく使う人は IPL を暗記していた。

確かに IPL を入れるのは大変だったが、 かつて主記憶にコアメモリという素子が使われていたころは、 電源を切っても主記憶の内容が消えなかったので、 プログラムの暴走などで IPL が消えなければ、 IPL の入れ直しは必要なかった。 コアメモリは、磁気を利用した記憶素子だった。

現在は、ROM に IPL を入れておくことができる。 IPL が何段かになっていることもある。 一段目の簡単な IPL が補助記憶から二段目の (もう少し複雑 な機能を持つ) IPL (名前は別になっているかも) を読み込む (読み込んでメインメモリに入れる)、というしかけ。 一段目の IPL を簡単にしたい理由は、複雑だと、ROM が大量に必要になるからである。

IPL は補助記憶からオペレーティングシステムを読み込み、 それを起動する。

ハードディスクがパソコンに搭載するにはまだ高価過ぎたころ、 ROM に小さい OS (オペレーティングシステム) のようなものや、 プログラミング言語処理系が入っていたこともあった。 今はオペレーティングシステムはハードディスクなどに入れておくのが普通。

ROM には IPL だけでなく、 電源投入時にハードウェアを自己診断 (故障箇所がないか、などを調べる) するためのプログラムや、 色々な装置を初期化する (動作を開始するのにふさわしい状態にする) プログラムを含めることが多い。 そういうプログラムは、 一般に個々の製品モデルによって異なったものにしなければならない (ハードウェアの構成が変わるとそういうプログラムを作り直さないといけない) ので、ROM に入れておくのは割合もっともらしい。 (ソフトウェアだけれど、ハードウェアに密着しているので、 ハードウェアの一部みたいなもの。) このように、ソフトウェアとは言っても、 ハードウェアに近いようなもの、 ハードウェアに密着したようなものを「ファームウェア」と呼んでいる。

現在の技術では ROM は DRAM よりも低速である。 そのため、ROM に入っているプログラムをいったん RAM にコピーしてから実行することもある。

ROM の内容は書き換えができないのが普通だが、電気的な方法、あるいは、 紫外線を当てるなどの方法で、 内容を消して内容を書き換えることができる ROM も存在する。 ただし、通常高価なので、少量しか使われない。 そのような ROM (EEPROM など)が使われるケースとしては、 例えばファームウェアを入れておく場合が考えられる。 ファームウェアにバグ(プログラムの間違い)があったような場合、 あとからそれを直そうとすると、 ROM が書き換え可能でないといけないからである。 また、バグがなくても、バージョンアップしたい場合には、 ファームウェアの入ったROM を書き換える必要がある。