不同進程的不同變量可以同時訪問相同的地址嗎?


可以

我們程序中所顯示的內存地址實際上是虛擬地址.

不同進程訪問相同地址的一個典型例子就是共享內存.

共享內存在不同進程中映射的地址一樣嗎?

 不一樣.同一塊物理內存被映射到進程A、B各自的進程地址空間.但是可以通過OS的幫助得到他們在不同進程的虛地址.

 

另外的言論:

理論上,用戶在任何當前流行的操作系統(Win,linux,unix,Sol等)中執行的每個進程最初都允許使用4gig的地址范圍(在32位平台上為0x00000000 t0 0xffffffff),無論它是一個簡單的hello世界程序或其復雜的Web容器托管stackoverflow site.It意味着每個進程的范圍從相同的起始地址開始,並以相同的地址空間結束,並且以VIRTUALLY結尾。因此,顯然每個進程在其各自的虛擬地址空間范圍內具有相同的虛擬地址。

當操作系統執行任何進程時,差異就會出現,現代操作系統是多任務操作系統,並且它們在任何時間點都可以在進程中運行更多。因此,在主內存中容納4gig的每個進程根本不可行。因此操作系統使用分頁系統,其中它們將虛擬地址范圍(0x00000000到0xffffffff)划分為4k大小的頁面(並非總是如此)。因此,在開始該過程之前,它實際上將初始時需要的頁面加載到主內存,然后根據需要加載另一個虛擬頁面范圍。因此,將虛擬內存加載到物理內存(主內存)稱為內存映射。在此過程中,您將頁面的虛擬地址范圍映射到物理地址范圍(如ox00000000到ox00001000 virtaul地址范圍到0x00300000到0x00301000物理地址范圍),基於主存儲器中的空閑時隙。所以在任何時間點只有一個虛擬地址范圍將映射到該特定的物理地址范圍

BUT

共享內存概念是一個例外,其中所有進程可以彼此共享一些虛擬地址范圍,這將被映射到公共物理地址空間。所以在這種情況下,答案可以是YES。

作為Linux上的一個例子,每個可執行文件都需要libc.so庫來執行程序可執行文件。每個進程都會加載它們所需的庫,並在它們的地址空間中為它們分配一些虛擬地址頁面范圍。所以現在考慮一個執行100個進程的場景,其中每個進程都需要這個庫libc.so.因此,如果操作系統在此庫libc.so的每個進程中分配虛擬地址空間,那么您可以想象庫libc.so&的重復級別。很有可能在任何時候你都會在主內存中獲得多個libc.so地址范圍頁面的實例。所以要做多余的操作系統會將libc.so加載到映射到的每個進程的特定虛擬地址空間范圍內主存儲器中的固定物理地址范圍。因此,每個進程都將引用該固定的物理地址范圍來執行libc.so中的任何代碼。因此,在這種情況下,每個進程也共享一些物理地址范圍。

但是在用戶malloced虛擬地址范圍映射中,兩個進程不可能同時具有相同的物理地址。

參考文章:https://www.thinbug.com/q/3552633


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM