<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)有什么區(qū)別?

          共 2452字,需瀏覽 5分鐘

           ·

          2024-07-28 10:03

                    

          本文轉(zhuǎn)載自公眾號(hào):菜鳥教程

          今天簡(jiǎn)單聊一下動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)的區(qū)別。

          計(jì)算機(jī)的運(yùn)行當(dāng)然離不開內(nèi)存。

          程序運(yùn)行在內(nèi)存當(dāng)中,那么程序在內(nèi)存中的布局是什么樣子的呢?

          程序的內(nèi)存分為代碼區(qū)、數(shù)據(jù)區(qū)、堆區(qū)和棧區(qū),它們的布局是這樣的,這里重點(diǎn)看代碼區(qū)。

          代碼區(qū)中是什么呢?

          這里主要就是你寫的代碼,當(dāng)然還有你使用的庫(kù)。

          這里主要是標(biāo)準(zhǔn)庫(kù),以及非標(biāo)準(zhǔn)庫(kù),也就是普通的庫(kù)。

          接下來(lái)我們來(lái)看第一個(gè)階段:編譯。

          假設(shè)你在編寫一段空前絕后的代碼,需要使用加法函數(shù),考慮到這個(gè)函數(shù)可能其它人也需要,因此單獨(dú)放到一個(gè)源文件中,其它類似的函數(shù)也一樣。

          接下來(lái)是編譯過(guò)程,先編譯成目標(biāo)文件,鏈接器把目標(biāo)文件打包成最終的可執(zhí)行程序。

          由于你實(shí)現(xiàn)的加減乘除等函數(shù)非常好用,廣受其它程序員的歡迎,因此你寫的代碼漸漸的變成了一種標(biāo)準(zhǔn),所有程序員都遵循,標(biāo)準(zhǔn)庫(kù)就是這么誕生的。

          當(dāng)然,你寫的代碼也可能根本沒(méi)有其它人用,只能當(dāng)做你自己使用的普通庫(kù),實(shí)際上這才是人生常態(tài),這樣的非標(biāo)準(zhǔn)庫(kù)還是留著自己用吧。

          不管是標(biāo)準(zhǔn)庫(kù)還是非標(biāo)準(zhǔn)庫(kù)對(duì)后續(xù)的講解都是一樣的,因此我們以標(biāo)準(zhǔn)庫(kù)為例來(lái)講解。

          現(xiàn)在有了標(biāo)準(zhǔn)庫(kù),所有人都很開心,終于不用重復(fù)造輪子了。

          但是很快你會(huì)發(fā)現(xiàn),及時(shí)寫一個(gè)最簡(jiǎn)單的hello world程序,也不得不重新編譯一堆標(biāo)準(zhǔn)庫(kù)代碼。

          這顯然是很浪費(fèi)時(shí)間的,但這對(duì)打工人來(lái)說(shuō)是很不錯(cuò),可以利用編譯時(shí)間合理摸魚。

          該怎么解決重復(fù)編譯標(biāo)準(zhǔn)庫(kù)的問(wèn)題呢。

          很簡(jiǎn)單,可以提前把標(biāo)準(zhǔn)庫(kù)編譯出來(lái)。

          這樣我們?cè)俅尉幾g自己的項(xiàng)目時(shí)直接跳過(guò)標(biāo)準(zhǔn)庫(kù)的編譯過(guò)程,直接把標(biāo)準(zhǔn)庫(kù)鏈接到最終的可執(zhí)行程序中。

          接下來(lái)我們來(lái)到了第二階段,鏈接。

          鏈接器從表面看實(shí)際上是一個(gè)打包器,把各種目標(biāo)文件,也就是你的代碼和標(biāo)準(zhǔn)庫(kù)打包起來(lái),如果還有其它庫(kù)也是一樣的道理,經(jīng)過(guò)鏈接會(huì)生成最終的可執(zhí)行程序。

          注意看最終的可執(zhí)行程序中,包含了你的代碼和使用的庫(kù),這種將所有代碼打包到可執(zhí)行程序的鏈接方式叫做靜態(tài)鏈接。

          可執(zhí)行程序當(dāng)然是保存在磁盤中的,接下來(lái)我們雙擊運(yùn)行這個(gè)程序。

          此時(shí)會(huì)在內(nèi)存中劃分出一塊區(qū)域,這里就是我們最開始看到的堆區(qū)、棧區(qū)、數(shù)據(jù)和代碼區(qū)。

          這時(shí)會(huì)把可執(zhí)行程序中的指令都拷貝到代碼區(qū),這就是程序運(yùn)行的最基本原理。

          顯然計(jì)算機(jī)系統(tǒng)里不會(huì)只有一個(gè)程序。

          可能會(huì)有很多個(gè),如果所有程序都采用靜態(tài)鏈接會(huì)怎樣呢?

          如果都是靜態(tài)鏈接,那么這些程序都保存一份標(biāo)準(zhǔn)庫(kù),由于是標(biāo)準(zhǔn)庫(kù),因此它們的內(nèi)容都是一樣的,最終這些程序都保存在磁盤上,占據(jù)磁盤空間:

          而在運(yùn)行起來(lái)后同樣會(huì)占用內(nèi)存空間。

          注意看這里 和這里,它們的內(nèi)容都是一樣的,這顯然是在浪費(fèi)寶貴的存儲(chǔ)資源。

          問(wèn)題出在哪里呢?

          注意看這里,每個(gè)可執(zhí)行程序都包含有一份標(biāo)準(zhǔn)庫(kù)。

          這就像什么呢?這就像一本非常厚的書,這本書把引用到的所有內(nèi)容到裝訂在一起。

          好處當(dāng)然是更方便讀者閱讀引用到的內(nèi)容,但問(wèn)題就是這樣的書太厚重了,更好的方法是把引用到內(nèi)容放在一頁(yè)參考文獻(xiàn)中而不要打包在一起,這樣一本書就很輕量了。

          可執(zhí)行程序也是一樣的道理,我們不再打包一切而是使用參考文獻(xiàn)。

          這就是所謂的動(dòng)態(tài)鏈接。

          這時(shí)提前編譯好的庫(kù)就是動(dòng)態(tài)庫(kù),linux下以.so為結(jié)尾,windows中是dll文件。

          這時(shí)的可執(zhí)行程序中不再包含完整的動(dòng)態(tài)庫(kù)代碼,而是只有一份參考文獻(xiàn),你可以想象一下,這里肯定保存了兩項(xiàng)基本信息,依賴了哪個(gè)庫(kù),這個(gè)庫(kù)保存在了哪里。

          這樣及時(shí)有再多的可執(zhí)行程序也不怕,因?yàn)槲覀冎恍枰4嬉环輼?biāo)準(zhǔn)庫(kù)。

          動(dòng)態(tài)鏈接的程序該怎么運(yùn)行呢?依然是把可執(zhí)行程序拷貝到代碼區(qū),然后根據(jù)參考文獻(xiàn)把動(dòng)態(tài)庫(kù)加載進(jìn)來(lái),這時(shí)才是真正的鏈接,也就是所謂的動(dòng)態(tài)鏈接,我們把鏈接這個(gè)過(guò)程從編譯期推遲到了運(yùn)行時(shí)。

          如果是其它程序運(yùn)行呢?道理也一樣。

          動(dòng)態(tài)鏈接下每個(gè)程序中不會(huì)有一份標(biāo)準(zhǔn)庫(kù),而是大家共享內(nèi)存中的同一份標(biāo)準(zhǔn)庫(kù)。

          這樣利用動(dòng)態(tài)鏈接我們不但節(jié)省了磁盤空間也節(jié)省了內(nèi)存空間。

          接下來(lái)我們簡(jiǎn)單總結(jié)一下靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的區(qū)別了。

          首先是靜態(tài)鏈接。

          靜態(tài)鏈接下的可執(zhí)行程序中打包了所以用到的東西,就和這個(gè)工具箱一樣,這樣的程序不再依賴其它庫(kù)。

          因此在大規(guī)模部署到服務(wù)器時(shí)非常方便,所以你會(huì)看到一些互聯(lián)網(wǎng)服務(wù)程序很多采用靜態(tài)鏈接。

          但是靜態(tài)鏈接也有自己缺點(diǎn),那就是修復(fù)bug不是很方便,你需要從頭開始編譯鏈接生成最終的可執(zhí)行程序,然后重新部署服務(wù)并重啟。

          同時(shí)靜態(tài)鏈接也有我們剛提到的重復(fù)占據(jù)磁盤和內(nèi)存空間的問(wèn)題,而動(dòng)態(tài)庫(kù)則沒(méi)有這個(gè)問(wèn)題。

          當(dāng)然我們說(shuō)靜態(tài)庫(kù)的這一問(wèn)題這是站在單機(jī)一臺(tái)機(jī)器有多個(gè)應(yīng)用的角度,而對(duì)于一個(gè)應(yīng)用需要部署在多機(jī)的角度這些都不是事。

          接下來(lái)我們看動(dòng)態(tài)庫(kù)。

          假設(shè)你用動(dòng)態(tài)鏈接的方式構(gòu)建了一個(gè)非常受歡迎的應(yīng)用程序,然后發(fā)布出去。

          發(fā)布出去后發(fā)現(xiàn)動(dòng)態(tài)庫(kù)模塊有bug,那么該怎么修復(fù)呢?很簡(jiǎn)單,只需要修復(fù)bug后重新生成新的動(dòng)態(tài)庫(kù),簡(jiǎn)單的更新動(dòng)態(tài)庫(kù)即可,而不需要重新發(fā)布應(yīng)用。

          這就是為什么很多應(yīng)用程序采用動(dòng)態(tài)鏈接的原因。

          好啦,這個(gè)話題就先簡(jiǎn)單講解到這里,希望對(duì)大家理解鏈接器有所幫助。

             



          招已經(jīng)開始啦,大家如果不做好充足準(zhǔn)備的話,招很難找到好工作。


          送大家一份就業(yè)大禮包,大家可以突擊一下春招,找個(gè)好工作!


          瀏覽 86
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美色道 | 淫色成人网 | www.操逼操逼 | 九色在线观看 | 日批后入试势动态视频免费看 |