bep*_*ras 4 c linux malloc virtual-memory
假设我有两个过程a,并b在Linux上.在这两个过程中我malloc()用来分配一个内存,
有没有机会malloc()在两个进程中返回相同的起始地址?如果不是,那么谁来照顾这个.如果是,则两个进程都可以访问此地址的相同数据.
小智 12
malloc()是否有可能在两个进程中返回相同的起始地址.
是的,但这不是问题.
您不理解的是操作系统首先为您处理物理空间 - 程序等只能看到虚拟地址.只有一个虚拟地址空间,然而,操作系统(现在让我们坚持使用32位)将其划分.在Windows上,上半部分(0xA0000000 +)属于内核,下半部分属于用户模式进程.这被称为2GB/2GB分割.在Linux上,鸿沟为3GB/1GB - 请参阅此文章:
内核内存定义为从PAGE_OFFSET开始,在x86中为0XC0000000或3千兆字节.(这是定义3gig/1gig拆分的地方.)PAGE_OFFSET上方的每个虚拟地址都是内核,PAGE_OFFSET下面的任何地址都是用户地址.
现在,当进程切换(而不是上下文切换)发生时,属于当前进程的所有页面都从虚拟内存中取消映射(不一定要分页)和属于待运行进程的所有页面被复制(免责声明:这可能不完全正确;可以将页面标记为脏等,然后在访问时复制,理论上).
分裂的原因是,出于性能原因,虚拟内存空间的上半部分仍然可以映射到操作系统内核.
因此,尽管malloc可能在两个给定进程中返回相同的值,但这并不重要,因为:
对于64位系统,由于我们目前只使用其中的48位,因此用户模式底部和内核模式之间存在鸿沟(尚未解决).
| 归档时间: |
|
| 查看次数: |
1569 次 |
| 最近记录: |