malloc 可以在两个不同的进程中返回相同的地址吗?

标签 c linux malloc virtual-memory

假设我在 Linux 上有两个进程 ab。在这两个过程中,我都使用 malloc() 分配内存,

malloc() 是否有可能在两个进程中返回相同的起始地址? 如果没有,那么谁来处理这件事。 如果是,则两个进程都可以访问该地址的相同数据。

最佳答案

Is there any chances that malloc() return same starting address in two process.

是的,但这不是问题。

您不了解的是,操作系统首先会为您处理您的物理空间 - 程序等只能看到虚拟地址。只有一个虚拟地址空间,但是,操作系统(让我们暂时使用 32 位)将其划分。在 Windows 上,上半部分 (0xA0000000+) 属于内核,下半部分属于用户模式进程。这称为 2GB/2GB 拆分。在 Linux 上,划分为 3GB/1GB - 请参阅 this article :

Kernel memory is defined to start at PAGE_OFFSET,which in x86 is 0XC0000000, or 3 gigabytes. (This is where the 3gig/1gig split is defined.) Every virtual address above PAGE_OFFSET is the kernel, any address below PAGE_OFFSET is a user address.

现在,当进程切换(而不是上下文切换)发生时,属于当前进程的所有页面都从虚拟内存中取消映射(不一定对它们进行分页)并且所有属于 future 的页面-run 进程被复制(免责声明:这可能不完全正确;理论上可以将页面标记为脏等并在访问时复制)。

拆分的原因是,出于性能考虑,虚拟内存空间的上半部分可以保持映射到操作系统内核。

因此,尽管 malloc 可能在两个给定进程中返回相同的值,但这无关紧要,因为:

  1. 实际上,它们不是同一个地址。
  2. 进程不会在任何地方共享虚拟内存。

对于 64 位系统,由于我们目前只使用其中的 48 位,因此在用户模式和内核模式之间存在一个不可寻址的鸿沟(目前)。

关于malloc 可以在两个不同的进程中返回相同的地址吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11328815/

相关文章:

C语言 : Parallel threads?

c - gtk 初学者应用程序无法在断言失败的情况下工作

linux - 在 linux 中的嵌套 for 循环中调用可执行文件

在 C 中重新分配内存时编译中断

c - c 中的 sbrk 和 malloc

我可以依靠 malloc 返回 NULL 吗?

c - fseek 在 Linux 中不起作用

C sscanf 不适用于 float

c - 具有重定向输出应用程序的 Linux C TCP 套接字客户端/服务器

c - ioctl调用程序编译错误