• ベストアンサー

SE初心者の質問(メモリ編)

アドレス空間とメモリとは同義なのでしょうか? アドレス空間の説明として、住所(番地)を よく引き合いにだされると思います。 データの場所をアドレスが指定していると いったイメージはわかるのですが、 そもそもデータとは、どこにあるのですか? データがアドレス空間に展開されていて そのアドレスをさしているのですか? それとも、データがメモリ上に展開されていて そのアドレスをさしているのですか? アドレス空間=メモリなのでしょうか? アドレス空間が2GBとは、メモリが2GBといっている? 「1234」といった4byteのデータが、メモリに展開されて そのアドレス(場所)が、アドレス空間に展開される。 (つまり、アドレス空間は目次?)なのでしょうか? すみません素人質問で。お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.9

質問者さんが扱っている汎用機に限れば、そしてOSの開発を行ってるのでなければ、アドレス空間 = 仮想アドレス空間と考えても差し支えないでしょう。 > I/Oとかまで考慮に入れるとイメージが難しいのですが > なにかわかりやすくイメージする方法はないでしょうか? > (ICのピンの話?) CPUの本来のアドレス空間は「物理アドレス空間」です。これはどんなにチープなCPUにも存在します。ICの内部にメモリやI/Oを持っている場合もありますが、基本的にはアドレスバスがそのまま物理アドレス空間の番地を表していると考えて構いません。 アドレスバスというのは、例えば典型的な32ビットのCPUであればA0~A31のアドレスピンの束だと考えてください。このピンで32ビットの番地を表現するのです。 CPUによってはMMU(Memory Management Unit)を備えています。あるいは外付けされています。MMUは、物理アドレス空間を再配置したり、特権モード以外では特定の領域へのアクセスを制限したりします。これが「仮想アドレス空間」です。 再配置するのは、例えば実メモリが512Mバイトしかないのに2Gバイトのメモリを使いたい場合に使用します。 実際にアクセスしている部分に実メモリを再配置し、実メモリが再配置されていないところをアクセスしようとすると、それまで実メモリに格納されていた内容をハードディスク等に退避し、アクセスしようとした場所に空いた実メモリを再配置するわけです。このとき、以前にその領域のデータを退避していたのであれば、その内容を実メモリに戻します。 なお、これはOSがそのような使い方をしているだけであって、CPUの機能そのものではありません。 特権モード以外でのアクセスを制限するのは、例えば一般的なアプリケーションからハードウェアを直接制御したり、OSを破壊したり、並行に稼動している他のアプリケーションを破壊しないようにするためです。 その意味では、仮想アドレス空間を主に使用する環境で、かつ一般的なアプリケーションしか開発しないのであれば(デバイスドライバなどを作らなければ)、アドレス空間 = メモリ領域と考えても、実質的には問題ありません。 ご理解いただくためにかなり詳しく解説しました。分からない用語はなるべく検索した上で再質問してください。

phoenix062
質問者

お礼

ありがとうございます。 かなり理解できました。特権モードなどは、あまり意識しないでも 問題なさそうなので今回はこれ以上掘り下げないです。 IT用語は同一のような言葉で、どちらも普通に使われる言葉が 多くて悩むことがあります。また今回のように、若干ながらも 見方によって違うものもあるので余計に混乱します。 実は、初心者質問「メモリ編2」の質問も予定しているので、 そちらをもし見かけたら、また回答願います。 ありがとうございました。

その他の回答 (8)

  • j_nishiz
  • ベストアンサー率26% (183/697)
回答No.8

