やかんです。
以前ファイルシステムのAPIについてブログでも復習しました。
こちらの記事になります。
で、問題はmmapについての理解です。多分一朝一夕に理解できるものではないとは思うんですが、それでも少しでも深く理解していきたいと言うことで、今回はこいつに焦点を当てて復習していこうと思います。
mmap apiについて
APIの基本的な使い方等は前提として進めます。適宜、こちらの記事を参照してください。
mmapについてQA
mmapについて生じた僕の疑問を題材に、それに対して色々調べながら答えていこうという試みです。
1. mmapは二次記憶のファイルとプロセスの論理アドレスを直接に対応づける、で合ってる?
合ってる。
2. 「1」を踏まえるなら、mmapが使用された場合は「プロセスの論理アドレスと二次記憶のアドレス」の対応表と「プロセスの論理アドレスと物理メモリのアドレス」の対応表、2つの対応表が必要になるということ?
合ってそう。mmapにおいては、2つの対応表が登場する。
- プロセスの論理アドレスと物理メモリアドレスの対応
- →いわゆるページテーブル。OSによって管理され、実際の写像はCPU内部でMMUによって行われる。
- 二次記憶のファイルと論理アドレスの対応
- →OSによって管理される。特定の名前があるのかは知らない。
3. 物理メモリの話題に関連して、いわゆる「カーネル領域」は物理メモリに確保されているの?
まず、「領域」には少なくとも2種類あると。
1つ目は、アプリケーションが実行される「ユーザー空間」。基本的に「プロセス空間」と言った場合はこちらを指すんだろうな。
2つ目は、OSのカーネルが存在し、実行される領域である「カーネル空間」。
この2分法でだいぶ理解できる気がするな。まず問いに対する答えとしては「Yes」ですよね。カーネル領域は物理メモリに確保されてます。
で、このことをより深く理解するために以下の4つ目の問いに進みましょう。
4. カーネル領域が二次記憶にスワップされることはあるの?
答えは、No。
いや、原則「No」であって例外的にスワップされたりするんかな。ちょっとその辺はわかりませんが、基本的にこれは「カーネル領域は二次記憶にスワップされません」でいいと思います。
逆から見れば、スワップされるものはユーザー空間のプロセスということ。
ここで3つ目の問いにも関連づけると、OSというソフトウェアもその動作は当然ながら物理メモリ上を利用して行われるわけです。
これも踏まえて改めて「カーネル領域」とは何かを考えると、「大変に保護された物理メモリ上の領域」というイメージが良いのでは、と思います。OSの処理は基本的に常に、いついかなる時もPCの正常な動作にとって必要となります。そのため、常に物理メモリ上にはOSが動作するための領域を確保しておきたいわけです。という意味で、「大変に保護された物理メモリの領域」というイメージ。
なんか違う気もするが。。
5. ファイルシステムにおけるキャッシュはどこに保存されてるの?
カーネル領域に保存される。
はい。ファイルシステムのキャッシュはカーネル領域に保存されるそうです。とは言えもちろんキャッシュがメモリを圧迫しては意味がないので、適宜適切なアルゴリズムに基づいてキャッシュは削除(更新)されます。
この時、「ファイルシステムのキャッシュ」と「CPUにおけるキャッシュ」は概念として別物であることを強く意識しておかないと、頭がこんがらがります。
6. mmapに関連して、readはどのようにメモリ領域を使用するの?
流れとしては、
- readが実行されると、二次記憶から物理メモリのカーネル空間にファイルデータが読み込まれる
- 物理メモリのカーネル空間からユーザー空間にファイルデータがコピーされる
- ユーザー空間のファイルデータが読み込まれた領域と、プロセスのアドレス空間における適切なアドレス群が対応づけられる
のスリーステップなはず。
これを踏まえると、mmapは非常にメモリ効率が良いよね、と。
うん。なんか、結構理解が深まった気がする。このQA形式いいですね。
ということで、今回の復習は以上になります。最後までお読みいただき、ありがとうございます。