PCを触ったことのある人は、「Windows」、「iOS」、「Linux」など、よく知らないけど聞いたことのあるワードをチラホラと目にすると思います。コレらは全てOS(Operating System)の一種であり、「じゃあOSってなんなんだ?」となって、しばらくggる時間が出てくると思います。
この記事では、そんなOSを含めて、カーネルやシェルといった普段使っているはずなのに馴染みのない彼らに焦点を充てて「なぜコイツらがPCの核となっているのか」を解説していきます。
OSの種類(一部抜粋)
PC
・Windows
・MacOS
・Linux
・UNIX(Linux、Minix、FreeBSDなど)
スマートフォン
・iOS
・Android
など…
PC、スマートフォンのOSの名前は見たことがある方も多いと思いますが、実はケータイ、プリンター、冷蔵庫など、様々な電化製品にはOS(組み込みOS)が組み込まれています。ただし、電気ポッドなどの単機能な電化製品はOSを組み込むほどでも無いため、こういったものには入らないです。
https://thinkit.co.jp/story/2010/08/10/1695
(余談ですが、MacOSはUNIXから生まれたFreeBSDをベースに作られたOSなのでunixコマンドを使用することができます。UNIXとWindowsの区別が当初分からなかったのですが、UNIXにはドライブの概念がないためパスの区切りが / であるのに対して、Windowsでは¥で区切られている、ということを知り、なるほどとなりました。)
OSの役割は様々にありますが
①ユーザーからのアクションを受け取り、実行されたプログラムが正しく実行されるために、ハードウェアやソフトウェアにアクセスしてくれる仲介役を担っている。
②キーボード、メモリ、CPUなどの計算機リソースを管理すると共に、実行するプログラムの管理をする。
などがあり、つまりOSとはコンピュータのハードウェアリソースを管理して、プログラムが動作する環境を提供するソフトウェア(カーネル)と定義できます。
さて、カーネルという言葉が出てきました。カーネルとは、一体何でしょうか。
調べていくと、定義が曖昧なのだと分かりましたが、要はOSのコアとなる部分です。コアといってもカーネルだけでPCが成り立っているというわけでもありません。カーネルは単なる最重要ソフトウェアであり、シェルやデーモンなどのソフトウェアを動かしてくれます。これら全てが組み合わさって1つのOSが出来上がります。そして、カーネルは一番ハードウェアに近いソフトウェアでもあります。ソフトウェア側が、直接メモリやCPUのメモリやCPUの管理などをしていては大変ですので、これをカーネルが代わりにしてくれます。
カーネルのインターフェースは、システムコールと呼ばれます。一般的に、関数ライブラリ群はシステムコールインターフェースを挟んで作成されます。そして、これらライブラリ群はシェルを通じて実行されるため、先述した ユーザー⇆シェル⇄カーネル の関係が出来上がります。
引用「詳解UNIXプログラミング第3版」より
もっと身近に考えてみます。
bash(Bourne-again shell)を例としてシェルとカーネルの関係を見ていきます。
ユーザーはCLI(Command Line Interface)上で、十字キーの↑を押すと、一個前に実行したシェルコマンドが表示されます。
これは順を追ってくと、
①ユーザーが十字キーの↑を押す
②シェルが↑を認識して、一つ前のコマンドを表示するようにカーネルに伝える
③カーネルはシェルからの命令を受け取り、結果を返す
④シェルは、処理結果を解釈して、CLI上に実行結果(一つ前のコマンド)を返す
⑤ユーザーは、CLI上で一つ前のコマンドを見れる といったようになります。
上記から、
①シェルは ユーザー⇆シェル⇄カーネル というように仲介役として務めを果たしている
②カーネルはシェルからの要求に応えてプログラムのオペレーションを実行し、その結果をシェルに返す
ということが分かります。そして、このシェルは一つではなく数種類のシェルがあり、
・bash
・zsh
・fish
・mintty
などのが存在しているため、自分好みのシェルを使用することができます。 Macは、デフォルトシェルをbashからzshに変えたことが話題になっていましたが、bashもzshも元々Bourneシェルを拡張したものです。
まとめ
OS:コンピュータのハードウェアリソースを管理して、プログラムが動作する環境を提供するソフトウェア(核にあるのはカーネルと呼ばれる)
カーネル:OSのコアとなる部分だが、カーネルだけでPCが成り立っていない。他のソフトウェアからの命令をインターフェースを挟んで受け取ったり、ハードウェア(メモリやCPUなど)にアクセスしたりして、ソフトウェア⇄ハードウェアの仲介屋として頑張っている
シェル:ユーザー⇆シェル⇄カーネル と、カーネルとは違う仲介役だったりする。