【问题标题】:Mapping of Virtual Address to Physical Address虚拟地址到物理地址的映射
【发布时间】:2012-02-18 20:50:41
【问题描述】:

我怀疑每个进程都有自己的单独页表,那么为什么需要系统范围的页表?此外,如果页表将虚拟地址映射到物理地址,那么我认为两个进程可能映射到相同的物理地址,因为所有进程都具有相同的虚拟地址空间。系统范围页表上的任何好的链接也可以解决我的问题?

【问题讨论】:

  • 你需要考虑共享内存。每个进程都需要自己的虚拟到物理映射,但系统需要对整个物理内存进行概览,以便在进程需要将更多虚拟内存映射到物理内存时知道可以使用哪些内容。

标签: c linux unix operating-system


【解决方案1】:

每个进程都有自己独立的虚拟地址空间——两个进程可以将 virtpage 1 映射到不同的 physpage。进程可以参与共享内存,在这种情况下,它们每个都有一些 virtpage 映射到同一个 physpage。

进程的虚拟地址空间可用于将 virtpages 映射到 physpages、内存映射文件、设备等。Virtpages 不必连接到 RAM。一个进程可以对整个 1GB 文件进行内存映射——在这种情况下,它的物理内存使用量可能只有几兆,但它的虚拟地址空间使用量将是 1GB 或更多。许多进程可以做到这一点,在这种情况下,所有进程的虚拟地址空间使用总和可能是 40 GB,而总物理内存使用量可能只有 100 兆;这在 32 位系统上很容易做到。

由于许多进程加载相同的库,操作系统通常将库放在一组只读可执行页面中,然后在 virtpage 空间中为每个进程加载映射以指向该一组页面,以保存在物理内存上。

进程可能具有不指向任何内容的 virtpage 映射,例如,如果进程的部分内存被写入页面文件 - 进程将尝试访问该页面,CPU 将触发页面错误,操作系统将看到页面错误并通过暂停进程来处理它,将页面从页面文件读回内存,然后恢复进程。

通常有 3 种类型的页面错误。第一种是当 CPU 在 TLB 中没有虚拟物理映射时 - 处理器调用操作系统中的页面错误软件中断,操作系统将映射放入该进程的处理器中,然后 proc 重新运行有问题的指示。这些情况每秒发生数千次。

第二种类型是当操作系统没有映射时,例如,进程的内存已交换到磁盘,如上所述。这些在负载较轻的机器上很少发生,但随着内存压力的增加,发生的频率更高,每秒高达 100 到 1000 次,甚至更多。

第三种是当操作系统因为映射不存在而没有映射时——进程试图访问不属于它的内存。这会产生一个段错误,并且通常会终止该进程。这些不应该经常发生,仅取决于软件在机器上的编写程度,与调度或机器负载无关。

即使你已经知道这一点,我想我还是把它贡献给社区。​​p>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 2021-11-22
    • 2015-05-04
    • 1970-01-01
    相关资源
    最近更新 更多