32ビットプロセッサと1GBのRAMでいくつのメモリアドレスを取得できますか?


12

32ビットプロセッサと1GB RAMで取得できるメモリアドレスの数と、64ビットプロセッサで取得できるメモリアドレスの数

私はそれがこのようなものだと思う:

1GBのRAMを32ビットで除算するか、4で除算するか?メモリアドレスの数を取得するには?

確信はないけど。それが私が尋ねている理由です。

ウィキペディアでは、1つのメモリアドレスまたは1つの整数が64ビット幅または8オクテットの64ビットプロセッサと比較して、1つのメモリアドレスが32ビット幅または4オ​​クテット(1オクテット= 8ビット)であると思います。しかし、私もそれを正しく理解したかどうかわからない。


事実上、最新のシステムはすべてバイトアドレス指定されています。つまり、32ビットで約4ギガバイト(RAMが搭載されている場合)をアドレス指定できます。歴史的には、12、15、16、17、24、32、36、または48ビットの「ワード」と、おそらく4ビットまたは6ビットをアドレス指定する10進マシンのワードアドレス指定スキームがありました。単位。しかし、最新のシステムのほとんどは仮想メモリを採用しているため、プロセッサはインストールされているメモリよりもさらに多くのメモリに対応できることに注意してください。
ダニエルRヒックス14

@DanielRHicks仮想メモリは、アドレス指定できるRAMの量には影響しません。
ジェイミーハンラハン

@JamieHanrahan-仮想メモリが機能するためには、(単一プロセスの)仮想アドレス範囲にまたがるアドレス指定メカニズムが必要です。これはソフトウェアシミュレーションで実行できますが、それは非常に非効率的であるため、ほとんどのシステムでは、プロセッサのアドレス範囲はプロセスの最大アドレススペースを組み込むのに十分な大きさになります。
ダニエルRヒックス

@DanielRHicksもちろんですが、それはどのくらいのRAMに対処できるかに影響しません。RAMは仮想メモリではなく物理メモリです。仮想アドレスはRAMアドレスではなく、仮想メモリはRAMではありません。
ジェイミーハンラハン

@JamieHanrahan-あなたは何の意味もありません。仮想アドレス空間でRAMのページをアドレス指定できない場合、RAMは役に立たなくなります。(1972年以来、仮想メモリの設計に取り組んできました。)
ダニエルRヒックス

回答:


38

簡単な答え:使用可能なアドレスの数は、これらのうち小さい方に等しくなります。

  • バイト単位のメモリサイズ
  • CPUのマシンワードに保存できる最大の符号なし整数

上記の長い答えと説明:

メモリはバイト(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

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ビットで構成されます。

これについて考えてみましょう:1ビットの場合、2つの値を保存できます:0または1。もう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を追加してgetし0001、もう一度1を追加するとが得られます0010。ここで起こったことは、10進数を09持ち、1を追加したようなものです。9を0に変更し、次の桁をインクリメントします。

上記の例から、常に一定のビット数の数値を保持できる最大値があることがわかります-すべてのビットが1で、値を1増加させようとすると、すべてのビットが0になるため、数。これは整数オーバーフローと呼ばれ、ユーザーと開発者の両方にとって多くの不快な問題を引き起こします。

   11111111    = 255
+         1
-----------
  100000000    = 0   (9 bits here, so 1 is trimmed)
  • 1ビットの最大値は1です
  • 2ビット-3
  • 3ビット-7
  • 4ビット-15

可能な最大数は常に2 ^ N-1です。Nはビット数です。前にも言ったように、メモリアドレスは数値であり、最大値もあります。そのため、マシンワードのサイズは使用可能なメモリアドレスの数の制限でもあります。CPUが、より多くのメモリをアドレスするのに十分な大きさの数値を処理できない場合があります。

したがって、32ビットでは、0から2 ^ 32-1までの数値を保持できます。これは4 294 967 295です。1GB 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組の数字で参照されますが、セグメンテーションの場合はそうではないことに注意してください。

セグメンテーション

まあ、これはページングに非常に似ています。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からアドレス指定)

  • セグメント0、オフセット3
  • セグメント1、オフセット2
  • セグメント2、オフセット1
  • セグメント3、オフセット0

常に同じメモリセルです。

実際の実装では、セグメントは1バイト以上シフトされます(8086では16バイトでした)。

セグメンテーションの悪い点は複雑だということです(しかし、あなたはすでにそれを知っていると思います;)良いことは、いくつかの巧妙なテクニックを使ってモジュール式プログラムを作成できることです。

