プログラマやSEで活躍中の人でも、実はパソコンの中身を知らないとか説明できないということがあります。
プログラムを作る場合でもパソコン(コンピュータ)の構造を意識しないといけない場合もあります。
年配SEとの会話で恥をかかないようにしておきましょう。
基本的なパソコンパーツ

基本的なパソコンのパーツ構成(サーバーの場合も基本的には同じですが)は以下の4つです。
・CPU
・メモリ
・ハードディスク(ストレージ)
・マザーボード
他にも電源ユニット、DVD-RM、キーボード、マウス、モニタなどもありますが、パソコンの内部で何が行われているのかを理解するため、上記に絞って説明していきます。
ハードディスク(補助記憶装置)
外見

データを保管するパーツです。
ストレージとも言われ、最近はディスク(円盤)でないものもありますが役割は同じです。
徐々にハードディスクはSSDなどに置き換わりつつあるので、写真のようなものは10年も経てば姿を消すかもしれませんが、
一度、仕組みを理解しておきましょう。
(SSDについてはメモリのところで説明します。)
本当はやってはいけませんが、廃棄予定のディスクを分解してみました。
(通常のドライバでは分解することはできません。どうやって分解したかは内緒です)
中身はこんな感じです。


見ての通りディスク(円盤)が入っています。
ディスクはモータ(写真では見えませんが)で回転します。
中心にはベアリングがあり滑らかに高速回転ができるようになっています。

これがシーク針です。
ディスクに磁気(0,1データ)を読み書きするための装置です。
役割
一般にストレージと言われるものの役割は(電子)データの保存です。
(本末転倒的な表現ですが)Windowsでいうところの「ファイル」を保存するところと思ってください。
Windows(OS)やドライバ、EXCELなど、どんなプログラムもストレージ上のファイルとして保存されています。
パソコンは起動(電源オン)するとストレージの中身から最初に処理するファイルを探し、そこに保存されているプログラムを実行するようにできています。
WindowsやLinuxといったOSも、そのように起動しています。
私たちが日々作成しているプログラムや書類などのファイルはすべてこのストレージに保存されています。
何をしているか
先ほどの写真の通り、ハードディスクの中には金属のディスク(円盤)が複数入っており、それに電気信号が磁気で書き込まれています。
ディスクは磁気的な区画(セクタ)で区切られており、細かい箱のようなものに1ビットずつの磁気信号を記録するようになっています。

ファイルの中身を読み込むときは、
1.ディスクを回転(通常は回転しっぱなしですが止まるときもあります)

2.シーク針がディスクの中心から順に各区画を読み取って目的のファイルを見つける

3.ファイルの中身を読み取る
という処理を行っています。
区画が小さいほど大容量、ディスクの回転が速いほど高速にデータの読み書きが可能となります。
また、構造上、振動に弱いという性質があります。
ファイルの書き込みはディスクの中心から順に書き込まれます。
ファイルを削除すると部分的に空きができます。
次にファイルを書き込むときは(必ずではないですが)その空いたところに書き込まれます。
もし、空きより大きいファイルを書き込む場合は2か所以上に分けて書き込むことになります。
これを断片化といい、このファイルを読み解きは2か所以上にシーク針を移動して読み込むことになり、結果的にファイルアクセスが遅くなります。
これを解消する機能がデフラグで、断片化したファイルを1か所に集めてディスクアクセスを早くすることができます。
ちょっと深堀
セクタも磁気で記録されています。
磁気であるため、時間の経過や周りの電磁波などで消えてしまうことがあります。
そうすると、シーク針がうまく読み込むことができず、結果的にエラーとなります。
こういったセクタを不良セクタと言い、OSはセクタが破損していると判断するとそのセクタにはアクセスしないようにすることで遅延が発生しないようにしています。
ただ、あまりに不良セクタが多い場合やOSの重要部分のセクタが破損するとディスクアクセスそのものができなくなり「壊れた」ということになります。
なので、ハードディスクの故障は物理的な故障ではなく磁気的なものであることもあり、物理フォーマットを行うことでまた使えるようになることもあります。
(そうなった時点でかなり古くなっているので、やる人はあまりいませんが)
ちょっと昔話し
Windowsができる前にMicroSoftが販売していたMS-DOSというOSがあります。
DOSとはDiskOperatingSystemのことで、ディスク(当時はフロッピー)を使うためのOSでした。
基本的にWindowsはDOS上で動作しています。(たぶん)
本来のコンピュータはCPUに相当する機能のみでした。
CPUを便利に使うためにメモリを作り、さらに便利にするためにストレージ(フロッピー、ハードディスク)を作ったというわけです。
しかし、現代のコンピュータはディスク(ストレージ)があることを前提としたものとなっているということになりますね。
メモリ(主記憶装置)
外見

