わたしの名はフレイ 作家・デザイナー見習い
神々とともに生きる詩人 一等星シリウスの導きを信じて

ハードウェア

CPU・メモリというコア装置が計算をしていて、そこに情報が入出力される

コンピュータの仕組みが良く分からない人は、CPUとメモリという「コア装置」があって、そのコア装置にハードディスクなどから「情報」が入出力として送受信され、その上でマウス、キーボード、ディスプレイが「イベント」を与えると理解すると良いでしょう。

ここで重要なのは、コア装置よりも入出力として与えられる「情報」です。この情報の中に、全てのプログラム、全てのデータ、全ての設定内容、そして全ての読み書きされる内容が保管されているからです。

コア装置と情報がやりとりしながらイベントを送り合う、そんな機械がパソコンです。情報の中にプログラムがあり、そのプログラム情報の中の中核部分(カーネル)によって情報の「形態」や「形式」が決められ、それらが個別のプログラムとなって「カーネルとプログラムが協調して動作する」と理解すると良いでしょう。

コンピュータは計算とメモリ

コンピュータの基本は、計算とメモリです。それも、CPU自体は足し算(あるいは四則演算)しかできません。三角関数のような基本的な数学の関数でさえ、プログラミングを用いて行います。

また、メモリといっても、処理速度の速さから言って、CPUのレジスタ、メモリ(キャッシュメモリと主メモリ)、ハードディスクなどの大容量記録装置があります。

このようなパソコンですが、プログラミングでやっていることはまさに、計算とメモリです。

「aに3を入れろ」「bに10を入れろ」「a+bを計算してそれをcに入れろ」という、まさに電卓をやっているだけなのが、ハードウェアとしてのコンピュータです。あとは、そのaやbやcがどこにあって、どこから読み出し、どこへと転送するか、ということをやっているだけが、ストレージやネットワーク、あるいはデータベースです。

プログラミングとは、計算を行うための手段であると同時に、計算を何のために行うかという目的です。繰り返したり条件分岐したり、といったことは、ハードウェアを上手く活用して、抽象化されたプログラムをいかに作るのか、ということの「応用の極め」にすぎません。

ですが、一度作ったプログラムは何度でも使えます。変更する必要なく再利用できることが理想であるため、バージョンアップという発想は、正しいプログラムでは必要のない考え方です。ですが、プログラムを作るのもプログラマという人間の行いであり、プログラムは間違えなくても人間が間違えてしまいます。人間の間違いを後になって修正する、それがバージョンアップです。

どこまでをプログラムの内部に書き、どこからを外部に出す(実行時に決める)か

また、プログラムとは永遠のデータ処理のようなもので、プログラムの内部で保持される定数や変数があると同時に、外部からそうしたデータを読み込むプログラムを書くこともできます。

このため、「どこまでをプログラムの内部に書き、どこまでを外部に出すか」ということが重要になってきます。

プログラムの作成時に想定できる範囲が全てなら、それで良いでしょう。ですが、プログラムが使われるうちにデータや設定を変更し、外部に書き出して実行時に読み込むことで、あらかじめ決められているファイル形式で保存したデータを、読み込んだり書き出したりすることができます。

また、プログラムの外部として動的に処理するのはデータや設定ファイルだけではなく、ユーザーのフォームの入力や、どんな行動をしたかというログや、あるいは、プログラムの通信対象(たとえばサーバーに存在するWebサイトのデータなど)なども、プログラムの外部に出すべきデータとなります。

よって、単純に人工知能を学習するだけではなく、Webサイトの更新をチェックする「アンテナ」の更新日時や、ツイッターに自動的に文章を投稿する「ボット」などの定型文章(テンプレート)なども、プログラムのある意味でのデータと言えます。こうしたデータは、大規模で再利用可能なプログラムでは必ず必要になります。プログラムが必要とすることで、プログラムの中に書かれるものは、少ししかありません。ほとんどが、外部データを操作して読み書きするだけです。

コンパイラを上手く使うこと

そういうわけで、プログラム自身である「情報」をどのように組み立てるか、ということが、コンピュータを使う上で重要になってきます。

