# 【作業系統】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)