linux两个进程相同的地址,在虚拟内存中,两个不同的进程可以具有相同的地址吗?...

Anil Vishnoi..

25

从理论上讲,用户在任何当前流行的操作系统(Win,linux,unix,Sol等)中执行的每个进程最初都允许使用4gig的地址范围(在32位平台上为0x00000000 t0 0xffffffff),无论是简单的hello world程序还是其复杂的Web容器托管stackoverflow站点.这意味着每个进程的范围都从相同的起始地址开始,并以相同的地址空间结束,并且以VIRTUALLY结尾.因此,显然每个进程在其各自的虚拟地址空间范围内具有相同的虚拟地址.所以你的第一个问题的回答是肯定的.

操作系统执行任何过程时都会出现差异,现代操作系统是多任务操作系统,并且它们在任何时间点都可以运行,因此在主存储器中容纳4gig的每个进程根本不可行.因此操作系统使用分页系统,其中它们将虚拟地址范围(0x00000000到0xffffffff)划分为4k大小的页面(并非总是如此).因此,在开始该过程之前,它实际上将初始时需要的页面加载到主内存,然后根据需要加载另一个虚拟页面范围.因此,将虚拟内存加载到物理内存(主内存)称为内存映射.在此过程中,您将页面的虚拟地址范围映射到物理地址范围(如ox00000000到ox00001000 virtaul地址范围到0x00300000到0x00301000物理地址范围),基于主存储器中的空闲插槽.

共享内存概念是一个例外,其中所有进程可以彼此共享一些虚拟地址范围,这将被映射到公共物理地址空间.因此在这种情况下,答案可以是YES.

作为Linux上的一个例子,每个可执行文件都需要libc.so库来执行程序可执行文件.每个进程都加载它们所需的库,并在它们的地址空间中为它们分配一些虚拟地址页面范围.所以现在考虑一个执行100个进程的场景,其中每个进程都需要这个库libc.so. 因此,如果操作系统在此库libc.so的每个进程中分配虚拟地址空间,那么您可以想象库libc.so的重复级别,并且很可能在任何时候您将获得多个libc.so地址实例主存储器中的范围页面.要使冗余操作系统将libc.so加载到映射到主存储器中固定物理地址范围的每个进程的特定虚拟地址空间范围.因此,每个进程都会引用固定的物理地址范围来执行libc.so中的任何代码.因此,在这种情况下,每个进程也共享一些物理地址范围.

但是在用户malloced虚拟地址范围映射中,两个进程不可能同时具有相同的物理地址.

希望能帮助到你.

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值