2014-01-24 147 views
8

我只想知道共享內存駐留在Linux系統中的位置?它在物理內存還是虛擬內存中?linux共享內存實際在哪裏?

我知道有關進程的虛擬內存發送信箱,他們從不同的工藝處理和流程沒有看到對方的記憶,但我們可以利用IPC進程之間傳遞數據。爲了實現這個簡單的場景,我剛創建了一個簡單的共享內存程序,並嘗試從shmat函數中打印共享內存地址和返回值,但是這兩個進程的地址不同,但值相同。

這裏是寫程序。

爲write.c

#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <stdio.h> 

int main() { 

    key_t key=1235; 
    int shm_id; 
    void *shm; 

    int *ptr = 83838; 

    shm_id = shmget(key,10,IPC_CREAT | 0666); 
    shm = shmat(shm_id,NULL,NULL); 

    sprintf(shm,"%d",ptr); 

    printf("Address is %p, Value is %p \n", (void *)shm, (void *)&ptr); 
    printf("Shm value is %d \n", *(int *)shm); 
    return; 
} 

這裏是閱讀器程序。

read.c

#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main() { 

    key_t key=1235; 
    int shm_id; 
    void *shm; 

    int *p = (int *)malloc(sizeof(int)); 
    shm_id = shmget(key,10,NULL); 
    shm = shmat(shm_id,NULL,NULL); 
    if(shm == NULL) 
    { 
    printf("error"); 
    } 
    sscanf(shm,"%d",p); 
    printf("Address is %p %p %p %d\n",(void *)shm, (void *)p, (void *)&p, *p); 
    printf("Shared value is %d \n", *(int *)shm); 
    return 0; 
} 

這將是巨大的,如果有人能請詳細解釋瞭如何處理同一個值,儘管有不同的地址?

這個問題來自C pass void pointer using shared memory

謝謝。

+1

其真實物理地址共享 – user2760375

+0

正如您所理解的答案的解釋,請接受它 – tez

回答

14

提交的所有內存都是物理的。

然而進程不能直接解決物理內存。它們具有內核將解析爲物理地址的虛擬地址。當共享內存區域被設置時,多個進程尋址相同的物理內存位置。但是,虛擬地址可以不同。每個進程只使用它自己的上下文中收到的虛擬地址。這兩個虛擬地址都指向相同的物理內存。


爲了詳細描述,在一個共享的存儲器區域的情況下,相同的物理存儲器地址是尋址由多個進程同時作爲二者的方法具有指向相同的物理地址的虛擬地址。

例如考慮以下幾點:

  • 虛擬地址V1(在過程T1上下文)
  • 虛擬地址V2(在過程T2上下文)

都指向共享內存區域。
這實際上是一種常見的物理地址P

現在,
過程T1參照虛擬地址V1
OR
過程T2參照虛擬地址V2

將導致到物理地址P上的訪問因爲內核會將虛擬地址位置轉換爲相同的phy在記憶中的位置。


例如,下面的圖中,物理存儲器PFN4由進程X和Y使用在各自的上下文VPFN3VPFN1共享。

Virtual memory maps for 2 processes

+0

確定。得到它了。感謝您的詳細解釋。現在清楚。但在我所共享的鏈接中,我試圖使用共享內存共享一個進程地址,在第二個示例中,我試圖讀取該地址的地址和值,但我只能共享地址或值,而不能同時使用兩者。 – skanzariya

+0

虛擬地址僅在其進程上下文中有效。一旦發生上下文切換並且正在運行不同的進程,則加載的新頁面表可能不包含該特定地址的物理位置映射,從而導致段錯誤。即使偶然地將物理內存位置映射到新進程中的相同虛擬地址,也不能保證指向與原始進程中相同的物理內存位置。通過這個[**答案**](http://stackoverflow.com/a/20348391/319204)來正確理解你所面臨的問題。 – TheCodeArtist