FE EXAM

動的ライブラリ(DLL)

実行時に読み込まれ、複数のプログラムで共有できる形式のライブラリ。

INTERACTIVE VISUALIZATION
実行ファイル
ローダ
DLL
プロセス
フェーズ
idle
DLLの状態
未ロード
共有プロセス数
0 プロセス
シナリオ
ステップ1 / 6
STEP 1/6プログラムを動かす前まだプログラムを起動していない状態です。手元には実行ファイル(本体のみ)と、よく使う機能をまとめた動的ライブラリ(拡張子.dll や .so のファイル。DLL=Dynamic Link Library のこと)が別々に置かれています。
メモリ(実行時の作業領域)プロセスAapp.exe(本体のみ)DLL参照ありプロセスBother.exeローダ読み込み担当DLL(共有)libmath.dll / .so関数の実体実行ファイルは小さいまま、DLLは1つをみんなで使い回す
実行時ロードの流れ
① 実行ファイルにはDLLの参照だけを持つ(本体は含めない)
ローダがDLLをメモリに読み込む(実行時)
③ 関数呼び出しをDLL内のアドレスに結びつける(動的リンク)
④ 複数プロセスが同じDLLを共有して使う
解説

📌
動的ライブラリとは

プロセスAプロセスBDLL(1つ)1つのDLLを共有

動的ライブラリ(DLL=Dynamic Link Library のこと)とは、実行時に読み込まれ、複数のプログラムで共有できる形式のライブラリです(拡張子は .dll や .so)。実行ファイルの中には含めず、プログラムの起動時や使用時に読み込みます。

身近な例で考えると、図書館に置いてある辞書をみんなで使うのに似ています。各自が辞書を丸ごと書き写す(静的ライブラリ)のではなく、必要なときに棚から1冊を借りて引く。1冊を多くの人で使い回せるので場所を取りません。

上のツールで▶ボタンを押すと、実行ファイル本体だけを持った状態から、実行時にローダがDLLを読み込み、複数プロセスが同じDLLを共有するまでの流れを確認できます。

⚙️
実行時ロードの仕組み

実行ファイルローダ読込DLL関数の実体動的リンク

動的ライブラリは実行時に読み込まれます。読み込みを担当するのがローダ(=必要なファイルをメモリに運び込む読み込み担当)です。メモリ=コンピュータが作業に使う一時的な置き場のことです。

仕組みは次の流れで動きます。
① 起動:実行ファイルを動かすと、ローダが必要なDLLを探す
② ロード:DLLをメモリに読み込む
③ 動的リンク:プログラムの関数呼び出しを、DLL内の実際のアドレス(置き場所)に結びつける
④ 共有:別のプロセスも、すでにメモリにあるDLLをそのまま共有して使える

電話帳で名前から番号を調べてはじめて電話をかけられるように、動的リンクで呼び出し先を結びつけてはじめてDLLの関数が使えるようになります。1つのDLLを多くのプロセスで共有できるので、メモリの節約にもなります。

⚖️
静的との違い

静的ライブラリと動的ライブラリは、ライブラリを組み込む(読み込む)タイミングが決定的に違います。静的はビルド時に組み込み(自己完結・大きい)、動的は実行時にロード(実行ファイルが小さい・更新が楽・メモリ共有できる)です。

項目静的ライブラリ動的ライブラリ(DLL)
組み込み時期ビルド(リンク)時実行時にロード
実行ファイル大きい(自己完結)小さい(本体のみ)
更新再ビルドが必要DLLの差し替えで完了
メモリ共有できない(重複)複数プロセスで共有
弱点ファイルが肥大化DLL地獄

ただし動的ライブラリには弱点もあります。必要なDLLが見つからなかったり、想定と違うバージョンのDLLが読み込まれたりすると、プログラムが動かなくなります。これを俗に「DLL地獄」と呼びます。自己完結する静的ライブラリには、この問題が起きにくいという良さがあります。上のツールの最終ステップで、両者の違いをあらためて見比べてみてください。

練習問題

🎯
基本情報技術者 練習問題

Q1.動的ライブラリ(DLL)の説明として最も適切なものはどれか。
A.ビルド時に実行ファイル本体へ組み込まれるライブラリ
B.実行時に読み込まれ、複数のプログラムで共有できるライブラリ
C.ソースコードのまま配布されるライブラリ
D.コンパイル前にソースへ展開されるマクロ集
Q2.動的ライブラリの実行時ロードに関する説明として正しいものはどれか。
A.リンカがビルド時にDLLの中身を実行ファイルへコピーする
B.ローダがDLLをメモリに読み込み、関数呼び出しをDLL内のアドレスに結びつける
C.DLLはコンパイラがソースに直接埋め込む
D.DLLは一度読み込むと二度とメモリから消えない
Q3.静的ライブラリと動的ライブラリの違いとして正しいものはどれか。
A.静的は実行時ロード、動的はビルド時組み込みである
B.静的は実行ファイルが小さく、動的は大きくなる
C.静的はビルド時に組み込み自己完結し、動的は実行時ロードで実行ファイルが小さくメモリ共有できる
D.両者に実用上の違いはない

関連コンテンツ