この時、機械語で直接プログラムを書くと、そのコンピュータのCPUでしか、プログラムが動かなくなります。この際にC言語などの「高級言語」を使うことで、UNIXがそうだったように、さまざまなアーキテクチャにプログラム(OS)を移植することができます。

高級言語は、そのままではCPUでは動きません。高級言語(C)をCPUの機械語Intel x86)に翻訳するプログラム、すなわち「コンパイラ」が必要となります。

昔は、コンパイラは「限りあるコンピュータ資源の無駄」であると言われましたが、今ではほとんどのOSがコンパイラを使って作られています。また、OSの上でJavaのようなミドルウェアを実行することで、さらに高水準の高級言語を使うことも増えています。今では、CのプログラマよりもJavaプログラマの方がはるかに多いです。

OSとカーネル

また、コンピュータのハードウェアを支配しているのは、OSと呼ばれるプログラムです。OSの中で、中核に当たる部分をカーネルと言います。

ハードウェアから見れば、常にカーネルマルチタスクでプログラムを実行し、そのカーネルの内部で「さまざまな内部情報」を構築して、その中にデバイスの情報やそれを処理するデバイスドライバ、あるいはFATやNTFSのハードディスクを操作するために必要なファイルシステムモジュールを読み込み、その中で「上手くハードウェアのイベントに応じてやり取りすること」で、カーネルは成り立っています。

プログラムの実行が要求されると、カーネルはプログラムのインスタンスである「プロセス」を生成します。プロセスの論理アドレス空間は物理アドレス空間に変換され、それぞれのプログラムが別々のアドレス空間を持つようにします。また、別のプロセスの実行が要求されると、カーネルレジスタの内容をレジスタ外に退避して、そのプロセスを停止させ、別のプロセスを同時に実行し、スケジューラのクォンタム(プロセスを切り替える時間)と優先順位に基づいて次々にプログラムを実行させます。また、ユーザーモードカーネルモードはカーネルの中で明確に区別され、ユーザーランドのプログラムがカーネルのメモリ空間にアクセスすることはできません。

コンピュータは二進数の計算以外、何も出来ない

コンピュータは、内部の数値データを全て二進数で保持している。言ってしまえば、人間がどのような計算をさせても、コンピュータの方はただ二進数を論理回路で計算しているだけである。

コンピュータは、二進数を計算して、CPUで用意されたレジスタやメモリへ入出力を行う以外、何も出来ない。それ以上のことは、人間が「プログラミング」しなければならない。これがコンピュータの肝である。コンピュータは、そもそもプログラミングしなければ何も出来ない。最初から、二進数以外のことはプログラミングすることを意図して、コンピュータという機械は作られているのである。

CPUは順に命令を実行するほか、実行の順番を制御する「ジャンプ命令」がある。これはC言語のgotoに相当する。現代的なOS(カーネル)やコンパイラは、こうした順番の制御と二進数の計算とハードウェア的なやりとりによって作られている。モニターに映る内容はウィンドウシステムが描画している。

オープンソースの真価とは、こうしたプログラマブルな環境をユーザーに自由に解放することにある、と言っても良いだろう。確かにWindowsの方が会社が作っていて信頼できるかもしれないが、Windowsソースコードは非公開である。Linuxは今のところWindowsほどに優れたGUIは提供していないが、ソースコード全てがオープンなライセンスで公開されている。それは、「自分で研究し、改造し、コピーし、再配布する自由」があることを意味する。フリーソフトウェアと呼ばれるこれらの自由は、「CPUの上にある、全てのプログラム可能な環境を与える」という意味で、コンピュータ本来の自由を取り戻すということを意味しているのである。

Windowsのようなクローズドなソフトウェアを独占的(プロプライエタリ―)なソフトウェアというのは、著作権を利用してみんなのものを独占しているからである。言ってしまえば、「ドラえもんの絵しか描けない絵の具」に近い。それしか使ったことのない人間は、自分でもっと高度なOSをハッキングする楽しみを知らないのである。金儲けを取るか、自由を取るか、それがGNUの正義なのである。

ただ、そんなにGNUがかっこいいかというと、そうでもない。GNUは、自分の所有するコンピュータの自由という概念を持ち出して、「Microsoftが全てのコンピュータを勝手に独占している」と言うが、私有権をもっとも否定するのはGNUである。そういうところがおかしいから、Red Hatのようにみんなを騙して儲ける企業が出てくる。そもそもが革命は悪である。それは、言っておかなければならないだろう。

