メモリリークとは?スラッシング・断片化・オーバレイとの見分け方
基本情報技術者試験 平成29年度秋期 午前 問16 / ソフトウェア › オペレーティングシステム
過去問にチャレンジ
メモリリークの説明として,適切なものはどれか。
- ア
OSやアプリケーションのバグなどが原因で,動作中に確保した主記憶が解放されないことであり,これが発生すると主記憶中の利用可能な部分が減少する。
- イ
アプリケーションの同時実行数を増やした場合に,主記憶容量が不足し,処理時間のほとんどがページングに費やされ,スループットの極端な低下を招くことである。
- ウ
実行時のプログラム領域の大きさに制限があるときに,必要になったモジュールを主記憶に取り込む手法である。
- エ
主記憶で利用可能な空き領域の総量は足りているのに,主記憶中に不連続で散在しているので,大きなプログラムをロードする領域が確保できないことである。
会話形式の解説
講師今回はメモリリークの意味を問う問題です。選択肢には主記憶管理でよく出る用語の説明が並んでいるので、それぞれが何の用語の説明なのかを言い当てながら読むのがコツです。
受験者メモリが漏れるという言葉の印象から、主記憶が足りなくなる話だろうとは思いました。ただ、ページングが多発して遅くなる説明も、領域が確保できない説明も、どれも主記憶不足に見えて迷いました。
講師そこが迷いやすいところです。判断の基準は「空き領域が減る原因が、確保した領域を解放しないことにあるか」です。この基準に合う選択肢はどれだと思いますか。
受験者動作中に確保した主記憶が解放されず、利用可能な部分が減っていく、という説明だと思います。原因がバグというのも、プログラムの不備という感じがします。
講師そのとおりで、それが正解です。使い終わった領域が戻されないことと、その結果使える容量が減っていくこと、この二つがそろっています。C言語なら、mallocで確保した領域をfreeし忘れるとリークが起こります。
受験者ページングが多発してスループットが極端に落ちる説明は、何という用語でしょうか。これも主記憶が足りない話ですよね。
講師それはスラッシングです。ページングは、主記憶と補助記憶の間でページという単位のデータを入れ替える仕組みのことです。同時実行数が増えて主記憶が足りなくなり、入れ替えに処理時間の大半を取られます。原因は実行するプログラムの量に対して主記憶が足りないことで、解放されない領域があるからではありません。
受験者必要になったモジュールを主記憶に取り込むという説明は、そもそも困った現象の話には見えませんでした。
講師よく気づきました。これはオーバレイ方式という手法で、プログラム領域に制限があるときに主記憶を工夫して使うための方式です。不具合として起こる現象ではないので、メモリリークとは性質が違います。
受験者残りの、空き領域の総量は足りているのに散らばっていて大きなプログラムをロードできない、という説明がいちばん紛らわしいです。確保できない点はリークと同じに見えます。
講師それはフラグメンテーション、つまり断片化です。確認してほしいのは空きの総量です。断片化では総量は足りていて、連続した領域が取れないことが問題です。リークでは空きの総量そのものが減っていきます。
受験者総量が減っているならリーク、総量は足りていて連続した領域だけが取れないなら断片化、ページングに時間を取られて遅くなるならスラッシング、主記憶を工夫して使う手法ならオーバレイ、という見分け方ですね。
講師そのとおりです。補足すると、メモリリークは長時間動かすと、容量不足や処理の失敗、システム停止につながることがあります。結果として領域が確保できなくなる点は断片化と同じなので、結果ではなく原因で区別することを覚えておいてください。
まとめ
メモリリークは、プログラムの不備などで、確保した主記憶が使い終わっても解放されずに残り、使える容量が少しずつ減っていく現象です。主記憶が足りなくなってページングが多発し、性能が極端に落ちる現象はスラッシングと呼ばれます。空きの総量は足りているのに連続した領域が取れない状態はフラグメンテーション(断片化)で、必要なモジュールだけを主記憶に読み込む手法はオーバレイです。リークと断片化はどちらも領域が確保できなくなるので、空きの総量が減っているかどうかで見分けます。
解答・解説
正解はアです
この問題のテーマ
メモリリークの意味を問う問題です。主記憶管理でよく出る用語(スラッシング、オーバレイ、フラグメンテーション)と区別できるかが問われています。
解き方の考え方
各選択肢が説明している現象や手法を、用語に置き換えて考えます。メモリリークで押さえるのは、確保した領域が使い終わっても解放されずに残り、その結果として使える主記憶が減っていくという点です。「空き領域が減る原因が解放されないことにあるか」を基準に選択肢を見ると、残りの3つは別の用語の説明だと分かります。
選択肢ごとの解説
- ○ア OSやアプリケーションのバグなどが原因で,動作中に確保した主記憶が解放されないことであり,これが発生すると主記憶中の利用可能な部分が減少する。アは、バグなどのために動作中に確保した主記憶が解放されず、利用できる部分が減ると説明しています。確保した領域が不要になっても戻されない点と、その結果使える容量が減っていく点の両方がメモリリークの定義に合うので、これが正解です。
- ×イ アプリケーションの同時実行数を増やした場合に,主記憶容量が不足し,処理時間のほとんどがページングに費やされ,スループットの極端な低下を招くことである。イのページング多発の説明は、同時実行数が増えて主記憶が足りなくなり、ページの入れ替えに処理時間の大半を取られてスループットが落ちる現象です。これはスラッシングと呼ばれます。原因は実行するプログラムの量に対して主記憶が不足することで、確保した領域が解放されないことではありません。
- ×ウ 実行時のプログラム領域の大きさに制限があるときに,必要になったモジュールを主記憶に取り込む手法である。ウの、必要になったモジュールを主記憶に取り込むという説明は、プログラム領域に制限があるときに使うオーバレイ方式という手法のことです。不具合として起こる現象ではなく、主記憶を工夫して使うための方式なので、メモリリークとは違います。
- ×エ 主記憶で利用可能な空き領域の総量は足りているのに,主記憶中に不連続で散在しているので,大きなプログラムをロードする領域が確保できないことである。エは、空き領域の合計は足りているのに、ばらばらに散らばっているため大きな連続領域が確保できない状態を説明しています。これはフラグメンテーション(断片化)です。空きの総量そのものが減っていくメモリリークとは、問題になっている点が違います。
補足
メモリリークとフラグメンテーションは、どちらも結果として「領域が確保できない」ことがあるため混同しやすい用語です。空きの総量が減っているならリーク、総量は足りていて連続した領域だけが取れないなら断片化、と見分けるとよいでしょう。たとえばC言語では、mallocで確保した領域をfreeし忘れるとリークが起こります。
POINT
- メモリリークは、確保した主記憶が解放されないまま残り、使える容量が少しずつ減っていく現象です。
- 主な原因はメモリの解放忘れなどプログラムの不備で、長時間動かすと容量不足や処理の失敗、システム停止につながることがあります。
- 主記憶が不足してページングが多発し、性能が極端に落ちる現象はスラッシングです。
- 空きの総量は足りているのに連続した領域が取れない状態はフラグメンテーションで、必要なモジュールだけを主記憶に読み込む手法はオーバレイです。
