このページの本文へ

基礎から覚える 最新OSのアーキテクチャー第7回

Windowsのメモリー管理をx86の仕組みから読み解く

2011年11月17日 17時24分更新

文● 塩田紳二

  • この記事をはてなブックマークに追加
  • 本文印刷

Windowsはセグメントレジスタを
どう使っているのか

 x86アーキテクチャーでは、メモリーをアクセスする命令はすべて、暗黙に特定のセグメントレジスターを仮定している。例えば、メモリーから汎用レジスターに値を入れる場合にはセグメントレジスター「DS」が、ジャンプ命令ではコードセグメントレジスター「CS」が仮定されている。仮定されるセグメントレジスターはCS、SS、DS、ES(ストリング命令用)となっている。一方FSとGSは仮定されていない。

 セグメントの大きさや位置(ベース・アドレス)を設定する「セグメントディスクリプタ」は、OSカーネルのみが設定可能なデータである。アプリケーション側ではこれを操作することはできず、またどのようなセグメントセレクタが用意されているのかも、あらかじめ情報として与えられない限りわからない。そのため、アプリケーションプログラムからは、セグメントレジスターを操作することは事実上できない。しかし、x86命令ではプログラムがリニアアドレスを直接指定できるので、セグメントレジスターを操作する必要もない。

 Windowsでは利用目的を限定しないFSとGSは、OSカーネル側がセグメントディスクリプタを設定して、アプリケーションからのシステム関連情報などへのアクセスに利用している。例えば、ひとつのスレッドには固有の情報(TIB。Thread Information Block)や、スレッド自身が独立して持つ記憶領域として「TLS」(Thread Local Storage)がある。これらのアクセスには、スレッドが起動するときにOSカーネル側でその位置を示すセグメントディスクリプタを用意し、セグメントレジスターFSがセグメントディスクリプタを指定するように設定される。

 セグメントレジスターはタスク切り替え時に、CPU内部情報としてメモリーへと保存される。そのため、このようにスレッドごとに異なるデータを指すようにしておくと、スレッドが切り替わってもアクセスが簡単になるわけだ。GSも同じように、汎用的に利用されているようだ(カーネル内部でも利用しているらしい)。

タスクマネージャーから
Windowsのメモリー使用状況を読み解く

 x86 CPUの機能を使ってメモリーを管理しているWindowsだが、ユーザーからはその挙動は、タスクマネージャーやリソースモニターでしか確認できない。しかもこれらに表示されるグラフは、メモリーの利用量が多いか少ないか、スワップが多いか少ないかといった程度の情報でしかなく、数値表示は意味がわかりにくい。

 そこで、タスクマネージャーやリソースモニターの表示と、パラメーターの意味などを説明しよう。

 まずタスクマネージャーのメモリー関連情報は、「パフォーマンス」タブにある「物理メモリ」の、「カーネルメモリ」および「システム」の表示にある。

タスクマネージャーの「パフォーマンス」タブ。赤枠部にメモリー関連のパラメータが表示される

 Windowsのメモリー管理で言う「コミット」とは、仮想メモリーでメモリーが割り当てられた量のことだ。ひとつのプロセスの場合、そのプロセスに割り当てられたメモリー量を示す。以下の表で、タスクマネージャーのメモリー欄の意味を説明しよう。

項目 意味
物理メモリ 合計 搭載されたメモリーの総量
キャッシュ済み ファイルキャッシュや高速起動用のキャッシュなどに割り当てたメモリー量
利用可能 空きメモリーとキャッシュ済みメモリーのうち、すぐに利用可能なメモリーの合計量
空きメモリー 何も使われていないメモリーの合計量
カーネルメモリ ページ カーネルが利用しているメモリーのうち、スワップが可能な領域
非ページ カーネルが利用していてスワップできない固定領域
システム ハンドル ハンドルオブジェクトの総数
スレッド 起動しているスレッド数
プロセス 起動しているプログラム(プロセス)数
起動時間 起動してからの時間
コミット 仮想記憶として割り当てられている量/仮想記憶として割り当て可能な物理メモリー+スワップ領域のサイズ

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

最新記事

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン