OSの仕組みと魅力について知る

## はじめに
[前回書いた記事](https://qiita.com/fujifuji1414/items/359d754f9ab0ad2ccbb7#os%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF)で、軽く触れたOSの仕組みを本記事で深ぼっていこうと思います！
皆さんが当たり前のように使っているOSですが、かなり奥が深く、詳細を知っている方はそう多くないのではないでしょうか。

本記事では、Linuxとは何か、他のOSとの比較にも触れながら理解を深めていこうと思います！

まずは、OSとは何かみていきましょう！

## OS(Operating System)とは
### OSの定義
- **OS（Operating System）** 
    - コンピュータやスマートフォンなどのデバイスを動かすための基本的なソフトウェアです
    - ハードウェア（物理的な機器）とソフトウェア（アプリケーション）との仲介役をします

:::note
*OSは、ソフトウェアを使ってPCを構成している各ハードウェアを適切に動かして運用するためのプログラム群*
:::

### 代表的なOS
**Windows**
- Microsoft社が開発したOSで、デスクトップやノートパソコンで広く使われています
- 使いやすい`GUI(Graphical User Interface)`を提供します

**macOS**
- Apple社が開発したOSで、Macシリーズのコンピュータで使用されます
- シンプルで直感的な操作が特徴で、クリエイターやデザイナーに人気があります
- macOSも`Linux`や`UNIX`というOSから派生して作られている歴史があるようです

**Linux**
- オープンソースのOSで、多くのバージョン（**ディストリビューション**[^1]）があります
- `CUI(Character User Interface)`がメインで
- カスタマイズ性が高く、主にサーバーや開発環境でよく使われます

**UNIX**
- 現存する中で最も古いOSと呼ばれます
- `MacOS`や`Linux`などの、多くの現代的なOSの基盤を築いた存在です
- 非常にシンプルな構成で作られているので安定性が高く、サーバー用途などで人気があります
- ただ、`CUI`ベースなので初心者には少し使いづらいかもしれません

**Android**
- Googleが開発したモバイルOSで、多くのスマートフォンやタブレットで使用されています
- アプリが豊富で、カスタマイズも容易です

**iOS**
- Apple社が開発したモバイルOSで、iPhoneやiPadで使用されます
- セキュリティが高く、操作が直感的です

## OSが果たす機能について
PC上で動作するプログラム同士が混乱しないように制御する機能があり、主に、「ジョブ管理、タスク管理、記憶管理、ファイル管理」をします。

これらの役割は、「**カーネル(制御プログラム)**」と呼ばれるソフトウェアとハードウェアの橋渡をしてくれるプログラムによって行われています。

カーネルのイメージは以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763692/05f9ff39-5ae3-8e65-c25d-a9b8939134a2.png)


順に機能を見ていきましょう。

### プロセス管理
- システム上で実行される全てのプロセス（プログラムのインスタンス）を管理します
- これには、プロセスの作成、スケジューリング、終了などが含まれます

### ジョブ管理
- コンピューター上で実行される処理のひとまとまりのことを「**ジョブ**」といいます
- **ジョブ**の実行を監視・制御し、どのジョブにどのくらいの時間CPUを割り当てるか、複数のジョブをどのようにスケジューリングするか、といったことを管理します

### タスク管理
- ジョブはタスクという単位に細分化されます
- タスクごとにCPUが割り当てられます
- カーネルはCPUの処理効率を考慮して、どのようにタスクを処理するかを管理します

### 記憶管理
- CPUで処理される命令は主記憶に読みだされますが、主記憶のどの領域を確保するのかを管理する必要があります
- カーネルはこの記憶空間の割り当てや管理も行っています

### ファイル管理
- コンピューターが実行するプログラムなどはファイルの形でストレージなどに保管されます
- このときカーネルは、ファイルシステムと呼ばれる仕組みで論理的にファイルを配置し、それらを効率的に管理します
- メインとなる場所から階層的に枝分かれした構造になっていて、パスによって場所を指定してファイルにアクセスすることができます

### デバイスドライバの管理
- 「キーボード、マウス、ストレージデバイス」など、様々なハードウェアデバイスとの通信を管理するデバイスドライバの役割を持っています
- ハードウェアごとにインストールが必要ですが、カーネルの代わりにハードウェアの制御を行ってくれます

### 言語プロセッサ
- CやJava、Pythonといった高級言語で書かれたプログラムは、そのままではコンピューターが理解することはできません。コンピューターが理解できる機械語に翻訳する必要があります

- **言語プロセッサ**は、このような高級言語（プログラミング言語）と機械語の間の橋渡をしてくれます

- コンパイラやインタプリタ、アセンブラなどがこれに当たります

### サービスプログラム
- ユーザーがプログラムの実行をすることを手助けするプログラムです
- OSをインストールするとついてくるテキストエディタなどもこれに含まれます

### システムコールとセキュリティ
- アプリケーションがシステムリソースを安全に使用できるようにするためのインターフェースも提供します
- 不正アクセスやマルウェアからシステムを保護する重要な役割も果たします

## カーネルの種類
主に以下の4つが挙げられます。
**モノリシックカーネル**
- 全てのシステムサービスとドライバが単一の大きなプロセスとして実行される設計です。
- LinuxやWindowsのようなOSでは、このタイプのカーネルが採用されています