たとえば、いくつかのモジュールをセグメントにロードし、セグメントが実際よりも小さいふりをして(モジュールを保持するのに十分なだけ小さい)、次にその疑似小さいセグメントと重ならない最初のセグメントを選択し、次のモジュールをロードできます、 等々。基本的にこの方法で得られるのは、可変サイズのページです。


1
OSはユーザープロセスに完全な4GiB仮想アドレススペース(x86の場合は1ページ-4KiBを引いたもの)を提供できますが、アドレススペースを変更する必要があるため、システムコールのコストが高くなります。PAEおよび同様のメカニズムを使用すると、システムでアドレス指定可能な物理メモリの量を増やすことができますが、アドレスは32ビットに制限されています。
ポールA.クレイトン

それは私が探していたものではありませんが、とにかく良い情報です!マックスの良い説明をありがとう。2進数と10進数のテーブル比較のための数字(1 =最大。バイナリ9の場合は最大)。これについて考えるのは本当に良い方法です。私は何か新しいことを学びました。:)ありがとう!
ヨハンスモーハン

このGibiとGigaは非常に紛らわしいです...一部のサイトでは、メモリがGibiで測定されることを読んだり、他のサイトではGigaにあることを読んだりしています。
ヨハンスモーハン

ウィキペディアにはいくつかの歴史的背景を含むバイナリ接頭辞に関する記事あります。ほとんどのハードウェア関連の数値は10進数の接頭辞を使用しますが、最も顕著な例外はおそらくRAMであり、おそらくカラースケールです。16MカラーのLCDには、3つの8ビットカラーチャネル(2 ^ 24)があります。質問に直接答える:この場合、RAMはバイト単位でアドレス指定されるため、使用可能なアドレスの数はメモリのバイト数に等しくなります。32ビットCPUは最大2 ^ 32 B、64ビット1-2 ^ 64を処理できます。
グロノスタジ

ありがとう!これは学校の試験に必要です。:)私は今、ほとんどのものを理解していると思います。まだ私を悩ませている唯一のことは、それが32バイトではなく32ビットプロセッサである場合、なぜ2 ^ 32 Bですか?
ヨハンスモーハン

3

上記に加えて、仮想アドレス指定が複数のアドレススペースとともに使用されることに注意してください。したがって、RAMが1GBしかない場合でも、プログラムは概念的に最大4GBの仮想メモリを使用できます(ただし、ほとんどのオペレーティングシステムではこれよりも少ないメモリに制限されます)。また、概念的には(ほぼ)無限の数のそのような4GBアドレススペースを持つことができます。

RAMサイズは、プログラムの最大サイズや実行できるプログラムの数を(それほど)制約することはありませんが、むしろパフォーマンスを制約します。実メモリーが「オーバーコミット」になり、システムがRAMとディスク間でメモリーの「ページ」を「スワップ」するときに「スラッシュ」を開始すると、パフォーマンスが低下します。


2

RAMの1Gバイトは、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は、これらすべてを任意の方法でユーザー空間プロセスに再配置できます。


ウィキペディアでは、1つのメモリアドレスまたは1つの整数が64ビット幅または8オクテットの64ビットプロセッサと比較して、1つのメモリアドレスは32ビット幅または4オ​​クテット(1オクテット= 8ビット)であると思います。あなたは4 * 1024 * 1024 * 1024バイトのアドレス空間については正しいですが、私は1GB / 32ビットであると思うメモリアドレス空間を探していましたが、私はまだ正しいかどうかわかりません。:)ご回答ありがとうございます!
ヨハンスモーハン

Np。Intel CPUには、「メモリ」と「I / O」の2つのアドレス空間があります。RAM以外のものが「メモリ」スペースに表示されます。I / OデバイスやROMなどの他のものは、RAMによって占有されていない場所にある場合があります。一般に、I / Oアドレス空間にはI / Oデバイスのみが表示されます。
ローレンス

@johansmohanあなたの番号もローレンスの答えも正しくありません。プロセッサの「ビット幅」と使用可能なRAMアドレスの幅の間に固定の関係はありません。32ビットのみのx86プロセッサは、64 GBのRAMに対応できます。x64プロセッサは40ビットの物理アドレス空間で始まり、現在は52ビットです。仮想アドレス空間に関しては、それも異なる場合があります。x64では、仮想アドレスの保存には64ビットが必要ですが、64ビットから期待される16 EiBの代わりに256 TiBのVASの場合、48ビットのみが実装されます。
ジェイミーハンラハン

0

32ビットプロセッサは最大2 ^ 32個のメモリの個別バイト(約4GB)をアドレス指定できますが、1GBのメモリがあると、1 * 1024 * 1024 * 1024アドレス可能なメモリバイトになります(ただし、おそらく2 ^ 32仮想アドレススペースがあります) )。64ビットCPUは2 ^ 64個の個々のバイトをアドレス指定できますが、ほとんどのシステムはメモリアドレスに48ビットのみを使用して上限を設定していると思います。アドレス可能なバイト2 ^ 48。


