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

モデム

モデム(modem ← MOdulator-DEModulator, 変復調装置)とはデジタルのデータ を電気信号や光を変化させること(変調)によって表して送信する装置 (modulator, 変調装置) と、その逆を行なう受信装置(demodulator, 復調装置) の組合せからなる通信装置。

かつては、電話回線を伝わる音声信号を変化させることでデータを送受信する機 能を持つモデムがよく用いられた。今でももちろん利用されることはある。 まず、これについて説明する。

モデムは、

                              アナログ
                              電話回線
  コンピュータ <---> モデム <---------->  モデム <---> コンピュータ
               シリアル
               接続(外付けモデムの場合)

のような形で接続することにより、コンピュータどうしの通信を可能にする。 ファクス の機能も持っているものは、ファクスモデムと呼ばれる。モデム経 由でインターネットを利用することもできる。ただし、いわゆるブロードバン ドの普及によって、家庭やオフィスからの利用は減った。携帯電話にモデムを つなぐ利用法もかつてはよく見られたが、携帯電話の業者が自前のインターネッ ト接続サービスを提供するようになって、これも減った。 しかし、モデムはノート型 PC などに最初から組み込まれた形でよく出荷され ているので、アナログ電話回線用のモデムもしばらくは無くならないだろう。 ノート型のPCのハードウェア仕様に「56kbps モデム内蔵」とよく書かれている のはこれである。

電話回線ではなく、ケーブルテレビ(CATV)のケーブルを利用したネットワーク 接続サービスもある。また、電話回線を使うが、従来のモデムとは違う方法で データを送る ADSL (Asymmetric Digital Subscriber Line) と呼ばれるサー ビスも普及している。そのようなサービスにおいて、コンピュータを回線に接 続するための装置もモデムと呼ばれる。(音声信号を使わない場合でも、変調 装置と復調装置はあるので、モデムと呼んで良いわけだ。) ただし、アナログ電話回線用のものと区別するためにケーブルモデムとかADSL モデムと呼ばれている。アナログ電話回線用のものは PC のカタログなどでは よくアナログモデムと呼ばれている。

光の変化(変調)によって信号を送受信する光モデムというものもある。最近普 通してきた光ファイバ通信では光モデムを使うわけである。光通信の場合、電 気的なノイズが入り込む心配がないこと、干渉がないことから、高速な通信が できる。

干渉とは: 電気信号の場合、近くを通る信号線どうしで干渉が起こります。信 号線 A を流れる信号の影響を受けて信号線 B を流れる信号が少し変化してし まう、ということが起きるのです。

通信速度とその単位

通信速度の単位は bps (bit per second, ビット毎秒, 「ビーピーエス」と 読むことが多い) で、1bps とは、1秒あたり1ビット送信(または受信)する速 度である。

電話線用の最も高速なモデムは 56 kbps (kilo bps,キロビット毎秒) 程度 である。ただし、このモデムでは、送信・受信の両方で56kbps の速度が出る わけではない。送信は33.6kbps しか出ない。(通信速度の非対称性。)受信に 関しては、接続先の ISP (インターネットサービスプロバイダ, インターネッ トへの接続サービスを提供している業者)がこの手のモデムに対応してくれて いる時だけ、56kbps の速度が出る。さらに、これらは最高速度であって、回 線の状態が悪いときや、相手方(あるいはこちら)のコンピュータの処理が追い つかない場合にはもっと低い速度になってしまう。

ADSL やケーブルモデムの通信速度は最高数十Mbps といった程度(業者によっ て違う)である。

ADSL も通信速度に関して非対称性を持っている。すなわち、送信速度は受信 速度よりずっと低速しか出ない。一般のユーザの場合、受信するデータ量のほ うが送信よりもずっと多いので、これで十分なのである。ADSL の A の字は Asymmetric から来ているが、この語は「非対称」の意味である。非対称でな いサービスもあり、その場合は A の部分が別の字に変わる。そこで、同様の サービスで一般的なものについては、総称して xDSL と呼ぶことがある。

