基礎●○○○○

OS

Operating System ・ おーえす

ハードウェアを管理して使いやすい抽象に変え、アプリケーションに実行環境を提供する基盤ソフトウェア。

✦ 30秒で試す — 航海アプリはハードウェアに一度も直接触れずに動いている同時に動いているように見えるプログラムは、いくつまで?予想してみる

概要

OS(オペレーティングシステム)は、コンピュータのハードウェア資源——CPU・メモリ・ディスク・ネットワーク——を一手に管理し、アプリケーションに「使いやすい形」で貸し出す基盤ソフトウェアです。私たちが書くプログラムは、CPUに直接命令を並べているように見えて、実際にはOSが用意した窓口(システムコール)を通してハードウェアを間接的に使っています。代表例は Linux、Windows、macOS、そしてスマートフォンの Android や iOS で、サーバの世界では Linux が圧倒的多数を占めます。

普段の開発でOSを意識する場面は多くないかもしれません。しかし「ファイルを開く」「ネットワークに接続する」「メモリを確保する」といった当たり前の操作はすべてOSの機能ですし、プロセスやスレッド、ソケットといった語彙はどれもOSが提供する抽象の名前です。性能問題や障害の調査を突き詰めていくと、最終的にこの層に行き着きます。

なぜ生まれたか

初期のコンピュータには OS がなく、プログラムはハードウェアを直接操作していました。プログラムを1本動かすたびに機械を占有し、ディスクやプリンタの制御コードも各プログラムが自前で書く必要がありました。「ハードウェアの細部を知る仕事」と「解きたい問題を解く仕事」が分離されておらず、機種が変わればプログラムも書き直しでした。

当時のコンピュータは非常に高価だったため、まず求められたのは機械を遊ばせないことです。1950年代半ばには、仕事を次々に自動で流すバッチ処理のためのモニタ(IBM 704 向けの GM-NAA I/O など)が現れ、共通の入出力処理を肩代わりするようになりました。次に、1本が入出力を待つ間に別の仕事を進める多重プログラミングが生まれ、複数のプロセスのメモリを互いに守る必要が出てきます。1961年に MIT で動いた CTSS に始まるタイムシェアリングは、多数の利用者が端末から同時に対話できるように、タイマで仕事を強制的に切り替えました。こうして「資源を配分し、互いを守り、ハードウェアの違いを共通の窓口で吸収する」専門のソフトウェア——OS——が形になります。1969年にベル研究所の Ken Thompson と Dennis Ritchie が作り始めた UNIX の設計(プロセスという実行単位、すべてをファイルとして扱う考え方、小さなシステムコールの組)は、現代の Linux や macOS にまで受け継がれています。

詳細

OS は「抽象」を配る

OS の仕事を一言でいえば、有限で機種ごとに癖のあるハードウェアを、アプリにとって扱いやすい「抽象」に作り替えて配ることです。CPU のコアは数個しかありませんが、OS はそれを時間で切り分けて、各プロセスに「CPU を独占している」ように見せます。物理メモリの番地は1つしかありませんが、OS は番地を付け替えて、各プロセスに「自分専用の番地空間」を見せます。ディスクはただのブロックの列ですが、OS はそれに名前と階層を与えてファイルにします。ネットワークカードはパケットを出し入れするだけですが、OS はそれを相手とつながった「接続」にします。

ハードウェア(有限・機種ごとに違う)カーネル(特権モード)OS が見せる抽象(アプリが使う)CPUコアは数個だけメモリ番地は1組だけディスクブロックの列NICパケットの出入りスケジューラが時間を切り分けるページ表で番地を付け替えるファイルシステムが名前と階層を付けるTCP/IP のスタックが接続にするプロセス・スレッドCPU を独占しているように仮想メモリ自分専用の番地空間ファイル名前で読み書きできるソケット相手と話す口
ハードウェア資源と、OS が見せる抽象の対応。アプリが触るのは右側だけで、左側との間をカーネルが取り持つ

図の4本の矢印は、それぞれが1つの語彙です。CPU を時間で切り分けてプロセスやスレッドに配るのがスケジューラ、番地を付け替えて各プロセスを隔離するのが仮想メモリ、ディスクのブロックに名前と階層を与えるのがファイルシステム、ネットワークカードの上に TCP/IP を積んでアプリにソケットという口を渡すのがプロトコルスタックです。抽象のおかげで、アプリは機種の違いを知らずに書け、互いのメモリを壊さずに同居でき、同じ read/write でファイルにも通信にもアクセスできます。

カーネルとシステムコール

この変換を担う中核がカーネルです。カーネルはCPUの特権モードで動き、ハードウェアに直接触れられる唯一の存在です。アプリケーションはユーザーモードという制限された環境で動き、抽象を使いたいときはシステムコールという決まった入口からカーネルに依頼します。デバイスからの知らせは割り込みとしてカーネルに届きます。この二層の仕組みのおかげで、行儀の悪いプログラムがハードウェアを壊したり、他のプログラムのメモリを勝手に読んだりすることを防げます(詳しい構造はカーネルの記事で図にしています)。

OS という言葉は、カーネルだけでなく、その上で動くシェル・標準ライブラリ・デーモン(常駐プログラム)・GUI まで含めて使われます。「Linux」も厳密にはカーネルの名前で、Ubuntu や Debian のような配布物(ディストリビューション)は、Linux カーネルに GNU のツール群などを組み合わせた OS 全体を指します。

サーバ運用と現代のインフラでの位置づけ

Web サービスを運用するうえで、OS の知識は「異常時に効く」知識です。CPU 使用率・メモリ使用量・ディスク I/O・開いているファイルディスクリプタ数といった OS レベルの指標は監視の基本項目ですし、top や ps、ログの調査といった障害対応の道具はすべて OS の機能に根ざしています。「メモリが足りずプロセスが OOM Killer に殺された」「ファイルディスクリプタの上限に達して接続を受けられない」といった障害は、OS を知らないと原因にたどり着けません。

また、現代のインフラ技術は OS の機能の応用として理解できます。仮想マシンはハードウェアごと仮想化して複数の OS を1台の物理マシンに同居させる技術であり、コンテナは Linux カーネルの隔離機能(namespace、cgroup)を使って「カーネルは共有しつつプロセスを隔離する」技術です。サーバレスやクラウドコンピューティングは OS の管理を事業者側に委ねる仕組みですが、その裏側でも必ず OS が動いています。抽象化が進むほど OS は見えなくなりますが、消えたわけではなく、誰かが代わりに面倒を見ているだけ——この視点を持っておくと、レイヤをまたいだトラブルシューティングに強くなります。

試問

OS は、CPU・メモリ・ディスク・ネットワークカードという限られたハードウェアを、アプリにとって使いやすい姿に作り替えて貸し出しています。アプリの側から見える8つの「使いやすい姿」は、それぞれどのハードウェアを作り替えたものでしょうか。

✦ 命題挑戦中

アプリから見える8つの「使いやすい姿」を、元になっているハードウェアごとに仕分けよ

CPU数個のコアで計算する
メモリ番地の付いた1本の記憶
ディスクただのブロックの列
ネットワークカードパケットを出し入れするだけ

項目を選んでから、入れる箱を選びます