Category 2_9. メモリ管理 〜スワップ処理〜

「私のデスクトップの壁紙はイケメンにしている。

おっと、これは反射している私の顔だった」

〜 クプ・ド・ンドブヴァ 〜

あれ・・・どゆことだ(ぶつぶつ

どういう事っすかねぇ。

 

いや、この前の話なんだけどよ・・・。

やはり、エロがインターネットを普及させたっていう点がどうも納得いかないんすよ!
はい?

 

ちっげぇだろ、ぼけっ!

仮想メモリ空間の話だっ!

ぁ・・・そうっした。

仮想メモリ空間をプロセス毎に生成して、それを個々のプロセスが占有するっていうのはわかるんすけどね。

仮想メモリ空間の大きさって、物理メモリ空間と同じってマスターいったじゃないっすか?

はい、いいましたね。

疑問に思うところは分かりました。

というのも、そういう疑問を持つよう仕向けたんですが。

 

じゃあ、聞くがよ。

物理メモリが4Gあったら、仮想メモリ空間も4Gって事だろ?

仮想メモリが沢山出来たら、物理メモリのリソースが絶対に足りないと思うんだけどよ。

というか、一個しか仮想メモリ空間作れないんじゃないっすか?
全てのプロセスが、仮想メモリ空間のリソースをそれだけ使えば当然そうなりますね。

 

うん・・・?なんか引っかかる言い方だな。

つまり、どういう事だってばよ?

物理的に搭載されているメモリは当然、物理メモリに依存します。

当然、仮想化してもそれ以上のメモリリソースを使うことは出来ないという事ですよ。

プロセスに対してはあくまでもこれだけのメモリ空間が使えますよっと見せかけても、実際はそこまでメモリ空間を利用できるわけじゃないです。

というよりも、一つのプロセスがそこまでメモリを消費する事もありえないですがね。

 

なんだ・・・ということはだな。

4Gの仮想メモリ空間をプロセスに与えたとしても、それは見せ掛けであって全部使えるわけではないって事か?

なんだそれ!詐欺っすねっ!!

ですから先程も言ったとおり、仮想メモリ空間を全て使うプロセスなんてそうは無いんですよ。

それと、4Gの仮想メモリ空間と言いましたがシステム上その4G全てをプロセスが使用できるわけではありません。

 

うん・・・?

前回の話だと、仮想メモリ空間はプロセス単位に独立して割り当てるみたいなこと言ってただろ?

駐車場を占有して使っていいと言っておきながら、実は全部用意しているわけもなく、一区画はしかも利用できない事に加え、さらにその上、妄想上の駐車場だと抜かすこと、下衆の極み

ひどい言われようですね・・・。

CPUアーキテクチャによって仮想メモリ空間の最大値は変わってきます。

IA32のCPUの場合は、4Gが最大値です。

この仮想メモリ空間は実はさらに二つの空間に分けられるんです。

 

なるほど。

二つのうち一つの空間がプロセス用って事だろ?

空間の中に空間っすか?

仮想メモリ空間は、「プロセス(ユーザ)空間」と「カーネル空間」によって構成されています。

意味は分かりますか・・・?

[pic_cat2_9_1 プロセス空間とカーネル空間]

 

カーネル・・・そうか。

全ての仮想メモリ空間にはカーネルが収められている領域が用意されていて、全てのプロセスと同居するのか。

ははぁ・・・しかしなんでっすかね?

プロセスは独立されたメモリ空間に収容されています。

つまり、プロセスにとって完全に一人ぼっちなんですよ。

一人ぼっちを想像してみてくださいよ。

 

さみしいな。

さみしいっすね。話し相手がほしいっす。

プロセスさん、かわいそうっす。

でしょ?かわいそうでしょ?

他のプロセスさんとお話したくても違う世界にいるのだから声は届かないんですよ。

でも、そこにカーネルさんが一人いて御覧なさい。

 

なんか、すごく安心するな。

フライドチキンとか食べ放題っすかね。

うるさい黙れ

実際は、プロセスが孤独だろうがなんだろうが知ったこっちゃありません。

プロセスはカーネルの上で動作するものでしょ?プロセスとは、プログラムの事ですよ?もっと言えばアプリケーションの事です!

 

そうだった・・・。

プロセスはカーネルから機能を提供してもらっているんだったな。

ははぁ、プロセスとカーネルはお互いでお話できないといけないんすねぇ。

そういう事です。

カーネルはプロセスに対して「通信」をする必要があります。その為には同じメモリ空間にいる事が条件でもあるんです。

(プロセスからはカーネルに対して同じ空間であっても、セキュリティレベルにより直接アクセスできません。詳細は補講にて)

 

あぁ・・・やっとわかったぜ。

そういえば以前、プロセス同士はお互いに干渉出来ず、資源も共有出来ないって言ってたな。

異なるメモリ空間のプロセスと通信するには・・・えっと。

プロセス間通信・・・っすか?

M君から答えが出るとは思っても見なかったです・・・。

メモリ空間が異なるプロセス同士、通信を行うには「プロセス間通信(IPC)」という機構を使う必要があります。

IPCには実に沢山の方法がありますが、何かしらの処理が発生するので同空間内のアクセスより当然遅くなるんですよ。

 

ふーむ・・・新しい用語が沢山出てきたなぁ。

メモメモ・・・。

っと・・・随分とお話がそれてしまいました。

まぁ、仮想メモリ空間にはプロセス空間とカーネル空間が同居しているという事です。覚えておきましょうね。

 

うぬぅ・・・。

でも、なんかこう納得いかないっすね。

オイラが駐車場を借りている立場だったとしたら、多分管理人を訴えるレベルっすよ。

訴えられては困りますので、もう一つメモリ管理の機能をお話しておきましょうか。

 

・・・なんだ、まだ続くのか。

てっきり、プロセス空間とカーネル空間のお話だけかと思ってたっす。

タイトルを御覧なさい・・・。

それにお二人ともまだ納得してないじゃないですか。そこをしっかりと解消をするのが私の役目ですよ。

 

タイトルタイトルっと・・・「スワップ処理」?

スワップ・・・ちょっと前に聞いたっすね。

えっと、確か意味は・・・?

M君の頭のその、「揮発性」はどうにかなりませんかね。

スワップというのは「交換」という意味です。

 

確か、メモリ上のデータと補助記憶装置上のデータを交換するとか言ってたな。

あぁ、そこで確かオイラが「気を使って」質問したら、軽くスルーされた奴っすね。

・・・すみませんでした。

本日はしっかりとお話をしておきます。

 

(Mのやつ、天然で言ってるのか・・・よく真顔でそんなズカズカといえるな

いや、別に気にしてはないんすけどね〜。

ご存知の通り、メモリと補助記憶装置ではメモリのほうがアクセス速度が速いです。

 

んだな。だからプログラムの実行時は、データを一通りメモリ上にロードしてからCPUに渡しているだもんな。

もう常識っすね!

いいでしょう。

先程、メモリ空間のリソース不足が話しとしてあがりましたが、実はその問題を有る程度解消してくれるのがこのスワップ処理です。

 

ほほぉ・・・。リソース不足の解消か。

なんすか・・・もしかして補助記憶領域をメモリみたいにして使うとかいうオチじゃないっすよね?
M君、大当たり〜♪

 

うそつけ・・・。

それは本末転倒じゃないか。

だから適当なことを言った時に限って当たるこの設定をどうにかしてほしいっす・・・。

ウソじゃないですよ。

お二人とも経験あるんじゃないですか?

作業台が資料で埋まってしまって、仕方なく引き出しを開けてその上に資料を広げる・・・みたいな経験。

 

あぁぁ・・・あるあr・・・ねーよっ!

あ、あるっす・・・。

M君あるんですか・・・。それこそ適当にいったのに。

まぁ、スワップ処理はあくまでも最終手段だと思ってください。

当然、補助記憶装置上をメモリとして使うのですからアクセス速度は遅くなります。

 

最終手段か・・・まぁわからんでもないがな。

でも、アクセス速度が遅くなるっていうのはいただけないっすね。

まぁM君のいう事もごもっともですね。

なのでそこを解消しようと、カーネルによってスワップ処理の仕組みが異なるんですよ。

 

ほぉ・・・それは少し興味あるな。

興味あるっすかね・・・?

メモリリソースの残りが減ってきたら、データを一時的に補助記憶装置・・・ここでは主流のHDD(ハードディスク)にしましょう。ハードディスク上に「あるデータ」を退避させます。これを「スワップアウト」といいます。

[pic_cat2_9_2 スワップアウト]

 

あるデータ」ってなんだ。

なんでもいいんすか?

なんでも良いわけなかろう・・・。

「あるデータ」というのはいろいろあります。

例えば、

 1)ロードされてから更新が全くされていない

 2)ロードされてからアクセスが少ない

 3)実用性の無いデータ(一時ファイルなど)