LAN でよく使われている Ethernet(イーサネット) の通信速度は規格によって違っていて、 一番古い 10BASE-T という規格で 10Mbps (mega bps, メガビット毎秒), 100BASE-TX 規格で100Mbps, さらに速い規格の 1000BASE-T で、1Gbps (giga bps, ギガビット毎秒, これは 1000Mbps に等しい) である。

さらに細かく言うと、10Mbps のイーサネットは半二重通信(half duplex)で あるのに対し、100Mbpsでは全二重通信(full duplex)であるから、そこでも差 がつく。半二重通信では、双方向に通信ができるが、同時に両方向に通信する ことはできず、片方向ずつ使うことになる(単線の鉄道のようなもの?)。全二 重通信では、同時に双方向に通信できる。

これらはいずれも最高でこれだけの速度が出る、ということである。ネットワー クに複数の装置が同時に信号を出そうとすると、待ち合わせが起こるので、ネッ トワークの混雑度がある程度以上になると急激にパフォーマンスが低下する。 高速道路も車が増えると渋滞するのと似ている。

ついでに伝送距離のことも言っておくと、100Mbps のイーサネット規格である 100BASE-TX の場合、信号を伝えることのできる最 大の距離(最大伝送距離)は100m である。つまり、ケーブルの長さは 100m ま ででなければならない。その以上の長さを伝送したければ、途中で信号を中継 できる装置を使うか、別の方式で接続する。よく見かける「スイッチングハブ」 (あるいは「スイッチ」とも呼ぶ)という装置は、ネットワークを分岐させるの に使われているが、中継も行っているので、スイッチングハブを通せば100m以 上でも伝送できる。

キャッシュメモリ

主記憶に使われる DRAM は CPU の速度に比べてずっと遅いということは前 に説明した。例えば、CPU のクロックが 500MHz だとすると、あるクロックパ ルスと次のクロックパルスの間の時間間隔(これを クロック周期 とか サ イクル という)は、1/(500*1000000) 秒 = 2 × 10^(-9) 秒 = 2 ns (ナノ秒) であるが、DRAM への一回のアクセスにかかる時間は 60ns 程度のものである。 (最近はもっと速い。60ns というのは、CPU が 500MHz くらいだったころの話。) (DRAM に対して、例えば読み出しの指示をする信号を送っても、データが DRAM から実際に出力されてくるのは 60 ns後。)

これでは、いくら CPU が速くなっても、CPU がメモリアクセスをするたび に待ちが発生する(メモリから反応が返るまで CPU が待つ)ので、コンピュー タ全体の性能は上がらない。

もちろん、DRAM を全部 SRAM のような速いメモリに置き換えれば速度は格 段に向上するが、SRAM は高価なため、コストがかかってしまう。

そこで、少量の高速メモリを使うだけで、大量の高速メモリを使うのとそう 変わらないような効果を上げられるような方法が考案された。その技法をキャッ シュメモリという。キャッシュメモリを使った場合、全てのプログラムの動作 が高速化されるわけではないが、統計的にみて多数のプログラムが高速化され る。キャッシュメモリのために使われる高速メモリとしては普通 SRAM が使わ れる。

キャッシュメモリの原理 I (読み出し)

まず、簡単のため、メモリの読み出しについてだけ考える。(書き込みにつ いてはあとで。) CPU は、主記憶から直接にデータを読み出すのではなく、主 記憶の一部の内容のコピーがキャッシュメモリ内に作られ、CPU はそこからデー タを読み出す。もう少し詳しく言うと、主記憶の X 番地の内容を読まなけれ ばならないとき、

                                 X 番地(*の所)
  主記憶                           ↓
    ┌───────────┬────────┬──────────┐
    │         …           │/////*/////////│         …         │
    └───────────┴────────┴──────────┘
                                     │
                     ┌───────┘ライン(斜線部)をコピーする
  キャッシュメモリ   ↓
    ┌───┬────────┬──────┐
    │  …  │/////*/////////│     …     │
    └───┴────────┴──────┘
                   │ 
                   │読み出し
                   ↓
               ┌───┐
               │ CPU  │
               └───┘

