わかりやすく カーネル とは
前回のレッスンでは、プログラムが公式の窓口であるシステムコールに頼み、要求が窓口を越えた瞬間にCPUが一時的にカーネルモードへ切り替わると話しました。では、その窓口の奥で、強い権限を使って実際に仕事をしているのはだれでしょうか。そもそも、なぜそのモードには「カーネル」という名前が付いているのでしょうか。今回は、OSのいちばん深い中心で、いつも持ち場を守っている核と向き合います。
窓口の奥にいるのはだれか
前回を思い出してみます。プログラムは柵の中に閉じ込められていてハードウェアに直接触れられず、仕事が必要になるとシステムコールという公式の窓口に頼みました。窓口を越えた瞬間、CPUは一時的にカーネルモードに切り替わって仕事を片づけ、戻ってきました。
そのとき、わざと見ずにおいたものが一つあります。窓口の奥で、その強い権限を使って実際に仕事をしている存在です。
窓口は頼みを受け付ける入り口にすぎず、その奥には、実際にディスクを読み、画面に点を打つ働き手が別にいます。その働き手の名前がカーネルです。
ボタンを押すと、システムコールの窓口の奥に隠れていた枠が開き、カーネルが姿を現します。プログラムの頼みを実際に処理していたのは、このカーネルだったのです。
これで、カーネルモードという名前にも納得がいきます。あの強い権限は、カーネルが働くときに使う力なので、その名前が付いているのです。
では、カーネルは頼みが来たときだけ一瞬現れて、また消えてしまうのでしょうか。そうではありません。
OSという言葉をいちばん狭い意味で使うとき、指しているのもこのカーネルです。
カーネルがいつからいつまでその場所にいるのかが、次の話です。
カーネルはいつも起きている
私たちが使うアプリは、起動したり終了したりします。音楽アプリを開いては閉じ、ブラウザーを立ち上げては終了します。アプリは必要なときにメモリに読み込まれ、閉じればメモリから取り除かれます。
カーネルは違います。コンピューターが起動する途中でメモリに読み込まれて居場所を確保し、電源が切れるまで一度もその場所を離れません。アプリがどれだけ出入りしても、カーネルはいつもその下で起きています。
考えてみれば当然です。アプリをメモリに読み込んだり取り除いたりする仕事も、だれにCPUを渡すかを決める仕事も、すべてカーネルがしているからです。カーネルが眠ってしまえば、その仕事をする者はだれも残りません。
上の三つのアプリの枠は押すたびについたり消えたりしますが、いちばん下のカーネルの枠はずっとついたままです。カーネルは起動から終了までメモリに常駐しています。
アプリの枠は点滅しても、カーネルの枠は変わらずついたままでした。カーネルは、舞台裏で幕を上げ下げする人に似ています。役者は出たり入ったりしますが、その人は公演のあいだずっと持ち場を守っています。
では、カーネルはその持ち場で、具体的に何をしているのでしょうか。実は、この分野で学んできたことのほとんどが、カーネルの手で動いていたのです。
すべての資源の管制塔
この分野を通して、私たちはいろいろなことを学びました。だれに先にCPUを渡すかを決めるスケジューリング、実際より大きなメモリがあるように見せる仮想メモリ、新しい装置と話を通じさせるドライバー、ファイルを整理するファイルシステム、だれが何をできるかを確かめる権限の確認です。
そのときは一つずつ学びましたが、これらの仕事を実際にこなしている手は一つです。それがカーネルです。
カーネルは空港の管制塔に似ています。管制塔が飛行機ごとにいつ離着陸するか、どの滑走路を使うかを一か所で決めるように、カーネルはCPU、メモリ、装置、ファイルという資源をだれにどれだけ渡すかを、一つの手で決めています。
五つの資源のどれかを押すと、真ん中のカーネルの枠が光ります。CPUスケジューリングでも、メモリ、ドライバー、ファイル、権限でも、その仕事を受け持っているのはすべてカーネルです。
どの資源を押しても、道はカーネルに集まりました。ばらばらに見えた仕事は、実は一つの中心で回っていたのです。
けれども、カーネルがこれほど強力な仕事を全部こなしているとしたら、危険ではないでしょうか。どんなプログラムでもこの力を使えるとしたら、大変なことになります。
そこでコンピューターは、力の世界を二つに分けています。
二つのモードの境界
前回見た二つのモードを、もう一度思い出してみます。ユーザーモードは、私たちのアプリが暮らす、力の限られた世界です。カーネルモードは、ハードウェアでも何でも直接触れられる、カーネルが働く世界です。
二つのあいだには、はっきりした境界があります。ユーザーモードのアプリはハードウェアに直接手を伸ばせず、カーネルモードで働くカーネルだけがハードウェアに直接触れます。だから、アプリが何かを自分でしようとすると止められ、カーネルに頼んでカーネルモードを通したときにだけ、その仕事が実現します。
この境界のおかげで、強い力は信頼できるカーネル一か所にだけ集まっています。
左のボタンでモードを切り替え、右のボタンでハードウェアに直接手を伸ばします。ユーザーモードでは止められ(赤)、カーネルモードのときだけ許可されます(緑)。強い力はカーネルモードの中にしかありません。
ユーザーモードでは止められ、カーネルモードでだけ通りました。強い力がカーネル一か所に集まっているのは心強いことです。危険な行動が一か所しか通らないので、そこだけをしっかり守ればよいからです。
ただ、ひやりとする考えも浮かびます。すべてがカーネル一つにかかっているなら、そのカーネル自体に問題が起きたらどうなるのでしょうか。
カーネルが止まったら
ここまで見てきたことをまとめます。カーネルは、システムコールの窓口の奥で実際の仕事をこなす中核のプログラムで、起動から終了までメモリに常駐し、CPU、メモリ、装置、ファイル、権限という資源を一つの手で取り仕切っています。強いカーネルモードは、カーネルが働くときに使う力です。
そのため、アプリが一つおかしくなって固まったり落ちたりしても、その下のカーネルが生きていれば、そのアプリだけが片づけられ、残りは問題なく動き続けます。固まったアプリ一つだけを強制終了して、コンピューターを使い続けられるのはそのおかげです。
しかし、カーネル自体が止まると話はまったく違います。アプリを片づけ、資源を配り、頼みを処理するその一つの手がなくなるので、その上のすべてのアプリとシステム全体が一度に止まってしまいます。画面が突然青くなったり、何も反応しなくなったりして再起動するしかない、あのまれな瞬間こそ、カーネルがもう持ちこたえられなくなったときです。Windowsの青いエラー画面やLinuxのカーネルパニックが、まさにそれです。
三つのアプリのどれかを押すと、そのアプリだけが止まり、ほかは無事です。最後に下の「カーネルを止める」ボタンを押すと、その上のすべてが一度に停止します(赤)。
これで、OSの真ん中がはっきり見えてきました。別々に学んだスケジューリング、メモリ、ドライバー、ファイル、権限、システムコールは、すべてこのカーネル一つの手で動いていたのです。
ところが、資源を一つの手で配っていると、新しい厄介ごとが生まれます。二つのプログラムがそれぞれ自分の持っているものを手放さず、相手の持っているものだけを待ち続けると、どちらも永遠に止まってしまうのです。
次のレッスンでは、互いに譲らないときに起きるこのデッドロックを扱います。