が考えられます。ここら辺はOSによって異なるところでもあります。

ちなみに、カーネル空間はスワップアウトされません。

 

そりゃそうか。

アクセスが頻繁にあるデータをHDDに退避させたら遅くなるもんな。

いろいろ考えてるんすねー。

スワップアウトされたデータがあったメモリの場所には、緊急性の高いデータが割り当てられます。

当然、それらスワップアウトされた情報や新しく割り当てられたデータ情報、それらのアドレスに関してはしっかりと管理しています。

 

スワップアウトされたデータはどうなるんだ?

そのまま終わり?

いえ、メモリリソースに余裕が出来た時やそのデータが必要とされるまでそのまま退避してます。

もし、プロセスがスワップアウトされたデータに対してアクセス要求をしてきたら、メモリ管理はスワップアウト先のHDDからデータをメモリ上に移動してきます。移動した上で、ページテーブルにその情報書き換え、プロセスに渡します。

 

なんだ、直接HDDにアクセスするわけじゃないのか。

やはりデータを一度メモリ上に戻すんすねぇ。

そうですね。スワップアウトしたデータをメモリ上に戻すことを「スワップイン」といいます。

これら、スワップ処理はプロセス側からは全く見えません。

つまりユーザ側も意識する必要が無く、カーネルが自動的にやってくれるんです。

