--- title: 'OCW CH8 - Memory Management' disqus: hackmd --- [TOC] # Memory Management ## Address Binding * 位址定位 (Address Binding) 決定程式的起始位置: 在程式編譯 (Compile) 後,符號化的地址(參數、函數)因為存取的記憶體位置可能不是連續的。 * 所以之後的鏈結器 (Linker) 或載入器 (Loder) 可能會將他們重行定址,把地址連結(bind) 至絕對地址(absoulte address)、即實際上在 Memory 的位置。 * 與記憶體位置的連結(bind)至絕對地址的時間點,可以在以下任何步驟完成。 --- ### 編譯時期 (Compile time) * 若編譯期間知道 process 會在記憶體何處,則產生==絕對碼(Absolute object code)==。 * 在 Linkage Editor 時將程式所用的函數,鏈結到程式碼區段。 * 而之後的 Loader 我們稱作他為 Absolute Loader,依序將 ==絕對碼(Absolute object code)== 載入到 memory 之中。 * 若程式的起始位置變更了,那就得從頭使用 compiler 在執行一遍,包括後續的 Link 與 Load。 ![](https://i.imgur.com/JBie2bA.png) --- ### 載入時期 (Load Time) * 若編譯 (Compile) 時不知到需要用到的變數、函數會在記憶體何處,則 Compiler 必須產生==重新定位碼 (Relocated Code)==,並且會在不知道實際位置的程式碼加註記號。 * ==重新定位碼 (Relocated Code)== 包含了以下資訊 * Linking Info : 在 Linkage Editor 時會將程式使用到的函數地址鏈結近來,因此就可以處理在 Compile 時不知道實際位置的函數。 * Relocation Info : 因為起始位置隨著載入 memory 的地方而有所不同,根據欲載入的起始位置做為 $Base$ $address$ 再加上相對的偏移量 $Offset$ 即是正確的地址 * 若程式的起始位置變更了,我們只需要重新做一次 Link 與 Load 即可,不需要再使用 compiler 編譯成機器語言。 ![](https://i.imgur.com/1eZrrwB.png) --- ### 載入時期 (Load Time) ver.2 * 跟上一種不同的地方是,原本 Linkage Editor 會到處將分散在各處的函數地址修正在 Main code 裡面,只需要加上偏移量即可知道他在記憶體的何處。 * 為了節省重新執行程式時 Linkage Editor 重新 Link 的時間,我們在此種採用的方法為:將所有用到其他 Memory 中的程式碼區段與 Main Code Link 成一個連續的記憶體分段。 * 因此我們就不需要每次都在找失散在 Memory 各地的函數了,只需要重新使用 Loader 修正偏移量以及重新地址最後再載入到 Memory 即可 --- ### 執行時期 (Execution Time) * 藉由額外的硬體資源:MMU 輔助計算實際的記憶體位置 * 若使用 OS 則需要使用中斷機制、導致效能低落 ![](https://i.imgur.com/Am1C8c0.png) --- ### Address Binding 流程圖 ![](https://walkccc.github.io/CS/assets/os/8.3.png =400x) --- ### Logical (Vitual) vs. Physical (Absolute) Address * Logical address – generated by CPU * Compile-time & Load-time address binding * logical addr = physical addr * Execution-time address binding * logical addr ≠ physical addr --- ### Static/Dynamic Linking * Static Loading * * Dynamic Loading * * Static Linking * 將程式所需要的函數、資源等全部加入程式的執行檔 * 需要較大的記憶體空間 * 當所用的函式庫越多時,執行檔也就越龐大。 * Dynamic Linking * 程式執行時才被載入,而不是直接編譯在執行檔中 * 讓系統更彈性的應用硬體資源,且可以不公開程式碼的情況分享給別人使用。 * 由於靜態連結是把整個 Library 包進去執行檔,因此可以保證到不同機器環境下執行時,也不會因為少了這個函式庫導致無法執行檔案 * 缺點是檔案 (儲存空間) 比較大 * 在程式開始執行時才載入的,執行檔較小,而且更新程式庫無需重新編譯其他程式 * Sum up * 當檔案共用多個函式庫,可採用動態連結,反之就建議採用靜態連結。 * 可由檔名來判斷是否使用動態連結 * 在微軟的作業系統上, * 動態連結為 .dll * 在蘋果的作業系統上 * 動態連結為 .dylib * 靜態連結為 .a --- ## Swapping ###### tags: `OS`