本記事は、Linuxの仕組みを読んで学んだことを
アウトプットするために作成しています。
記事全体は、5分程度で読むことが可能です。
前回の記事からの続きになるのでカーネルの基本理念については下記を参照ください。
【Linuxの仕組み①】SEこそ知っておきたい「カーネル」の役割と基本理念 | 技術ブログ倉庫
カーネルのメモリ管理システムについて
カーネルには、メモリ管理システムがそなわっています。
名前の通りメモリを管理してくれます。
freeコマンドで、メモリ関連情報を取得できるので実際にたたいてください。
コマンドの意味については本記事の説明と乖離するので項目の解説は省きます。
プロセスを実行すると値が変わるので、動いているんだなあ、程度で大丈夫です。
メモリがOOM(OutOfMemory)時のプロセス強制削除という機能があり、OOM killerといいます。
メモリが足りなくなった際に起こる現象のことです。dmesgで確認することができます。
プロセスが何の前触れもなく終了した際は、ここを見ることによってプロセスがkillされているかを確認しましょう。
また、メモリがあるのにOOM killerが動く場合はメモリリークが起きている可能性も考慮すること
下記わかりやすくまとめてくださっている著者のページを引用させていただきます。
LinuxにおけるOOM発生時の挙動
仮想記憶の重要性(カーネル管理)
仮想記憶の重要性(カーネル管理)
仮想記憶がない場合は、メモリのアドレスを完全に指定するのでデータが壊れる。メモリが断片化して効率良く使えない。などがおこります。
なので、仮想記憶は直接アクセスさせるのではなく、仮想アドレスを用いて間接的にアクセスさせています。
実際のメモリのアドレスを物理アドレスといい、アクセス可能な領域をアドレス空間といいます。
ページテーブルについて
仮想記憶の管理方法の一つのページフォールトを紹介します。
ページフォールトとは、物理アドレスにデータがないのに、仮想記憶内でアドレスを保持した状況で、実際に物理アドレスと照合した際にデータを渡す時の動作をいいます。
マルチプロセスは別プロセス同士が参照しあえないなど制限が設けられるそうです。
そのため不正なマッピング値に格納などが防がれているそうです。
※ここら辺は、詳しい方の記事を参照いただけると幸いです。
MeltDownの脆弱性の恐怖について
※ここは要学習課題です。
簡単に言うと、仮想記憶にマッピングをしているとメモリに対して、不正アクセスがきたとしても仮想記憶を参照することで、実アドレスを見ることはできない。といったものなんですが最近では仮想記憶のアドレスを貫通して実アドレスを身に行けるウイルスがあるようなんです、
これはカーネル開発者はどう対応しているのでしょうか・・・?
メモリ割り当てのシステムコール
Linuxでは、メモリ領域の割り当てには、mmap()システムコールがあります。
mmap システムコールは、ファイルをメモリにマップするためのもので、
メモリ操作でファイルコンテンツを変更でき、システムコールや入出力操作を回避できます。
ディスクへの変更を同期し、データが失われる可能性のあるプロセスのハングを防ぐそうです。
また、read() や write() といったシステムコールを何度も呼ばずに、メモリ操作(ポインタ操作)だけでファイルの中身を読み書きすることによってmmap()システムコールは高速なんです。
便利な管理機能について
・デマンドページングについて
プログラムが「1GBのメモリをください」と言ったとき、カーネルはすぐには物理メモリ(RAM)を渡しません。これが デマンドページング(要求時ページング) です。
利点は、確保しただけで使われないメモリを節約でき、プログラムの起動も早くなります。
・階層型ページテーブルについて
仮想アドレス(プログラムが見る住所)を物理アドレス(実際のメモリの住所)に変換する「地図」がページテーブルです。
・ヒュージページについて
一言でいうと、大きくページングを取得して、ページテーブルのエントリ数を減らす仕組みです。
また、トランスペアレントヒュージページとうい機能がLinuxにはあり管理者によって選択が可能でみたいです、Ubunts.20.04では無効になっていました。
機能面は、自動的にヒュージページを作成するといった内容だが特定の条件がそろっていないとヒュージページが解体されるため、解体時に性能が下がる傾向があるようです。
ですので、設計者はよく考えて設計しないとですね。
まとめ
今回も読んでいただきありがとうございました。
次回は、「Linuxの仕組み①&②」を交えてプロセスの高速化について
解説をしていきたいと思います!是非そちらも参照ください。


コメント