?軟硬鏈接與動靜態庫
軟連接
創建鏈接的方法:
- ln? -s? test1.txt? test2.txt
?其中ln? 是link(鏈接),-s? ?是soft(軟),后者鏈接前者。
?
此時打開test2.txt,發現其中內容與test.txt一致。那么軟連接到底建立了什么聯系?
- ?首先兩個文件都有獨立的inode號,也就是說他們是兩個獨立文件
- 其次,如果刪除了目標文件(此處為test.txt),軟鏈接文件則無法使用。反過來只刪除軟連接文件的話,不會對目標文件產生影響。
所以軟連接可以看作是創建一個快捷方式。
硬鏈接
創建鏈接的方法:
- ln? test1.txt? test2.txt
?其中ln? 是link(鏈接),后者鏈接前者。
- ?兩個文件共用一個inode,并非獨立文件
- 2是文件(inode)的屬性,對應的是文件的引用計數
?此時使用? ll -li? 指令查看文件:
- ?軟連接是通過路徑去查找的(先找路徑,再使用inode),這也就是為什么刪除目標文件就無法使用的原因
- 硬鏈接是直接通過inode去查找的,建立鏈接后引用計數加一,只要引用結束不為0則不會真正刪除文件。
因為其查找的特點 ,軟連接常用于創建快捷方式,硬鏈接常用于備份。
動靜態庫
編程時很多常用的功能都是提前編好并封裝成庫,而庫則是程序代碼的集合,是共享程序代碼的一種方式。
- 靜態庫(.a):程序在編譯鏈接的時候把庫的代碼鏈接到可執行文件中。相當于程序自帶靜態庫。
- 動態庫(.so):程序在運行的時候才去鏈接動態庫的代碼,多個程序共享使用庫的代碼。
- 鏈接了動態庫的可執行程序的函數地址表中只包含會用到的函數的地址。
- 動態庫可以在多個程序間共享,所以動態鏈接使得可執行文件更小。
靜態庫創建:
- ar? ?-rc? ?libmyc.a? ?*.o?
把所有.o文件打包,形成一個文件libmyc.a的靜態庫。
動態庫創建:
-shared 意為共享
- gcc? ?-shared? ?-o? ?libmyc.so? ?*.o
?動靜態庫優缺點
靜態庫優點:
- 靜態庫打包到應用程序當中,加載快
- 方便移植
靜態庫缺點:
- ?其相同的庫文件數據可能在內存中被加載多份,比動態庫更消耗內存
- 庫文件更新需要重新編譯項目文件,生成新的可執行程序,更加耗時
?動態庫優點:
- 可實現不同進程間的資源共享
- 動態庫升級簡單,只需要替換庫文件,無需重新編譯應用程序
- 可以控制何時加載動態庫,不調用庫函數動態庫不會被加載?
動態庫缺點:?
- 加載速度比靜態庫滿
- 發布程序需要提供依賴的動態庫
動態庫加載
動態庫在程序運行時被加載到物理內存中,與程序進程產生關聯。動態庫加載后,會被映射到進程的地址空間中,先在頁表中填寫虛擬地址和物理地址的映射關系,然后映射到進程地址空間的共享區中。