このテキストは、運営している韓国のブログを日本語に翻訳したものです。
韓国のブログ:https://yunsuu.notion.site/e379eccd32c545419f0651f743c12c13?v=35310b282de24cc5a292fe45cc498a32&pvs=74
この記事は「Operating Systems: Three Easy Pieces」を読んでまとめた本です。
著者が無料で公開しているので、興味のある方はぜひ読んでみてください。
本にある良い問題は解いてgithubにアップロードしています。
github:https://github.com/yunsuu/ostep-homework-solution
本のリンク:https://pages.cs.wisc.edu/~remzi/OSTEP/
仮想メモリが必要な理由
初期のオペレーティングシステムはメモリに常駐するルーチンでした。特別な仮想化は期待されず、物理メモリには一つのプロセスしか存在していませんでした。
時間が経つにつれて、コンピュータは高価な装置となり、一台のコンピュータを購入して複数のユーザーが利用する時代が到来しました。一つのCPUで複数のユーザーが問題なく使用できる方法が必要であり、複数のプロセスが同時に実行されるマルチプログラミングが必要となりました。タイムシェアリングの概念がこの時期に導入され始めました。
しかし、問題はタイムシェアリングだけで解決されませんでした。コンピュータは多くの人々がバッチ処理方式でプログラミングを行い、プログラム-デバッグのサイクルが非常に長かった(現在のデザイナーが感じているレンダリングと同じような苦痛だろう)。プログラマーたちは即時の応答を求めており、対話型の利用(インタラクティビティ)の概念を導入し始めました。
さて、一つのCPUで複数のプロセスを使用することが可能になりました。しかし、新たな問題が生じます。それはセキュリティ問題で、CPUがプロセスを切り替えながら複数のプロセスを実行しているとき、これらのプロセスの計算結果に必要な変数はすべて一つのメモリを共有することになります。その結果、プロセスAが予期せぬ動作で本来プログラムされていない他のメモリを触ってしまい、それがプロセスBの計算に関連していると、プロセスBは予期せぬ方法で実行されるでしょう。
この問題を解決する方法は、仮想メモリです。複数のプロセスを同時に実行しても、各プロセスには仮想メモリを作成し、メモリ領域が衝突しないようにします。
仮想メモリ実装の目標
透明性(Transparency)
- オペレーティングシステムは、実行するプログラムが仮想メモリの存在を認識せず、実際に専用の物理メモリを所有しているかのように認識させる必要があります。
効率性
- もちろん、できるだけ効率的にする必要があります。
保護
- プロセスを他のプロセスから保護します。
- オペレーティングシステム自体もプロセスから保護する必要があります。
- これを実現する方法は、各プロセスのメモリを隔離することです。
まとめ
私たちは、オペレーティングシステムの構成要素である仮想メモリについて学びました。VMシステムは、各プロセスに専用のスペースという幻想を持たせる必要があります。命令全体とデータ全体が保存されます。ハードウェアの支援を得て、オペレーティングシステムは仮想メモリアドレスを受け取り、物理アドレスに変換します。物理アドレスは、必要な情報を取り込むために物理メモリに渡されます。オペレーティングシステムは、多くのプロセスを対象にこのような作業を行い、プログラムとオペレーティングシステムを保護します。全体的なアプローチは、多くの技術、多くの低レベルのハードウェア機能、および重要なポリシーを必要とします。詳細については、次の記事でじっくりと学んでいきましょう。