Skip to content
Published on

[オペレーティングシステム] 01. オペレーティングシステムとは何か

Authors

オペレーティングシステムとは何か

オペレーティングシステム(Operating System)は、コンピュータハードウェアを管理し、アプリケーションプログラムに実行環境を提供するソフトウェアである。ユーザーとハードウェアの間の仲介者の役割を果たす。

コンピュータシステムの4つの構成要素

コンピュータシステムは大きく4つの要素で構成される。

  1. ハードウェア: CPU、メモリ、I/Oデバイスなどの基本リソースを提供する
  2. オペレーティングシステム: ハードウェアを制御し、アプリケーションプログラム間のリソースを調整する
  3. アプリケーションプログラム: ワードプロセッサ、コンパイラ、Webブラウザなど、ユーザーの問題を解決する
  4. ユーザー: 人間、他の機械、または他のコンピュータ

オペレーティングシステムの役割

オペレーティングシステムは観点によって2つに定義できる。

  • リソースアロケータ(Resource Allocator): CPU時間、メモリ空間、記憶装置、I/Oデバイスなどすべてのリソースの管理者
  • 制御プログラム(Control Program): プログラムの実行を制御し、エラーや不適切な使用を防止する

より一般的な定義として、オペレーティングシステムはコンピュータで常に実行されているプログラムである**カーネル(kernel)**である。


コンピュータシステム構成

割り込み(Interrupt)

割り込みは、ハードウェアがCPUにイベントの発生を通知するメカニズムである。I/Oデバイスが作業を完了すると、割り込みを通じてCPUに信号を送る。

[割り込み処理過程]

1. I/Oデバイスが作業完了
2. デバイスコントローラが割り込み信号を発生
         |
         v
3. CPUが現在の作業を中断
4. 現在の状態(PC、レジスタ)をスタックに保存
         |
         v
5. 割り込みベクタを通じてISRアドレスを確認
6. ISR(Interrupt Service Routine)を実行
         |
         v
7. 保存された状態を復元
8. 中断された作業を再開

割り込みの種類は以下の通りである。

  • ハードウェア割り込み: I/Oデバイス、タイマーなどによって発生
  • ソフトウェア割り込み(トラップ): エラー(ゼロ除算)やシステムコールによって発生
// 割り込みベクタテーブルの概念図
// 各割り込み番号に対応するISRアドレスを格納

typedef void (*isr_handler_t)(void);

isr_handler_t interrupt_vector_table[256];

// 割り込み番号 0: ゼロ除算例外
// 割り込み番号 1: デバッグ例外
// 割り込み番号 14: ページフォルト
// ...
// 割り込み番号 32~255: ユーザー定義(I/Oデバイスなど)

void handle_interrupt(int interrupt_number) {
    // 割り込みベクタからハンドラを探して実行
    isr_handler_t handler = interrupt_vector_table[interrupt_number];
    if (handler != NULL) {
        handler();
    }
}

記憶装置の階層構造

記憶装置は速度、コスト、揮発性に応じて階層を形成する。

[記憶装置の階層]

      高速 / 高価 / 小容量
        +-----------+
        | レジスタ    |    < 1ns
        +-----------+
        | キャッシュ(L1)|    ~1ns
        +-----------+
        | キャッシュ(L2)|    ~4ns
        +-----------+
        | キャッシュ(L3)|    ~10ns
        +-----------+
        | メインメモリ  |    ~100ns     (揮発性)
        +-----------+
        |   SSD     |    ~100us     (不揮発性)
        +-----------+
        |   HDD     |    ~10ms
        +-----------+
      低速 / 安価 / 大容量

キャッシング(Caching)は、遅い記憶装置のデータを速い記憶装置に一時的にコピーする技法である。同じデータに再アクセスする際、速い記憶装置から読み取るため性能が向上する。

I/O構造

I/O操作はCPUとデバイスコントローラ間のやり取りによって行われる。

  • プログラムドI/O: CPUが直接データを1バイトずつ転送(非効率的)
  • 割り込み駆動I/O: デバイスの準備ができたら割り込みでCPUに通知
  • DMA(Direct Memory Access): 大量データ転送時、CPU介入なしにデバイスコントローラが直接メモリにアクセス
[DMA動作過程]

CPU                     DMAコントローラ         メモリ
 |                           |                   |
 |-- DMA転送要求 ----------->|                   |
 |   (ソース, 宛先, サイズ)    |                   |
 |                           |--- データ転送 ----->|
 |                           |--- データ転送 ----->|
 |                           |--- データ転送 ----->|
 |<-- 転送完了割り込み -------|                   |
 |                           |                   |

コンピュータシステムアーキテクチャ

マルチプロセッサシステム

現代のコンピュータはほとんどがマルチプロセッサシステムである。利点は以下の通りである。

  1. スループットの向上: N個のプロセッサがあれば処理速度が向上する(ただしN倍ではない)
  2. スケールメリット: 複数の単一プロセッサシステムよりコスト効率が良い
  3. 信頼性の向上: 1つが故障しても全体のシステムは動作を継続する(graceful degradation)

マルチプロセッサシステムには2つのタイプがある。

  • 非対称マルチプロセッシング(AMP): 1つのマスタープロセッサがシステムを制御し、残りは指示に従う
  • 対称マルチプロセッシング(SMP): 各プロセッサが対等な立場でOS機能を実行する
[SMPアーキテクチャ]

  CPU 0        CPU 1        CPU 2
 [レジスタ]   [レジスタ]   [レジスタ]
 [キャッシュ]  [キャッシュ]  [キャッシュ]
    |             |             |
    +------+------+------+------+
           |             |
      [共有メモリ]    [I/Oシステム]

