何故メモリの容量は2の累乗になるのか
みなさんこんにちは。
ガンディー@元エクアドルのコーヒー農園です。
ご無沙汰しております。新年あけましておめでとうございます。本年も何卒よろしくお願いいたします。
今年の抱負は、「基本的なことをちゃんと知ってくこと」にしたいと思っています。常識的な知識って意外と知らなかったりします。僕も恥ずかしながら、去年TOEICの勉強を通して初めて「ケータリング」という日本語を覚えました。。そんなもんです。
こういうことって結構あるんじゃないかと思い、年相応の知識はつけておけねば。。と思う次第であります。
ということで本日は、知っていたつもりで知らなかったことについて紹介したいと思います。
みなさん、パソコンやスマホの容量が32GB(ギガバイト)、64GB、128GBという不思議な数字になっているのに疑問を持ったことはありませんか?
何故、10GB、100GB、、、ではないのか?
ちょっと詳しい人だと、「コンピュータは2進数で動いているから、2の乗数になるんだ」という認識を持っていたりします。
僕も、そこまでは知っていました。
腐っても、理学修士です。
ただ、それ以上の理由を知りませんでした。
仲良くさせていただいている数学主婦の人から質問され、答えられなかったのが恥ずかしかったので、エンジニアの友人にヒアリングしたりして調べてみました。
※僕は理学修士ですが、新卒から一貫して文系職を貫いています。ですので、ここから先の情報は厳密には正しくない可能性があります。正しさよりも、イメージが伝わるように書くつもりです。逆にいうと、専門家でない分、厳密性を気にせずに分かりやすく伝えることができる、とも言えます。
半導体って何?
パソコン、スマホが動く仕組みってご存知ですか?
僕も詳しいことは分かりません。分からないので、超簡単に言うと、「半導体」が作動しているからです。
では、半導体とは何でしょう。
この世には、電気が流れる物質と、電気を流さない物質があります。
電気が流れる物質を「導体」と呼びます。金属なんかがそうです。
電気を流さない物質を「絶縁体」と呼びます。ゴムなんかがそうですね。
実は、電気を流すことがあれば、流さない事もある物質があるんです。
このどっちつかずな優柔不断な性質を持つ物質のことを「半導体」と呼びます。どっちつかずなので、「半」なんですね。
この半導体の特徴として、与えられた環境によって電気を流したり、流さなかったりするのです。意志の弱い物質です。気の弱い日本人が半導体産業をリードしたのも何かの縁でしょう。
この性質が、人間にとっては実に有用なんです。
というのも、磁場をかけたり色々することで、電気を流す/流さないのコントロールができるようになるんです。
流す状態を1、流さない状態を0にしたら、0と1の2パターンを作ることができます。
これが、コンピュータが01と言われる所以ですね。1箇所の半導体で2パターン(0 /1)を作れるので、2箇所あれば4(00 / 01 / 10/ 11)、3箇所あれば8パターン(000/001/010/011/100/101/110/111)を作れます。
これ、2=2^1、4=2^2、8=2^3ですね。何となく、2の何乗(簡単のため、2^nとします)となることが予想できますね。
ところが、スマホの容量が2^n GBになるのはもうちょっと違う理由がある
※2^nの ^ は、2の右上にnが乗ってることを簡易に示す理系の書き方です。
文系職の僕は、上記の理由からスマホの容量って2^nになるんだよな、と本気で思っていました。
でも、これちょっと違うんです。
その説明を行うため、まずはbit(ビットと読みます)というものをご紹介します。
bitとは、半導体素子の数
このタイトル、厳密な人(というか半導体業界の人全員)には怒られちゃいますが、あくまでイメージを伝えたいので、こう書きました。
巷でよく聞くbitとは、半導体素子の数です。厳密には、回路中の半導体の種類も色々あって、bit数=半導体素子数ではないです。
半導体素子の数ってどういうことかと言うと、電気を流す(1) or 流さない(0)の選択をする場所の数です。
bit数とは0 or 1の2パターンを作りだす場所の数です。
なので、1bit = 0 or 1 の2パターン、2bit = 00 or 01 or 10 or 11の4パターンと、表せる組み合わせが倍々になって増えていくのです。
コンピュータ関連の人たちは、プログラムの都合が良いので8bitをひとまとまりに考えるそうです。そこで、1byte (バイトと読みます)=8bitとすることにしたそうです。
1 byte = 8bit = 00000000 / 00000001 / —– / 11111110 / 11111111 の256パターン
数学的に言えば、n byte では、2^(8n)のパターンが作れます。
あーだから容量って2^nになるのね。
って思った皆さん、重大な勘違いをしています。
最初の疑問に戻ってください。
スマホの容量って、 64GBとかですよね?
GBとは、Giga Byteのこと。byteって、パターンの数ではなく、半導体の数を表しています。(厳密には半導体の数の8分の1)
つまり、64GBだと、
2^(64 x 1024 x 1024 x 1024 x 8) パターンが作れることになります。
※ちなみに、この業界以外でGといえば1,000,000,000を表しますが、コンピューターワールドでは1024 x 1024 x 1024 (= 2^30)になるそうです。同様に、K=1024, M=1024x 1024です。これもビックリですね。純粋理学専攻からコンピュータワールドに行くと苦労しそうです。
パターン数は2^(2^n)になる。。ちょっとやりすぎ感。
ここで数学科や物理科の人間なら思う事があります。
あれ?半導体素子の数が2^nである必然性は無いよね。。。と。
ここで僕は泥沼にはまっていました。。。
容量の数字は、ソフトウェア側の都合
実は、ハード面からみれば、容量の数字は2^nである必要は無いんです。
半導体素子を10個にしようが100個にしようが自由です。
ただ、ハードを動かすために作るソフトウェアを設計する際に、重要になってくるんです。
ここではメモリの例をとりましょう。
メモリに記録を書き込むには、
「どこの半導体素子に電気を流すか」ということをプログラムで指示する必要があります。
ただ、非常にやっかいなのが、プログラムの指示も半導体のオンオフのパターンで行わなければいけません。なぜなら、プログラムは半導体に電流を流す、流さない、をコントロールして指示を出すからです。
例えば、1番目~4番目の素子を、(指示① 指示②)のように指示パターン分けをします。
1番目の素子=(0 0)
2番目の素子=(0 1)
3番目の素子=(1 0)
4番目の素子=(1 1)
3番目の素子に書き込む、としたときは
指示① 0(電流を流さない)にする
指示② 1(電流を流す)にする
ですね。
もし、指示③まで出せたら、何個まで半導体素子をポインティングできるでしょうか?
そう、8個ですね。
パターンは、(000)(001)(010)(011)(100)(101)(110)(111) です。
これ、2^3なんです。
指示を1つ加えると、指示できる半導体素子が2倍になるんです。
つまり、指示を1つ加えると、2倍のソフトウェア側の箱ができてしまうんです。
ソフトウェア側の箱は、現実の半導体素子と1対1で対応させる、もしくは、メモリ側に素子が無ければ「存在しない」という注釈をプログラムに書き込む必要があるそうなので、メモリ(ハード)側にはちょうど2倍の半導体素子の数があると都合が良いそうです。
実は、これがデバイスの容量が2の何とか乗になる所以なんです。
どうです?すっきりしましたでしょうか?
おそらく、情報系の人から見たら正しくない知識だし、純粋文系の人から見たらちょっと何言ってるか分からない、という文章だとは予想しています。
ただ、自分が納得できたので良しとします。
ご指摘等は大歓迎ですので、よろしくお願いします。
P.S. 本年はまた一つ変化の年にしたいと考えておりますが、ひとまず次回のブログにてご報告させていただければと思います。