32ビットプロセッサと1 GB RAMで取得できるメモリアドレスの数と、64ビットプロセッサで取得できるメモリアドレスの数はいくつですか。
私はそれがこのようなものだと思います:
1GBのRAMを32ビットで除算するか、4で除算しますか?メモリアドレスの数を取得するには?
確信はないけど。それが私が尋ねている理由です。
私がウィキペディアで赤くしたのは、1つのメモリアドレスまたは1つの整数が64ビット幅または8オクテットの64ビットプロセッサと比較して、1つのメモリアドレスは32ビット幅または4オクテット(1オクテット= 8ビット)であることです。しかし、私がそれを正しく理解したかどうかもわかりません。
短い回答:利用可能なアドレスの数は、それらの小さい方に等しくなります。
上記の長い回答と説明:
メモリはバイト(B)で構成されます。各バイトは8ビット(b)で構成されます。
1 B = 8 b
1 GBのRAMは、実際には1 GiB(ギガバイトではなくギビバイト)です。違いは次のとおりです。
1 GB = 10^9 B = 1 000 000 000 B
1 GiB = 2^30 B = 1 073 741 824 B
WordのCPUマシンの大きさに関係なく、メモリの各バイトには独自のアドレスがあります。例えば。 Intel 8086 CPUは16ビットで、メモリをバイト単位でアドレス指定していたため、最新の32ビットおよび64ビットCPUも同様です。これが最初の制限の原因です。メモリバイトを超えるアドレスは使用できません。
メモリアドレスは、CPUが探しているアドレスに到達するためにメモリの最初からスキップする必要があるバイト数です。
ここで、32ビットが実際に何を意味するかを知る必要があります。前に述べたように、それはマシンワードのサイズです。
マシンワードは、CPUが数値(RAM、キャッシュ、または内部レジスタ)を保持するために使用するメモリの量です。 32ビットCPUは、32ビット(4バイト)を使用して数値を保持します。メモリアドレスも数値なので、32ビットCPUではメモリアドレスは32ビットで構成されます。
これについて考えてみましょう。1ビットの場合、0または1の2つの値を保存できます。ビットを1つ追加すると、4つの値:0、1、2、3になります。3ビットの場合、8つの値を保存できます。 :0、1、2 ... 6、7。これは実際にはバイナリシステムであり、次のように機能します。
Decimal Binary
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 bits here, so 1 is trimmed)
最大可能数は常に2 ^ N-1です。ここで、Nはビット数です。前述したように、メモリアドレスは数値であり、最大値もあります。そのため、マシンのWordのサイズは使用可能なメモリアドレスの数の制限でもあります。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をアドレス指定できます。これは、オペレーティングシステムの内部アーキテクチャによるものです。一部のアドレスは他の目的のために予約されています。このいわゆる Wikipediaの3 GBの障壁 について詳しく読むことができます。 Physical Address Extension を使用して、この制限を解除できます。
メモリのアドレス指定について言えば、いくつか言及する必要があります:仮想メモリ、segmentation、paging 。
@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 |
| 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からアドレス指定)。
それは常に同じメモリセルです。
実際の実装では、セグメントは1バイト以上シフトします(8086の場合は16バイトでした)。
セグメンテーションの悪い点は、それが複雑であることです(しかし、あなたはすでにそれを知っていると思います;)良いことは、いくつかの巧妙な手法を使用してモジュール式プログラムを作成できることです。
たとえば、一部のモジュールをセグメントにロードし、セグメントが実際よりも小さい(モジュールを保持するのに十分小さい)ふりをして、その擬似的に小さいセグメントと重複しない最初のセグメントを選択して、次のモジュールをロードすることができます。 、 等々。基本的にこの方法で得られるのは、可変サイズのページです。
上記に加えて、複数のアドレススペースとともにvirtualアドレッシングが使用されることに注意してください。したがって、RAMが1 GBしかない場合でも、プログラムは概念的に最大4 GBの仮想メモリを使用できます(ただし、ほとんどのオペレーティングシステムでは、これよりも少なく制限されています)。また、概念的には、このような4GBアドレススペースを(ほぼ)無限に持つことができます。
RAMサイズは、プログラムの最大サイズや実行できるプログラムの数を(それほど)制限するのではなく、パフォーマンスを制限します。実メモリが「オーバーコミット」され、システムがメモリの「ページ」をRAMとディスクの間で往復)するときに「スラッシュ」を開始すると、パフォーマンスが急激に低下します。
RAMの1GByteは、1024 * 1024 * 1024バイト、または1,073,741,824バイトを占有します。
32ビットプロセッサの場合、常に4 * 1024 * 1024 * 1024バイト、または4,294,967,296バイトのアドレススペース 1GバイトのRAMがこのスペース内に表示されます。Intelプロセッサの場合、一部のRAMは割り込みベクトルのアドレス0に出現する必要があるため、物理RAMはアドレス0から始まり、上昇します。
BIOSとオプションROM(最初の1Mバイト内の上位384Kバイト)、I/Oデバイス(APICなど)、ビデオRAMなど、他のものがそのアドレス空間に表示されます。システム管理モード「SMRAM」では、まだ完全には理解していない奇妙なことがいくつかあります。
これは、カーネルの観点から、物理アドレス空間であることに注意してください。 MMUは、このすべてを任意の方法でユーザースペースプロセスに再配置できます。
受け入れられた答えは良い説明を与えます。しかし、私はそれが答えだとは思いません。 address busについては何も含まれていません。そして、そのサイズは実際にはメモリの制約の主な理由です。たとえば、8080は8ビットプロセッサ(データバスのサイズは8ビットです)ですが、16ビットのアドレスバスを持っています。 2 ^ 16 =(2 ^ 6)*(2 ^ 10)= 64 * 1024バイト= 64KBをアドレス指定できます。
さらに詳しく ここ(32ビット) は、「技術履歴」セクションにあります。
32ビットプロセッサは、最大2 ^ 32のメモリの個別バイト(約4GB)をアドレス指定できますが、1GBのメモリを使用すると、1 * 1024 * 1024 * 1024のアドレス指定可能なメモリバイトが作成されます(ただし、おそらく2 ^ 32の仮想アドレス空間があります) )。 64ビットCPUは2 ^ 64の個々のバイトをアドレス指定できますが、ほとんどのシステムはメモリアドレスに48ビットしか使用しないと思います。アドレス指定可能なバイト2 ^ 48。