轉 DLL 多個程序間共享動態鏈結庫的原理

2022-08-27 05:18:08 字數 2270 閱讀 2007

同樣這個問題是我在面試總監的時候,總監問我的乙個問題,這些天一直 忙活,都沒有好好看書了,今天總結一下這個問題?為什麼乙個程序用完乙個動態鏈結庫以後另乙個程序還可以繼續使用呢?當時回答的很是籠統,只說對了答案的一半,現在就在這裡好好總結一下吧!

前面我們已經說過程序間的通訊有好幾種方式,其實現在我們講的這種動態鏈結庫也是程序間的通訊方式之一。

不管是windows還是linux作業系統其實所有的作業系統的內涵知識都是一樣的。

動態鏈結庫是windows作業系統的基礎,其中windows api基本上都是以動態鏈結庫的形式來提供的,通常來說動態鏈結庫是不能夠直接執行,也不能直接接收訊息的,他們是一些獨立的檔案(字尾名一般為.dll,當然還有其它的一些字尾名也是可以的),其中包含能被可執行程式或其它dll呼叫來完成某項工作的函式,也就是說動態鏈結庫也就是由一些函式組成而已。並且只有在其它模組呼叫動態鏈結庫中的函式時,動態鏈結庫才發揮作用,在實際的程式設計中,通常可以完成某種功能的函式放在乙個動態鏈結庫中,然後提供給其它函式呼叫。當這個訪問了的動態鏈結庫的程序被載入時,系統會為這個程序分配4gb的私有位址空間(如果是32位機的話),然後系統就會分析這個可執行模組,找到這個可執行模組中將所要呼叫的dll,然後系統就負責搜尋這些dll找到這些dll後便將這些dll載入到記憶體中,並為他們分配虛擬記憶體空間,最後將dll的頁面對映到呼叫程序的位址空間彙總,dll的虛擬記憶體有**頁和資料頁,他們被分別對映到程序a的**頁面和資料頁面,如果這時程序b也啟動了,並且程序b也許要訪問該dll,這時,只需要將該dll在虛擬記憶體中的**頁面和資料頁面對映到第二個程序的位址空間即可。這也表明了在記憶體中,只需要存在乙份dll的**和資料。

多個程序共享dll的同乙份**,很明顯這樣做可以節省記憶體空間的。

但是在windows下(linux中也是一樣的),由於系統會為每乙個程序分配4gb的私有位址空間,

dll中的**和資料也只是對映到了這個私有位址空間中,所以這些應用程式之間還是不能夠相互影響的,

也就是說多個應用程式雖然是可以共享同乙個dll中的相同的**的,

但是dll為每乙個程序儲存的資料都是不相同的,

並且每乙個程序都為dll使用的全部資料分配了自己的位址空間,

舉個最簡單的例子,我的dll中有乙個函式為intadd(int    num1 ,   int    num2)

這個函式的作用是實現num1num2相加並返回相加後的結果。

然後我有乙個程序 a使用了這個dll,並且其呼叫了函式add(10, 20),

然後我還有乙個程序 b其也使用了這個dll,並且其呼叫了函式add(30, 40),

那麼對於程序 a中的資料1020其實是儲存在程序 a的私有位址空間中的,

而對於程序 b中的資料3040則是儲存在程序 b的私有位址空間中的,

上面這個簡單的例子表明如果單單用這種簡單的使用動態鏈結庫的方式是不能夠實現程序之間的通訊的。

如果想利用動態鏈結庫來實現程序間的通訊的話,那麼有一種方案可以試一試,

即從系統為動態鏈結庫分配的那一塊記憶體(系統需要將動態鏈結庫載入到記憶體中)下手,

由於在記憶體中,動態鏈結庫其實只存在乙份,

其被所有需要呼叫該動態鏈結庫中的函式的模組或者簡單說是可執行程式所共享,

既然是共享的話,如果我在系統給動態鏈結庫分配的這塊記憶體中儲存資料,

那豈不是可以被所有訪問該動態鏈結庫的可執行程式所獲取或者說設定。

這樣的話,我就可以使用程序 a來設定好這個共享記憶體中的資料,

然後程序 b就可以讀取這個共享記憶體中的資料了,這不是也可以實現程序間的通訊嘛,

這樣看來的話,其思路其實和使用剪貼簿是一模一樣的了。

也是採用一塊兩個程序共享的記憶體來作為存放資料的中介。

使用DLL在多個程序間共享全域性變數

預設情況下,同乙個程式啟動多個程序,它們各自的變數值是不會相互影響的。第二個例項啟動後,在修改全域性變數的時候,系統會運用記憶體管理系統copy on write的特性來防止修改了第乙個例項的資料,即系統會再分配一些記憶體,並將全域性變數複製到這塊記憶體中,每個例項使用自己的記憶體空間上的資料而互不...

使用DLL在多個程序間共享全域性變數

預設情況下,同乙個程式啟動多個程序,它們各自的變數值是不會相互影響的。第二個例項啟動後,在修改全域性變數的時候,系統會運用記憶體管理系統copy on write的特性來防止修改了第乙個例項的資料,即系統會再分配一些記憶體,並將全域性變數複製到這塊記憶體中,每個例項使用自己的記憶體空間上的資料而互不...

程序間通訊 DLL共享節

dll共享節技術可以讓使用同乙個dll的多個程序共享一塊記憶體 共享節 下面我通過乙個專案來演示使用方法。首先準備乙個受害者程式,我選用了xp的掃雷,您也可以用任意喜歡的程式。然後,編寫dll,dll中需要設定共享節,然後在本專案中,dll被注入到掃雷程序,然後迴圈列印共享節中的資料,這個資料可以被...