またまたNo.1です。 どうやら私が話をはしょり過ぎて、ややこしくしてしまったようですね。 まず、前言撤回します。 >>アドレス空間が2GBとは、メモリが2GBといっている? >アドレス空間2GBのシステムで、実メモリが2GBあれば、ほぼ全てが実メモリ上にありますよね。だからほぼ正解。 これが間違いです。 メモリとアドレス空間は別の物です。 ただ、イメージ上はアドレス空間は全てメモリ上にある物と思ってください。 実際に、あるアドレスが実メモリにあるか、ハードディスク上にあるかはわかりません。それはOSあるいはハードウェアが変換します。 で、アセンブラが分かるなら話は早い。 アセンブルリスト上にある”アドレス”はアドレス空間上のものです。 >つまりソースコードも変数もメモリに展開して アドレスどうし(変数Aのアドレス-変数Bのアドレス= 汎用レジスタ3 みたいな感じ)で実際のデータを 増減させているのだろうと思っています。 この メモリに展開して => アドレス空間に展開して が正解です。 後の部分はまあそんな感じ。 なので、 >多分、主記憶や仮想記憶は、あまり意識してないで というのが正解です。ユーザレベルで意識する必要は無いのです。 あと、 >実際のデータ(ファイルに格納されているデータのこと)も、 アドレス空間に展開されるのでしょうか? ファイルを読む際に、内容を変数領域に読み込みますよね? このときにアドレス空間上に展開される事になります。 というわけで、No.6さんのご指摘の通り >> アドレス空間=仮想アドレス空間で構いません。 >これはちょっと言い過ぎでは? 確かに言いすぎですね。

phoenix062
質問者

お礼

ありがとうございます。 今回の内容は、だいぶ理解できました。 このあたりの話って昔からある機能だと思うのですが どうも社内でも詳しく知っている人(新人にわかりやすく 教えられる人)が少ないのです。 どこの会社でもそうなのか、うちの会社のレベルが低いのか わからないですけど。。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.7

話を難しくしているのは、質問者さんが想定している環境を明確にしていないことにあります。マイコンなのか、PCなのか、スーパーコンピュータなのかも分からない状況ですから漠然とした話になってしまうのです。 汎用機の話でしょうか? それに特化した質問であれば、環境の特徴を補足してください。そうではなく、コンピュータ一般についての基礎的な知識を求めているのであれば、8~16ビットCPUのような簡単なところから入った方が結局は近道です。

phoenix062
質問者

お礼

いつも早い回答をありがとうございます。 回答者さまの内容から環境によって違うということが わかりました。自分の中のイメージ的には汎用機(IBM社:MVS系)を 考えながら話をしていましたが、WindowsもLinuxも概念は 似たようなものだろうと思っていました。 入門書もいくつか見てみましたが、環境による違いなどが 書いてあるものは見受けられませんでしたので… マイコンなどは、実際に見たこともなければ そのような本も見たことないです。 言葉だけ知っているレベルです。 汎用機の環境の特徴ですが、何が明確だと回答しやすいのでしょうか? リンクのイメージでわかりますか? OSの担当ではないので、あまり理解してないのですが… http://www.sa.il24.net/~teitoku/yellow_ibm1.htm

phoenix062
質問者

補足

マイコンについては… 家電に組み込まれているマイコンといった 知識くらいはありますが、あまり意識はしてない といった意味です。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.6

> アドレス空間=仮想アドレス空間で構いません。 これはちょっと言い過ぎでは? MMUのない環境では仮想アドレス空間というのは存在しませんし、数だけでいえば、MMUがない、またはMMUがあっても使用しない環境の方が多数なのですから。

phoenix062
質問者

お礼

いろいろと回答を頂いているのですが 全然イメージが頭に入ってこないのです。 自分で調べようにも、先輩でも回答者様のレベルまで 達していないようで、正確に説明してもらえないです。 絵を書いてみようにも、絵のあるわかりやすい資料を 見つけようにも見つけらることすらできないのです。 つまり、勉強の仕様がないのです。 どうしたらいいでしょうか? 予想以上に、とてつもなく広がりを見せているので 締め切ってポイントをつけることすら出来ない状況です。 (明確にスッキリしてないし)

  • j_nishiz
  • ベストアンサー率26% (183/697)
