OS輪講 11.5-11.6 sada
11.5 メモリ管理 Windows2000でどのようにメモリを管理しているか
11.5.1 基本概念 各プロセスは4GBの仮想アドレス空間を持つ 下位2GB-256MBをプロセスのコードとデータが使用可能 11.5.1 基本概念 各プロセスは4GBの仮想アドレス空間を持つ 下位2GB-256MBをプロセスのコードとデータが使用可能 256MBは読み出し専用で全てのユーザ間で共有するいくつかのシステムカウンタやタイマ 上位2GBが保護されたカーネルメモリにマップ コード,データ,およびオブジェクトなどに使うページ化(或いは非ページ化)されたプール 書込み禁止 ユーザプロセスは読み出しも禁止 スレッドがシステムコールを呼び出したときに,メモリ空間が延長線上にあるから 高速だがプライベートアドレススペースが窮屈 一部のモードでユーザ空間を3GBに可能 最上部と最下部64KBは通常マップされない プログラムエラーを捕まえる助けとするため 多くの無効なポインタは0とか-1とかだから
仮想ページの状態 コミットページへの補助記憶の割り当て フリー コミット 予約 参照するとページフォールトが起きる コミット ページがメモリにあれば成功する なければページフォールト 予約 解除されるまでマップできない コミットページへの補助記憶の割り当て 各コミットページがコミットされたとき,それをバックアップするページングファイルに1ページを割り当てる 単純だがディスク領域を浪費 スタック領域のようにもともとディスク上に実体を持っていないようなコミットページ領域には,ページアウトの時点までディスクページを割り当てない Windows2000で使われている手法 ディスク浪費はないが複雑
シャドーページ(ディスク上で対応するページ) 性能向上のため16個までのページングファイルに分散することもある Windows2000ではUNIXと同様に,ファイルを仮想アドレス空間の領域に直接マップすることを許している シャドーページがページングファイルの代わりにユーザのファイルになっているだけ 二つ以上のプロセスが同時に同じファイルの同じ部分を明示的にマップすることを許している データをコピーしなくていいので,高速アクセス可能
コピーオンライト(図11-24) 共有コードのアドレス メモリ空間の限界を乗り越える 複数のプロセスが同一のDLLを読み込んで,そのDLLにデータをおく場合,そのデータを自分のプロセス内に保持する 共有コードのアドレス 絶対仮想アドレスを用いると他のプロセスのアドレスを読んでしまう 相対仮想アドレスを使う(位置独立コードとも言う) 絶対仮想アドレスを使うより遅くなるので,明示的にコンパイラに相対仮想アドレスを使う メモリ空間の限界を乗り越える バンク切替 Address Windowing Extensions
11.5.2 メモリ管理システム APIいろいろ VirtualAlloc, VirtualFree, VirtualProtect, VirtualQuery 領域のコミット,解除,権限変更,状態問い合わせ VirtualLock, VirtualUnlock ページング不可にする,解除する CreateFileMapping, MapViewOfFile, UnmapViewOfFile, OpenFileMapping メモリマップドファイルを管理する 作成,マップ,アンマップ,他のプロセスによってマップされているファイルへのマップ
11.5.3 メモリ管理の実装 ページサイズ メモリマネージャはスレッド単位ではなくプロセス単位で管理 11.5.3 メモリ管理の実装 ページサイズ 理論的に64KBまでの2のべき乗 Pentiumでは4KB,Itaniumでは8KBか16KBか選択可能 メモリマネージャはスレッド単位ではなくプロセス単位で管理 スケジューラと逆 VAD (Virtual Address Descriptor) 中身 マップされたアドレスの範囲 補助記憶ファイルとそれがマップされている場所のオフセット 保護コード アドレス空間はVADのリストによって完璧に定義されている
● ページフォールトの扱い プリページングしない ページテーブルエントリ(図11-26) Windows2000の戦略 ● ページフォールトの扱い プリページングしない 予測してページングしない,常にページフォールト ページテーブルエントリ(図11-26) 大事な状態はA (Active) & D (Dirty) ページフォールトの原因の分類 参照されたページはコミットされていない(致命的!) 保護違反が発生した(致命的!!) 共有ページに書き込まれた コピーオンライトの可能性を調べ,復旧可能な場合がある スタックは成長しなければいけない セキュリティ上,新しいプロセスへのメモリはゼロクリアされている必要あり 参照されたページがコミットされているが現在はマップされていない 普通のページフォールト Windows2000の戦略 ディスク転送の回数を最小にする 孤立したページを読み込まない 隣接したページも読み出しておく
● ページ置換アルゴリズム ページフォールトが発生したとき Windows2000はどうやってプロセスからページを奪ってフリーにするか? ● ページ置換アルゴリズム ページフォールトが発生したとき 最初に他のページをディスクに書くことなく,すぐに空きページを維持しようと試みる →1回当たりのディスク操作が1回で済む Windows2000はどうやってプロセスからページを奪ってフリーにするか? ページングシステム全体で各プロセスが保有するワーキングセットの概念を使用している ワーキングセット=特定のプロセス専用の物理的なメモリページ群 ワーキングセットのパラメータ 最小サイズと最大サイズ 厳密ではない でも限界はある(最後の512ページは獲得できない)
バランスセットマネージャ(カーネルデーモンスレッド) 十分な空きページがあるかどうかを見極める,もし十分でなければ・・・ ワーキングセットマネージャ(カーネルデーモンスレッド) が回収しにいく いろいろパラメータを勘案しつつ,全てのページを検査する 検査するたびに未参照カウンタを増やしていく 参照ビットがセットされていたら未参照カウンタを0にする 未参照カウンタが大きいページを優先的にページアウト ただしマルチプロセッサだと難しい...
● 物理メモリ管理 メモリ中の全てのページは1つ以上のワーキングセットか4つのリストのどれかに属する 変更ページリスト 待機ページリスト ● 物理メモリ管理 メモリ中の全てのページは1つ以上のワーキングセットか4つのリストのどれかに属する 変更ページリスト ダーティなページ 待機ページリスト クリーンなページ フリーページリスト どのプロセスにも関連していないクリーンページ ゼロページリスト どのプロセスにも関連していなく,ページがゼロクリアされている 不良RAMページリスト 物理的に欠陥がある
遷移の状況(図11-27) スワッパスレッド マップドページライター・変更ページライター ゼロページスレッド 4秒ごとに起動される 全スレッドがアイドルのプロセスを探す→待機リストか変更リストに変える マップドページライター・変更ページライター 定期的にウェイクアップ 変更ページを待機リストへ 探索・書き込みの2種類の処理があるので,スレッドを分けている ゼロページスレッド フリーリストを選んでゼロクリア 一番最低の優先度
処理の戦略いろいろ Windows2000の場合 例:ページアウトしてゼロクリアしたのに,すぐにそのページが必要になったらもったいない CPUがアイドルのときは優先的にゼロページからとる CPUがビジーの時は待機リストから優先的にとる 例:積極的に待機ページリストに変更するとI/O処理が増える Windows2000の場合 Heuristics, guess work, historical precedent, rules of thumb, administrator controlled などを通じて解決 図11-28のようなRAMページの各々に対応したエントリを持ち,ページフレームデータベースを維持している
11.6 Windows2000における入出力 今はたくさんデバイスがある これからもデバイスはたくさんでるだろう
11.6.1 基本概念 I/Oマネージャ 全てのファイルシステムはI/Oデバイスとして実装される ダイナミックディスクのサポート 11.6.1 基本概念 I/Oマネージャ 多くのバスがある PCカード,PCI,USB,IEEE1394,SCSIなど 認識手順 プラグアンドプレイマネージャがそれぞれのスロットに要求を送り,デバイスの種類を発見 割り込みレベルなどのハードウェアリソースを割り当て ドライバをロード→ドライバオブジェクトを作成 SCSIは起動時,USBやIEEE1394はいつでも認識 電力マネージャとも密接に連携 状態は6つある 全てのファイルシステムはI/Oデバイスとして実装される ダイナミックディスクのサポート 論理ボリュームが物理的にいろいろまたがっていてもOK 非同期I/Oのサポート スレッドがI/Oと並列に実行を続けることが可能 サーバで特に重要
11.6.2 入出力APIコール 図11-29:Win32APIコールのカテゴリ 特にグラフィック周りが多い! クリップボードのサポート GUIアプリケーションはイベント駆動のため,入力はメッセージで行われる
11.6.3 I/Oの実装 I/Oマネージャがどう実装されているか 異なるI/Oデバイスを操作できる共通フレームワークを作ること フレームワークの基本構造 あるI/O機能に対してデバイスに独立なコールの集合をユーザに与えることと デバイスドライバの集合をユーザに与えること
11.6.4 デバイスドライバ WDM (Windows Driver Model) の規定 適合ドライバは少なくとも下記の要求を満たすこと 11.6.4 デバイスドライバ WDM (Windows Driver Model) の規定 適合ドライバは少なくとも下記の要求を満たすこと 標準形式で到着するI/O要求を扱うこと Windows2000のドライバ以外の部分と同じく,オブジェクトベースであること 動的に追加,削除できるプラグアンドプレイデバイスを可能にすること... ほか色々
I/O要求=IRP (I/O Request Packet) ドライバの要件 標準化されたパケットの形式でドライバに渡される ドライバの要件 自身以外からも呼べるようオブジェクトベースである必要がある プラグアンドプレイをサポートする あらゆる状況を想定する必要あり 電力供給が突然なくなった,など 割り込み線やI/Oポートを仮定してはいけない プリンタポートを0x378と仮定するドライバは不適合 マルチプロセッサを想定する Windows98もサポート
ドライバの場所の決定 UNIXのようなメジャー番号を用いない プラグアンドプレイマネージャは製造業者とも出る番号を知るためにデバイスに問い合わせ,ディスク内にドライバがあるか検索
ドライバの動作手順 ドライバはスタックになっているものも DriverEntry AddDevice バス管理とデバイス制御の分離 ドライバの初期化(まだデバイスには触れない) デバイスオブジェクトが作られる AddDevice デバイスを加える IRPを伴ってドライバが呼び出される ドライバはスタックになっているものも バス管理とデバイス制御の分離 フィルタの実装 データの暗号,圧縮など