在linux下做過一個測試:
寫一個so,該so中有一個全域性變數。so中的程式碼在執行時會修改該全域性變數的值。然後,有多個程式都需要該so,而且這些應用程式都啟動了。此時,很顯然so只被載入了一份,那麼,當這麼多程式在執行呼叫該so時,該so中的全域性變數的值會被覆蓋來覆蓋去麼?
答案是不會。這是測試的答案。
現在知道原理了,儘管這是windows via C/C++中解釋的windows的做法,但是我想linux也是這麼類似處理的。
windows 使用memory map來載入exe和dll。當一個exe/dll有多個instance要啟動時,實際在windows paging file(包括RAM和swap檔案)中,exe和牽涉到的dll,只有一份。這樣可以節省記憶體使用,也可以提高效能。
也就是說,如果是exe,雖然每個instance都有自己獨立的地址空間,但是地址空間對映到storage的時候,他們對映的都是同樣的地方。這樣就帶來問題了:exe/dll中的全域性變數和靜態變數怎麼辦?每個instance都有可能會修改這些變數。
windows 的做法是,該存放全域性變數和靜態變數的page,設定copy on write protect attribute。所以,當任何一個執行緒嘗試修改這些page中的內容時,windows負責分配一個新的page出來,然後修改該執行緒的地址空間,將 這個新分配的page的地址設定上去,從此以後,該執行緒修改這個全域性變數或是靜態變數,操作的就是這個新分配的page了。這樣,多個例項就不會出現全域性 變數或靜態變數互相覆蓋的問題了。
在linux下做過一個測試:
寫一個so,該so中有一個全域性變數。so中的程式碼在執行時會修改該全域性變數的值。然後,有多個程式都需要該so,而且這些應用程式都啟動了。此時,很顯然so只被載入了一份,那麼,當這麼多程式在執行呼叫該so時,該so中的全域性變數的值會被覆蓋來覆蓋去麼?
答案是不會。這是測試的答案。
現在知道原理了,儘管這是windows via C/C++中解釋的windows的做法,但是我想linux也是這麼類似處理的。
windows 使用memory map來載入exe和dll。當一個exe/dll有多個instance要啟動時,實際在windows paging file(包括RAM和swap檔案)中,exe和牽涉到的dll,只有一份。這樣可以節省記憶體使用,也可以提高效能。
也就是說,如果是exe,雖然每個instance都有自己獨立的地址空間,但是地址空間對映到storage的時候,他們對映的都是同樣的地方。這樣就帶來問題了:exe/dll中的全域性變數和靜態變數怎麼辦?每個instance都有可能會修改這些變數。
windows 的做法是,該存放全域性變數和靜態變數的page,設定copy on write protect attribute。所以,當任何一個執行緒嘗試修改這些page中的內容時,windows負責分配一個新的page出來,然後修改該執行緒的地址空間,將 這個新分配的page的地址設定上去,從此以後,該執行緒修改這個全域性變數或是靜態變數,操作的就是這個新分配的page了。這樣,多個例項就不會出現全域性 變數或靜態變數互相覆蓋的問題了。