Built To Last

廃れない計算機科学の知識体系を残す

メモリの仮想化① 〜導入

前回までは、OSを理解する上で重要な三要素の一つの「仮想化」を、CPUに適用した際、必要となるポリシーや設計基盤について議論してきた。

今回からは、メモリの仮想化について議論する。

 

メモリを仮想化することの目的は、

OSを理解するための3つの構成要素 - Built To Last

でも話したように、「複数のプロセスがそれぞれ独自のメモリ空間を持っていると錯覚させること」である。この、物理メモリが仮想化されることで個々のプロセスがアクセスできるようにしたプロセス独自のメモリ空間を、アドレス空間(Address Space)と呼ぶ。

以下にx86-32環境におけるLinuxアドレス空間の例を示す。

f:id:froprintoai:20200917011948p:plain

これはあるプロセスが持っているアドレス空間であり、この空間内でどこにアクセスし値を変更しようが、他のプロセスには影響を与えない。それは、この空間内のアドレスは仮想化されたものであり、実際に物理アドレス上のどこかのアドレスに対応するものであるが、他のプロセスの持つアドレス空間に重ならないように、OSが管理しているからである。

このように、メモリ仮想化には、あるプロセスを他のプロセスから独立させることで、一つのプロセスの失敗が他に影響を与えないという、アイソレーション&プロテクションの恩恵をシステムにもたらす。

CPU仮想化④ 〜複数あるプロセスの中でどれを優先すべきか?ーCFS編

前回に引き続き、複数あるプロセスにどのようにCPU時間を振り分けるか、のルール(ポリシー)としてメジャーな手法を取り上げよう。今回は、Linuxで用いられているCompletely Fair Schduler(CFS)である。

 

スケジューリングにおいて重要なことは公平性とそのパフォーマンスである。Linuxで採用されているCFSでは、その2つのゴールをデータ構造とその設計を巧みに用いて達成している。

 

CFSの重要な要素として、

  1. Virtual Runtime (vruntime)
  2. Weighting (Niceness)
  3. Red Black Tree

が挙げられる。ひとつひとつ見ていこう。

Read more

CPU仮想化③ 〜複数あるプロセスの中でどれを優先すべきか?ーMLFQ編

今回は、CPUの仮想化を理解する上での2つの観点のうち、2つ目の「複数あるプロセスの中でどれを優先すべきか?」、というポリシー(方針)の話をしようと思う。

ここで、良いスケジューラを実装するために重要なこととして、パフォーマンスの他に公平性(Fairness)も挙げられることに注意する。

まず、前提としてシステム上で作られるプロセスは一様でないことを考えよう。そのプロセスがCPUバウンドなのかI/Oバウンドなのか、そのプロセス実行にかかる時間はどれくらいなのか、など多種多様なプロセスが作られる。それらのプロセスを、効率的にかつ公平性を保ったまま実行していくには複雑なルールが必要となる。

 

主流となっているスケジューリングポリシーの二つのうち今回はMLFQを紹介する。

1.Multilevel Feedback Queue(MLFQ)

この手法は、SolarisWindowsMacOSで採用されている。

Read more

CPU仮想化② 〜どのようにtime sharing of CPUを行うか?〜

今回は、「どのようにTime Sharing of CPUを行うか」という点について考えていこうと思う。

 

「どのようにTime Sharing of CPUを行うか」を理解するということは、「Context Switchがどう行われるか」を理解することである。

 

Context Switchの話に移る前にいくつか前提となるOSのコンセプトに関して話す。

 

Read more

CPU仮想化① 【導入】

CPUの仮想化の話に入る前に、プロセスの話をしなければならない。

 

プロセスとは、プログラムを実行した際にOSに作られる抽象物のことである。プロセスとプログラムは一対一の関係とは限らず、一つのプログラムから複数のプロセスをつくることができる。実際に我々がコンピュータを使うとき、複数のプロセスがコンピューティングソースであるCPUを譲り合いながら動いている。その譲り合いは高速で、我々の目からは、複数のプロセスが同時に動いているように見える。これをtime sharing of CPUと呼ぶ。

 

CPUの仮想化とは、OSによって作られた複数プロセスが、それぞれ独自のCPUを持っているように錯覚させることである。つまり、あるプロセスAが、「他のプロセスBにCPUを譲らなければいけないので、ここまで処理を終わらせたら一旦中止してCPUを譲ろう」などと考えなくて済むのである。更に計算機科学チックに言い換えると、「time sharing of CPUのロジック、複雑性を、プロセスの処理に持ち込まない」ということである。

 

Read more

OSを理解するための3つの構成要素

Q. 「OSとはなにか?」

 

A. OSとは、CPUやメモリ、ディスクなどのリソースを仮想化(Virtualize)することで、コンピュータを使いやすくするものである。

 

                      f:id:froprintoai:20200829001535p:plain

上図のように、異なる(または同一の)複数ユーザが1つのコンピュータを扱うときに、ユーザが使うメールやブラウザなどのアプリケーションプログラムとCPUなどのハードウェアの仲介役としてOSが存在する。OSのおかげで、これらのハードウェアソースを効率的に使うことができるのだ。その効率化を可能にしているのが仮想化である。 

 

OSを理解する上で、3つのアプローチがある。

  1. 仮想化(Virtualization)
  2. 並行性(Concurrency)
  3. データ保持(Persistence)

一つ一つ追っていこう。

Read more

このブログについて

当ブログの目的は、「廃れない計算機科学の知識体系を残すこと」です。

 

そのため、当ブログで扱われる分野は、OS、ネットワークなどの低レイヤ、またデータ構造、アルゴリズムに集中します。セキュリティやAIも扱っていくつもりです。

同理由で、各プログラミング言語シンタックスや、ツール群の使い方などの短期間でしか通用しないものは、当ブログでは扱いません。