• ベストアンサー

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

  • メモリ3枚や4枚でのデュアルチャンネルについて

     デュアルチャンネルは同じメーカーと仕様のメモリを2枚1組で使用し、データ転送帯域をおよそ2倍に高速化する技術ですが、3枚や4枚の場合だとどうなるんですか?  3枚の時は3倍、4枚の時は4倍といった風に、なるのでしょうか? あと、速度や容量を揃えないと不安定になると書いてあったのですが、それだと例えば、メモリスロット4つの32bitのOSのPCでは1GB×4じゃないと安定しないってことになります。 しかし、32bit OSでは、仮想メモリ空間が4GBであるため、カーネル空間の1GBを除くとユーザーが利用できるメモリ空間は3GBまでとなります。 となると1GB無駄になってしまいますよね? かといって3GBにすると1GBのメモリ×2と512MBのメモリ×2で容量が違うので不安定になります。  さらに、1GBのメモリ×3だと3倍にまでしかデータ転送領域が高速化しないことになります。(あくまでも3枚で3倍とかが正しかった場合ですが・・・)  では実質4倍でメモリ3GBっていうのは不可能ってことなのでしょうか? 凄く間違ったことを言っているのかもしれませんが、どなたか分かる方いらっしゃいましたら教えてください。 よろしくお願いします。

  • メモリについて

    メモリアドレスの説明の時に、1byteは8bitと、1つの番地を示す時に 00000000~FFFFFFFFなどの表が使われてますが、 1bitって0,1の2つまでなのに、それぞれの桁にF(0~15)までの値が入れられるのがわかりません。 各桁(1bit)の中も4つに区切られているのですか? 頓珍漢な質問かもしれませんが、よろしくお願いします。

  • 32bitOSで4GBメモリを使用できない理由

    こんにちは。いつもお世話になっています。 Windows XPやVistaの32bit版はメモリスロットに計4GBのメモリを挿しても3GBと少ししか認識しませんよね。 その原因が「アドレス空間」が関係しているというのを見たことがあるのですが、そもそもアドレス空間とは何のことですか?この空間がメモリの認識にどう影響を与えているのか知りたいです。また、何故同じ32bitOSでもそれぞれのPC環境によって認識できる容量に差が出てくるのでしょうか?64bit版ではどこがどう変わって128GB(Vista Business以上)ものメモリを認識できるのでしょうか? たくさん質問してしまって申し訳ありません。 検索してみたのですが少し難しく、私には理解できませんでした。 お時間のあるときでかまいませんので、ご回答よろしくお願いします。

  • ThinkPad X201のメモリ

    TinkPadX201ですが、メモリが2GB×2式搭載されています。 メモリを増設したいのですが、諸元では、8GBまで搭載できるようになっています。  増設するために、メモリスロットにあるメモリは捨てる覚悟です。 メモリスロットが2つあるので、4GB×2、つまり、1つのスロットには4GBまでしか搭載できないのか?とも思っていますが、 当時、4GBのメモリしかなかったが、今は8GBのメモリもあり、1スロットに8GBのメモリ(2つで16GB)を搭載できないのでしょうか? BIOSの制限でしょうか? 64Bitのアドレスバス幅/データバス幅はあるのでしょうから、アドレス空間を8GBに制限する理由はないように思いますが、・・・。

  • 32ビットCPUのメモリについて

    32ビットCPUの場合、アドレス空間の制限で1プロセスにつき4GBまでしか使用できないことになっていると思いますが、このうち2GBはシステム用、その他2GBがアプリケーション用と聞いたことがあります。1プロセスで使用する度にOSに2GBほどのメモリを使用することがあるのでしょうか?(プロセスが多くなる度にOSで使用されるメモリ量も増大すると考えてよろしいでしょうか?)

  • 仮想メモリ

    16ビットの仮想アドレス空間を持つ場合のページング処理について考える。 ページテーブルサイズを8とする。 主記憶の実ページ(物理ページ)の大きさを求めよ。 という問題がわかりません。 仮想メモリについて理解できてきないのだと考え色々調べましたがよくわからなかったです。 仮想アドレス空間と主記憶上の実ページの関係が上手くイメージできないです。 どなたか答えと解説をお願いします。

  • メモリをアドレスを直接指定して値を取得するには

    マイコンのプログラムを書いております。 やりたい事はC言語でフラッシュメモリの物理アドレスを直接指定してそのアドレスの値を1バイト読むことです。例えば0xF000番地のアドレスから1バイト読む場合、以下のソースコードで問題ありますでしょうか?なおアドレスは2バイトで表現されます。 unsigned char *p_value; unsigned char value; p_value=&value; p_value=0xF000; この時点で変数valueには0xF000番地の値が正確に代入されてますでしょうか? よろしくお願いします。

  • メインメモリについて質問をさせていただきます。

    こんばんは、早速ですが質問します。 尚、高校生のため専門的な解説や用語など砕いていただけたらと思います。 【http://h50146.www5.hp.com/info/newsroom/pr/fy2007/pdfs/fy07-062_v7000.pdf】 品型RN620AV-ABJ v7080jp メモリ512*2本 CPU core2 @1.8GHz グラボ GeForce7600GS 504MB 自分は、512*2本 メモリの確認はわからないのでしてませんが; とりあえず容量だけいえば、この2本を差し込んでいます。 上記のURLのデータを見る限り ============================== メモリ容量(最大容量)512MB(512MB×1)/1GB(512MB×2)/1GB(1GB×1)/2GB(1GB×2)/4GB(1GB×4) PC2-5300(667MHz)(最大4GB) メモリスロット※3 4DIMMソケット(1ソケット、 2ソケットまたは4ソケット占有済み)/DDR2 SDRAM(240ピンDIMM) ※3 増設は1枚単位で可能ですが、デュアルチャネル構成でパフォーマンスを最適化するためには メモリスロットの各チャネルの合計容量が同一になるように増設することをお薦めします。 ============================== を読んだ限り、これがいいのかな? と思っています。 【http://kakaku.com/item/05209011957/】 予定としては、2GBを買い512MBの2本を継続しようと思ってます。 しかし2CPUなら、メモリの容量の差は小さいほうが 安定しやすいとかなんとかデータに書いてあり悩んでいます。 一応自分の選択するメモリは間違ってはいませんか? 何分素人なので、もし違ってたら悲しいですし。 できればお店は値がはるのでネットがいいのです。 回答、アドバイスよろしくお願いします。

  • LCDに表示するためのフォントデータ

    マイコンでLCDに文字を表示するようなプログラムを作成しています。 現在使用している基板のアドレス0x400000番地から0x480000番地のフラッシュROMの空間に文字コード順に並んだフォントのドットデータが入っているそうで、文字コードを指定して、そのメモリからデータを引き出して、LCDに表示できるようになっています。 このフォントデータは1文字ごとに24バイトのデータとなっていることがわかりました。 なので、21,845文字程度のデータが入っていて表示することが可能のようです。 このようなフォントデータというのはネット上でフリーでダウンロードできるものとかありますでしょうか? またこのような文字のどっとデータをバイナリとしてダウンロードすることが可能なサイトなどご存じでしたら、是非教えて頂きますようお願い致します。 どうぞ、よろしくお願い致します。

  • メインメモリについての酷く拙い愚問です。

    メインメモリから各アプリケーションへ割り当てられ得るアドレス空間の場所は、何らかの基準で先に予約されているのでしょうか? 私は入門者に留まっていますから、質問の内容に誤りが含まれているのかも知れませんが、諒察を宜しく御願い申し上げます。

このQ&Aのポイント
  • エラーメッセージ「1403: プリントヘッドの種類が違います。」が表示されています。このエラーは、プリントヘッドが正しく装着されていない場合に発生します。
  • プリントヘッドの種類が違うため、印刷ができないエラーメッセージ「1403」が表示されます。
  • このエラーメッセージが表示された場合、修理が必要です。正しいプリントヘッドを装着するために、修理依頼をする必要があります。
回答を見る