このようにして、ある記憶領域をキャッシュメモリの一部に対応づけるこ とを、「(その領域を)キャッシュ(cache)する」と言う。

RAM はランダムにアクセス可能であるが、実際のプログラムの挙動を見る と、本当にランダム(でたらめ)な順序でメモリをアクセスするわけではな く、ある番地にアクセスしたら、近いうちにまたその近くの番地にアクセ スすることが多い。従って、X 番地を読む時に、X 番地だけでなく、その 回りの番地も合わせた1つのラインをキャッシュにコピーしておけば、そ れからしばらくの間のアクセスは主記憶に対してではなく、キャッシュに 対するアクセスで済ませられる割合が高いと予想され、速度の向上が期待 できる。

つまり、キャッシュメモリによって高速化が達成できるのは、メモリアク セスのパターンが次のような空間的局所性時間的局所性を持つ傾向にあ るからだと言える:

アクセスしようとしているメモリアドレスがキャッシュメモリ上にあった 場合、「キャッシュにヒットした」という。逆にキャッシュメモリ上にな かった場合は「キャッシュミスが起きた」という。

アドレスの対応づけ(写像)

主記憶上でのラインの配置とキャッシュメモリ上でのラインの配置には何 の関連もない。例えば、下図のようになっていてもよい。

                                 
  主記憶       ライン1             ライン2
    ┌───┬─────┬───┬─────┬──────────┐
    │  …  │//////////│      │//////////│         …         │
    └───┴─────┴───┴─────┴──────────┘
                 │                  │
                 └───────┐  │
                     ┌─────┼─┘
  キャッシュメモリ   ↓          ↓
    ┌──┬─────┬──┬─────┬────┐
    │ … │//////////│    │//////////│  …    │
    └──┴─────┴──┴─────┴────┘
             ライン2           ライン1
             のコピー          のコピー

そこで、現在主記憶のどのラインがキャッシュメモリのどの場所にキャッ シュされているかを極めて短時間で調べる方法が用意されている。(その 方式については省略。)

ラインサイズ

ラインのサイズを大きくすると、実際にはアクセスしないデータまでたく さん移動させることになるから、ラインサイズはあまり大きくできない。 逆に、ラインサイズがあまり小さいとキャッシュの意義が薄れてしまう。 実際には、もっと色々な要因も考慮に入れてラインサイズを決めているが、 専門書によれば、32バイトから256バイトの間に設定されるのが普通だという。

ラインの置換

ところで、主記憶よりもキャッシュメモリのほうがずっと容量が小さいの だから、あるラインをキャッシュメモリに入れるためには、別のラインを キャッシュメモリから追い出さなければならなくなる、ということが頻繁 に起きる。この時、できるだけ「最後にアクセスしてから一番長く時間がたっ ているラインを追い出す」というアルゴリズム(LRU アルゴリズム ← Least Recently Used )(に近いアルゴリズム)を使うようにしている。(「できるだ け」とか「近い」と書いたのは、完全な LRU アルゴリズムを実現するのは 手間がかかるから。複雑なアルゴリズムを使ったために処理速度が落ちて は意味がない。)

何故そのようにするか、という理由だが、それはもちろん、先程説明した時 間的局所性と空間的局所性のためである。つまり、最近アクセスしたばかり のラインには、近々再びアクセスする可能性が高いので、できるだけ追い出 したくないのである。

多段キャッシュ

キャッシュメモリと主記憶との間にもう一段キャッシュメモリを置くことも 多い。この場合、CPU に近いほうのキャッシュメモリを1次キャッシュ、遠 いほうを2次キャッシュと呼ぶ。こちらをそれぞれ、レベル1(L1)キャッシュレベル2(L2)キャッシュと呼ぶこともある。2次キャッシュと主記憶の間にも う一段キャッシュを置くこともある(3次キャッシュ, レベル3(L3)キャッ シュ)。