[pic_cat2_9_3 スワップイン]

 

なるほどなぁ。

HDDの部分にメモリ空間を拡張するっていうわけじゃないんだな。

じゃあ、引き出しの上で作業をするっていう例えは厳密にいうと違うんすね・・・。
違いますよ、だから適当っていったじゃないですか。

 

しかし、スワップ処理がある事で随分とすっきりしてきたんじゃねぇか?
そうっすねぇ、安心したっす。
ですが、このスワップ処理には一つ落とし穴があります。

 

・・・なんだまだあるのかよ。

そろそろフィナーレかと思ってたっす。

補助記憶装置のスワップ領域は、ユーザが自由に決めることが出来ます。

OSによっては、Linuxのようにパーティションドライブ一つを丸々スワップ領域にさせることも出来ます。

Windowsでは、スワップ領域をファイルで実現させることで、好きなところへ保存できるなど融通が利きます。

 

それらのどこが落とし穴なんだ?

言いたいことがさっぱりっす。

メモリリソースは当然多ければ多いだけいいのですが、それがスワップ領域になると話は別です。

スワップ領域が多ければ多いだけ、メモリ管理が調子こいて沢山スワップ処理を行ってしまいます。

 

んが?いいんじゃねぇか?別に。

スワップ領域が多ければ多いだけそれだけ、実質メモリリソースを沢山使えることになるじゃねえか。

言いたいことがさっぱりっす。(二度目っす

スワップ処理はアクセスの遅い補助記憶装置が関係してくるので、どうしても処理そのものに時間がかかるんです。

ましてや、それらが頻繁に発生する事で「スラッシング」が発生します。

スラッシングとは、スワップアウトやスワップインなどのスワップ処理によって発生する遅延です。

 

なるほど・・・。

メモリ管理側としては、出来ればスワップ処理を行わず自分の空間だけで処理したいもんな。

ははぁ・・・言いたいことがわかってきたっす。

なので、ユーザが自由にスワップ領域を決めることが出来るといっても、あまり多くしすぎないほうが懸命なんですよ。

一般的には物理メモリの2倍を目安としていますが。

 

2倍か。わかった、覚えておこう。

結構大事な目安っすね。

言いたいことはまだありますが・・・それは補講で。

今日は少し長くなりましたね。

 

まさかの1万超えとかはやめてほしいな。

はは!まっさかぁ。
本日のお会計は9430円になります。

 

ぎゃー!

あぶないっすよっ!何気合入れて沢山しゃべっちゃってるんすか!マスター!

話しすぎて、少々のどが渇きましたよ。

財布は潤いましたがねぇ。

 

うまくない、うまくないよ!

全然うまくないっす・・・。
では、次回のお越しをお待ちしております。

 

今日のポイント

 ・メモリ空間は、「プロセス空間」と「カーネル空間」によって構成される

 ・スワップ処理によって、補助記憶装置にデータを一時退避させ、メモリリソースを大きくしている

 ・補助記憶装置にデータを退避させることをスワップアウトという

 ・メモリ上にデータを戻すことをスワップインという

 ・スワップ処理が頻繁に発生し、全体の処理が遅延する事をスラッシングという

前回へ TOPへ 次回へ

Copyright since 2010 IT Category Project All rights reserved.
inserted by FC2 system