回答No.5

No.1です。 >3件の回答は、いずれも若干違うものに思えます。 そうですね。でもよく見ると、どれかの回答を否定している物でもないですよね。 回答で言うと、1>2>3>4 と順番に高度な説明になってます。 逆に言うと、1の答えが一番不正確です。(詳細を全部はしょってます、だから「細かいところにはつっこまないように」) 用語で言うと、アドレス空間=仮想アドレス空間で構いません。 あと、アドレス空間を語る上でレジスタの考え方は必須ですが、これは最初は無視してください。 まずアドレス空間が何であるかを分かった上で、アドレス空間でアプリがどうやって動くか、の段階になったときにレジスタの役割を考えればよいです。i/oも同様ですね。 勉強していくに従って、2,3,4の回答の意味が分かってくると思います。

phoenix062
質問者

お礼

もう専門的すぎて混乱の境地です。 実は、少しだけアセンブル(汎用機用)を書けます。 アセンブラリストをみると、ソースコードの横に アドレスが書いてあります。 変数領域にもアドレスが書いてあります。 つまりソースコードも変数もメモリに展開して アドレスどうし(変数Aのアドレス-変数Bのアドレス= 汎用レジスタ3 みたいな感じ)で実際のデータを 増減させているのだろうと思っています。 で、上に書いたメモリをアドレス空間と呼ぶ先輩がいますが これは同義なのでしょうか? 多分、主記憶や仮想記憶は、あまり意識してないで 単にアドレス空間と言っていると思うのですが… それとも、やはり、その2つは同義ではないですよと 言うべきなのでしょうか? I/Oとかまで考慮に入れるとイメージが難しいのですが なにかわかりやすくイメージする方法はないでしょうか? (ICのピンの話?) ところで、さらに初心者質問ですが変数でなく 実際のデータ(ファイルに格納されているデータのこと)も、 アドレス空間に展開されるのでしょうか? アセンブラリストではデータの領域まで書かれないので イメージしづらいのです。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

> CPUのアドレス空間?レジスタのことでしょうか? 汎用レジスタのことをいわれているのであれば違います。 ただし、汎用レジスタにアドレスが割り付けられているアーキテクチャも実在します。 制御レジスタのことであれば、アドレス空間上に割り付けられていることもあれば、通常のアドレス空間とは別のI/Oアドレス空間に割り付けられていることもあります。 仮想メモリ云々は、MMUを搭載している環境に特化した話であり、一般的ではありません。昨今のPCではそれが普通ですが、質問者さんは特に環境を指定されていませんから。(私は4ビットや8ビットのCPUやマイナーなアーキテクチャも視野に入れて回答しています) 通常、(C言語のような比較的低水準のものも含めて)高級言語ではアドレスを指定してアクセスするのはメモリがほとんどですが、メモリをいくら読み書きしても、それだけでは画面に表示することも、キーボードを読み込むことも、ネットワークにつなげることもできません。LEDひとつ点灯させることもできません。必ずハードウェアを制御するためのI/Oが必要であり、アドレス空間にはそうしたI/Oも配置されているのが普通です。(前述したI/Oアドレス空間の場合もあります)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

> アドレス空間とメモリとは同義なのでしょうか? ちょっと違います。 CPUのアドレス空間のことだと思いますが、その場合、CPUが番地を指定可能な全領域のことをアドレス空間といいます。例えば、バイトアドレスを16ビットで表現する場合なら64Kバイト、24ビットで表現するなら16Mバイト、32ビットで表現するなら4Gバイトのアドレス空間があるわけです。 ところが、アドレス空間のうち、メモリが実装されているのは一部だけです。別の場所にはI/Oが実装されていたり、何も実装されていないところもあります。 I/Oのある番地に対して読み書きを行うことで、ハードウェアを制御することができます。例えば、キーボードを読み込んだり、LEDを点灯させたり、タイマの周波数を設定したりできるわけです。 仮想アドレス空間の話はもっとややこしいので、まずは基本から理解することをお勧めします。

