Segmentation Fault の反対語って、な～んだ？

Segmentation の対義語は data で Fault の対義語は hit (多分) なので、表題のなぞなぞの答えは **data hit** になるのかな？（知らんけど）
まあ表題はアクセス数目当てなのであまり気にしないで欲しい。
本記事は IT エンジニアが好きそうな、主にハードウェアよりのトリビアである。

# segmentation とは何ぞや？

筆者の知る限り segmentation とはハードウェアエンジニア、例えば CPU の設計図を作ったりする人達がよく使う言葉だ。

多くの人は「コンピューターとは CPU、メモリ、内蔵ディスク、ネットワーク機器からなる」と言われると「厳密な事は分からないが、そんな物かもしれないな」と思うだろう。

ただ、「コンピューターとは CPU と主記憶（メモリ）からなる」と書かれている教科書を読んだことが有る人も居るかもしれない。
ハードウェアエンジニアの中には、この説明の方が納得感が有ると感じる人も居る。

CPU とメモリは、それだけ密結合なのだ。
ざっくり言うと、Segmentation とはこのレイヤーの人達にとって「メモリ上のデータ」と似た意味を持つ言葉だ。

## segmentation は速くて大きい程良い？

Web プログラマーの立場では「メモリは速い」、「メモリ搭載量は多い程良い」と思う事が多いが、CPU エンジニアにとってはそうでも無かったりする。

メモリ搭載量を多くすると、大型化し部品数が多くなる。
すると電気信号による通信にかかる時間が増えるのだ。

例えばクロック周波数が 3 GHz の CPU を想像しよう。
光の速度は約 3 x (10 の 10 乗) cm/S なので、1 クロック当たりに約 10 cm しか進まない。
マザーボード上で CPU から距離が 5 cm （往復 10 cm）離れているメモリとの通信には、光速でも 1 クロックかかってしまう。
当然、実際のコンピューター内の通信速度はもっと遅い。

そのため彼らは Segmentation と呼ばれる大型のメモリの他に、CPU の近く（内部）に小型のメモリを用意する事がある。
このメモリは階層構造になっていて Segmentation のキャッシュとして働く。

1 番小さくてプロセッサの近くにあるものを Layer 1 キャッシュ（L1 キャッシュ）と呼び、CPU は最初にここを探す。
この時、もし欲しい値が見つかれば hit、見つからなければ lost と言う。
L1 キャッシュで lost した場合、次に小さくて近くにある L2 キャッシュを探すだろう。

近くのキャッシュから順に探していき、全ての CPU キャッシュを探しても欲しい値が存在しなければ CPU はあきらめて segmentation を探しに行くだろう。

CPU のスペックには CPU キャッシュの容量が記載してある事があるが、前述の様に CPU キャッシュの存在理由は小さい事だ。
大きければ良いという物では無いし、数字だけ見て優劣を判断出来るものでは無いと筆者は考える。

# segmentation の対義語としての data

プログラムが必要な情報は、最初から全て Segmentation 上に存在するとは限らない。
アプリケーションが内蔵ディスク上のファイルやネットワーク上の別のコンピューターから情報を取得することも有るだろう。
その様な情報を data と言う。

「無事に取得できた」 data はメモリ上に保存されて、やがて segmentation になるだろう。
このように、data が取得に成功する事を CPU キャッシュと同様に hit という。
対して、取得に失敗する事を fault という（lost では無い。）

data は常に fault する可能性が有り、fault した場合のエラー処理をする事はプログラムの責任である。
実際に、必要なファイルが存在しなかったりアクセス権の問題で読めない事は良くある事だ。

# segmentation fault とは何ぞや？

これまでの復習をしてみよう。

- segmentation とはメモリ上に存在する情報、まだメモリにロードされていない情報を data と呼ぶ。
- data が取得できない事を fault と呼び、fault した場合のエラー処理はプログラムが行う