CPUとは

CPUは、コンピュータの中枢であり、全ての計算と実行を行うハードウェア装置。

加減乗除やシフト演算などの基本的な演算・計算ができる。

また、レジスタと呼ばれる高速の記憶領域を何個か持っていて、計算の時に使う。レジスタにはAX, BX, CX, DXのように名前がついている。

記憶を保管するためのメモリや、バスなどを通じて周辺機器ともつながっていて、メモリの中の記憶にアクセスしたり、メモリの中に記憶を保存したり、周辺機器に対するI/O操作を行うことができる。

また、実行中のプログラムに関しては、現在の命令の位置を任意の位置にジャンプする「ジャンプ命令」を使うことができる。

命令は機械が解釈できる機械語の命令で行うが、このそれぞれの命令を人間が理解しやすいように言葉(ニーモニック)に置き換えたアセンブリ言語というものがあり、機械語のプログラムを作る時はこうしたアセンブリ言語を用いる。

現在のコンピュータではCPUを意識しない

現在のコンピュータでは、CPUやメモリのような低レベルなハードウェアを直接触ることは少ない。OSが仮想CPUや仮想メモリの機構を用意しているため、プログラムを動かす時は原則プログラムはOSの管理下に置かれる。プログラムはマルチタスクを実現するコンテキストスイッチ(プログラムを並列で動かすためのOSの機構)やスケジューリング、あるいはプログラムが利用する変数などの記憶が物理アドレスの中のどの場所に保管されるのか、などといったことを意識することなく、独自の論理アドレス空間を用いて、並列でプログラムを動かすことができる。

だが、そうしたOSの低レベルなカーネル処理は、全て現実のCPUとメモリの上に実現されている。OSのコードを実行する場合でも、実際に動いているのはCPUであり、プログラムを動かす時も、実際に計算しているのはCPUである。CPUによっては「カーネルモード」と「ユーザーモード」が分かれていることがあり、カーネルはそうしたCPUの機能を用いて作られている。

また、機械語アセンブリ言語でプログラムを書くこと自体、現在のコンピュータでは稀であり、多くの場合C言語のようなプログラミング言語を用いて、それを機械語に翻訳するコンパイラを用いて機械語を生成する。手動でハンドアセンブルするよりは遅く非効率的になるかもしれないが、機械語アセンブリ言語で書くよりもはるかに人間に分かりやすく、書きやすく、読みやすく、また移植性も高い。多くのコンパイラで「最適化」が行われており、ハンドアセンブル並みに高速かつ効率的な機械語コンパイラが生成することも少なくない。

もっとも高速なのはFORTRANC/C++だが、遅くても生産性が高い他の言語を使うことで、さらに書きやすく、読みやすく、作りやすく、また移植性が高くなる。また、オブジェクト指向言語のような高水準の機能のある言語を用いて、より大規模かつ簡単な開発が可能となる。

ただし、現在のコンピュータではCPUを意識しないからといって、CPUが無関係になるわけではない。実際のところコンピュータの中枢として動いているのはCPUであり、そのため、CPUのクロックやコア数が上がるとコンピュータのスピードが速くなる。

また、OS開発者にとっては、CPUの処理は知っておかなければならない。近代のOSでは、CPUを有効に使うために、特にマルチプロセッサ環境やクラスタシステムなどにおいて、複数のプロセッサ(マルチプロセッサ)をいかに効率よく利用するか、などといった課題がある。

後日注記:本当のことを言うと、機械語アセンブラでの開発をしていると、CPUの命令体系にじかに触れる機会は結構多い。特に、x86アセンブラをやろうとすると、Intel CPUの演算命令(ニーモニック)を覚える必要があるし、セグメント、レジスタ、アドレスなどの概念を知っておかなければならない。C/C++言語を用いて開発をする上でも、メモリアドレスを格納する変数であるポインタに触る機会はわりと多い。また、2進数や16進数の考え方は、デジタル処理を行う上で多用される。CPUの仕組みを知っておいて、損になることはなく、ためになる知識がそのままスキルアップになる。

