Windowsはなぜ動くのか

概要

Windowsはなぜ動くのか
2002年、WindowsXP発売後の書籍。
「10年後も通用する基本を身につけよう」のコンセプトで出版された「なぜ~」シリーズ2作目。
CPUのアーキテクチャ、プログラムに対するメモリ管理、ウィンドウ管理、デバイスマネージャ、プロセス管理等、10年経った今でも有用な知識を学べます。
初心者向けを謳ってますが分かりやすく書いてあるものの十分深いです。
基本情報技術者資格等で出てくる仮想記憶等の技術について、
「これを勉強して何になるんだ?」
という疑問がこの本を読んで今更解消されました。
しっかりWindowsでも使われてました。
OS、デバイス、メモリ管理の話は非同期処理や排他処理、プログラム連携を行う際に有用です。
と言うよりここを理解している前提で技術書が書かれているので必須です。
古い本ですがもっと早くに読んでおけば良かったです。

オペレーティング・システムとは

システムコール(WindowsAPI)

OSが、OS上で動くプログラムの為に呼び出す命令。
・メモリの確保、解放
・プロセス、スレッドの切り替え
・入出力装置の制御
等、個々のプログラムが勝手に行うと問題がある処理についてOSに依頼してやってもらう。

ライブラリ

システムコールが動作する実行ファイル。

マルチタスクのふしぎ

メモリー管理

リロケータブル

単一のプログラムだけが動作する前提のOSでは、プログラム領域・データ領域の開始位置を固定していた。
これに対し、OS上で複数のプログラムを起動させる前提で、プログラム領域・データ領域の開始位置を動的にずらして動作させる仕組み。

セグメント

CPUが一度にアクセス可能なメモリ領域。
CPUの性能により大きさが違う。

(ローカル)ディスクリプタテーブル(LDT)

32bitCPU以降で利用されるメモリ領域。
プログラムがメモリ領域においてどこからどこまで使用するのか?
を記憶しておき、例えプログラムによって命令されたとしても範囲外の領域に書き込む事はできない構造になっている為、
マルチタスク環境における安定性が保障させる。
また、存在フラグによって仮想記憶も実現される。

仮想記憶

メモリ領域の不足に対して、ハードディスクをメモリとして扱う技術。
OS上で動作するプログラムが使用するメモリ領域の一部を仮想記憶へコピーし、必要になった場合にはまた戻す。
スワップ方式/ページング方式がある。

存在フラグ(P:Presentフラグ)

仮想記憶利用の為のフラグ。
本来のメモリ領域にはデータが無い場合、存在フラグはOFF。ある場合はON。
ON/OFFに応じて仮想記憶からのデータの復元が行われる。

セグメント不在割り込み

プログラムを実行する際、読み込み先メモリ領域にプログラムが無い場合(仮想記憶領域にページアウトされている場合)、
OSはセグメント不在割り込みを発生させ、あらゆる処理に優先してメモリ領域にプログラムを復元させる。

スワップ

(スワップイン/スワップアウト)
仮想記憶利用の方法。
プログラム(セグメント)単位でプログラムを仮想記憶領域に退避、復元する。
32bitCPUではセグメントが大きい為ページングが使用される。

ページング

(ページイン/ページアウト)
ページ(4KB)のメモリ領域単位で仮想記憶領域にプログラムを退避、復元する。
この際、プログラムにおけるどの部分をページアウトしているか?はページテーブルで管理する。

DLL

通常のコンパイル・リンク手順(StaticLinkLibrary方式)
・ソースファイル
↓(Byコンパイラ)
・オブジェクトファイル
・ライブラリ
↓(Byリンカ)
・実行ファイル
DLLを利用する手順(DynamicLinkLibrary方式)
・ソースファイル
↓(Byコンパイラ)
・オブジェクトファイル
・ライブラリ
・スタブ
↓(Byリンカ)
・実行ファイル
※DLLは実行ファイルとしては取り込まれない。
スタブを用いて参照経路を確保するだけで、実行時に(動的に)初めて取り込まれる。

スタブ

実行時にDLLを呼べる様に、リンクの際に作成されるプログラム。
オブジェクトファイルからDLLの呼び出しを仲立ちする。

マルチウィンドウ

