恐竜本の2章まとめです。正直大部分が1章と被っており、冗長でした。急いでいる方はこの章は飛ばしていいと思います。
OSが提供する機能
- UI(CUI・GUI)
- プログラムの実行
- I/O
- ファイルシステム操作
- プロセス間通信
- エラー検出
また、複数ユーザーが同じコンピュータを使用する場合以下の機能が必要となる。
- リソース割り当て
- アカウント管理
- アクセス権保護
OSのインターフェース
- コマンドインタプリター(shell)
- デスクトップ環境
システムコールの提供の仕方
OSはシステムコールをユーザープログラムに提供し、それを呼ばれたときにカーネルモードで仕事をする。ユーザーがプログラムからシステムコールを呼び出すときは、各プログラミング言語で提供されたAPIを使用する。例えばC言語でのファイル読み込みではReadFile関数を呼べば、コンパイル後対応するシステムコール呼び出しに変換される。
システムコールの種類
- プロセス制御
- ファイル操作
- デバイス操作
- システム情報取得(日付時刻、メモリダンプ等)
- プロセス間通信
- リソースの保護
OSが提供するシステムプログラム
- ファイル操作
- メモリやディスクの空き容量などのシステム情報
- ファイル編集
- インタプリタやコンパイラ等のプログラミング言語サポート
- プログラムのロードと実行
- 通信
OSの設計と実装
設計ではポリシー(何を実現したいか)とメカニズム(どうやって実現するか)を決める。実装は昔はアセンブリ言語で行っていたが現在はCやC++で行う。そのほうがアセンブリ言語よりも可搬性が高くなる。また、コンパイラの性能は上がっており、アセンブリ言語を手で書くより最適化されたコードを出力することも多い。
OSの構造
- モノリシック
- ハードウェアに近い順に層状構造
- 下層がハードウェアなどの仕様を隠蔽しており、上層は複雑な下層仕様によらず組むことができる
- 層の切り分け方が難しい
- 多段階でシステムコールを呼び出す必要があり効率が悪い
- マイクロカーネル
- カーネルとして実装する機能を厳選し、多くの機能をシステム・ユーザーレベルのプログラムで実現
- プロセス間通信で多くの機能を実現するのでオーバーヘッドが大きい
- ロードしたりアンロードしたりできるモジュール
- 層状構造に似ているが、上層下層の区別が無いので、自由にモジュールをお互い呼び出せる
- 現代(この本の執筆時点)では最良
仮想化
仮想化ではシステムのリソースを仮想化することで、OSを複数個同じコンピュータ上で動かすことができる。ハードウェアの上層に仮想マシンの層を構築し、各仮想マシンは独自のOSカーネルを実行している。仮想マシンなのでOSにバグが有っても深刻な問題を引き起こさず、OS開発に便利である。
上記仮想化は同じアーキテクチャを持つゲストシステムを想定していたが、仮想化と比較される技術であるシミュレーションはゲストシステムがハードウェアとは異なるアーキテクチャを持っている場合に用いられる。パフォーマンスとしては仮想化より劣る。
準仮想化は動かしたいゲストシステムに変更を加えて仮想化のパフォーマンスを上げたものである。
仮想化の実装における難点は、仮想マシンはベースとなっているマシンのユーザーモードで実行されているので、プログラム実行時は必要に応じ仮想のカーネルモード・仮想のユーザーモード・実際のカーネルモード・実際のユーザーモードを切り替える必要がある、という点である。この切替で仮想化されたシステムの実行速度は下がる。また、命令の実行のためにCPUを模擬したりすると更にスピードが落ちる。ただし、IBMのVMではハードウェア上で命令を直接実行できる。ハードウェアのサポートなしでは仮想化は実装不可能と言って良い。
システムの起動
システム起動時はROM上の決められた位置からファームウェアの実行がスタートする。ファームウェアにはブートストラップローダーが組み込まれている。ファームウェアはシステム診断後、ディスクの決められた位置(アドレス0等)からOSのブートブロックをメモリに読み込む。ブートブロック内のプログラムはOSの残りの部分を読み込んだり実行したりする。ブートブロック内のプログラムは単に別のブートストラッププログラムの場所を覚えているだけのことも多い。LinuxではブートストラッププログラムとしてGRUBが用いられる。
コメント