0

例如,如果有 3 个进程,每个进程都使用0x400000文本部分的虚拟地址。并且用户进程只有一个4KB物理页面。

假设进程 0 正在使用物理页面(虚拟地址0x400000)。假设物理页数据为page_pid_0_0x400000

当操作系统调度进程 1 时page_pid_1_0x400000,进程 1 将从可执行文件加载到物理页面中。然后page_pid_0_0x400000应该将数据换出到磁盘。

当进程 2 也被加载时,page_pid_2_0x400000物理页面上的数据也应该被换出到磁盘。

现在,在磁盘上,我们有相同虚拟地址空间的 2 个副本,即0x400000:page_pid_1_0x400000page_pid_0_0x400000.

如果现在调度进程 1,我(操作系统)如何识别page_pid_1_0x400000来自虚拟地址0x400000(因为内存访问指令只知道虚拟地址0x400000而不知道进程 ID)?

4

1 回答 1

0

操作系统可以有各种相关的数据结构。例如,每个进程可以有自己的数据结构(和页表)来表示其地址空间,并且操作系统只需要确保在恢复进程时将 cpu 指向正确的页表集。

类似地,交换处理不限于仅使用虚拟地址,它可以(address space, virtual address)用来发现交换位置。它可以根据需要使其灵活或刚性。例如,它可能将虚拟地址视为连续虚拟地址集合的一部分,这些虚拟地址在页面存储在文件或交换的位置之间具有一些共同点。

页表和虚拟地址的概念是地址CPU+MMU转换的接口。操作系统可以维护它想要的任何关联数据结构。

在旧系统中,每个页面描述符(有时是页表条目或 pte)都会有一个位来确定页面是否有效。CPU/MMU 将忽略被认为无效的页面;因此,当一个页面被交换到磁盘时,页表条目中的其他位是存储磁盘交换地址的方便位置。

现代系统倾向于具有更复杂的数据结构来适应页面的瞬时共享和锁定,因此通常使用辅助结构。

于 2020-12-11T04:13:17.760 回答