2017-10-20 42 views
1

進程A使用shmget創建共享內存'1234'。之後,進程A使用shmat將內存附加到自身。共享內存在Linux環境下如何工作?

進程B還使用shmat將與'1234'對應的共享內存附加到自己。

現在「附加」是什麼意思?有兩個相同內存的副本存在嗎?如果不是,那麼這個內存究竟在哪裏存在?

回答

0

每個進程都有自己的虛擬內存空間。爲了簡化一些事情,你可以想象一個進程擁有所有可能的內存地址0x00000000..0xffffffff。這樣做的一個後果就是一個進程不能使用分配給任何其他進程的內存 - 這對於穩定性和安全性都是絕對必要的。

在幕後,內核管理所有進程的分配並將它們映射到物理內存,確保它們不重疊。當然,並非所有的地址都是實際映射的,只是那些正在使用的地址。這是通過頁面完成的,並且通過CPU硬件中的內存映射單元來完成。

創建共享內存(shmget)會分配一塊不屬於任何特定進程的內存。它只是坐在那裏。從內核的角度來看,誰來使用它並不重要。所以一個進程必須請求訪問它 - 這就是shmat的作用。通過這樣做,內核會將共享內存映射到進程的虛擬內存空間。這樣,該過程可以讀取和寫入它。因爲它是相同的內存,所有「附加」到它的進程看到相同的內容。其他進程也可以看到進程所做的任何更改。