コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB
コンピューターとOSの役割
2 つのプログラムが、同じ番地にデータを置いたら
ブラウザとエディタを同時に開いているとき、どちらもメモリにデータを置きます。もし両方が「メモリの先頭から順に使う」と決め打ちしていたら、後から書いたほうが、先に書いたほうのデータを踏み潰します。エディタで開いていた文章が、ブラウザのタブを増やした瞬間に化ける、ということが実際に起きます。
これを避けるには、誰かが「あなたはここからここまで」と割り振り、割り振った外へ手を伸ばそうとしたら止める必要があります。その誰かが OS です。おかげでプログラムの側は、自分が物理的にメモリのどこを使っているかを知らないまま書けます。同じアプリを 2 つ起動しても衝突しないのは、2 つとも「自分は先頭から使っている」と思い込んでいて、その思い込みを OS が別々の実体に割り当てているからです。
止める側も本気です。割り当ての外を読み書きしようとしたプログラムは、その場で強制終了させられます。C 言語を書いていて出会う Segmentation fault がまさにそれで、あれはバグが顕在化した瞬間であると同時に、そのバグが機械全体に広がらずに済んだ証拠でもあります。
誰も CPU を譲らなかったら
CPU のコアは、1 つにつき同時に 1 つの命令しか実行できません。それでも 4 コアの機械で数百のプログラムが同時に動いて見えるのは、ごく短い時間で持ち主を入れ替えているからです。
問題は、走っているプログラム自身が「そろそろ譲ります」と言ってくれるとは限らないことです。無限ループに入ったプログラムは永遠に譲りません。譲るかどうかをプログラムに任せた設計では、1 本のバグで機械全体が固まります。
そこでハードウェアのタイマーが数ミリ秒ごとに割り込みをかけ、強制的に制御を OS へ戻します。次に誰を走らせるかを決めるのは、走っているプログラムではなく OS です。
配り方も単純な順番待ちではありません。ファイルの読み込みを頼んだプログラムは、ディスクから返事が来るまで何もできません。この待ち時間に CPU を握らせておくのは無駄なので、OS は待ちに入った相手からいったん取り上げ、走れる別のプログラムに渡します。メモリを配ることと CPU の時間を配ること、この 2 つが OS の中核である資源管理です。
SSD を買い替えたら動かなくなる、を避ける
もう 1 つの仕事が抽象化です。ファイルを保存するとき、アプリは SSD の型番も、どのブロックが空いているかも知りません。開いて、書いて、閉じる。同じ手順でどの機種にも書けます。
ターミナル
echo hello > /tmp/a.txtこの 1 行の裏で、OS はファイルを開き、バイト列を受け取り、その機種のドライバを呼び、書き込みが終わるまで面倒を見ています。もし抽象化が無ければ、アプリは対応したい機種のぶんだけドライバを抱え込み、新しいハードが出るたびに全アプリが書き直しになります。
ついでに 1 つ、OS と画面は別物です。Finder やエクスプローラは OS の上で動くアプリで、画面のないサーバー用 Linux も何ら問題なく動きます。