おおよそ、こんな形をしています。
写真のものは1枚で動作するものですが、2枚1組で動作するものなどいろいろな種類や形があります。
ノートパソコン用になるともっと小さくなっています。
役割
ハードディスクのところで説明した通り、パソコンはストレージに保存したファイルを読み込んでCPUで処理して動いています。
ただ、ストレージから直接CPUに読み込んだり、作業中のデータをストレージに書き込んだりするとかなり処理が遅くなります。
そのため、ストレージのファイルをメモリに読み込み(ロード)、メモリとCPUがやり取りすることで高速に処理ができるようになっています。

プログラムをメモリにすべて読み込んでメモリからCPUに読み込んだり、作業中のデータをメモリ上に一時的に保存してプログラムの処理ができるようにする役割があります。
また、文書やデータベースといったプログラム以外のファイルを保存してストレージのアクセスを減らすことで処理の高速化を図る役割も担っています。
何をしているか
電子回路のカタマリで出来ています。
AND/ORなどのいわゆるデジタル回路を組み合わせてデジタル(0/1)データを大量に保存、読み出しができるようになっています。
パソコンパーツとしてのメモリは「揮発性」の「RAM(Random{読み書き}AccessMemory)」です。
「揮発性」とは電源が切れると保存したデータが消えるという意味で、対して「不揮発性」は電源が切れても保存したデータが消えないメモリです。
「RAM」は読み書きが可能ですが、対して「ROM{ReadOnlyMemory}」は(一度書き込んだら)書き込みができず読み込みのみのメモリです。
SSD
ハードディスクのところで説明しなかった「SSD」は上記の「不揮発性メモリ」に相当します。
SSDとは「Solid State Drive」の略で「半導体メモリをディスクドライブのように扱える補助記憶装置」という定義です。
(昔はシリコンディスクなんて言われてました)
メモリと同様にデジタル回路で出来ていますが、NANDとかNORとかといった回路を使用することから「NANDメモリ」などと言われることもあります。
SDカードメモリなども同じ原理で出来ています。
先ほどのハードディスクも寿命があることを説明しましたが、内部構造が全く違うにもかかわらずSSDも同様に寿命があります。
SSDの場合、セクタという概念はありませんがビット単位にシーク回数に限界があり、壊れると動作しなくなるようです。(私はまだ経験してませんが)
同じ場所を何度も読み書きすると壊れる確率が高くなるので注意が必要です。
余談
ちなみにSSDやSDカードを”ROM”ということがあります。
「えぇっ、ROMはリードオンリーじゃないの?」って思ってしまいますが、実は”フラッシュROM”とか”EEPROM”とかを略して”ROM”と言っています。
何とも紛らわしい。
なんでこんな紛らわしい名前になっているかというと、もともとROMは「最初にプログラムを書き込んだら書き換えできないもの」という定義でした。
たとえばテレビやエアコンなどのプログラムは一度書き込んだら変更する必要はないですよね。
でも、プログラムが複雑になるにつれてバグの修正やバージョンアップが必要になり「ROMだけど書き換えたい」となったわけです。
気持ちはわかるけど名前変えたら?って思ってしまいますね。
プログラマなら知っておこう「変数」の保存
プログラムを書く上で「変数」とか「定数」とかのデータはメモリに保存されます。
たとえば、
int a = 1;

