- ベストアンサー
多重処理下のメモリ
一つのメモリ(0番地からMAX番地まで)に複数のプログラムを 置くと、番地はどうなるんですか? 特に、変数の番地やジャンプの命令の飛び先番地が、2つ目以降 のプログラムの場合どうなるんですか? 問題が起きた場合どういった解決方法があるのですか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
模範的には再配置(relocation)という技術を使っているというのが正解ですね。 再配置には、静的再配置と動的再配置があります。前者は、メモリに入れる (ロードする)前に各アドレスの参照部分を修正することで再配置をします。 そのためには、どこでアドレスを参照しているかを別に記録しておく必要があ ります。後者は、すべてのアドレスをPCに対して相対的に参照するようにプロ グラムを構成しておき、アドレスを参照するときにプロセッサが自動的に目的 アドレスを生成することで、再配置を達成します。これらのいずれかが可能な プログラムのことを、再配置可能(relocatable)なプログラムといいます。 ところが、UNIXなんかでは、ロードモジュール本体はいわゆる再配置可能になっ ていません。ほとんどのプログラムは固定の番地にロードされることを前提に 作成されています。近代的なプロセッサはプログラムが利用する論理アドレス を動的にメモリが利用する物理アドレスに変換するような装置を内部または外 部に備えています。プロセスの切替えごとに、そのアドレス変換表をとりかえ れば、マルチプロセッシングが可能というわけです。
その他の回答 (2)
- alfeim
- ベストアンサー率58% (114/195)
x86系CPUではプロテクトモード下ではアドレス変換を使って それぞれのプログラムが独立した連続のアドレス空間下で実行されます 実際にはそれぞれのプログラムの論理アドレス空間事にどの実アドレス空間にマッピングされるかという情報をセットしてあり、CPUがメモリを参照するときにマッピングテーブルを見て実メモリのアドレスを取得し、アクセスします 詳細は参考URLの「はじめて読む485」という本を読んでみてください
- ymmasayan
- ベストアンサー率30% (2593/8599)
オブジェクトプログラムは全部0番地から作られますが、連係編集プログラム(リンケージエディタ) and/or ローダの働きで実際にローディングされるアドレスに従って、プログラムの実行に支障がでないよう処置が採られますのでご安心下さい。変数の番地やジャンプ先の番地も必要が有れば上記のプログラムたちが書き換えてくれます。従って問題は起きないはずです。 この辺の方式はハードやOSとの組み合わせで色々あって簡単には説明できません。書籍の目次で、あまり親切ではありませんが「参考URL」の中で「再配置」というキーワードがその部分です。 なお、普通はメモリーの先頭にOSが入っていますので、先頭のAPも0番地からは入れず、上記の仕組みで再配置されています。
お礼
ありがとうございまっす! ローダとインケージエディタの本を探してみようと思います。
お礼
どうもありがとうございます! とても助かりました!