# Chapter9-4 「実記憶管理」 ## 5/14(金) ###### tags:`基本情報技術` さつき * プログラムを主記憶上にロードして実行する。 このとき、割り当てがへっぽこだと、主記憶の容量を十分に活用できない これを綺麗に割り当てるのが、実記憶管理。 なまえが相応でない。 * 固定区画方式 * パーティション!!!最初に固定で区切ってしまう。 * 単一...ひとつのプログラムしかロードできない * 多重...区画ごとにプログラムをロードできる。区画のサイズが均等である必要もない。 * 可変区画方式 * プログラムをロードするタイミングで、必要なサイズに区切る * 区画内に余剰スペースは生じないので、固定区画方式よりも主記憶装置の効率はよくなる。 * フラグメンテーションとメモリコンパクション * 可変区画方式にもデメリットはある。。必ずしも詰め込んだ順番に、プログラムが終了するとは限らない。 * 絵で見るとわかりやすい。飛び飛びでプログラムが終了すると、空き容量もとびとびになる。 * まだ終わっていないプログラムをぎゅっとひとつの領域にしてやると、飛び飛びの空き容量が合体する。 * オーバーレイ方式 * ロードするプログラムを、そもそも分割する。 * 機能に応じて、分割したプログラムそれぞれを実行する。 * スワッピング方式 * 割り込みが発生した場合、現在実行中のものを一旦中断させて、切り替えを行うが、割り込みロードできる場所がないこともある。 * このとき、優先順位の低いプログラムを、一旦補助記憶装置に退避させて、空き容量を作る。これをスワップアウトという。 * 退避させたプログラムを再び実行するときは、補助記憶装置から呼び戻し、中断箇所から再開する。これをスワップインという。 * スワッピングが発生すると、処理速度が一気に低下する。 * 過去問: * 問1:OK * [5分でわかるガベージコレクションのしくみ](https://geechs-job.com/tips/details/35) >掃除のおばちゃんに例える。 >ガベージコレクションがないときは、プログラマーがメモリ管理のコードを書いていた。 >今でもC言語などは、メモリ管理のコードを書く。 * ヒープ領域(下記引用は、上記リンクと同じ記事から) >「あるプログラムが使用できるメモリ領域」のこと > オブジェクトをできるだけ使いまわさない→オブジェクトの寿命が長くなるため、old領域に割り当てられる可能性が高くなる。 > そうなると、FullGCが発生する可能性が高くなる。→処理がめちゃ遅くなるので、避けなければならない。 > 新しいオブジェクトを大量に使用する場合は、New領域を大きめに取る。 > なんかオブジェクト指向の本で読んだ気がする。。 * 問2:日本語がむずかし。。OK にわ: - 読み込み * マルチプログラミング環境では、主記憶上に複数プログラムがロードされる。 * 限られた主記憶空間を効率よく使えるようプログラムに割り当てるのが実記憶管理。 * 割り当て方 * 固定区間方式:固定長の区画を設けて、そこにプログラムを読み込む管理方式。単純なので簡単だが、余りスペースが使えなかったりと主記憶の利用効率は良くない * 単一区画方式ひとつのプログラムしかロードできない * 多重区画方式:あらかじめ決めたサイズに分割した複数の区画ごとにプログラムをロードできる * 可変区画方式:プログラムをロードするタイミングで必要なサイズに区切る管理方式。 * フラグメンテーションとメモリコンパクション * 可変区画方式では、必ずしも詰め込んだ順番にプログラムが終了するとは限らない。早く終わったのが飛び飛びだと、空き容量が細切れになる。=「フラグメンテーション(断片化)」 * これを解消するため、ロードされているプログラムを再配置する。この操作を「メモリコンパクション」「ガベージコレクション」という。 * オーバーレイ方式:プログラムをセグメントという単位に分割しておき、その時必要なセグメントだけを主記憶上にロードして実行する。 * スワッピング方式 * 優先度の高いプログラムによる割込みが発生した場合、今実行中のものを一旦中断させて切り替えを行う。 * この時優先度が低いプログラムが使っていた主記憶領域の内容を、一旦補助記憶装置に丸ごと退避させる。=「スワップアウト」 * 退避させたプログラムを再開させる場合は、主記憶へロードしなおして中断箇所から処理再開する。=「スワップイン」 * スワップアウト+スワップイン が、スワッピング。補助記憶装置へアクセスするので処理速度が極端に低下する。 - 過去問 * 問1:OK * 問2:若干文章がわかりづらい・・・wけどOK ちさと: * 実記憶管理 * プログラムがロードされる主記憶装置内を、効率よく使えるようする役割をもつ * 方式 * 固定区画方式 * 固定の区画(パーティション)にプログラムを読み込む * 単一区画:プログラムひとつだけロード! * 多重区画:複数に分割した区画ごとにロード! * 分けると余った分は使用できない=利用効率あんまり良くない * けど処理は早い! * 可変区画方式 * 固定の区画にせず、ロードするタイミングでプログラムの大きさに合わせて区切る=区画が余ったりしない=利用効率ヨシ * が、問題もある↓ * フラグメンテーションとメモリコンパクション * 可変だと隙間なくプログラムを実行できるが、必ず詰め込んだ順番に処理してくれるとは限らない * 細切れに処理が終了して、隙間があく。この隙間がプログラム実行に足りるサイズでも連続した状態で確保できない * これを、フラグメンテーション(断片化)という * フラグメンテーションを解消するために、隙間をなくすようにプログラムを再配置。連続したひとつのスペースを作る。 * これを、メモリコンパクション or ガーベジコレクションという * オーバーレイ方式 * そもそも実行したいプログラムのサイズが主記憶の容量を超えてたら、ロードのしようがない * これを可能にするのがオーバーレイ方式! * プログラムを「セグメント」という単位に分けて、必要なセグメントだけをロードする >技術の進化により利用可能な物理メモリの容量やアドレス空間が拡大され、更にはメモリの仮想記憶管理の技術(参照Wikipedia)が一般化されることによって、オーバーレイ方式は使われなくなってきたようですね * スワッピング方式 * 優先度の高いプログラムが割り込んだときに空き容量を作る * 優先度の低いプログラムを補助記憶装置に退避させる(スワップアウト) * 退避させたプログラムを主記憶装置にもどす(スワップイン) * 低速な補助記憶装置へアクセスすることで処理スピードは落ちる * 過去問 * 問1:ガーベジ!ゴミってことか〜 * 問2:まどろっこしい言い方だ…
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up