多段キャッシュを使う理由だが、キャッシュと主記憶の速度に差がある 場合、その差を吸収する必要があるからである。

キャッシュのサイズ(=バイト数)については、(普通) 1次キャッシュのサイズ < 2次キャッシュのサイズ < 3次キャッシュのサイズ < 主記憶のサイズ となるようにする。(最近の設計で、1次キャッシュと2次キャッシュのサイ ズが同じということもある。)

最近のMPUでは、1次キャッシュがCPUといっしょにLSIに入っていることが多 い。2次キャッシュもいっしょに入っている場合もある。

分離キャッシュと統合キャッシュ

命令アクセス用のキャッシュとデータアクセス用のキャッシュを別にするこ とも多い。別にしたものを分離キャッシュ、分離しないものを統合キャッシュ と呼ぶ。 分離する理由は、命令アクセスとデータアクセスでは、メモリへのアクセス の仕方がかなり異なるからである。命令アクセスでは、連続した番地へのア クセスを行なう確率が非常に高いのである。また、命令は(原則的に)読み取 りしかしない。そのため、命令用のキャッシュは単純化する事が可能。 1次キャッシュは分離キャッシュで2次以降のキャッシュは統合キャッシュ、 という例も多い。

キャッシュメモリの原理 II (書き込み)

ここまでは読み出しアクセスだけを考えていたが、書き込みの際は難しい問題 が起きる。主記憶にアクセスすると遅くなるので、できるだけ主記憶への書き 込みは減らしたいのだが、キャッシュにだけ書き込みをして、主記憶への書き 込みをしないと、キャッシュの内容と主記憶の内容が食い違ってしまう。

  主記憶
    ┌───────────┬────────┬──────────┐
    │         …           │/////*/////////│         …         │
    └───────────┴────────┴──────────┘
                                   ↑
                   ┌───────┘食い違い
  キャッシュメモリ ↓
    ┌───┬────────┬──────┐
    │  …  │/////#/////////│     …     │
    └───┴────────┴──────┘
                   ↑ 
                   │書き込み
                   │
               ┌───┐
               │ CPU  │
               └───┘

従って、この食い違いがのちの処理に影響を及ぼさないように、適当なタイミ ングでキャッシュの内容を主記憶に書き込まないといけない。その方式には次 の2つがある:

ストアスルー方式では、書き込みがあるたびに、主記憶へのアクセスが起き、 主記憶の遅さのために長い待ち合わせが起きるから、メモリアクセスの速度が 低下する。しかし、方式が単純なために実現しやすいというメリットがある。 ストアイン方式だと、主記憶への書き込みの回数をストアスルー方式よりも減 らせるため、メモリアクセスの速度低下を防ぐ効果が大きい。ただし、処理が 複雑になるため、実現は多少面倒になる(回路が複雑になる)。

以上のような複雑な制御を高速で行なうために、キャッシュメモリにはキャッ シュコントローラと呼ばれる制御回路がついている。(ただし、マシンによっ ては、キャッシュメモリの制御の一部をソフトウェアで行なっているものもあ る。)

最近の Pentium II, III, 4 とか PowerPC G3, G4, G5 が速いのは、 高速キャッシュ技術によるところが非常に大きい。

ディスクキャッシュ(バッファキャッシュ)

キャッシュメモリの考え方は、他の所にも色々と応用がきく。だいたい、動 作速度に大きな違いのある2つの装置がデータをやりとりしなければならない ような状況では、キャッシュメモリと同様の考え方が使えることが多い。