という処理を行うとメモリ上に以下のように保存されます。(かなり要約してますが)
言語によりますが、int型として宣言されるとメモリ上にint型で必要なバイト数を確保し、そこにデータを保存します。
この”a”を、新しい変数”b”に代入するとどうなるでしょう
int b = a;

変数”b”のメモリエリアが確保され、その中に変数”a”の値がコピーされます
では、配列のようなオブジェクトの場合はどうなるのでしょうか?
int[] X;

決まったサイズがない場合は変数として宣言されたということだけをメモリに保存します。
そのため、この変数にアクセスすると「値を保存する領域がない」といういみで「NULL」を返してきます。
変数に値を入れると、そのサイズに合わせてメモリを確保します。
X = new int[](1, 2, 3);

この「メモリを確保する」命令が”new”で、確保したメモリのことを「インスタンス」と言います。
変数”X”はインスタンスの位置を示すアドレス「ポインタ」を値として保持します。
int[] X = new int[](4, 5, 6);

もう一度”new”すると、新しいインスタンスが生成されて”X”に紐付られます。
古い方のインスタンスはどこにもつながっていないインスタンスとなり、(JAVAなどの場合)破棄(ガベージコレクション)される対象のインスタンスとなります。
int[] Y = X;

とやると、先ほど作成したインスタンスが”Y”にもつながってしまいます。
そのため、”Y”の内容を書き換えると”X”も書き換わってしまうという現象が起きます。
注意していただきたいのはオブジェクト型とプリミティブ型(int,float,charなど)とではメモリ確保のやり方が違うということです
同じ書き方でもメモリ上で行われていることが全く違うということをしっかりと認識したうえでプログラムを書くようにしましょう。
データベースから値を取得するときなどはbeanクラスを使用します。
変数に設定されたオブジェクトが、さらに変数を内包しているものをネストしたオブジェクトなどと言いますが、こういったクラスをnewして、各メンバー変数に値を設定するとメモリ上ではどういったことが行われているのでしょうか?
Class Employee(){ int id; String name; } Employee emp = new Employee(); emp.id = 1; emp.name = "shinji ikari";

ネストしたオブジェクトの場合、インスタンスの中に変数があり、その変数は各インスタンスの位置を示すポインタを保持するというような階層構造になります。
※注意事項
多くの言語で文字型(String)はオブジェクト型のひとつでCHARの配列とされます。
配列はオブジェクトなので、別の変数に代入するとポインタコピーとなるはずですが、ほとんどの言語で、String型に限って別の変数に代入すると同じ値を持つ別のインスタンスが作成されます。
これは、言語コンパイラやランタイムなどがStringだけ特別扱いをしているためです。
Class Employee(){
int id;
String name;
}
Employee emp = new Employee();
emp.id = 1;
emp.name = "shinji ikari";
このようにStringはオブジェクト型なのにプリミティブ型と同じような動きをすることをしっかりと認識してプログラムを作る必要があります。
難しいかもしれませんが、ちゃんと理解しておきましょう。
CPU
外見

パソコンの心臓部で、写真のような形をしています。
CPUは熱を持ちやすく、高温になると誤動作を起こすことがあるため放熱板がついています。
放熱板を外すとこんな感じ。

写真のCPUはマザーボードと一体型(オンボードCPU)ですが、通常はマザーボードにはめ込む形になっています。
役割
プログラムで書かれた処理を実行するパーツと思ってください。
中身はAND/OR回路などのカタマリでビット演算を行っています。
皆さんも一度は勉強したことがあると思いますが、いわゆる以下のようなビット演算を電気回路で行っているわけです。
何をしているか

でも、あくまでも電気回路(抵抗とかコンデンサとか)なので、各ビットを入力されて出力するだけです。
そのため入力をしてあげるものが別に必要で、それがレジスタと言われるメモリです。
(パソコンパーツのメモリとは別で、CPU内部に持っているメモリです)