CPUと人間の頭脳の比較

CPUはコンピュータの「頭脳」だが、人間の頭脳との違いは、プログラムを書かなければ動かない、ということ。機械語の命令に変換(コンパイル)することのできるプログラム言語を用いて、プログラムを書かなければ動かない。自らプログラムを考える、ということをCPUはしない。

その代わり、いったんプログラムが与えられてしまえば、それを計算するのは高速であり、人間よりはるかに速く、人間のするのと同じ計算をすることができる。また、CPUは柔軟で、どんなプログラムであっても、休まず、何度でも、ひたすらその通り計算することができる。

その代わり、プログラムに書いたことしか理解できないため、プログラムに書くことのできない曖昧で厳密性を欠いたことについては理解することができない。必ず、厳密な命令が必要であり、そしてどんなに細かすぎるようであっても、機械が理解することができるように、極めて細かく、厳密に、間違いなく丁寧に書かなければならない。

プログラムという方式の利点としては、「抽象性」が挙げられる。どんなに関数やサブルーチンを繰り返しても、その通りきちんと実行する。変数を用いることで、同じ言葉を繰り返さなくても、ひとつのサブルーチンでどんな場合にでも対応できる。人間であれば学習してひとつひとつ覚えなければならないことを、その計算式に基づいて簡単に計算できる。そのため、人間が頭で考えるには不可能な膨大な情報を瞬時かつ自動的に計算してくれる。そのため、形式的・手続き的な処理を行うのであれば、マウスやキーボードで行うより、プログラムを書いて行った方が楽である。OSのソースコードなどはとても膨大であるが、CPUは文句を言わずOSのコードを簡単に計算する。

CPUの基本原理

CPUは、基本的に二進数の0と1の組み合わせと桁上がりで足し算と引き算を行います。

技術の進歩とともに、計算出来る量が増えてきました。ですが、これは計算する人数が増えたのであって、決して計算する頭が賢くなったわけではありません。だから、基本的に昔のプロセッサと原理は変わらないのです。

ソフトウェアやOSで仮想化しても動いているのはCPU

CPUについて言えることとして、「ソフトウェアやOSでいくら仮想化しても、動いているのはCPUである」ということ。

マルチタスクや並列性のような技術は確かにソフトウェアでCPUを仮想化して実現しますが、それでも、パソコンで中央処理をしているのは、現実にあるCPU自身に他なりません。

Intel 4004以降のマイクロプロセッサでは、CPUやハードウェアに機械的回路を作って計算するのではなく、ソフトウェアで「プログラミング」を行って計算を実現します。(ちなみに、Intel 4004インテルとともに開発したのは、嶋正利という日本人エンジニアです。)

そのため、プログラミングは必ず必要ですが、それでも、動いているのはCPUであり、それは機械語の命令を読み出し、解読し、データを取得し、計算し、実行結果を保管する、一連のステージを実行できるCPUプロセッサなのです。

キャッシュ

キャッシュとは「隠し場所・貯蔵庫」の意味で、よく使うデータをキャッシュに置き、素早く利用するために使う。

データがハードディスク上にあるよりも、メモリ上にあった方が圧倒的に速いため、よく使うデータをメモリ上に置き、そこからアクセスし、必要になった段階でハードディスクに読み書きするようなキャッシュの実装が考えられる。

Intelムーアの法則

Intelは、CPUの集積率をものすごく高めて、CPUのスピードを速く、高速にした。

インテル創業者の一人であるゴードン・ムーアの経験則として、ムーアの法則が知られている。これは、「半導体の集積率は18か月で2倍になる」ということ。

半導体は、原理自体はそんなに変わっていない。だが、極めて集積率が高くなり、ものすごくスピードが速くなっている。これは、計算する頭が賢くなったわけではなく、計算する人数が増えたということである。

そういうわけで、原理的にはそんなに変わっていない。Intelはスピードを速くした、つまり、計算のための論理回路のやり取りを(集積率を高めることで)速くしたというだけである。

RISC-Vとは

RISC-Vは、カリフォルニア大学バークレー校(UCB)によって開発された、オープンソースなISA(命令セットアーキテクチャ)。