ウィンドウハンドル

Windows上で各ウィンドウを識別する為の番号
厳密には一つのウィンドウ内でもボタンやメッセージ領域等で別の数字が割り当てられおり、
これにより各オブジェクト、各イベントに応じたイベントハンドラを発生させる事が可能になる。

イベントハンドラ

ボタン押下やマウスクリック等、ユーザーの操作に対してプログラムする特定の処理。
イベントが発生する度に処理を分岐させるのではなく、イベント発生前にイベント毎に処理内容を登録しておく。
=ウィンドウ・プロシージャ

イベントドリブン

イベントハンドラを実行するに当たって、プログラムがユーザーの操作を常に監視する必要はない。
マルチタスク実行中で、他のプロセスが実行中であっても、
自プロセスに対する操作があればイベントを検知するのはOSの仕事。
OSが検知が行う事を前提にしたシステムやプログラミング言語の事をイベントドリブン型、イベント駆動型言語等と呼ぶ。

ハードウェア・サポート

I/Oポートアドレス

Windows上で各ハードウェアを識別する為の数字
プラグ&プレイにより重複しない番号が自動で割り振られる。

デバイスドライバ

OSが行う、ハードウェアに対する操作を仲介するソフトウェア。
本来ハードウェア毎に仕様が異なり、これを操作する為には個別の操作プログラムが必要になるが、
ハードウェアメーカーが、OSの操作命令に対応するプログラムを作成・提供する事によってOS側はプログラムを変更する事なくハードウェアを操作できる。

プラグ&プレイ

ハードウェアをOSに接続した際に自動でOSから操作可能にする機能。

プログラム連携

プロセス間通信

別々のプロセス同士が自プログラムのデータ領域以外のメモリ領域を使ってデータ連携を行う事。
プロセスはプログラム領域に加えデータ領域を持ち変数やスタックに利用する。
しかし他プロセスからデータ領域にアクセスする事はOSにより禁止されている。

ファイルマッピング

プロセス間通信の一手法。
他OSでは共有メモリと呼ばれる。
ファイルをメモリ上に作成(マッピング)し、プロセス同士でこのファイルにアクセスする事でデータを連携する。
例:クリップボード

名前付きパイプ

プロセス間通信の一手法。
他OSではメッセージ・キューと呼ばれる。
ネットワークを介して他コンピュータからも共有されるメモリ領域。
ファイルの様にCreate/Read/Write/Close命令を用いてアクセスでき、Closeすると消滅する。
匿名パイプもあるがOSによって自動的にランダムなパイプ名が付けられるだけで仕組みは同じ。
パイプが勝手に消えたり、他アプリケーションによって上書きされたりする事が無い。
共用メモリー方式より少量のデータを連携する場合、プロセス間で同期を取る必要がある場合に使用。

ミューテックス

プロセス間通信の一手法。
CreateMutex()関数でメモリ空間にミューテックスオブジェクトを作成。
この際、所有者名、オブジェクト名を引数として渡す。
外プロセスから同名のミューテックスオブジェクトが作成されている場合、
OSは既存のミューテックスオブジェクトを探して所有者情報を返すので同名のオブジェクトが複数作られる事は無い。
OpenMutex()
所有者情報を取得
WaitForSingleObject()
所有権が空くまで待機。
ReleaseMutex()
所有権を離す。

セマフォ

プロセス間通信の一手法。
ミューテックスが1プロセスの所有しか認めないのに対し、複数の所有が認められる。
複数のプロセスの同時処理は可能だが、負荷を軽減する為にその数を制限したい場合等に使用。
制限数を1にしてミューテックスと同機能の使い方も可能。
作成、開始、待機、終了はミューテックスとほぼ同じ
CreateSemaphore()
OpenSemaphore()
WaitForSingleObject()
ReleaseSemaphore()

ネットワーク

ポート番号

ネットワーク上でコンピュータを識別するIPアドレスに付加するサブアドレス
IPアドレス+ポート番号をソケットと呼び、コンピュータ上の各アプリケーションを区別する。
Windows上で起動するアプリケーションはデフォルトで使用するポート番号が決まっている。
※メールサービス:110等
起動時に別のアプリによってその番号が使用されている場合は空いている別の番号を使用する。