でも、レジスタに入れている途中で演算が始まってしまうとちゃんと答えが出ませんね。
そこで
1.レジスタに命令を設定する(フェッチ)

2.命令の解読(デコード)

3.命令実行

4.結果出力

という4ステップで処理を行うようにしています。
各ステップの実行はタイマーによって管理されます。
たとえばタイマーの間隔が0.25秒の場合、①フェッチ~④結果出力が1秒で行われることになります。

CPUスペックの意味
CPUの処理能力でクロック数○○GHz(ギガヘルツ)とか書いてあるのを見たことがあると思いますが、Hz(ヘルツ)とは1秒間に何回行われるかという意味で、例えばクロック数128GHzの場合、①フェッチ~④結果出力が1秒間に128,000,000,000回実行されるということです。
また、CPUに32ビット、64ビットがあると思いますが、それはレジスタに1度に設定できる(1回に処理できる)ビット数を表しています。
そしてコア数というのは①フェッチ~④結果出力を処理する回路の数で、4つ持っていると4コア、8個持っていると8コアとなります。
64ビットでコア数が多く、クロック周波数が多いと高性能のCPUということになります。
(それだけではないですが)
ちょっと深堀
昔のパソコンは(パソコンパーツの)メモリからレジスタに命令を読み込んでいましたが、CPUが高速になるとメモリのスピードがついていけなくなってしまったため、
最近(と言っても20年ぐらい前から)CPUに高速なキャッシュメモリを持ち
メモリ(パソコンパーツの) ⇒ CPUキャッシュ ⇒ レジスタ
とすることで処理を高速に行うことができるようになっています。
昔のCPUはCPUキャッシュがない86。
CPUキャッシュが増えるごとに286,385,486,586と増えて、今は686です。
その頃はまだコアは1つでした。
その後はキャッシュを増やすだけでは高速化できなかったんでしょうね。
コアが増えていきました。
最近のi7とかとなると、もっといろんな機能を持っていますので興味がある人は調べてみてください。
マザーボード
外観

パソコン筐体と互換性を持たせるために、ATXとかMicroATXとかのサイズや形状でいくつかの種類があります。
CPU、メモリ、ストレージを接続するコネクタと外部入出力インターフェース(USB、LAN、HDMIなど)もマザーボードに組み込まれています。
役割
CPU、メモリ、ハードディスクがあればパソコンとしての機能は一通りそろいますが、それらを直接つなぐわけにはいきません。
相互の接続とそれらのデータのやり取りの制御、CPUクロックの制御など、パソコンを動作させるためのいろいろな機能が備わっています。
何をしているか
役割のところに書いたもの以外にも、起動時のファイル保存先をストレージに捜しに行ったり、システム時間のための時計機能を持っていたりします。
CPUなどのパソコン本来の機能をつかさどるエリアと、それ以外のものの制御を行うエリアというように、大きく2つのエリアに分けて設計されています。
そこまでの知識はあまり必要になることがないので、ここではあまり詳しく説明しません。
興味がある人は調べてみてください。
まとめ
パソコンの仕組みをざっと説明しました。
要約したところがたくさんあるので、詳細に知りたいところは、別途、調べてください。
今回紹介したCPU、メモリ、ハードディスク(ストレージ)、マザーボードが基本的なパソコン(コンピュータ)を構成しています。
パソコンの性能はCPUが早ければ早くなるわけではありません。
ファイルアクセス(ハードディスク)、メモリアクセス(メモリ)、演算処理(CPU)、それらの制御(マザーボード)すべてが円滑に処理されてパソコンの性能になるわけです。
プログラムを作成するときにも、ファイルアクセス、ファイルの読み込み、データベースアクセス、ビット演算などを行うことも多いと思いますので、ハードウェアの構造を意識したプログラムや設計、打合せなどを行うと品質の高い成果物を作ることができると思います。
しっかりとスキルアップしていきましょう。
(しかし、XDomainよく落ちる。なんとかしてほしい)