🍣

【OS】「カーネル」、「システムコール」、「シェル」、「タスク管理」の基本

2 min read

前に投稿した記事です.アカウント名を変えたので再投稿しました

導入

コンピュータはプログラム可能で自由なマシンですが,実際ユーザやプログラマが安全にコンピュータを利用するためにオペレーティングシステムは様々な機能を提供しています.

その例として,今回は「カーネル」,「シェル」,「システムコール」,「タスク管理」について書きます.

プログラミングを始めたばかりの頃,僕はif文やfor文が理解できても,なぜ"Hello, World"が画面に出力されるのかわかりませんでした.これは最もな疑問です.プログラムの入門書には基本的な制御構文の説明はあるけれど,printf関数がどのように実装されているのかは書かれていません.これの答えはシステムコールを通してカーネルの機能を呼び出しているからです.

#include <stdio.h>

int main() {
    printf("Hello, World"); // ここでシステムコールを呼んでいる.
    return 0;
}

では,そもそもカーネルとは何でしょう.

カーネル

カーネル(kernel)は英語で「中核」を意味します.カーネルは,コンピュータのハードウェアとソフトウェアを仲介するソフトウェアです.また,次にような機能を提供します.

  • プロセス管理
  • メモリ管理
  • デバイス管理
    など

なので,このカーネルの機能を使うことでコンピュータは制御構文や演算以外の処理(画面に文字を出力する等)のハードウェアを利用する事ができます.そして,そのカーネルのアクセスするインターフェースとして,システムコールとシェルがOSから提供されています.

システムコール

システムコールは,アプリケーションからカーネルの機能を利用するためのインターフェースです.
パソコンで動いているアプリはシステムコールを上手く使うことで実現しています.

シェル

シェルは,ユーザがコマンドを用いてカーネルの機能を利用するためのインターフェースです.
ハッカー映画で黒い画面で対話的にコンピュータを動かしているシーンはまさにシェルを使っています.

ユーザモードとカーネルモード

CPUはプログラマに従順なので,プログラマの命令ならなんでも言うことを聞いてしまいます.これは危険なのでCPUには「ユーザモード」と「カーネルモード」という2つにモードがあります.この2つは,単純に「カーネルモード」という何でもできるモードと,それに制限を与えた「ユーザモード」があるということです.OSはこのモードの切り替えを担当しています.
こうすることで,複数のプロセス(プログラムの実行単位)が同じデバイスを同時操作してしまうようなことを防げるようになるのです.

プロセス管理

プロセス(タスクとも呼ばれる)は実行中のプログラムの単位のことです.ハードウェア的に捉えると,CPUで実際に演算をしていたり,メインメモリの領域を使っているようなものです.現代的なコンピュータはマルチプロセスで動作します.古いコンピュータはシングルプロセスで動いていました.

シングルプロセス

シングルプロセスとはOSが実行を管理できるプロセスがただ1つであるということです.よって前のプロセスが終了するまで次のプロセスは実行できません.これには様々な問題点があります.

具体的には,

  • 入出力は終わるまで,CPUが待機しなければならない.
  • 現在実行中のプロセスより優先度が高いプロセスがあっても現在のプロセスが終了するまで他のプロセスを実行できない.

このような問題点を解決するためにマルチプロセスがあります.

マルチプロセス

マルチプロセスは1つのCPUで,複数のプロセスを同時に処理しているように見せかけます.これは,コンピュータが超高速にプロセスを切り替えることで実現されています.これによりユーザは音楽を聞きながらネットサーフィンをすることだって可能になるのです.

マルチプロセスの種類

マルチプロセスには「ノンプリエンプティブなマルチタスク」と「プリエンプティブなマルチタスク」があります.「ノンプリエンプティブなマルチタスク」は,各プロセスが明示的にプロセスを譲ります.「プリエンプティブなマルチタスク」は,OSが実行中のプロセスからCPUを横取りして,別のプロセスにCPUを割り当てます.

世の中のコンピュータはの殆どは「プリエンプティブなマルチタスク」を採用しています.

プロセスのスケジューリング

マルチプロセスは複数のプロセスを超高速に切り替えてあたかも同時に実行しているように見せかけていました.しかし,プロセスをどのような順番で切り替えるのか.(スケジューリングするのか)これにはいくつか方法があります.

スケジューリング例①)優先度スケジューリング

これは設定された優先度の高いプロセスから実行していくようなスケジューリングです.より優先度の高いプロセスが現れたらそのプロセスに切り替えます.

スケジューリング例②)ラウンドロビンスケジューリング

タイマー割り込みで全プロセスを一定時間で切り替えていきます.(ずっとラウンドロビンは人名だと思っていたが違うらしい.)

このように様々なスケジューリングアルゴリズムがあり,現代的なOSでは様々なスケジューリングアルゴリズムを組み合わせて効率的にプロセスを管理しています.

おわりに

疲れた.
スタバでコレを書いていたけど,スタバのエアコン寒すぎワロタ.じゃあ👋

間違えの指摘は歓迎です.