※見出しの数字は本書の章立ての番号となります。
3.1 3階層型システムの図解
第1章で紹介した3階層アーキテクチャについて、まず主要構成要素であるWebサーバー、アプリケーション(AP)サーバー、データベース(DB)サーバーをまとめて1つの図としてみました(図3.1)。
まず最初に目につくのは棒人間ですよね。これが何かは次節で説明しますが、本書では彼の姿を何度も見かけることになりますので、慣れ親しんでおいてください。
下から見ていきましょう。3台のサーバーは、スイッチ経由で接続されています。それぞれのサーバーについてズームアップしてみると、CPU、メモリ、ディスク、NIC/HBAといったハードウェア機器が並んでいます。これらは、前章で紹介した物理機器です。
その上に、CPUとメモリ領域をズームアップした枠組みがあります。この部分が、本章のメインテーマとなる、論理構成です。この枠組みは「オペレーティングシステム(OS)」領域を表わしています。棒人間とカーネル(Kernel)については、次節で説明します。
データの流れを見ていく前に、論理構成における主要要素について見ていきます。
3.2 主要概念の説明
OSを理解する上で欠かせない概念である、プロセスおよびスレッドと、カーネルについて簡単に説明していきます。さらに詳しいことが知りたくなった方は、姉妹書『絵で見てわかるOS/ストレージ/ネットワーク 新装版』(ISBN:978-4-7981-5848-8)も併せて読んでみてください。
3.2.1 プロセスおよびスレッドとは?
まずは注目の棒人間から説明します。皆さんも、インターネットからプログラムをダウンロードし、PCにインストールしたことがありますよね。プログラムをインストールし、アイコンをダブルクリックして起動すると、ウィンドウが表示されますよね。もう1回ダブルクリックすると、別のウィンドウが起動することもあります。これらが、プロセスやスレッドと呼ばれるものです。図3.2をご覧ください。
プロセスやスレッドは、プログラムの実行ファイルそのものではありません。OSの上で起動し、ファイルからは独立して、自分で動いている状態になっているものを指します。多くの書籍でも「人型」として記載されるように、プロセスやスレッドが起動するということは、息が吹き込まれ、まるで人間であるかのように活動を開始すことを表わします。本書を読み終わるころには、プログラムを起動するたびに棒人間が脳裏に浮かぶようになりますよ。
さて、プロセスおよびスレッドが活動するには、メモリ空間が必要です。これはカーネル(後述)により、メモリ上に確保されます。このメモリ空間は、棒人間が自分のために所有する空間、さながらパーソナルスペースとでも言うべき領域です。さまざまな処理を行ない、データのやり取りを行なう上で、このメモリ空間を利用します。図3.2にあるように、プロセス起動時にこの空間が確保されます。
では、3階層型システムにおけるサーバーごとに具体的にどういったプロセスが起動しているのか、見ていきましょう。図3.3をご覧ください。
まず、Webサーバーを見てみましょう。ここではApache HTTP Serverを用いて説明します。「httpdプロセス」とラベルが貼られている棒人間がプロセスです。その周りを囲むような白い空間がありますよね。これがプロセスのメモリ空間を表わしています。プロセスの具体的な動きについてはあとで出てきますが、ここでは、個々の棒人間が独立したメモリ空間を所持している点に注目してください。
APサーバーも見てみましょう。「スレッド」とラベルが貼られている棒人間が、スレッドです。Webサーバーとは異なり、APサーバー上の棒人間は1つのメモリ空間を共有していますよね。これがプロセスとスレッドの大きな違いです。プロセスは、自分専用のメモリ空間を主に利用して動きます。スレッドは、ほかのスレッドとメモリ空間を共有した運命共同体となります。
たとえば、プロセスは夫婦共働きで、財布は別々に管理しているイメージです。一方のスレッドは、奥さんは旦那さんの扶養家族というイメージです。子どもがたくさんできれば扶養家族が増えますが、お財布1つをやりくりすることになりますね。どちらの家族も構造こそ違いますが、生活するという目的は同じです。プロセスとスレッドの関係も似たようなイメージです。
プロセスとスレッドのどちらを利用するかは、アプリケーション開発者が決めます。その際は、それぞれの特性を理解した設計、プログラミングを行なう必要があります。
たとえば、プロセスは独自のメモリ空間を持つため、生成時のCPU負荷が、スレッドと比較して高くなります。ですので、マルチプロセスのアプリケーションでは、プロセスの生成コストを下げるために、あらかじめプロセスを起動しておくといったことを行ないます。その実例がコネクションプーリングと呼ばれるものであり、第7章で詳しく説明します。
複数同時起動を前提とした場合での、プロセスとスレッドのメリットとデメリットを簡単にまとめておきます(表3.1)。
ただし、プロセス同士がメモリ空間を共有できないわけではありません。たとえばOracle Databaseにおいては、図3.4のように、複数のプロセスが「共有メモリ空間」を相互利用するアーキテクチャを取ります。
それとは別に、プロセスごとの独自のメモリ領域もあり、用途ごとに使い分けています。各プロセスで共有したいようなデータ、たとえばキャッシュとして格納しているデータ(第4章で詳しく説明します)は共有メモリ上に置きます。一方で、各プロセスのみ利用するようなデータ、たとえば自らの計算結果は、自分専用のメモリ領域に置きます。