gpt4 book ai didi

c - linux共享内存实际位于哪里?

转载 作者:IT王子 更新时间:2023-10-28 23:33:05 30 4
gpt4 key购买 nike

我只是想知道共享内存在 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 .

最佳答案

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

但是进程不能直接寻址物理内存。它们具有内核将解析为物理地址的虚拟地址。设置共享内存区域时,多个进程会寻址相同的物理内存位置。但是,虚拟地址可以不同。每个进程只在自己的上下文中使用它收到的虚拟地址。两个虚拟地址都指向同一个物理内存。


详细说明,在共享内存区域的情况下,多个进程可以同时寻址相同的物理内存地址,因为这两个进程都有指向相同物理地址的虚拟地址。

例如考虑以下内容:

  • 虚拟地址V1(在进程T1上下文中)
  • 虚拟地址 V2(在进程 T2 上下文中)

都指向共享内存区域。
这其实是一个普通的物理地址P

现在,
进程 T1 引用虚拟地址 V1

进程 T2 引用虚拟地址 V2

将导致访问物理地址P,因为内核将两个虚拟地址位置转换为内存中的相同物理位置。


例如,在下图中,物理内存 PFN4 由进程 X 和 Y 使用各自的 VPFN3VPFN1 共享上下文(PFN 代表页框号)。

Virtual memory maps for 2 processes

关于c - linux共享内存实际位于哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21325001/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com