マルチコアシステム

マルチコアプロセッサは1つのチップに複数のコアを含む。同じチップ内で通信するため、別々のプロセッサ間の通信より高速で消費電力も少ない。

[マルチコアプロセッサ構造]

+--------------------------------------+
|           1つのCPUチップ               |
|  +--------+  +--------+  +--------+ |
|  | コア 0  |  | コア 1  |  | コア 2  | |
|  |[L1Cache]|  |[L1Cache]|  |[L1Cache]| |
|  +--------+  +--------+  +--------+ |
|         +----------+                  |
|         | L2キャッシュ|                  |
|         +----------+                  |
+--------------------------------------+
              |
         [メインメモリ]

NUMA(Non-Uniform Memory Access)

CPU数が増えるとシステムバスがボトルネックになる。NUMAは各CPUに独自のローカルメモリを提供することでこの問題を解決する。

[NUMAアーキテクチャ]

+------------------+   インターコネクト  +------------------+
|     ノード 0      |<================>|     ノード 1      |
| CPU 0  CPU 1    |                   | CPU 2  CPU 3    |
| [ローカルメモリ 0] |                   | [ローカルメモリ 1] |
+------------------+                   +------------------+

ローカルメモリアクセス: 高速 (~100ns)
リモートメモリアクセス: 低速 (~300ns)

オペレーティングシステムの動作方式

デュアルモード動作

OSはユーザープログラムの誤った動作からシステムを保護しなければならない。そのために2つの実行モードを提供する。

  • ユーザーモード(User Mode): アプリケーションプログラムの実行。特権命令は実行不可
  • カーネルモード(Kernel Mode): OSコードの実行。すべての命令が実行可能
[モード切り替え過程]

ユーザーモード                        カーネルモード
    |                                   |
    |-- システムコール呼び出し ---------->|
    |   (トラップ発生、モードビット 0)     |
    |                                   |-- システムコール処理
    |                                   |
    |<-- システムコール復帰 -------------|
    |   (モードビットを1に復元)           |
    |                                   |
// システムコールの例: ファイル読み取り
// ユーザープログラムからread()を呼び出す

#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>

int main() {
    char buffer[1024];

    // open()はシステムコールを通じてカーネルモードに切り替え
    int fd = open("data.txt", O_RDONLY);

    // read()もシステムコール - カーネルがI/Oを実行
    ssize_t bytes = read(fd, buffer, sizeof(buffer));

    printf("読み取りバイト数: %zd\n", bytes);
    close(fd);
    return 0;
}

タイマー(Timer)

タイマーはプログラムがCPUを独占することを防止する。一定時間が経過すると割り込みを発生させてOSに制御を戻す。

  • 固定タイマー: 一定間隔で割り込みを発生
  • 可変タイマー: 固定クロック+カウンタで実装。カウンタが0になると割り込みを発生

リソース管理

プロセス管理

プロセスは実行中のプログラムである。OSは以下を実行する。

  • プロセスの生成と削除
  • プロセスの一時停止と再開
  • プロセス同期メカニズムの提供
  • プロセス間通信(IPC)メカニズムの提供
  • デッドロック処理メカニズムの提供

メモリ管理

メインメモリはCPUが直接アクセスできる唯一の大容量記憶装置である。OSは以下を管理する。

  • メモリのどの部分が使用中で、誰が使用しているかを追跡
  • どのプロセスとデータをメモリにロード・アンロードするかを決定
  • 必要に応じてメモリ空間の割り当てと解放

記憶装置管理

OSは記憶装置の物理的特性を抽象化し、論理的なファイルの概念を提供する。

  • ファイルシステム管理: ファイルの作成/削除、ディレクトリ管理、アクセス制御
  • 大容量記憶装置管理: ディスクスケジューリング、空き領域管理、記憶装置の割り当て
  • キャッシング: 頻繁にアクセスするデータをより高速な記憶装置に保持

I/Oサブシステム

OSのI/Oサブシステムはハードウェアデバイスの違いを隠蔽する。

  • バッファリング(Buffering): 転送中のデータを一時的に保存
  • キャッシング(Caching): 頻繁に使用するデータのコピーを保持
  • スプーリング(Spooling): プリンタなどのデバイスの出力をキューに保存

保護とセキュリティ

  • 保護(Protection): OSが定義したリソースに対するプロセス/ユーザーのアクセスを制御するメカニズム
  • セキュリティ(Security): 外部または内部からの攻撃を防御する。認証、権限付与、監査などを含む

各ユーザーには一意のID(UID)が付与され、グループID(GID)を通じてグループ単位のアクセス制御も可能である。権限昇格(privilege escalation)は一時的により高い権限を得るメカニズムで、Unixではsetuidビットによって実装される。


まとめ

[オペレーティングシステム核心概念のまとめ]

+------------------------------------------+
|          アプリケーションプログラム          |
+------------------------------------------+
|       オペレーティングシステム(カーネル)    |
|  +------+ +--------+ +--------+ +------+ |
|  |プロセス| |メモリ   | |ファイル | |I/O   | |
|  |管理   | |管理     | |システム | |管理   | |
|  +------+ +--------+ +--------+ +------+ |
+------------------------------------------+
|              ハードウェア                   |
|  CPU / メモリ / ディスク / I/Oデバイス      |
+------------------------------------------+

オペレーティングシステムは、ハードウェアとユーザーの間でリソースを管理し、プログラム実行環境を提供し、システムを保護する中核的なソフトウェアである。デュアルモード動作、割り込み、タイマーなどのハードウェアサポートを活用して、安全で効率的なシステム運用を保証する。