塩田紳二シェアツイートする一覧マルチタスクではダイナミックリンクの仕組みが必要にアプリケーションがひとつしか動いていない環境なら、スタティックリンクの仕組みで問題ないが、マルチタスク環境になるとメモリーの扱いで問題が生じる。アプリケーションが複数同時にメモリーに読み込まれると、同じライブラリ部分がそれぞれのアプリケーションに含まれてしまう可能性が出てくる。プログラムの数が増えれば増えるほど、この無駄は大きくなる(図3)。すべてのアプリケーションがスタティックリンクでライブラリと結合されると、マルチタスク環境ではメモリーの無駄が増えるその解決方法のひとつが「ダイナミックリンクライブラリ」(DLL)だ。ダイナミックリンクライブラリの概念を簡単に説明すると、プログラムをロードするときに、リンクを「その場」で解決する方法である。プログラムは作られたときに、必要なライブラリのリストを実行ファイルの中に記録しておく。OSはプログラムをメモリーにロードするときに、ライブラリのリストを見て、必要なライブラリがすでにメモリーにあるかどうかを調べる。あるならばそのまま、ない場合にはライブラリをメモリーに読み込む(図4)。ダイナミックリンクライブラリでの呼び出しの仕組みプログラム中でライブラリを呼び出しているところは、プログラム内の一定の場所に集められる。ライブラリの各アドレスを記録した表を作っておき、プログラムの内部では、この表を経由してライブラリを呼び出すようにしておく。この表を「ジャンプテーブル」と呼ぶ。プログラムがメモリーに読み込まれると、ライブラリはプログラムの仮想メモリー空間に割り当てられて、仮想メモリー空間内でのアドレスが確定する。このアドレスがジャンプテーブルに書き込まれる。してメモリーにプログラムがロードされるときに、リンク処理が行なわれるわけだ。マルチタスク環境では、DLLのプログラムは複数のアプリケーションで共有される。アプリケーションがDLLを共有しているからと言って、あるアプリケーションがDLLを使った影響が、ほかのアプリケーションにまで及んではおかしなことになる。そのためDLLのプログラムは、複数のプログラム(タスク)から同時に呼び出されても、影響が出ないようになっている。した性質を「リエントラント性」という。このリエントラント性を実現するには、プログラムが扱うデータ領域を、タスクごとに分ける必要がある。プログラムを2回目に実行したときに影響が出る原因は、データ部分が書き換えられることにあるからだ(図5、プログラム自身は書き換えられないと仮定した場合)。呼び出すタスクごとにデータ部分を分離することで、リエントラント性は実現される(図6)。実際のDLL共有の仕組み。プログラムコードは共有しても、データ領域だけはアプリケーションごとに別扱いであるWindowsでのダイナミックリンクライブラリのプログラムは、拡張子「DLL」のプログラムファイルとなっている。WindowsのAPIの大半は、このDLLを介して提供されているのだ。一部のAPIには「COM」と呼ばれる仕組みが使われているが、その実体は、DLLもしくはEXE形式の実行ファイルである。次回は具体的にDLLの構造を見ていくことにしよう。Sl...わずか63gの癒やし。スマホお気に入り一覧マイページ。