UCBのRISCアーキテクチャとしては五世代目に当たるためV(ファイブ)という名前が名付けられている。

特徴は、ISAの仕様がオープンソースライセンスで公開され、非営利団体によって管理されていること。

クローズドの最後の牙城で、Intelが事実上の標準だったISAにおいて、オープンソースの新しいISAとして注目を浴びており、MicrosoftGoogleなども参加している。

クロック周波数やマルチコア化には限界がある

長い間、Intelの「ムーアの法則」、すなわち「半導体の集積率は18か月で2倍になる」という法則のもとで、爆発的に向上してきたIntel CPUの動作クロック周波数だったが、近年、それが頭打ち(スローダウン)してきた。

それでもCPUの動作速度を上げるために、Intelなどはマルチコア化を行って速度を向上させようと取り組んできたが、マルチコアには並列処理のできない直列処理の部分が全体の動作速度のボトルネックになる(タスク全体の速度を決めてしまう)という問題がある。

専用プロセッサ

これに対して、業界の大企業からは、汎用的な命令を定めるのではなく、特定の処理に専門化した命令セットを定める、つまり「専用プロセッサ」とすることで、CPUの動作速度を向上させることができないか、という要請があった。

RISC-Vの命令セットはは、オープンソースで公開されており、ロイヤリティフリーでRISC-Vの実装を製造することができ、また新しく将来性を見据えて設計されており、基本的な命令は最小限で、拡張することを念頭において設計されている。

RISC-Vの拡張は許されているだけではなく「推奨」されており、それぞれのRISC-VのCPUの製造元が独自に「拡張」することで、専用プロセッサを自由に開発できる。

LinuxFreeBSDNetBSDなどで暫定的対応

LinuxFreeBSDNetBSDなどでは、RISC-Vに対する(暫定的な)対応を行っている。

ロイヤリティフリーかつオープンソースであるため、誰でも使用料を払わずに、また契約完了まで待つことなくすぐにRISC-Vプロセッサを製造することができる。

このため、たとえば大学の研究でLinuxの動くRISC-V CPUを製造した、などという人も居る。

GPU

GPUは、グラフィックスやマルチメディア専用のチップ。

CPUは、コアが1つか2つが一般的で、多くても数個しかない。このため、連続的で順番のある処理(直列処理)を順番通りに計算するのが得意。

これに対してGPUは、コア数が数千個とあり、同時に決まった処理を並列で行う並列処理を得意とする。

グラフィックスの表示のためには、判断や計算を行う必要はあまりなく、たくさんのドットを画面に高速で表示すればいい。そのため、並列処理が得意なGPUを使う。

ストリーミングとコーデック

YouTubeWindows Media Playerなどで賢いのは、本当は動画の表示や再生ではない。動画の表示や再生は、GPUを使うだけにすぎないからである。

賢いのは、動画を再生している間に、動画の先の方をダウンロードし、ダウンロードしながら途切れなく再生する「ストリーミング」の技術である。

このストリーミングの技術自体は、YouTubeなどが提供しているわけではなく、OSやライブラリが提供している。

また、アナログな音をデジタルな再生可能な電子情報にするには、音声の波を記録するサンプリング(標本化)が必要。

このデジタル化された音声情報や動画情報は、各種の形式でデータファイルとして記録されており、このファイル形式を解読して再生するライブラリをコーデックと言う。

動画を再生するには動画のコーデック、音声を再生するには音声のコーデックがそれぞれ必要となる。

なので、ブラウザでHTML5のビデオタグを使って動画を指定してやれば、動画は簡単に再生できる。

つまり、YouTubeの賢い点は「動画を再生する」ことではなく、「インターネット上で動画を共有して楽しむ」ことにある。

パソコンは簡単に自作できる

パソコンは、思ったより簡単に自作できます。たとえば、メモリの容量を増やしたり、ネットワークカードやグラフィックカードなどを追加することで、性能の向上が期待できます。

もちろん、LSI(CPUやメモリのような半導体素子)を自作するわけではありません。そんなことは高度な会社や研究所でなければできません。ここでいう自作とは、ハードウェアをいったん分解して、その上で自分の好きなカードやボードを追加し、パソコンの性能を向上させることです。

