1. 程式人生 > >7.程式設計師的自我修養---動態連結

7.程式設計師的自我修養---動態連結

1.為什麼要動態連結 
	靜態連結缺點:
		1.靜態連結的方式對於計算機記憶體和磁碟的空間浪費非常嚴重。特別是多程序作業系統情況下,靜態連結極大的浪費了記憶體空間。
		2.靜態連結對程式的更新,部署和釋出也會帶來很大的麻煩。一旦程式中有模組更新,整個程式就要重新連結,釋出給使用者

	要解決空間浪費和更新困難這2個問題最簡單的辦法就是把程式的模組互相分割開來,形成獨立的檔案,而不再將它們靜態的連結在一起。
  簡單的說,就是不對哪些組成程式的目標檔案進行連結,等到程式要執行時才進行連結。也就是說把這個過程推遲到了執行時再進行。這就是
  動態連結的基本思想。

    多個程式共享一個目標檔案模組的好處是,節省記憶體,還可以減少物理頁面的換入換出,也可以增加 CPU 快取的命中率,因為不同的程序間的
  資料和指令都集中子啊了同一個共享模組上。

    動態連結也使得程式的升級變得很簡單。當我們要升級程式庫或程式共享的某個模組時,理論上只要簡單的將舊的目標檔案覆蓋,而無需將所有的
  程式再重新連結一遍。當程式下一次執行的時候,新版本的目標檔案會自動裝載到記憶體並連結起來。程式就完成了升級。

	動態連結還有一個特點是,程式在執行時可以動態的選擇載入各種程式模組,這個有點就是被人們後來用來製作程式的外掛。比如某個公司開發了某個
  產品,它按照一定的規則制定好程式的介面,其他公司或開發者可以按照這種介面來編寫符合要求的動態連結檔案。該產品程式可以動態的載入各種第三方
  開發的模組,在程式執行的時候動態的連結,實現程式功能的擴充套件。

    動態連結還可以加強程式的相容性。一個程式在不同的平臺執行時可以動態的連結到由作業系統提供的動態連結庫,這些動態連結庫相當於在程式和作業系統
  之間增加了一箇中間層,從而消除程式對不同平臺之間的依賴。

    動態庫的基本思想是把程式按照模組拆分成各個獨立的部分,在程式執行時才將它們連結成一個完整的程式,而不是像靜態連結一樣,把所有的程式模組都連結成
  一個單獨的檔案。
    動態連結涉及執行時的連結以及多個檔案的裝載,必須要有作業系統的支援,因為動態連結的情況下,程序的虛擬地址空間的分佈比靜態連結的情況更為複雜,還有
  一些儲存管理,記憶體共享,程序執行緒等機制在動態連結的情況下也會有些微妙的變化。

    當程式被裝載的時候,系統的動態連結器會將程式所需要的所有動態庫裝載到程序的地址空間,並且將程式中所有未決的符號繫結到相應的動態連結庫中,並進行
  重新定位。

    程式與 libc.so 之間真正的連結工作是由動態連結器完成的,而不是我們前面看到的靜態連結器 ld 完成的。也就是說,動態連結把連結的這個過程從本來的程式
  裝載被推遲到了裝載的時候。動態連結會導致程式在效能的一些損失,效能損失大概在 5% 一下,這點效能損失能換來程式在空間上的節省和程式構建和升級時候的靈活。

 

1.為什麼要動態連結