私のコンピュータのRAMはいくつのメモリアドレスを保持できますか?
いつの日か、コンピューティングエクスペリエンスの表面レベルを調べるのは楽しいですし、他の日には内部の仕組みを詳しく調べるのも楽しいです。今日は、コンピュータメモリの構造と、RAMに詰めることができる量を見ています。.
本日の質疑応答セッションは、コミュニティ主導のQ&A Webサイトのグループである、Stack Exchangeの下位区分であるSuperUserの好意により提供されます。.
質問
SuperUserの読者Johan Smohanは、プロセッサタイプとメモリサイズがどのように連携してアドレスの総数を算出するかに取り組んでいます。彼は書く:
32ビットプロセッサと1GB RAMでいくつのメモリアドレスを取得でき、64ビットプロセッサでいくつのメモリアドレスを取得できるか?
私はそれがこのようなものだと思います:
1GBのRAMを32ビットまたは4ビット(?)で除算してメモリアドレスの数を得る?
私はウィキペディアで、1メモリアドレスまたは1整数が64ビット幅または8オクテットの64ビットプロセッサと比較して、1メモリアドレスが32ビット幅または4オクテット(1オクテット= 8ビット)であることを読みました。しかし、私がそれを正しく理解したかどうかもわかりません.
これらは、夜に好奇心旺盛なオタクを続けることができる種類の質問です。 Johanの各仮説体系の下で利用可能な住所の数?
答え
SuperUserの寄稿者Gronostajが、RAMがどのように分割され利用されているかについての洞察を提供します。
短い答え: 利用可能なアドレスの数はそれらのうち小さい方と同じです。
- メモリサイズ(バイト)
- CPUの機械語に保存できる最大の符号なし整数
上記の長い答えと説明:
メモリはバイト(B)で構成されています。各バイトは8ビットで構成されています(b).
1 B = 8 b
1 GBのRAMは実際には1 GiBです(ギガバイトではなくギガバイト)。違いは:
1 GB = 10 ^ 9 B = 1000 000 000 B 1 GiB = 2 ^ 30 B = 1 073 741 824 B
CPUの機械語の長さに関係なく、メモリの各バイトには独自のアドレスがあります。例えば。 Intel 8086 CPUは16ビットで、メモリをバイト単位でアドレス指定していたため、最新の32ビットおよび64ビットCPUも同様でした。これが最初の制限の原因です。メモリバイトより多くのアドレスを持つことはできません。.
メモリアドレスは、探しているアドレスに到達するためにCPUがメモリの先頭からスキップしなければならないバイト数です。.
- 最初のバイトにアクセスするには、0バイトをスキップする必要があるので、最初のバイトのアドレスは0です。.
- 2番目のバイトにアクセスするには、1バイトをスキップする必要があるため、そのアドレスは1です。.
- (など)
- 最後のバイトにアクセスするために、CPUは1073741823バイトをスキップするので、そのアドレスは1073741823です。.
32ビットが実際に何を意味するのかを知る必要があります。前述したように、それは機械語のサイズです.
マシンワードとは、CPUが数値を保持するために使用するメモリの量です(RAM、キャッシュ、または内部レジスタ)。 32ビットCPUは、数値を保持するために32ビット(4バイト)を使用します。メモリアドレスも数字なので、32ビットCPUではメモリアドレスは32ビットで構成されています。.
今考えてみましょう:あなたがそれに2つの値を保存することができます:あなたはそれに2つの値を保存することができます:0または1。さらに1ビットを追加して、0、1、2、3の4つの値があります。 0、1、2…6、7。これは実際にはバイナリシステムであり、次のように動作します。
2進10進数0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 8 1000 9 1001 10 1010 11 1011 12 1100 13 1101 14 1110 15 1111
通常の加算とまったく同じように機能しますが、最大桁数は9ではなく1です。10進数の0は
0000
, それからあなたは1を加えて得る0001
, もう一度追加すれば、0010
. ここで起こったことは10進数を持つことのようなものです09
そして、1を加えます:あなたは9を0に変えて、次の数字を増やします.上の例から、常に一定のビット数を保持できる最大値があることがわかります。すべてのビットが1で、値を1ずつ増やそうとすると、すべてのビットが0になるため、数。これは整数オーバーフローと呼ばれ、ユーザーと開発者の両方にとって多くの不快な問題を引き起こします。.
11111111 = 255 + 1 ----------- 100000000 = 0(ここでは9ビットなので、1はトリミングされています)
- 1ビットの場合、最大値は1です。,
- 2ビット - 3,
- 3ビット - 7,
- 4ビット - 15
最大可能数は常に2 ^ N-1です。ここで、Nはビット数です。前述したように、メモリアドレスは数値であり、最大値もあります。それが、機械語のサイズが利用可能なメモリアドレスの数の制限でもある理由です。時々あなたのCPUはちょうどより多くのメモリをアドレス指定するのに十分に大きい数を処理できない.
32ビットでは0から2 ^ 32-1までの数字を保持でき、それは4 294 967 295です。それは1 GBのRAMの最大アドレスよりも大きいので、特定の場合にはRAMの量が制限要因となります。.
32ビットCPUのRAM制限は理論的には4 GB(2 ^ 32)であり、64ビットCPUの場合は16 EB(エクサバイト、1 EB = 2 ^ 30 GB)です。言い換えれば、64ビットCPUはインターネット全体を... 200回アドレス指定できます;)(WolframAlphaによる推定).
ただし、実際のオペレーティングシステムでは、32ビットCPUは約3 GiBのRAMをアドレス指定できます。それはオペレーティングシステムの内部アーキテクチャのためです - いくつかのアドレスは他の目的のために予約されています。あなたはウィキペディアでこのいわゆる3 GBの障壁についてもっと読むことができます。 Physical Address Extensionでこの制限を引き上げることができます.
メモリアドレス指定について言えば、私が言及すべきことがいくつかあります。 仮想メモリ, セグメンテーション そして ページング.
仮想メモリ
@ Daniel R Hicksが別の答えで指摘したように、OSは仮想メモリを使用します。つまり、アプリケーションは実際のメモリアドレスでは動作しませんが、OSによって提供されるものです。.
この手法により、オペレーティングシステムはRAMからあるページデータ(Windows)またはスワップ(* NIX)にデータを移動できます。 HDDはRAMより数倍遅いですが、めったにアクセスされないデータにとってはそれほど深刻な問題ではなく、OSは実際にインストールしたよりも多くのRAMをアプリケーションに提供できます。.
ページング
我々がこれまで話していたことはフラットアドレッシングスキームと呼ばれています.
ページングは、フラットモデルの1つの機械語で通常可能な、より多くのメモリをアドレス指定できる代替のアドレス指定方式です。.
4文字の単語でいっぱいの本を想像してみてください。各ページに1024の数字があるとしましょう。数字に取り組むには、2つのことを知っておく必要があります。
- その単語が印刷されているページ数.
- そのページのどの単語があなたが探しているものです.
これがまさに最新のx86 CPUがメモリを処理する方法です。それは4 KiBページ(それぞれ1024機械語)に分割され、それらのページは番号を持っています。 (実際には、ページは4 MiBまたは2 MiBでPAEになることもあります)。メモリセルをアドレス指定する場合は、そのページのページ番号とアドレスが必要です。各メモリセルは正確に1対の数で参照されることに注意してください。これはセグメンテーションには当てはまりません。.
セグメンテーション
これはページングとよく似ています。一例を挙げると、Intel 8086で使用されていました。アドレスのグループは、ページではなくメモリセグメントと呼ばれるようになりました。違いは、セグメントが重なり合うことがあり、それらは多くの場合重なり合うことです。例えば8086では、ほとんどのメモリセルが4096の異なるセグメントから利用可能でした。.
例:
8バイトのメモリがあり、255に等しい4バイト目を除いてすべて0を保持しているとしましょう。.
フラットメモリモデルのイラスト:
_____ | 0 | | 0 | | 0 | | 255 | | 0 | | 0 | | 0 | | 0 | -----
ページメモリの図 4バイトページの場合
PAGE0 _____ | 0 | | 0 | | 0 | PAGE1 | 255 | _____ ----- | 0 | | 0 | | 0 | | 0 | -----
セグメント化メモリの図 4バイトのセグメントを1だけシフトした場合
SEG 0 _____ SEG 1 | 0 | _____ SEG 2 | 0 | | 0 | _____ SEG 3 | 0 | | 0 | | 0 | _____ SEG 4 | 255 | | 255 | | 255 | | 255 | _____ SEG 5 ----- | 0 | | 0 | | 0 | | 0 | _____ SEG 6 ----- | 0 | | 0 | | 0 | | 0 | _____ SEG 7 ----- | 0 | | 0 | | 0 | | 0 | _____ ----- | 0 | | 0 | | 0 | | 0 | ----- ----- ----- -----
ご覧のとおり、4番目のバイトは4つの方法でアドレス指定できます。(0からアドレス指定)
- セグメント0、オフセット3
- セグメント1、オフセット2
- セグメント2、オフセット1
- セグメント3、オフセット0
常に同じメモリセル.
実際の実装では、セグメントは1バイト以上シフトされます(8086では16バイトでした)。.
セグメンテーションの悪いところは、それが複雑だということです(しかし、私はあなたがすでにそれを知っていると思います;)良いことは、モジュラープログラムを作成するためにいくつかの巧妙なテクニックを使うことができるということです。.
例えば、あるモジュールをあるセグメントにロードして、そのセグメントが実際よりも小さいように(モジュールを保持するのに十分なだけ小さい)ふりをしてから、その擬似小さいものと重ならない最初のセグメントを選択して次にロードします。モジュールなど。基本的に、このようにして得られるのは可変サイズのページです.
説明に追加するものがありますか?コメントの中で消してください。他の技術に精通したStack Exchangeユーザーからの回答をもっと読みたいですか?こちらのディスカッションスレッドをチェックしてください。.