デスクトップ型のマシンは、最初から自作PCを作ることを想定して作られているため、簡単にネジが外せたりします。ノートパソコンであっても、メモリを増設したり、あるいはハードディスクを取り換えて別のものにしたりすることができます。たとえば、Windowsの入ったハードディスクをそのままで取っておいて、その上で別のハードディスクにLinuxをインストールしたりすることができます。僕はいつもこのやり方で、Windowsにいつでも戻せる状態を維持したままで、Linuxを新しいハードディスクに入れています。Windowsがなければインターネットの情報にもアクセスできず、Linux関連の情報も調べることができなくなったりします。Linux入門者のみんなにもこの方法をおすすめします。

別のやり方として、コンピュータを数台用意して、スイッチ方式でキーボード、マウス、ディスプレイなどを切り替える方法もあります。昔は、僕もこの方法でやっていました。この方法の利点は、同時に複数のパソコンの電源を入れて、簡単にスイッチできることです。欠点は、パソコンのハードウェアがたくさん増えて、置き場所に困ることです。また、スイッチを行うための専用の機器が必要になります。ですが、一端それを導入してしまうと、いつでもWindowsLinuxを切り替えることができて、とても便利です。

もっと別のやり方としては、Windowsの仮想環境にLinuxをインストールする、という方法もあるでしょう。オープンソースVirtualBox環境にインストールしたり、Windows 10のHyper-Vを使う方法などがあります。

僕がパソコンの自作をしていたのは昔からで、中学生の頃には学校に自由研究のレポートにパソコンの分解と自作のことを書きました。ですから、子供ならLinuxの仕組みは分かるでしょう。ですが、きちんと開発するのであれば、大人になってからで良いと思った方が良いでしょう。きちんと前提となる基礎知識があれば、ソフトウェアの開発は難しくはないのです。ですが、ハードウェア環境を用意することがネックになる場合はたくさんあります。本当に開発するハードウェアと、いつも使うハードウェアはOSも含めて分けて管理しましょう。開発環境はいつ動かなくなるか、分からないからです。

バス

コンピュータ内部で各回路がデータをやり取りするための伝送路。

バスはコンピュータのインターフェース同士を繋いでデータを送受信する「通信回路」であり、CPUやメモリとハードディスクやプリンターなどの周辺機器を繋ぐ。

その通信回路のやり取りの方法と移動の経路が、バス停を順次移動していくバスに似ていることから、「バス」と名付けられた。

バスには8bit時代からさまざまな規格があり、それぞれのインターフェースをたくさんの(それだけの)線で結ぶ方式をパラレルバス、すべてを一本の線で結ぶ方式をシリアルバスと呼ぶ。

USB

USBは「ユニバーサル・シリアル・バス」の略で、比較的新しいバスのインターフェース。

今では、マウスやプリンターなど、多くの機器がUSBで繋がれている。

USBは通信用の2つの線と電源用の2つの線の4本の線だけで成り立ち、これだけで高速な通信ができる。最初の頃のUSB 1.0は遅かったが、USB 2.0で速度が改善され、USB 3.0ではもっと高速になった。

USBは簡単に抜いたり挿したりすることで動的にデバイスを感知し、ユーザーモードで接続するため、ホットプラグの仕組みが必要である。伝統的に、UNIXではデバイスファイルを事前に作っておくのが慣例であり、Linuxでもホットプラグを実現することは長い間課題だった。今では、ユーザーモードで/devディレクトリのデバイスを動的に作成するudevがLinuxでは使われている。

ハードディスクの仕組み

昔のテープは、紙や磁気によるテープにデータを記録していたが、大容量の記録媒体になると、「どこにどんなデータがあるか」というのを、番地やアドレスで管理し、データが欲しい時はそのデータのある場所だけを読めば良いような仕組みが考えられた。

この番地を管理する特別な記憶領域を、ファイルアロケーションテーブル(FAT)と言う。フロッピーディスクやハードディスクでは、ファイルアロケーションテーブルからどこにデータがあるかを探し、データのアドレスに基づいてセクタ(個々の記憶領域)を読み出して、データを取得する。