主記憶とハードディスクでは、速度が大きく異なる。そこで、できるだけハー ドディスクへのアクセスを減らすことを考える。といっても、主記憶とハード ディスクの間に(キャッシュメモリのように)別のハードウェアを追加するわけ ではない。主記憶の一部にハードディスクの内容をキャッシュするようにする のである。これをディスクキャッシュと呼ぶ。 制御はソフトウェアで行なう(オペレーティングシステム(OS)の仕事)。 ハードディスクはあちこちを飛び飛びにアクセスするよりも、連続した 部分を続けてアクセスする時のほうがはるかに高速にデータを転送できるから、 あるデータを読む時に、その前後のデータもついでに読み込んでおくのは高速 化に極わて有効である。(飛び飛びにアクセスすると、シーク時間や回転待ち 時間がかかるために速度はガタ落ちになる。)

ただし、これには短所もある。書き込みの際、ディスクキャッシュに書き込 まれたデータはすぐにはハードディスクに書き込まれない。もしもディスクキャッ シュとハードディスクの内容に食い違いがある状態でコンピュータがハングアッ プしたり、電源が落ちたりすると、ハードディスクの内容は正しくない状態の ままになってしまう。(ディスクキャッシュの制御は OS がやっているから、 OS がハングアップするとお手上げである。また、電源が落ちると、主記憶の 内容は消えるから、ディスクキャッシュの内容も消えてしまう。) こうした場 合の被害を少なくするためには、一定の時間ごとにディスクキャッシュの内容 をハードディスクに書き込むようにするとよい。UNIX の場合、ハードディス ク上のファイルの内容だけでなく、ファイルを管理するための情報も部分的に 主記憶に移してアクセスしている(もちろん高速化のため)。UNIX の場合、電 源を切る前に必ずシャットダウンという手続きを取る(シャットダウンプロシー ジャと呼ばれるプログラムを走らせる)。この手続きによって、全てのプログ ラムが停止させられると共に、メモリ上にキャッシュされていたデータがハー ドディスクに書き込まれる。(これでどうしてコンピュータの電源スイッチを いきなり切ってはいけないかわかりましたね?) なぜ、全てのプログラムを停止させるのを先にやるかと言うと、何かプログラ ムが動いていたとすると、そのプログラムがデータの変更を行なうかも知れな いからである。全てのプログラムを止め、これ以上絶対にデータの変更が起き ないようにしておいてから、全データをハードディスクに書き込むわけである。

昔のパソコンの OS には、ハードディスクやフロッピーディスクへの書き込 みを毎回正直にやっているものがあった。おかげでディスクにアクセスを始め たとたんにマシンが遅くなって困ったものであったが、ディスクに書き込みを していない時なら、いきなり電源を切っても大抵何ともなかった。現在の Windows や MacOS では、電源を切る前にシャットダウンの手続きが必要であ る。その代わりにディスク回りが高速化されたのは結構だといえるが、OS が 不安定でよくハングアップするので、ディスクの内容がよくおかしくなるのは 困ったことである。その点 Linux は極めて安定しているので安心して使える。

Linux の OS 自体はほとんどハングアップしないが、ユーザインタフェース に時々バグがあって、ユーザインタフェースがハングアップしてしまうことが ある。この場合でも OS は動いているので、ユーザインタフェースだけ再 起動すれば、再び使い続けることができる。

補足: 「一定の時間ごとにディスクキャッシュの 内容をハードディスクに書き込むようにするとよい」と書いたが、UNIX の場 合は、sync というコマンドを実行すると、メモリ上におかれたディスクの情 報がディスクに反映される。この sync コマンドを、UNIX は、標準で 30秒に 一回実行している。シャットダウンの際にも sync が行なわれる。 (sync という名前は synchronize (同期させる)という言葉から来ている。)

マウント(mount)とアンマウント

オペレーティングシステム(←普通 OS と略す) はディスク(やその他の補助記憶)への書き込みを即座には行なわないので、 いきなり電源を切ると困ったことになる、という説明をした。 それと同様の問題が、フロッピーディスクやUSBメモリなどの取りはずし可 能な記憶媒体を抜く時にも起こる。