phoenix062
質問者

お礼

CPUのアドレス空間?レジスタのことでしょうか? 3人の方の回答がそれぞれ違うので かなり悩んでいます。 多分、1番最初の方の回答が一番正解のような 気がしています(もともとの私の認識に近い)が、 違うのでしょうか?

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.2

Googleイメージ検索( http://images.google.com/ )にて,キーワード「仮想記憶」を検索して,一番目にヒットしたページがこちら。 http://jiten.search.biglobe.ne.jp/j/1d/51/e7/53f0936b9e01620470a337929c178d84.htm このページの図に対応させると,質問者のいうアドレス空間は「仮想アドレス空間(多重仮想空間)」,メモリは「物理メモリ空間」になります。「スワップ領域」は Windowsの場合,隠しファイルの C:\pagefile.sys です。 例えば,実行するために1GBのアドレス空間を確保するソフトウェアがあるとする。ところが,PCに搭載されている実メモリが512MBであってもそのソフトは動作したりするわけです(遅くなりますが)。 (1)プログラムとデータは仮想アドレス空間に展開され,仮想アドレスが割り振られる。 (2)そのうち,実行するある時点において必要なプログラム部分とデータ部分が,実メモリに読み込まれ(物理メモリ空間に展開され),物理アドレスが割り振られる。 (3)実行するある時点において不要となったプログラム部分とデータ部分は,スワップ領域に置かれる。 (3)→(2)の動きをページイン,(2)→(3)の動きをページアウトと呼びます。PCにメモリを多く搭載すると,このやりとりが少なくなるので,サクサクと快適に動作するということになります。

phoenix062
質問者

お礼

仮想アドレス空間+主記憶(物理メモリ)=アドレス空間 という定義ではないでしょうか? また、仮想アドレス?というものはなんでしょうか? 仮想アドレス空間であっても、アドレスはアドレスであるような 気がします。 今回、3者の回答が微妙に違うように思えます。 ネットで調べてもやはりこのように書いてあることが、 若干ずつ違うのでわからなくなるのです。 ※本で調べたくても、その辺を分かりやすく記述している  資料をみたことがない。 どなたの回答が最も正しいのでしょうか? どれも正しいと言われると、余計にわからなくなってしまいます。

  • j_nishiz
  • ベストアンサー率26% (183/697)
回答No.1

元SEでやんす。 >アドレス空間=メモリなのでしょうか? 論理的にはそう考えて構いません。 でないと訳が分からなくなります。 実際には、アドレス空間と実メモリの変換はOSが行います。 >アドレス空間が2GBとは、メモリが2GBといっている? アドレス空間2GBのシステムで、実メモリが2GBあれば、ほぼ全てが実メモリ上にありますよね。だからほぼ正解。 アドレス空間が2GBの時に実メモリが1GBだとすれば、のこり1GBはハードディスク上のどこかにとられます。 とられ方はOSにより違います。スワップファイルになったり、ファイル名を付けてとられたり。 >1234」といった4byteのデータが、メモリに展開されて そのアドレス(場所)が、アドレス空間に展開される。 後半は間違い。アドレスは単なる目次。 アドレスがどこかはOSあるいはアプリが知っている。 すごく話を単純化してますので、細かい所には突っ込まないように。

phoenix062
質問者

お礼

非常にわかりやすい回答ありがとうございました。 と、書かせて頂こうと思っていましたが 3件の回答は、いずれも若干違うものに思えます。 ネットなどで調べてもわからなくなるのは、このためです。 ※本で調べたくても、その辺を分かりやすく記述している  資料をみたことがない。 どなたの回答が最も正しいのでしょうか? どれも正しいと言われると、余計にわからなくなってしまいます。

関連するQ&A