ablog

不器用で落着きのない技術者のメモ

オペレーティングシステムとは? なぜオペレーティングシステムを学ぶのか?

自分がOSやその下のレイヤーに興味を持っている理由は知識を沢山覚えるより、応用が効く少ない基本的な原理を知ることで楽をしたいからです。
口頭で話すことはあっても文章にまとめたことがなかったのですが、東大の講義向けに書かれた(?)自分で書くよりはるかにすばらしい文章を見つけたので引用させていただきます。このページの「教科書・参考書」とかもとても参考になります。

オペレーティングシステム(OS)とは

すでに自宅などでパソコンを使っている人は多いと思います.マイクロソ フトのWindowsという製品名はほとんどの人が聞いたことがあるでしょう. Linuxというのももはや新聞に載る単語になりました.これらはみなオペレー ティングシステムの実例です.通な人は"Solaris"というOSもある ことを知っているでしょう.

OSはコンピュータを動かすにあたって,最も基本的なソフトウェアです. OSの厳密な「定義」は難しく,左のような言い方でごまかすのが普通です.OS が何か?という問いに対する短い答えを追い求める代わりに,OSのないコン ピュータとそうでないコンピュータの(その上の応用ソフトウェアを作る人の 立場から見た)違いについて簡単に触れるのが有益かと思います.

  • OSのない,「裸の」コンピュータでも,プログラムを作ることは可能です. しかしそれには非常な手間がかかります.まず,コンピュータにつながれた記 憶装置(ハードディスク,CDROM,フロッピーディスク,メモリスティックな ど)や,ネットワークとのデータのやり取りが恐ろしく大変になります.同じ 記憶装置でもディスクとメモリスティックではデータの読み方が違います. 「ディスクのどのトラックの何番目のセクタを読め」,というコマンドを発行 する変わりに「"OS講義案内"というファイルを読みたい」という, より抽象的な命令で,プログラムが必要な情報を入手できれば便利です.OSは このような外部記憶装置に対する,統一的なインタフェースを与え,プログラ ムが,必要な情報がハードディスクにあるのか,フロッピーにあるのか,など の(ほとんどの場合はどうでもいい)違いを考慮せずにプログラムを書くこと を可能にします.
  • それだけではありません.もし一度に動くプログラムが一つだけであれば OSの役目はさほど大きくなかったでしょう.しかし実際にはひとつのコンピュー タ内に同時にウェブブラウザが動き,ワープロが動き,ゲームが動きます.OS のないプログラムでこれを実現しようと思うと大変なことになります.コン ピュータに搭載されているCPUは,与えられた命令列を順に実行するだけの機 械です.裸のコンピュータで,ブラウザ,ワープロ,ゲームを同時に動かした ければ,それらを組み合わせた一つのプログラムを書いて,それぞれの実行を 「少しずつ,代わりばんこに」実行するような処理を,プログラマが書かなく てはなりません.しかしそれは今日のプログラマが行っている作業ではなく, 個々のプログラムはブラウザならブラウザ,ワープロならワープロ「のみ」に 集中し,それらを「代わりばんこにちょっとずつ」実行するのはOSが行ってく れます.
  • 最後に,OSの重要な機能に,保護機能があります.OSのない裸のコンピュー タでは,一つのプログラムが処理を間違えると,コンピュータ全体が機能停止 に陥ることが容易に起こり得ます.ワープロソフトのバグのせいで,コンピュー タ全体が機能停止に陥り,リセットボタンを押す羽目になることが容易に起こ るのです(Windows 98, Windows Meや,昔のMacintoshを利用している人は日常 経験していることと思います).これは,それに対し,基本的な「メモリ保護 機能」を備えたコンピュータは,通常のプログラムが勝手に他のプログラムや OSのデータを破壊することがないように作られています.この機能なくしては プログラム開発が困難になるばかりでなく,複数の利用者が安心して同時に利 用可能なコンピュータを作ることは,そもそも不可能です.


なぜオペレーティングシステムを学ぶのか?

