このページの本文へ

前へ 1 2 3 次へ

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

アプリがWindowsの機能を使うには? APIとDLLの仕組み

2012年03月15日 12時00分更新

文● 塩田紳二

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

マルチタスクでは
ダイナミックリンクの仕組みが必要に

 アプリケーションがひとつしか動いていない環境なら、スタティックリンクの仕組みで問題ないが、マルチタスク環境になるとメモリーの扱いで問題が生じる。アプリケーションが複数同時にメモリーに読み込まれると、同じライブラリ部分がそれぞれのアプリケーションに含まれてしまう可能性が出てくる。プログラムの数が増えれば増えるほど、この無駄は大きくなる(図3)。

図3 すべてのアプリケーションがスタティックリンクでライブラリと結合されると、マルチタスク環境ではメモリーの無駄が増える

 その解決方法のひとつが「ダイナミックリンクライブラリ」(DLL)だ。ダイナミックリンクライブラリの概念を簡単に説明すると、プログラムをロードするときに、リンクを「その場」で解決する方法である。

 プログラムは作られたときに、必要なライブラリのリストを実行ファイルの中に記録しておく。OSはプログラムをメモリーにロードするときに、ライブラリのリストを見て、必要なライブラリがすでにメモリーにあるかどうかを調べる。すでにあるならばそのまま、ない場合にはライブラリをメモリーに読み込む(図4)。

図4 ダイナミックリンクライブラリでの呼び出しの仕組み

 プログラム中でライブラリを呼び出しているところは、プログラム内の一定の場所に集められる。ライブラリの各アドレスを記録した表を作っておき、プログラムの内部では、この表を経由してライブラリを呼び出すようにしておく。この表を「ジャンプテーブル」と呼ぶ。

 プログラムがメモリーに読み込まれると、ライブラリはプログラムの仮想メモリー空間に割り当てられて、仮想メモリー空間内でのアドレスが確定する。このアドレスがジャンプテーブルに書き込まれる。こうしてメモリーにプログラムがロードされるときに、リンク処理が行なわれるわけだ。

 マルチタスク環境では、DLLのプログラムは複数のアプリケーションで共有される。しかし、アプリケーションがDLLを共有しているからと言って、あるアプリケーションがDLLを使った影響が、ほかのアプリケーションにまで及んではおかしなことになる。そのためDLLのプログラムは、複数のプログラム(タスク)から同時に呼び出されても、影響が出ないようになっている。こうした性質を「リエントラント性」という。

 このリエントラント性を実現するには、プログラムが扱うデータ領域を、タスクごとに分ける必要がある。プログラムを2回目に実行したときに影響が出る原因は、データ部分が書き換えられることにあるからだ(図5、プログラム自身は書き換えられないと仮定した場合)。呼び出すタスクごとにデータ部分を分離することで、リエントラント性は実現される(図6)。

図5 DLLのプログラムとデータ領域を分離しないと、あるアプリケーションによる変更が、ほかのアプリケーションに動作に影響を与えてしまう

図6 実際のDLL共有の仕組み。プログラムコードは共有しても、データ領域だけはアプリケーションごとに別扱いである

 Windowsでのダイナミックリンクライブラリのプログラムは、拡張子「DLL」のプログラムファイルとなっている。WindowsのAPIの大半は、このDLLを介して提供されているのだ。一部のAPIには「COM」と呼ばれる仕組みが使われているが、その実体は、DLLもしくはEXE形式の実行ファイルである。次回は具体的にDLLの構造を見ていくことにしよう。

前へ 1 2 3 次へ

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

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

ピックアップ

ASCII.jp RSS2.0 配信中

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