OSの仕組みについて - ザックリ調査 -
動機
いつも当たり前のように使っているOSですが、改めて考えてみると知らないことだらけだったので簡単に調査して備忘録としてまとめてみました。
WindowsやMacOS、Ubuntuなんかがメジャーどころですが、それらがPCの中でどんなことをやっているのかがわかっていれば、プログラムのデバックの際にも深い視点から原因解明ができるかもという目論見です。
対象読者
みんながいつも使ってるOSの役割について知りたい人。
プログラミング初学者。
そもそもOSとは?
OS(Operating System)の定義
OSという用語にも使われている"operate"の直訳は「動かす、操作する」です。
このことからもわかるようにOSというのは、ソフトウェアを使ってPCを構成している各ハードウェアを適切に動かして運用するためのプログラム群のことです。
狭義のOS(制御プログラム、カーネル)
PC上で動作するプログラム同士が混乱しないように制御します。
ジョブ管理、タスク管理、記憶管理、ファイル管理などの役割があります。
これらの役割は特にカーネルと呼ばれる制御プログラムによって行われます。
ハードウェアそのものを実際に制御するのはデバイスドライバーで、カーネルはこれに命令を送って実行させるので、人によってはデバイスドライバーを含める場合もあります。
基本的には他のソフトウェアに命令を送って制御するメインの部分はカーネルなので、狭義のOSが何かと聞かれたらカーネルだと答えておくのが間違いないはず。
ということで、ここではカーネルが狭義のOSの役割をしているという立場を取ることにします。
ジョブ管理
コンピューター上で実行される処理のひとまとまりのことをジョブといいます。
カーネルはジョブの実行を監視・制御し、どのジョブにどのくらいの時間CPUを割り当てるか、複数のジョブをどのようにスケジューリングするか、といったことを管理します。
タスク管理
ジョブはタスクという単位に細分化されます。
タスクごとにCPUが割り当てられます。
カーネルはCPUの処理効率を考慮して、どのようにタスクを処理するかを管理します。
記憶管理
CPUで処理される命令は主記憶に読みだされますが、主記憶のどの領域を確保するのかを管理する必要があります。
カーネルはこの記憶空間の割り当てや管理も行っています。
ファイル管理
コンピューターが実行するプログラムなどはファイルの形でストレージなどに保管されます。
このときカーネルは、ファイルシステムと呼ばれる仕組みで論理的にファイルを配置して、それらを効率的に管理します。
Windowsであればフォルダ、Linuxであればディレクトリと呼ばれる構造でファイルを整理します。どちらの場合でもメインとなる場所から階層的に枝分かれした構造になっていて、パスによって場所を指定してファイルにアクセスすることができます。
広義のOS(言語プロセッサ、サービスプログラム)
カーネルが命令を出すプログラムや、カーネルと同梱されているプログラム群を含めて広義のOSとする場合も多いです。
言語プロセッサ
CやJava、Pythonといった高級言語で書かれたプログラムは、そのままではコンピューターが理解することはできません。コンピューターが理解できる機械語に翻訳する必要があります。
このように高級言語(プログラミング言語)と機械語の間の橋渡しをするのが言語プロセッサです。
コンパイラやインタプリタ、アセンブラなどがこれに当たります。
サービスプログラム
ユーザーがプログラムの実行をすることを手助けするプログラムです。
OSをインストールするとついてくるテキストエディタなどもこれに含まれます。
デバイスドライバー
マウスやキーボード、その他のデバイスなどをPCと接続して使えるようにするためのソフトウェアのことです。ハードウェアごとにインストールが必要ですが、カーネルの代わりにハードウェアの制御を行ってくれます。
OSのメリット
ソフトウェア開発者の負担軽減
CPUやメモリの動作管理をしているのがOSなので、必然的にハードウェア的なところをすべてが良しなに管理してくれています。これによってソフトウェア開発者はハードの情報を意識せずにプログラミングすることができます。
もしOSがなかったら、CPUやメモリの型番を調べ、それらに対して最適な処理をプログラムする必要があります。しかもハードが変わるごとにプログラミングの仕方を変えなくてはいけません。これはものすごく不便です。こんなことをしなくていいのもOSがあるおかげです。
PC利用者の利便性向上
ここまで読んでくださったことは気づくかもしれませんが、OSがなければ上で挙げてきたような処理をすべてユーザーが管理する必要があります。
開発者でもなければ細かいタスクの管理などはしんどいですし、コンピューターを利用する際の技術的なハードルが上がってしまいます。
我々は当たり前のようにブラウザを開きながらレポートを書いたりしていますが、OSがなければこんなふうに複数のプログラムを動作させることすら一苦労です。
どのタイミングでどのくらいCPUを割り当てるのかといったことを考慮せずに実行できるのはOSのおかげです。
OSの種類
Windows
Microsoft社が開発したOSで、もっとも一般的に使われています。
たいていの企業や学校で使われているPCに入っています。
GUI(Graphical User Interface)による直感的な操作がしやすいのが特徴です。
クライアントとサーバーのどちらの用途でも使われる汎用性の高い製品です。
MacOS
Apple社が開発したOSになります。
主にApple社の製品であるMacシリーズのPCに入っています。
デザインや使いやすさにこだわって作られており、クリエイターやデザイナーに人気があります。
このMacOSも後述するLinuxもUNIXというOSから派生して作られたという歴史があるようです。
なのでコマンドの使い方などが似ているところがあります。
Linux
主にサーバー用途で使われることが多いOSです。
最も大きな特徴はオープンソース形式で配布されていて、基本的に無料で使えることです。
Windowsとは違ってCUI(Character User Interface)がメインになっています。
ターミナル上での操作がやりやすくなっています。
オープンソースなので、様々な派生版が開発されていて、ディストリビューションというLinuxカーネルと便利なソフトウェアのセットの形で配布されています。
有名どころはUbuntuやCentOSなどがあります。
UbuntuなどはGUIが充実しているので、初心者でも使いやすい印象です。
UNIX
現存する中で最も古いOSと呼ばれます。
MacOSやLinuxなどたくさんの派生版を生み出しました。
非常にシンプルな構成で作られているので安定性が高く、サーバー用途などで人気があります。
ただ、CUIベースなので初心者には少し使いずらいかもしれません。
Android
Googleが開発したスマホ用のOSになります。
Google製のスマホのほか、SONYやSamsungなどの大手メーカーの製品にも入っています。
実はLinuxがもとになっているOSだったりします(今回調べてみて初めて知りました、、、)。
必要なアプリはGoogle Playストアから入手します。
iOS
Apple社製のスマホ、iPhoneに入っているOSです。
MacOSのスマホ版といった位置づけになります。
必要なアプリはAppleストアから入手します。
Google Playストアに比べてアプリの審査が厳しことで有名です。
リアルタイムOS
医療機器や産業制御機器のようなリアルタイム性が要求される組込みシステムに入っているOSです。
リアルタイムの処理に特化した構成になっているので、優先度の高い処理を割り込ませるといった処理が得意になっています。
参考文献
以下参考にした記事などです。
もっと詳しい内容が知りたい場合は、それぞれのキーワードで検索をかけると深い内容にたどり着けると思います(ex. "OS タスク管理"、"カーネル 仕組み"、"言語プロセッサ 仕組み"、etc.)。
Discussion
Windows 1.0〜 と、OS/2, NT3.1〜 は別物ですし、MacOS も 9 と X で別物です。
*BSD なんかも現役でゲーム機の中で動いています。
と、余計な事を書いてみる。