Memory 虚拟内存是否总是为进程提供更大的地址空间?

Memory 虚拟内存是否总是为进程提供更大的地址空间?,memory,memory-management,Memory,Memory Management,据我所知,一个进程被分配了实内存空间,即RAM。这是固定的,因此如果进程需要更多内存,它将从虚拟内存中获取 因此,虚拟内存所做的只是根据需要将页面交换到进程内存空间中/从中取出,然而,进程的实际内存空间保持不变 我的问题是,虚拟内存是否可以物理地更改进程的实际内存空间以提供更多内存?冒着过度简化的风险,为一个进程分配一个页表(为简单起见,假设为单级页)。页表有许多条目。每个条目代表内存中的一个潜在页面。页表的最大大小受处理器地址空间的限制。但是,操作系统可能会限制小于此值的页面大小 (假设每个可

据我所知,一个进程被分配了实内存空间,即RAM。这是固定的,因此如果进程需要更多内存,它将从虚拟内存中获取

因此,虚拟内存所做的只是根据需要将页面交换到进程内存空间中/从中取出,然而,进程的实际内存空间保持不变


我的问题是,虚拟内存是否可以物理地更改进程的实际内存空间以提供更多内存?

冒着过度简化的风险,为一个进程分配一个页表(为简单起见,假设为单级页)。页表有许多条目。每个条目代表内存中的一个潜在页面。页表的最大大小受处理器地址空间的限制。但是,操作系统可能会限制小于此值的页面大小

(假设每个可执行文件启动一个新进程)应用程序加载器将地址空间设置为初始状态,其中包括所有静态数据、可执行代码、预分配的可修改数据和初始状态

此时没有物理内存

当程序启动时,它将引用虚拟内存中没有物理内存的页面(页面错误)。然后,操作系统将物理内存页分配给虚拟页。启动时会出现许多页面错误

当应用程序运行时,它可以分配更多的虚拟内存,直到达到页表大小的限制

当应用程序运行时,操作系统可以将物理内存重新映射到虚拟内存。程序运行时,同一虚拟地址可以有多个物理地址

所以这是一个错误的假设

据我所知,一个进程被分配了实内存空间,即RAM。这是固定的,因此如果进程需要更多内存,它将从虚拟内存中获取

这是不正确的:

因此,虚拟内存所做的只是根据需要将页面交换到进程内存空间中/从中取出,然而,进程的实际内存空间保持不变

对这一点是肯定的:

我的问题是,虚拟内存是否有可能通过物理方式改变进程的实际内存空间来提供更多内存


据我记忆所及,虚拟内存的主要原因是,传统的可激发代码总是在内存中的同一地址开始。这意味着您只能运行一个程序,虚拟内存映射内存,这样程序就不会重叠并覆盖其可执行代码。@rekire这是否意味着当进程正在运行时,磁盘正在从虚拟内存中读取数据,因为它是有序的?不,这是其他原因。只有当ram已满时,才使用硬盘驱动器。这对“隐藏”程序的性能是不利的,因为在恢复时,它必须在硬盘上缓慢(延迟)运行。不,你的前提不准确。进程直接或间接地请求虚拟地址空间(而不是“RAM”)(直接调用函数,如
malloc
VirtualAlloc
sbrk
,或通过映射文件间接地请求虚拟地址空间)操作系统根据需要使用物理RAM来填充地址空间,而进程的虚拟地址空间并不总是比其他任何东西(包括物理内存)都“大”。例如,可以让一台内存为256GB的机器运行64位操作系统,该操作系统承载32位进程,而这些进程只有4GB的地址空间。