**マイクロカーネル**
- カーネル自体は最小限の機能のみを持ち、残りのサービスはユーザースペースで実行される別のプロセスとして存在します
- これにより、より安全かつ柔軟なシステム設計が可能になります

**ハイブリッドカーネル**
- モノリシックカーネルとマイクロカーネルの中間に位置する設計です
- Windows NTは、このタイプのカーネルを使用しています

**エクソカーネル**
- アプリケーションにより多くの制御を提供することに焦点を当てた、非常に抽象化されたカーネル設計です

OSの種類や役割を見ていきましたが、実際どういったメリットがあるのか気になりますよね。

## OSのメリット
### 開発者の負担を軽減
OSはCPUやメモリなどのハードウェア管理を行い、ソフトウェア開発者がハードウェアの詳細を意識せずにプログラミングできる環境を提供します。
これにより、開発者はハード固有の情報を気にしないで済みます。

OSがなかった場合、開発者は各デバイスのCPUやメモリの型番を調査し、それに最適な処理をプログラムする必要があります。
また、ハードウェアが変更されるたびにプログラムを調整する手間も発生します。
こうした負担を軽減できるのも、OSの存在のおかげです。


### ユーザーの利便性向上
OSがなければ、ユーザー自身がすべてのハードウェア管理を行わなければなりません。
これには*高度な技術的知識*が必要で、多くのユーザーにとって大きな負担となります。

例えば、私たちは通常、複数のアプリケーションを同時に使うことが多いです。
ブラウザを開きながらドキュメントを編集したり、音楽を聴きながらメールをチェックしたりしますが、OSがなければこうしたマルチタスクも難しいです。
どのタイミングでどのくらいのCPUリソースを使用するかを自分で考える必要がないのも、「**OSの恩恵**」です。


次に押さえておきたい概念が「**デーモン**」や「**ライブラリ**」についてです。

## デーモン(daemon)
Linuxシステムには、デーモンと言う**常駐プログラム**が存在します。
つまり、バックグラウンドで動作するソフトウェアで、基本的にサーバー関連のソフトウェアの多くがデーモンの形で実行されます。
「httpd」・「sshd」のように、後ろに「d」がつくとdaemonであることが多いです。

:::note
余談ですが、この常駐プログラム「デーモン(daemon)」は悪魔という意味ではなく、「**ダイモン**」という神々と人間の仲介役を果たす神霊を指しているらしいです🤔
:::

しかし、クライアントからのリクエストがないにも関わらず、常に起動、待機状態にあるデーモンも存在します。その結果、リソースを無駄に多く消費してしまい、システムを圧迫することになってしまいます。
これを、**スーパーサーバー**（**super server**）という機能が解決してくれています。


## ライブラリ
**ライブラリ**は、システムコールを使ってカーネル機能を呼び出すものです。
コマンドやアプリケーションはカーネルを直接呼び出さず、ライブラリを仲介してカーネルの機能を利用しています。

全体像は以下の画像の通りです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763692/46a324c3-a968-45c3-8d65-38f02bd28058.png" alt="image" width="500px">

## システムコールについて
ファイル読み込みプログラムを例に考えていきましょう。
プログラムには `read()` というファイルを読み込む命令があります。
この `read()` 命令が実行されると、 `read() システムコール`が呼び出され、さらにライブラリの`read()`用プログラム（**ラッパールーチン**）が起動します。

**ラッパールーチン**は、CPUに対して割込み命令（`int`命令）を発行します。割込み命令が実行されると、CPUは現在の処理を一時停止し、カーネルのシステムコールハンドラ[^2]を起動します。
つまり、システムコールは「*カーネルの機能を割込み命令で呼び出す役割*」を持っています。

システムコールハンドラが起動した後、 `read() システムコール`に対応する `sys_read()`プログラム（**サービスルーチン**）が呼び出されます。
この `sys_read()`サービスルーチンはHDDからデータを読み取り、呼び出し元のソフトウェアにデータを渡します。

:::note 
**ポイント**
システムコール経由でカーネル機能を利用すると、ハードウェアに対する命令用のプログラムを書く手間が省けたり、ソフトウェアを簡単に移植することが可能です
:::

## さいごに
今回は、OSについてLinuxカーネルや種類に触れてまとめてみました！
OSが持つ多様な役割や、その重要性について理解を深めていただけたなら幸いです。

## 参考文献
https://envader.plus/article/7

https://manual.atmark-techno.com/armadillo-guide/armadillo-guide-1_ja-2.0.0/ch02.html

https://milestone-of-se.nesuke.com/sv-basic/architecture/operating-system/

https://itmanabi.com/operating_system/

https://qiita.com/yokoto/items/a2536bd1b81b42479bba


[^1]:**ディストリビューション**：Linuxカーネルを基盤に、必要なソフトウェアパッケージや設定を追加して構成された、完全なオペレーティングシステムのこと
`Ubuntu`や`CentOS`, `Debian`が有名です
[^2]:**ハンドラ**：イベント発生を受け取った場合に、カーネル機能を利用して、目的の処理をするプログラム
カーネル内部には各イベントごとにハンドラが用意されています