---
# System prepended metadata

title: 【作業系統】Dynamic loading /Dynamic linking/Static linking

---

# 【作業系統】Dynamic loading/Dynamic linking/Static linking

### Dynamic laoding : 
>背景 : 將整個程式載入 mem 會太佔空間
-> 使用 Dynamic loading 解決 mem 浪費的問題

Dynamic loading : 當程式被叫到時，才會**載入到記憶體**中
- 不會將整個程式 load 到記憶體，要用到那個 function code 才會 call 進 mem
- 優點 : 
    - 更好的記憶體空間使用
    - 在大量程式碼使用率較低時特別有用
(e.g 大多都是是 error handling code 時)
- 作業系統雖然提供 dynamic loading，但不會主動去做這件事，必須由使用者在 api 或函式庫中定義。

![](https://hackmd.io/_uploads/ryBt4iCJa.png)

### Dynamic linking : 

在 <font color="#000ff">**run-time**</font> 才將相關的 object code modules **linking**起來


> ==目的==
> 因為很多的程式都會使用一樣的函式庫，為了**避免一樣的函式庫被重複載入**，可以利用 Dynamic Loading 來解決 


- 可能包含 dynamic laoding
- 程式在編譯時就必須先設定好哪些函式庫為動態載入，程式在編譯時會加入一個 <font color="#FF0000">**stub** </font>的程式
    - Stub 內記錄了++函式庫的目錄（reference）++
    - 當執行時，程式會向 OS 確認 **stub** 在不在記憶體內，如果不在便透過 **dynamic loading** 載入
    ![](https://hackmd.io/_uploads/By0z_iR1T.png =50%x)

- 優點 : 數個程式可以**共用同一個 lib** -> **省空間**
- 缺點 : 在 execution time 時可能比 static linking **慢**，因為要花時間 linking 
- e.g : 
    - .dill / .so 檔
    - DLL :在 Windows 的動態連結函式庫

### Static linking : 
- 在 <font color="#000ff">**compile-time**</font>，將函式庫加入程式碼
- 優點：執行比較**快**
- 缺點：**浪費記憶體資源**、有**程式碼重複**複製的問題
![](https://hackmd.io/_uploads/B1sqPo0JT.png)

   

---
[*Reference*](https://www.youtube.com/watch?v=1z3QEs9WDmY&list=PLS0SUwlYe8cxj8FCPRoPHAehIiN9Vo6VZ&ab_channel=NTHUOCW)