虚拟内存?

问题描述 投票:6回答:4

我对这些问题非常困惑。

  1. 在32位处理器上,每个进程都有4 GB的虚拟内存。但是,如果evey进程有4GB的空间,那么如果100个进程正在运行,那么它将是每个巨大的数量 - 这大于交换区域。有人可以解释一下;我很迷茫。
  2. 操作系统如何将内存分配给进程?假设一个过程有a = malloc(2)。谁将这个记忆分配给这个过程?操作系统是否会为进程提供这2个字节的内存。 (我们访问a [2]它会产生分割错误)。
  3. 进程的不同部分(主代码或数据,堆栈,堆)在主内存或辅助内存中的位置。

请给我一些很好的链接,这样我也可以理解虚拟内存及其整个机制,因为我发现的链接并不能完全解释虚拟内存。

operating-system virtual-memory
4个回答
3
投票
  1. 谁在乎虚拟内存是大于还是小于交换区域?这有什么不同? (例如,如果您将2GB文件映射为只读,使用2GB的虚拟内存,但没有交换空间,只需要少量的物理内存。)
  2. 操作系统只是扩展了进程的虚拟内存空间。它只是改变一个会计分录。在尝试修改地址空间的内容之前,不需要物理内存。 (实际上,该过程本身可能会这样做,只是要求操作系统在需要更大的块时扩展其虚拟内存空间。)
  3. 它们保留在物理内存中(假设它们开始出现故障),直到操作系统选择将它们移动到别处或丢弃它们。如果将它们移动到其他位置或丢弃,则在通过页面错误访问它们时会将其重新分页或重新创建。 (操作系统将物理内存管理为一种宝贵的资源,并按照它认为最好的方式授予它。)

顺便说一句,在大多数32位操作系统上,操作系统本身占用1GB或2GB的虚拟内存空间,只剩下2GB或3GB的进程。在64位操作系统上,操作系统不占用任何空间,因此完整的4GB可用于32位进程。


2
投票

1)每个进程都有4GB的虚拟内存空间,但不需要一次性分配。操作系统向MMU指定物理内存的哪些部分映射到其虚拟空间,以及哪些部分根本没有映射。访问未映射的部分将导致处理器出现故障,操作系统通常会生成段错误。还有一个“not present”标记告诉处理器内存区域不在物理内存空间但在交换空间中,因此处理器出现故障,操作系统将页面交换回物理内存,然后恢复它停止的过程。要描述进程页表,您只需要几个字节的内存,因此100个进程在实际请求之前不会使用那么多内存。

2)有许多内存分配算法。通常操作系统一次只分配大块内存,因此对malloc()的调用有时只会导致对操作系统的调用,但大多数情况下,它是处理微管理的C标准库实现细节。无法保证超出数组范围的访问会产生seg错误,因为它可能是之前malloc'ed的不同数组的一部分,或者是标准库为将来跟踪的可用空间的一部分分配,因此不会出现段错误。但是,像valgrind这样的调试工具会检测到这样的错误。

3)每个段所在位置的详细信息取决于操作系统,但对于通用且可移植的代码,无需知道。

有关所有这些主题的更多信息,请参阅osdev wiki,特别是关于pagingmemory allocation的部分。


0
投票

第一:32位意味着32位。没有更多的位来处理更多的内存空间。多处理器系统不是新发明。使用32位,您只能处理4gig空间。有一些解决方法,如PAE http://en.wikipedia.org/wiki/Physical_Address_Extension

第二和第三..我不确定它今天如何运作。但看看http://en.wikipedia.org/wiki/Virtual_memory


0
投票

您的严重误解是虚拟内存和内存之间存在差异。从进程POV来看,没有区别,进程只访问内存,而是负责在物理(RAM)和虚拟内存之间交换部分数据的操作系统。

1)进程地址空间最高可达4GB并不意味着每个进程分配4GB。操作系统根据需要为其分配内存。

2)OS以块为单位给出存储器(* 1)。当你执行malloc时,管理程序存储器的malloc函数在内部获得进程内存中所需的空间并返回指针(可能在进程中它们从OS请求额外的内存,但这不是必需的)。

3)从一开始就开始,这是一个操作系统问题。每个操作系统都可以决定他们虚拟化哪些部分以及哪些部分不虚拟,因此需要采用复杂的策略来减少交换次数。

* 1请注意,我谈的是内存,而不是VM。应用程序不知道其内存的哪些部分是虚拟的或物理的,它们对它们是透明的。

© www.soinside.com 2019 - 2024. All rights reserved.