ならば「segmentation が取得できない場合はどうなるのか？」という疑問が当然湧くだろう。

ハードウェアエンジニアにとって、これはコンピューターが正常に動作する状態では無い事を意味する。
コンピューターとは CPU とメモリであり、CPU はメモリから常に情報を取得できるべきなのだ。
segmentation fault が発生すればエラー処理すらも正常に動作する補償は無い。
なので、該当コンピューターがエラー処理を行う必要も無い。
（必要ならば、外部に監視専用のコンピューターを用意しよう。）

ただし、プログラマーにとっては話が別だ。
普通のプログラムは OS 上で動く。
OS は複数のプロセスが同時に動作する事を想定しており、各プロセスにメモリを割り振る。
プロセスが OS から割り当てられた範囲外のメモリにアクセスしようとしても、値を取得する事は出来ない。
つまり segmentation fault である。

もし segmentation fault が発生してもプログラムはエラー処理を行う必要は無い。
そのプログラムは正常動作していないので、エラー処理も出来ないからだ。
ただし OS が正常動作していれば OS はエラー処理をするだろう。（例えばエラーメッセージを表示してプロセスをキルする。）

# クロック周波数の上限値

ところで、メモリの容量と速度の話をしたら「金属中の電子の速度は光速の 50 % 程度ならば簡単に出ますよね？あまり大きな問題にはならないのでは？」と反論された事がある。
彼の言っている事「電子の最大速度」という意味では正しい。
しかし CPU 内ではクロック周波数に応じて電圧が上がったり下がったりする。

CPU 内で電子を動かすには、下記の様な順を追うことになるのだ。

1. 最初、電子はランダムな熱運動をしている（もしくは、統計的に逆方向に運動している）
1. 電圧をかける
1. 電圧に応じて、半導体内部に電場ができる
1. 電場に応じて電子が加速する
1. 電圧のかけた方向に電子が統計的に運動を行う

さらにいうと、CPU の大部分はシリコン製の半導体であり、シリコンは電圧に応じて電場ができるまでの時間が長い。
これはシリコンの結晶が電場をかけると歪むからだ。（「歪む」は「ゆがむ」では無く「ひずむ」と読む。）

原子は原子核の周りを電子が周っている構造をしており、通常「電気が流れる」とは「電子が動く」という事だ。
しかし「結晶が歪む」ということは「電子だけではなく原子核も移動する」という事なので、応答速度が非常に遅くなる。

シリコン製の半導体の電子の応答速度はクロック周波数が 500 MHz を超えたあたりから大きく下がり始める。
これを「電子が凍る」と表現することが有る。
筆者は「電子が凍るので CPU のクロック周波数が 1 GHz を超えることは理論的に無い( ｰ`дｰ´)ｷﾘｯ」みたいな事が書かれている 20 世紀の物理の教科書を読んだ事が有る。

ご存じの通り、現在では CPU のクロック周波数が 1 GHz を超える事は珍しくない。
CPU は多くの半導体素子から構成されている。
CPU の各素子は例えば「クロック周波数の 1/10 の速度で動く」というような仕組みになっている。
（だからクロック周波数と CPU の性能が比例するとは限らないのだ。）
現在では、クロック周波数と実際の動作周波数の比率が昔の教科書の想定を超えてしまったのだ。

蛇足だが、5 GHz の wifi の送受信を行うためには半導体の素子は実際に 5 GHz で応答する必要がある。
「1/10 の速度で動く」なんてインチキは出来ない。

その様な部分ではシリコン製の半導体は使えない。
代わりに Ga 系の半導体が使われたりする。
（教科書には GaAs が良く紹介されるが、As は危険なので現実では滅多に使われない。このような「Ga と As の代替」からなる半導体を Ga 系半導体と言ったりする。）

# まとめ

以上、「生きていく上で何の役にも立たない無駄な知識、しかし、つい人に教えたくなってしまうようなトリビア（雑学・知識）」でした。