1 * 1024 * 1024ではなく1024 * 1024 * 1024を意味しましたか?
ヨハン・スモーハン

32ビットプロセッサは最大2 ^ 32オクテットまたはビットをアドレス指定できますか?確認するだけです。確かに知る必要があるからです。
ヨハンスモーハン

@johan smohan正解、1 * 1024 * 1024 * 1024
AcId

@johan smohan 32ビットプロセッサは、最大2 ^ 32バイトをアドレス指定できます。1バイトは8ビット(1オクテットtビット)
AcId

0

受け入れられた答えは良い説明を与えます。しかし、それが答えだとは思いません。アドレスバスについては何も含まれていません。そして、そのサイズが実際にメモリ制約の主な理由です。たとえば、8080は8ビットプロセッサ(データバスのサイズは8ビット)ですが、16ビットのアドレスバスがあります。2 ^ 16 =(2 ^ 6)*(2 ^ 10)= 64 * 1024バイト= 64KBをアドレス指定できます。

詳細については、「技術履歴」セクション(32ビット)を参照してください。


同意する。16ビットPDP-11の後期モデルには22ビットのアドレスバスがあり(したがって、4 MBのRAMをアドレス指定できる)、HP 1000MXも「16ビット」であり、最終的に16 MBのRAM(24 -ビットアドレス); VAXは32ビットCPUでしたが、30ビットの物理アドレススペースがありましたが、半分はI / Oスペース用に確保され、RAMの制限は512 MBでした。「16ビット」8086、1 MB。「16ビット」80286、16 MB。また、PAEがPentium Proで導入されたとき、32ビットx86は最大64 GBのRAM(24ビットの物理アドレス空間ですが、実際には下位3ビットがCPUから外れることはありません)に対応できました。
ジェイミーハンラハン

-2

私はこの会話で最も基本的な情報が失われると信じているので、ここに私の答えがあります:

「これは32ビットプロセッサです」と言うことは、CPUが一度に理解して操作できる命令サイズまたはコマンドサイズが32ビットであることを意味します。同様に64ビットプロセッサの場合:最大64ビットの命令を処理できます。

これは古い機械式計算機のように考えてください。桁数が非常に多いため、それ以上の数字を入力することはできません。

現在、CPUが使用できるアドレスも同じスペースに収まらなければならないため、32ビットプロセッサの場合、使用するアドレスは最大でも32ビットにしかできません。したがって、ここからアドレスの最大数(つまり、CPUが使用できるRAMの最大量)を簡単に計算できます。

2 ^ 32 = 4294967296(= 4 GB)

または

2 ^ 64 = 18446744073709551616(=もう少し;)

または、おもしろい例として、私の古いCommodore 64には16ビットCPUが搭載されていたため、次のメモリを管理できました。

2 ^ 16 = 65536バイト(= 64 KB)

これは基本的なロジックですが、前述のように、仮想アドレススペース、メモリマッピングなど、この制限を回避する方法があります。


2
32ビットプロセッサと64ビットプロセッサの大きな違いはアドレス範囲です(これは「実際の」よりも仮想アドレス空間に影響します)。プロセッサは非常に多くのトリックを使用するため、多くの場合、実際のデータパスの幅を言うのは困難です。また、命令の長さはプロセッサーの「幅」とはほとんど関係ありません。
ダニエルRヒックス

説明は完全に正しいです。「プロセッサ幅」と言うときに実際のチップの寸法をセンチメートルで表していないと仮定すると、その場合は無関係であると言うのは正しいでしょうが、物理メモリアドレッシングでメモリマッピングテクニック/仮想アドレススペースを間違えています。さらに、あなたが言うことはカーネルの実装により関連しているので、PAE linuxカーネルをチェックしたいかもしれません。
トゥンジャイGöncüoğlu

2
命令の長さは、最新のシステムのプロセッサーの「幅」とはまったく関係がありません。最も関連する値は、レジスタの幅(誤解を招く可能性がありますが)、プロセッサとメモリ間の転送パスの幅、およびメモリアドレスのビットサイズです。しかし、これらの3つの値は非常に簡単に互いに異なる場合があります。
ダニエルRヒックス14

1
@DanielRHicksダニエル・ヒックスは正しい。CPUの「ビット幅」は、必ずしも「命令サイズ、またはコマンドサイズ」とは関係ありません。そのように構築されたCPUがありましたが、今日の汎用プロセッサー(x86 / x64)はその中にはありません。
ジェイミーハンラハン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.