初心者がしっかり理解しておきたい基礎知識。OS、カーネル、シェルについて。

そもそもPCやスマホ、タブレットはどうやって動いているのか?

まず基本的なところから確認してみましょう。現代社会においてPC、スマホ、タブレットはもはや日常必需品とも言えるものになっています。メールやメッセージで連絡を取り合い、仕事のデータを編集したり作業したり、趣味の動画や写真を加工したりWebサイトを作ったりします。

PCやスマホ、そしてタブレットでアプリケーションを起動し、必要な作業を行うために私達は日常的にこれらの機器とアプリケーションを使っています。あまりにも当たり前の日常になっているので気にすることが少なくなっているかもしれませんが、そもそもPC、スマホ、タブレットはどうやって動き、なぜアプリケーションは動くのでしょうか?

世の中のほぼ全ての機器は「OS」によって動いている。

ご存じの方も多いとは思いますが、念の為に確認しておくと、PCやスマホ、タブレットなどに代表される様々な機器はほぼ例外なく「OS=オペレーションシステム」を搭載しており、機器全体の動きや機能を根本的に統制しているのがこの「OS」です。OSがなければPCもスマホもタブレットも動かず、例えばアプリストアからアプリをダウンロードしたりインストールすることもできません。

イメージとして説明すると、これはOSがアプリケーションのダウンロードやインストールをコントロールしているからです。さらに言えば、アプリストアを開いたり、欲しいアプリを選択しクリックやタップしたりするという「決定する行為」そのものも、OSがなければ行うことができません。OSというのはそれほどまでに各機器の動きの根幹を担っているものなのです。

ただし、世の中に存在するOSは1つだけではありません。PC用のOSで言えばUNIX、Linux、そこから派生や発展して開発され、現在では一般ユーザー向けPCのOSとして2大巨頭になっているWindowsとMacOS。スマホではiOSとAndroidなど、様々なOSが存在しています。それぞれのOSは細部の機能や基本コンセプトなどに違いはありますが、根本的な役割は全て同じです。つまり、自身がインストールされている機器・機械の基本機能を担う、という役割はどのOSでも同じです。

OSはどんな構造になっているのか?

機器や機械はいわゆる「ハードウェア」と呼ばれるもので、そのハードウェアを動かすために存在するのがOSです。ではOSはどのようにハードウェアを動かしているのでしょうか?

一口にOSと言っても実際にはプログラムとして作られたソフトウェアであり、プログラム構造物です。この構成内容にシェルやカーネルというものが含まれます。

シェルとは何か?

OSは一種のプログラム構造物であると紹介しましたが、これはつまりOSそのものがいくつかのプログラムの集合体として存在しているということを意味しています。

そして、そのプログラムのうち最も重要な要素であるものが「カーネル」と「シェル」です。

OSに関して勉強し始めたり、ある程度の知識がある方なら聞いたことがあるかもしれません。カーネルとはOSの中核を形成するもので、PC=ハードウェアの使用者=ユーザーから見た場合、カーネルとユーザーの間にシェルが存在することになります。シェルはユーザーが入力した命令をカーネルに伝える役割を持っていますので、実質的にはいわゆる「UI=ユーザーインターフェース」がシェルだと考えておくとわかりやすいでしょう。そして、ユーザーインターフェース=シェルを通じてユーザーの命令がコマンドとしてカーネルに伝わり、その後にカーネルは要求された処理を行ってユーザーに回答します。

つまり、ユーザーがキーボードで「A」と入力すると、ユーザーインターフェース上ではすぐに「A」と表示されることになりますが、実はその間にシェルがユーザーの行動を瞬時に「Aを表示せよ」という命令だと判断し、「Aを表示させる」というコマンド=命令文をカーネルに伝えます。そしてカーネルはコマンド通りに回答を返し、ユーザーインターフェース=画面上に「A」という文字を表示させ、ユーザーの要求を実現しているのです。

実際にシェルが行っていること

シェルの役割について解説を行う場合に、よく使われる表現として「シェルはユーザーの命令をカーネルに伝わるように。カーネルの回答をユーザーがわかるように翻訳するもの」という文章があります。

一番最初の段階で理解するための表現としてはわかりやすいと言えますが、厳密に言うともう少し細かい表現ができます。

ユーザーの要求がシェルを通じてカーネルに伝わるのは事実なので、その意味では「シェルはユーザーとカーネルの通訳である」と考えられるかもしれません。しかし、実際にシェルが行っているのは先に解説したように「ユーザーの命令をコマンドとしてカーネルに伝えている」という動作です。これは「シェルがユーザーの命令をコマンド化している」というわけではなく「シェルがコマンドを呼び出してカーネルに伝えている」ということになります。

