OS
OSとは
コンピューターシステムにおいてハードウェアとアプリケーションの橋渡しを行う。
- ハードウェアを抽象化してアプリケーションのインターフェースを提供する
たとえば、外部記憶装置にファイルを書き込む場合、その外部記憶装置はSATA接続のハードディスクかもしれませんし、NVMe接続のSSDかもしれませんし、はたまたUSBメモリかもしれません。しかも、各ディスクのファイルシステムは全部違うかもしれません。そんな状況でもアプリケーションは書き込み先のファイルをfopenしてwriteするだけで、書き込み先のデバイスが一体何なのかを気にせず書き込むことができます。これが「ハードウエアを抽象化して、アプリケーションにインターフェイスを提供する」ということなのです
- 計算資源を複数のアプリケーションに分配する
また、CPUは一般的に1コアで1つのアプリケーションしか動作させることができません。それでも、私たちはCPUのコア数より多くのアプリケーションを起動し、まるで同時に動いているかのように感じることができます。これは、OSがCPUの時間を細かい単位に分割し、各アプリケーションを切り替えつつ実行するよう調整しているからなのです。これが「計算資源を複数のアプリケーションに分配する」という機能の例 です。
OSの基本構造
カーネルはコンピューターの基本的な操作を行う機能を格納したライブラリ群のようなもので、コマンドやライブラリはこのカーネルの中にあるライブラリ(システムコール)を呼び出す。 例としてlsコマンドはC言語で書かれているが、その中でgetdentsというシステムコールを呼びファイルのリストを取得している。 つまりプロセスはOS内のコマンドやライブラリを呼び出し、そのコマンドやライブラリはカーネル内のシステムコールを呼び出している。 ここからはオペレーティングシステムのコンセプトを理解する。 以下のように追記すると、OSの基本構造についての詳細な情報が得られます。
-
コマンドやライブラリ:
- ユーザ空間: アプリケーションやユーザープログラムが動作する領域。
- シェル: ユーザーがコマンドを入力して実行するインターフェース。
- システムコールインターフェース: ユーザープログラムがカーネル機能を呼び出すためのAPI。
- ライブラリ: 共通機能を提供するコードの集まり。プログラムが効率よく開発・実行できるように支援する。
- アプリケーションプログラム: ユーザーが利用するためのソフトウェア(例: ブラウザ、エディターなど)。
- ユーザ空間: アプリケーションやユーザープログラムが動作する領域。
-
カーネル:
- プロセ スマネージャー: プロセスの作成、スケジューリング、終了を管理する。
- プロセス: プログラムの実行単位で、独立したアドレス空間を持つ。
- スレッド: プロセス内の実行単位で、プロセス内のリソースを共有する。
- メモリマネージャー: プロセスが使用するメモリの割り当てと解放を管理する。
- ファイルシステム: ディスク上のファイルの読み書き、作成、削除を管理する。
- デバイスドライバー: ハードウェアデバイスとの通信を管理する。
- システムコールインターフェース: ユーザープログラムからカーネル機能への呼び出しを提供するAPI。
- セキュリティマネージャー: アクセス権限の管理やユーザー認証を行う。
- プロセ スマネージャー: プロセスの作成、スケジューリング、終了を管理する。
-
デーモンやサービス:
- デーモン: バックグラウンドで動作するプロセスで、システムのサービスやメンテナンスを行う。
- サービス: 特定の機能を提供するプログラムで、ネットワークサービス(例: Webサーバ、データベースサーバ)などが含まれる。
-
ネットワークスタック:
- プロトコルスタック: ネットワーク通信を行うためのプロトコルを実装する。
- ネットワークドライバー: ネットワークインターフェースカード(NIC)との通信を管理する。
-
ユーザーインターフェース:
- グラフィカルユーザーインターフェース(GUI): ユーザーが視覚的に操作するためのインターフェース。
- コマンドラインインターフェース(CLI): ユーザーがテキストベースでコマンドを入力するためのインターフェース。
このように、OSは多くの構成要素で成り立っており、それぞれが連携してシステム全体の機能を提供します。
OSとCPUの関係
OSとCPUの関係を理解するには、OSがどのようにCPUを管理し、プロセスやスレッドを実行するかを知ることが重要です。以下に、その関係を説明します:
-
CPUスケジューリング:
- プロセススケジューリング: OSはCPUの時間を複数のプロセス間で公平に分配する必要があります。これをCPUスケジューリングと呼びます。スケジューリングアルゴリズムには、ラウンドロビン、優先度スケジューリング、最短ジョブ優先などがあります。
- スレッドスケジューリング: マルチスレッドアプリケーションの場合、OSは各スレッドに対してもCPU時間を割り当てます。スレッドは同じプロセス内でメモリやリソースを共有するため、スレッドスケジューリングは効率的なリソース利用を実現します。
-
コンテキストスイッチ:
- プロセスやスレッドの実行が切り替わるとき、OSは現在のプロセスやスレッドの状態を保存し、新しいプロセスやスレッドの状態をロードします。これをコンテキストスイッチと呼びます。コンテキストスイッチはオーバーヘッドがあるため、効率的に行う必要があります。
-
割り込み処理:
- ハードウェア割り込み: 外部デバイス(キーボード、マウス、ディスクドライブなど)がCPUに割り込みを発生させ、OSに処理を要求します。OSは現在のタスクを一時停止し、割り込み処理を行います。
- ソフトウェア割り込み: プログラムが特定の条件を満たしたときに割り込みを発生させます。これにより、OSは適切な処理を行うことができます。
-
マルチコアプロセッシング:
- マルチコアCPU: 近代的なCPUは複数のコアを持ち、各コアが独立して命令を実行できます。OSはこれらのコアを利用して、並行処理を行い、システム全体のパフォーマンスを向上させます。
- スレッドとプロセスの並列実行: マルチコアCPUを利用することで、複数のスレッドやプロセスが同時に実行されます。OSはスケジューラを使って、どのスレッドやプロセスをどのコアで実行するかを管理します。
CPUの役割
-
命令実行:
- フェッチ: CPUはメモリから命令を読み取ります。
- デコード: 読み取った命令を解釈します。
- 実行: 命令に基づいて計算を行います。
- 書き戻し: 結果をレジスタやメモリに書き込みます。
-
演算処理:
- CPUは算術演算(加算、減算、乗算、除算など)や論理演算(AND、OR、NOTなど)を高速に行います。
-
レジスタ管理:
- レジスタはCPU内部の高速なメモリで、データや命令の一時的な保存に使用されます。
-
キャッシュ管理:
- L1/L2/L3キャッシュ: キャッシュはメモリへのアクセス時間を短縮するための高速メモリです。CPUはキャッシュを利用して、頻繁にアクセスするデータを高速に取得します。
まとめ
- OSの役割: プロセスとスレッドの管理、メモリ管理、ファイルシステム管理、デバイス管理、ネットワーク管理、セキュリティ管理など。
- CPUの役割: 命令の実行、演算処理、レジスタとキャッシュの管理、割り込み処理など。
OSはCPUのリソースを効率的に管理し、複数のタスクを並行して実行するための機能を提供します。CPUはOSの指示にしたがって命令を実行し、システム全体のパフォーマンスを維持します。この相互作用により、ユーザーは効率的でスムーズなコンピューティング体験を享受できます。
プロセス管理(プロセスマネージャー)
- プロセス プログラムの実行単位であり、CPU時間単位で割り振られる。状態(ステート)があり、現在処理中であるRunning状態だったり、実行可能状態であるReadyなどが存在。 CPUがプロセスを実行する場合、そのプロセスが持つメモリデータに対して演算を行う。 プロセスはテキストセグメントとデータセグメントからなる構造データをメモリ上に持っている。 テキストセグメント プログラムの命令列 データセグメント PDA (Processor Data Area)と呼ばれる、プロセッサの情報やプロセス管理用のデータ領域 データ領域と呼ばれる、定数等が置かれる静的領域と、通常の変数等が置かれるヒープ領域からなる領域 スタック領域と呼ばれる一時的なデータ保管領域
ファイルディスクリプター(fdともいう)
ソケットを扱う上で切り離せないのがファイルディスクリプター
fdとはファイルやソケットなどを抽象化した仕組み。