いわゆる PC 互換機にはフロッピーのイジェクト(eject, 排出)ボタン、あ るいはイジェクト・レバーがついているので、次のような失敗をする可能性 がある:

        文書等のファイルをフロッピーに保存する操作をする →
        しかし、OS はすぐにはフロッピーへの書き込みをしない →
        ユーザはそれと知らずにフロッピーを取り出す →
        ユーザは電源を切ってしまう(シャットダウンする) →
        メモリ上にだけ存在していたファイルは読めなくなる!!

こうなるかどうかは OS によって違う。Windows の場合は、フロッピーに ついては、書き込みを毎回正直にやることによって、メモリ上の内容とフロッ ピーの内容が極力ずれないようにしているようである。Linux の場合には、 普通フロッピーに対してもキャッシュをして、処理を高速化しているので、 実際上のような問題が起こり得る。

フロッピー等を取り出す前には、「アンマウント」という操作をしなければ ならない。(ただし、OS によっては、「アンマウント」という名前がついて いないこともある。)アンマウントの際に、書き込みが未完だったデータは すべて書き込まれる。

近頃の Macintosh にはフロッピーディスクドライブ(FDD)がないが、むかし FDD がついていたころ、イジェクトボタンがなかった。フロッピーのアイコ ンをゴミ箱アイコンまでドラッグすると、アンマウントが行なわれ、自動的 にフロッピーが排出される、という安全設計になっていた。

ワークステーションの FDD にもイジェクトボタンは無いことが多い。あっ たとしても、普段はボタンがロックされており、アンマウントの操作をして、 イジェクトのためのコマンドを実行しなければイジェクトボタンが動作しな いのが当たり前。(しかし、近頃はコストを下げるために、ワークステーショ ンでも PC 用のフロッピーディスクドライブを使っている例がある。) デー タの書き込み中にイジェクトボタンに何かが当たってしまう事も考えられる。 イジェクトボタンでフロッピーをいつでも取り出せてしまう PC 互換機の設 計はひどい欠陥だと言われてもしかたがなかろう。

USB メモリの場合は、引っ張るだけではずせてしまうので、ユーザが自分で 気をつけないといけない。

ところで、アンマウントは、書き込みを完了させるためだけにするのではな い。ハードディスクや、MO、フロッピー、CD-ROM などにはファイルが格納 されているが、OS はそれらへのアクセスを管理している。いきなり記憶媒 体をはずされたりすると、管理上困ったことが起きる。例えば、CD-ROM 上 のファイルを読み込んでいる途中のプログラムがあったとすると、いきなり CD-ROM が抜かれれば、困ったことになるのは想像がつくだろう。だから、 CD-ROM のように書き込みのできない媒体の場合でも、抜く前にはアンマウ ントが必要である。 アンマウント操作をすると、その媒体のファイルを使用しているプログ ラムがないかどうかチェックが行なわれる。もしあれば、アンマウントは行 なわれない。ない場合は、未完了の書き込みがあれば完了させ、ファイルシ ステムの管理情報を更新するなどの処理(まあ、後かたづけみたいなもの)を 行なう。

ハードディスクは普通媒体を抜くことができないが、それでもアンマウント をする場合はある。コンピュータ管理の都合上、特定のハードディスク(あ るいはハードディスクの特定の区画)だけ使用しない状態にしたい、といっ た時などにアンマウントをする。

アンマウントとは反対に、補助記憶装置を使いはじめる時にも手続きがいる。 それにはマウントという操作をする。オペレーティングシステムは、マウン ト操作によって、ファイルシステム管理情報を適切に更新したり、その装置 を使いはじめるための初期設定のようなことを行なう。

昔の Mac の場合は、フロッピーを挿入しただけで自動的にマウント処理が 行なわれ、画面にフロッピーのアイコンが現れるようになっていた。(だか ら、ユーザがマウント・アンマウント処理を意識することはほとんどない。) PC 互換機ではこれは不可能。なぜなら、フロッピーの抜き挿しがあったこ とをFDDから CPU に伝える方法が存在しないから。ハードウェアの問題なの でどうしようもない。