ではなぜこのような動作が必要なのでしょうか?既にご説明したようにいわゆる「OSの核」がカーネルです。つまりカーネルが最終的な回答をユーザーに返すという決定を下すわけですが、そのためには「ユーザーがどのような命令を投げたのか」を知る必要があります。この「ユーザーの命令が何であるかを判断し、適切な回答を返す」という動作を、OSの核であるカーネルが行い、なおかつその動作が大量に重なってしまうと処理の順番待ちが起きてしまい、いわゆる「処理が遅い」という状態に陥ることになってしまいます。

このような「処理落ち」「処理遅延」が起きないようにするために、命令を端的にまとめてある「コマンド」が存在しています。シェルはユーザーインターフェースを通じて入力された要求に応じたコマンドを呼び出し、そのままカーネルに伝えます。これによりカーネルは自身がユーザーの要求・命令が何であるかを探し出す必要なく、コマンドとして設定された命令に応じた回答をユーザーインターフェースを通じてユーザーに返すことになるのです。

したがって、よく言われている「ユーザーとカーネル間の通訳・翻訳を行う」というシェルの役割は、厳密に言うと少し異なることがわかります。ただし、実際には全ての命令がカーネルまで到達しているかというとそうではなく、場合によってはコマンドの段階で動作が実行され、ユーザーの命令に対する回答が完結することもあります。そのため、シェルがユーザーとカーネルの通訳・翻訳であるという表現は、厳密に言うと少し違うということになるのです。

「OS=シェル+カーネル」というわけではない

ソフトウェアやプログラムというのは私達の目に見えるよりもずっと複雑な構造をしています。OSはカーネルを核として構成されたプログラムの集合体であり構造物ですが、シンプルに「OS=シェル+カーネル」という図式が成り立つわけではありません。特に現代のOSに関してはなおさらです。

OSに求められる機能は年々複雑化しており、実際にはいくつもの複数に及ぶプログラム群の集合体がOSです。それに伴い、複雑化したOSを遅延なく動かせるようにハードウェアやCPUといったものが進化しているとも言えるでしょう。

また、カーネルが処理できる命令=コマンドも、全てが100%OSと一体化しているわけではなく、場合によってはインストールされた別のアプリケーションがOSに対して命令を下し、カーネルが返す応答は「アプリケーショに対して」という状況も現代では起こるようになっています。

アプリケーションはどこにインストールされるのか?

では、アプリケーションはシェルの代替プログラムなのでしょうか?実際にはこれも誤解されやすいものですが、アプリケーションはシェルの代わりをするプログラムというわけではありません。あたかもインストールされたアプリケーションがユーザーインターフェースになっているように見えることもありますが、本来のユーザーインターフェースとして機能しているのはあくまでもシェルであり、アプリケーションはイメージとして「カーネルとシェルの間」にインストールされていると考えるのが良いでしょう。

アプリケーションが持つ機能を元々のOSに追加してOSと一体化させている、というわけではありませんが、元々のOSが処理しているコマンドだけではなく「ユーザーにとって利便性の高い要求をOSに送り実現させるためのプログラム」がアプリケーションです。こうした考え方は概念的ではありますが、細分化して理解しておくと頭の中が整理できると思います。

シェルがコマンドの出力結果を中継するわけではない

ここまでご説明した内容でわかるように、よくある説明として見かける「シェルがユーザーとカーネルの間を中継し命令を翻訳している」わけではありません。

繰り返しになりますが、シェルが行うのは「指定されたコマンドの実行をカーネルに伝達する」ということで、シェルがコマンドを作成するわけではありません。また、カーネルが行った処理をシェルが書き換えてユーザーインターフェース上に再現するわけでもありません。

カーネルが受け取ったコマンドをシェルが書き換えるわけではないので、この間は実質的にシェルは何もしていないことになるのです。仮に対話型のコマンドが動いていたとしても、シェルが最初のコマンドを指示した後に回答を受け取るは対話型コマンドであり、シェルが受け取ったコマンドに対して何かを実行するわけではありません。何らかのコマンドが行った結果をシェルが受け取ったり、受け取ってどこかに転送したりといった処理を行うわけではないということを覚えておきましょう。

まとめ

ここまで、OS、カーネル、シェルについて解説してきました。OSがPCやスマホ、そしてタブレットを動かすものであるということ。そして世の中にあるほぼすべての機器やデバイスはOSによって動いているということ。OSはカーネルを核としたプログラムの集合体であり、OSが「カーネル+シェル」というシンプルな構造になっているわけではないことをご紹介してきました。OS、カーネル、そしてシェルの関係性やそれぞれの働きについて解説する際、シェルがカーネルとユーザーの間に立って通訳・翻訳作業を行っていると言われることが多いですが、わかりやすく説明してイメージが付きやすいようにいくつかの内容を省略した内容だったことがご理解頂けたかと思います。ただし、完全に間違っているともいい切れない部分がありますので、OSの構造を理解するためには様々な知識が必要だとも言えるでしょう。これを機会に改めてOSの構造について復習し、さらに理解を深めてみてください。