zoukankan      html  css  js  c++  java
  • 不同进程的不同变量可以同时访问相同的地址吗?

    可以

    我们程序中所显示的内存地址实际上是虚拟地址.

    不同进程访问相同地址的一个典型例子就是共享内存.

    共享内存在不同进程中映射的地址一样吗?

     不一样.同一块物理内存被映射到进程A、B各自的进程地址空间.但是可以通过OS的帮助得到他们在不同进程的虚地址.

    另外的言论:

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

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

    BUT

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

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

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

    参考文章:https://www.thinbug.com/q/3552633

  • 相关阅读:
    HDU 1010 Tempter of the Bone
    HDU 4421 Bit Magic(奇葩式解法)
    HDU 2614 Beat 深搜DFS
    HDU 1495 非常可乐 BFS 搜索
    Road to Cinema
    Sea Battle
    Interview with Oleg
    Spotlights
    Substring
    Dominating Patterns
  • 原文地址:https://www.cnblogs.com/Stephen-Qin/p/13711865.html
Copyright © 2011-2022 走看看