2017年3月8日水曜日

ガーベジコレクション、その他メモリ配置

平成28年秋季 問16. ガーベジコレクション

問題文「プログラム実行時の主記憶管理に関する記述として適切なものはどれか。」

解答群
ア. 主記憶の空き領域を結合して一つの連続した領域にすることを、可変区画方式という。
イ. プログラムが使用しなくなったヒープ領域を回収して再度使用可能にすることを、ガーベジコレクションという。
ウ. プログラムの実行中に主記憶内でモジュールの格納位置を移動させることを動的リンキングという。
エ. プログラムの実行中に必要になった時点でモジュールをロードすることを、動的再配置という。

正直なところ、正解がイだとわかったのはガーベジコレクションという言葉を聞いたことがあって、なんとなく間違いではないことだけがわかったからで、その他の解答群についてはさっぱり理解していないので調査対象とした。

まずはそれぞれの用語をしっかりと把握してみよう。

今回検索してみて、絵付きで解説してくれているサイトさんでは断トツにわかりやすく、且つ要領を得たサイトがすぐに見つかった。

Geechs Managineさんの「5分で分かるガーベジコレクションの仕組み」である。

実際Javaを勉強しようとして出てきた用語なのでよく覚えているが、C言語などを教えてもらおうとして挫折した頃は、メモリの解放なんかについて説明を受けた記憶がある。

ざっくりまとめてしまうとプログラムが一旦利用したメモリの領域を、自動で開放する仕組み、ということになる。

Javaなどの高級言語以前はプログラムを書くときにメモリの解放を指定する必要があったとかなんとか・・・ 実際にはそこまでどっぷりプログラムの勉強できなかったのでそんなコードを書いた覚えはまるでないがw

後、これは応用情報にはあまり出てこないかもしれないが今後のために覚えておきたいのが「Scavenge GC」と「Full GC」だ。
こちらも上のリンクである程度教えてくれているが、まとめてしまうとヒープ領域と呼ばれるメモリ領域には二つの種類があり、比較的長い間使われる(つまり複数回参照されるような)オブジェクトは「Old領域」それ以外の命が短いオブジェクトは「New領域」に格納される。この「New領域」と呼ばれるところをざっくり掃除してくれるのが「Scavenge GC(Scavengerでハイエナなどの動物、清掃する・不要物を除去するなどの意)」で「Old・New領域」両方を全部掃除するのが「Full GC」ということだ。

何故覚えておきたいかというと、「Full GC」が頻繁に起こるとプログラム処理時間に影響があるから、とだけ書いておきたい。詳しく知りたい方は上記リンクを参照されたい。

次に可変区画方式について、だが、ググった結果を色々見ていると非常に端的に表現してくれているサイトを見つけた。

京都産業大学 大本教授?の平成14年度システムソフトウェア講義資料の「第7章 記憶管理」である。

おそらくは講義に使用するためにパワーポイント的にまとめた資料だと思われるが、非常に端的にかつ的確に要点をまとめてくれているのでわかりやすい。初めて開いた時は何かの冗談かバグかと思ったぐらいだが・・・

で、可変区画方式というのは、メモリを使う場合にプログラムが必要な分量だけ使う方式、ということになるが、もっと言うとプログラムが必要とするメモリのサイズはプログラムによって違うため、どれだけのサイズを指定するか?という問題が出てくる。

この割り当て方法について、プログラムがどのくらい使用するかは「しらんっ これだけ用意したからこれ使えっ( ゚Д゚)」と指定する方式を「固定区画方式」、

「ここに必要な分の領域があるからここを使ってねぇ(*´▽`*)」と指定する方式を「可変区画方式」というらしい。

他のページも時間があるときに(できればサイトがなくならないうちに)見てみたいが、他に試験で使うような内容を書いてくれているサイトもあったので紹介しておきたい。

it-資格.jpというサイトさんの「実記憶管理」である。
どうやら基本情報か応用情報資格試験用のサイトのようで、関連する用語をまとめてくれてはいる、が、全てが有益か?全てがわかりやすいか?という点では疑問がある。

次に、動的リンキングなのだが、この用語についてはなかなかピンポイントで「それが何を意味するか」という答えが出てこなかった。
ググった結果の多くは試験を受ける人を対象にしたもので、非常にざっくりと用語を説明してくれているだけである。

そこで見つけたのは「基本情報処理技術者になってください」というサイトさんの「動的リンキング」というページである。
このサイトさんはおそらく実際に何かのプログラムを作っているような人が書いているサイトなのか、非常にゆるーく、且つわかりやすく実際に怒っているだろうと思われることを例示して書いてくれている。

ただ、書かれている内容がゆるすぎる感じもあったので、英語でも検索してみた。

そこで見つけたのは「Computer Science from the Bottom Up」というサイトさんの「Chapter 9. Dynamic Linking」というページである。

転載させていただくと、
******************************
Each executable contains a reference essentially saying "I need library foo". When the program is loaded, it is up to the system to either check if some other program has already loaded the code for library foo into memory, and thus share it by mapping pages into the executable for that physical memory, or otherwise load the library into memory for the executable.
******************************

ざっくり訳すと
******************************
実行ファイル(プログラム)は「こんなライブラリが必要だよぉ」と言う情報だけ持っていて、そのプログラムが実行されるときにシステム(OS)側が他のプログラムが同じライブラリをメモリ上にロードして(呼び出して)いるかどうかをチェックし、あればその場所をプログラムに教えなければメモリにロードするということをする。
******************************
ということである。(だいぶ意訳しているので疑わしい場合は自分で訳してほしい。)

そして最後に「動的再配置」だが、これも同じくしっかりとした説明を探すのが難しかった。色々とブラウジングしてここで(全部は当然理解できなかったものの)ある程度納得のいく説明を見つけることができた。

宮城教育大学、(なんの授業かはわからないが)「授業のページ」より「オペレーティングシステム第5-2章 主記憶の管理-2-

このページ中、「5.8 動的再配置機能を用いるマルチプログラミング」という項目があり、内容を抜粋すると
******************************
メモリフラグメンテーション問題を解決するには、空き領域を結合してーつの連続した大きな空き領域にすればよい。それには、実行中のプロセスをメモリ内で移動させる必要がある。この処理を、メモリコンパクション、この機能を動的再配置機能という。****(中略)****この動的再配置機能によって、プロセスをメモリにロードするための領域の動的作成、削除、拡大、縮小によって生ずるメモリフラグメンテーションを解決できる。
******************************
そろそろ疲れてきたのでフラグメンテーションについては割愛させてもらうが、メモリのフラグメンテーションが発生した場合に、領域を効率的に使うために利用されるのが動的再配置と呼ばれる機能ということになる。

可変区画方式ではメモリが充分に空いている場所を指定してプログラムを配置するため、フラグメンテーションが発生する。このような場合にメモリを有効利用するため実行中のプログラムが利用しているメモリを別の場所に移動することでメモリの利用率を向上させようというものらしい。

ここまで調べて改めて問題を読み返してみると、「ア.ウ.エ.」については明らかに説明している文章と用語が一致していないのがわかる。。。

というか今日の俺は頑張ったっ( ゚Д゚)

0 件のコメント:

コメントを投稿