卒業論文,またはその後の研究において,オペレーティングシステムその ものや,ネットワーキング(インターネット),プログラミング言語,セキュ リティ,並列・分散計算など,その他あらゆる,コンピュータの基盤に関わる 研究をしたいと思っている人は,迷わずオペレーティングシステムを学ぶべき です.オペレーティングシステムを学ぶことは,大雑把に言って,コンピュー タソフトウェアが根本的なところで「どう動くか」を学ぶことと同じです.

  • オペレーティングシステムの研究をしたい人にはなんの説明も必要がない でしょう
  • ネットワーキングのように,コンピュータの入出力機構はオペレーティン グシステムの中にインプリメントされています.日々進化するネットワーキン グハードウェアを実際にプログラムから利用可能にするためには,デバイスド ライバと呼ばれるソフトウェアを書く必要がありますが,これを動かすために は,オペレーティングシステムが根本的なところでどう動いているのかを学ぶ 必要があるでしょう.
  • プログラミング言語やライブラリの実装の中には,OSの提供する機能(仮 想記憶など)を駆使したものがあります.たとえばメモリ管理やチェックポイ ンティング(実行中プロセスの状態を退避する)ために,OSの仮想記憶が使わ れます.OSを学ぶと,素人(失礼!)にとっては「摩訶不思議な」機能の実装 方法を理解することが出来ます.
  • セキュリティは,オペレーティングシステムのにならず様々なソフトウェ ア(時にはハードウェア)の連携により実現されるものですが,どのような役 割分担がされていることを知ることは,将来新たな提案をするための第一歩と いえるでしょう.
  • 並列・分散計算は,ネットワーキングやセキュリティなどの技術を組み合 わせて,多数の計算機を用いて高性能な計算を可能にする技術です.そこでは, OSを単なるブラックボックスとして見たのでは,機能や性能上の重要なポイン トをしばしば見失ってしまいます.たとえば,OSは「あたかも各プログラムが 1つのコンピュータを占有しているかのような錯覚」を与えてプログラミング を簡単にしますが,実際には100msとか,そのくらいの間隔でプログラムの間 を切り替えながら実行しています.この事実を知らずにいると,複数のプログ ラムの待ち合わせに,busy wait この言葉の意味がわからなければ授業にきて ください)を用いることが,どのような場合に良く,どのような場合に悪い選 択なのかが理解できません.

私はコンピュータのシステムそのものの勉強がしたいのではなく,コンピュー タを使った情報処理(自然言語,画像,音声,etc.)ができればそれで満足だ, 細かいOSの機能などはどうでもよい,という人もいることでしょう.そのよう な人にも,単位を取る以上の動機付けをあたえるとすると以下のようになるで しょう.

  • まず,およそどんなプログラムもOSの提供する機能を使わずにプログラム ができることはありません.そのようなプログラムはアルゴリズムの授業に出 てくるだけで,実際にはそれらのアルゴリズムを,ディスクやネットワークか らの情報と組み合わせてプログラムを作ります.その意味で,およそプログラ ミングに関わる人は全て,OSが提供する機能(API)を学ぶ必要があります.し かし,APIを学ぶときに,UNIXWindowsのマニュアルとにらめっこするのは, あまり知的なやり方ではないでしょう.そうではなく,どんなOSでも,(まと もなOSならば)提供している「はずの」機能に対する鳥瞰図を得ておき,必要 に応じてマニュアルを見るのが正しい方式です.
  • より重要なことは,マニュアルを読むのでもほとんどの場合,基本的なOS の背景知識が必要になることです.例えば以下はUNIXmmapというAPIに関する説明です.これを初めて読んで, 理解できる人は少ないでしょう.これがいったい何をするためにあるのか,ど ういう場面で役に立つのかを理解するには,マニュアルを奥深く読むのではな く,「OSの基本」について学ぶのが最も近道であり,まっとうな道です.

OSを学ぶ気になったでしょうか?

http://www.logos.t.u-tokyo.ac.jp/~tau/lecture/os/