マルチタスクでは
ダイナミックリンクの仕組みが必要に
アプリケーションがひとつしか動いていない環境なら、スタティックリンクの仕組みで問題ないが、マルチタスク環境になるとメモリーの扱いで問題が生じる。アプリケーションが複数同時にメモリーに読み込まれると、同じライブラリ部分がそれぞれのアプリケーションに含まれてしまう可能性が出てくる。プログラムの数が増えれば増えるほど、この無駄は大きくなる(図3)。
その解決方法のひとつが「ダイナミックリンクライブラリ」(DLL)だ。ダイナミックリンクライブラリの概念を簡単に説明すると、プログラムをロードするときに、リンクを「その場」で解決する方法である。
プログラムは作られたときに、必要なライブラリのリストを実行ファイルの中に記録しておく。OSはプログラムをメモリーにロードするときに、ライブラリのリストを見て、必要なライブラリがすでにメモリーにあるかどうかを調べる。すでにあるならばそのまま、ない場合にはライブラリをメモリーに読み込む(図4)。
プログラム中でライブラリを呼び出しているところは、プログラム内の一定の場所に集められる。ライブラリの各アドレスを記録した表を作っておき、プログラムの内部では、この表を経由してライブラリを呼び出すようにしておく。この表を「ジャンプテーブル」と呼ぶ。
プログラムがメモリーに読み込まれると、ライブラリはプログラムの仮想メモリー空間に割り当てられて、仮想メモリー空間内でのアドレスが確定する。このアドレスがジャンプテーブルに書き込まれる。こうしてメモリーにプログラムがロードされるときに、リンク処理が行なわれるわけだ。
マルチタスク環境では、DLLのプログラムは複数のアプリケーションで共有される。しかし、アプリケーションがDLLを共有しているからと言って、あるアプリケーションがDLLを使った影響が、ほかのアプリケーションにまで及んではおかしなことになる。そのためDLLのプログラムは、複数のプログラム(タスク)から同時に呼び出されても、影響が出ないようになっている。こうした性質を「リエントラント性」という。
このリエントラント性を実現するには、プログラムが扱うデータ領域を、タスクごとに分ける必要がある。プログラムを2回目に実行したときに影響が出る原因は、データ部分が書き換えられることにあるからだ(図5、プログラム自身は書き換えられないと仮定した場合)。呼び出すタスクごとにデータ部分を分離することで、リエントラント性は実現される(図6)。
Windowsでのダイナミックリンクライブラリのプログラムは、拡張子「DLL」のプログラムファイルとなっている。WindowsのAPIの大半は、このDLLを介して提供されているのだ。一部のAPIには「COM」と呼ばれる仕組みが使われているが、その実体は、DLLもしくはEXE形式の実行ファイルである。次回は具体的にDLLの構造を見ていくことにしよう。
この連載の記事
-
第13回
PC
ARM版Windows 8実現の布石となったWindows 7の「MinWin」 -
第11回
PC
マルチコアCPUの消費電力はスケジューリングで変わる? -
第10回
PC
AMD FX向けにパッチで修正 スケジューラーが抱える難題 -
第9回
PC
マルチコアCPUを賢く使いこなす スケジューリングの秘密 -
第8回
PC
意味の違いがわかる? タスクとプロセスとスレッド -
第7回
PC
Windowsのメモリー管理をx86の仕組みから読み解く -
第6回
PC
メモリー不足を根本的に解決する64bit OSの仕組み -
第5回
PC
Windows 8でMetro Styleアプリを動かす「WinRT」 -
第4回
PC
Windowsを動かすデバイスドライバーの仕組み 前編 -
第3回
PC
OSの仕事はハードウェアをアプリから「隠す」こと? - この連載の一覧へ