磁気ディスク装置では、電磁気を用いた磁気ヘッドによるディスクの読み書きを行う。磁気ヘッドは電磁気によって磁気を感知する物質が塗られた磁気テープに情報を記録・読み取りする。これは、フロッピーディスクでも、ハードディスクでも変わらず、ハードディスクはより高精度に磁気記録を行うヘッドとディスクが構成されている。

フロッピーディスクとハードディスクの違いは、データを読み書きする速さである。フロッピーディスクの場合、テープにヘッドが着いている、つまり接触しているが、ハードディスクでは、ヘッドはディスクの上を「接触せずに」動いている。少しディスクから浮いた状態で動いているため、とても高速に動かすことができる。また、ハードディスクは高精度で、何千分の一ミリで動く。ディスク容量は、フロッピーディスクと比べても、1GB~2GBと当時からすると大容量だった。だが、衝撃に弱く、壊れやすいという欠点もある。

後日注記:最近機密情報の入ったハードディスクの不正転売問題がニュースになっているが、パソコンのOSがファイルを削除する際に、一般的に完全には削除しない。ファイルアロケーションテーブル内の「目次」を削除するだけで、実際のデータは後で別のデータに書き換えられるまで残っていることが多く、このような場合復元ソフトで目次だけを再構築すれば簡単に復元できてしまう。Linuxではshredコマンドなどで、完全に復元できないように削除することもできるが、物理的に破壊することが一番であり、今回の事件のように「物理的に破壊されるはずの超大容量のハードディスクが大量に売られていた」という話は、IT業界を揺るがす「とても恐ろしい話」である。

データの永続性

メモリのデータには永続性がない。すなわち、電気を通さないと中のデータが消えてしまう。

ハードディスクは大容量であることと同時に、長期のデータの記憶や保管に向いている。

CPUはメモリとやり取りが多く高速である必要があるため、バスやI/OコントローラでCPUとメモリは近い位置に配置するが、ハードディスクは低速であり、やり取りも少ないため遠い位置に配置し、読み書きもキャッシュを用いることが多い。

ライトスルーとライトバック

メモリに限らずハードディスクにもライトスルーとライトバックがある。

ライトスルーは、キャッシュにデータを書き込んだ時、すぐさま物理ハードディスクにもデータを書き込む。データが書き込まれるまで処理は待機する。信頼性が高いが、参照や変更が多い場合には処理が遅くなる。

ライトバックは、キャッシュにデータを書き込んだ時、すぐにはハードディスクにデータを書き込まず、キャッシュに書き込んだ時点で完了とし、別の処理を行う。物理ハードディスクへの書き込み処理はCPUの負荷が低くなった時などに行われる。高速だが、信頼性は低く、どこかでカーネルなどの処理が異常終了すれば、データが正確に書き込まれない可能性もある。

SSD

磁気ディスクのハードディスクは大容量だが、ヘッドの回転が必要という意味で、必ずしも高速ではない。

これに対して、SSDでは回転の必要が無いため、ハードディスクよりさらに高速であり、磁気ディスクのハードディスクはそのうちSSDに取って代われると言われている。

キーボード

日本で現在使われているQWERTY式のキーボードは、アメリカのタイプライターが始まり。どうしてこのような複雑怪奇で分かり辛いキーボードになったのかは定かではないが、一説には「一番上の列にTYPEWRITER」の文字が来るようにした、といった都市伝説がある。

日本では、かな入力とローマ字入力があるが、一般的にはローマ字入力が使われる。このローマ字入力QWERTY式のキー配列は、最初にパソコンを触る人にとっつきにくさを与えている。反対に、スマホのようなケータイ入力の方がとっつきやすさを感じる人間も多い。

マウス

マウスはポインティングデバイスで、モニター上のある一点を操作するために使う。そして右と左のボタンを使って、シングルクリック、ダブルクリック、右クリックを使い分ける。これもパソコンを触る人にとっつきにくさを与えている。スマホのタッチパネルの方が使いやすい人間が多い。

ケータイ入力とタッチパネル

スマホでは、ケータイ入力とタッチパネルで操作を行う。初心者はこの方が良いかもしれないが、使い続けると逆にパソコン式の良さが分かってくる。特に、スマホで文字を選択したりスクロールしたりするのは、とても操作しづらい。やっぱりパソコンの方が良いと思う瞬間である。