我对这些问题非常困惑。
在32位处理器上,每个进程都有4 GB的虚拟内存。但是,如果evey进程有4GB的空间,那么如果100个进程正在运行,那么它将是每个巨大的数量 - 这大于交换区域。有人可以解释一下;我很迷茫。
操作系统如何将内存分配给进程?假设一个进程有a = malloc(2)
。谁将这个记忆分配给这个过程?操作系统是否会将这2个字节的内存提供给进程
(我们访问a [2]它会产生分段错误。)
主进程或辅助内存中进程的不同部分(代码,数据,堆栈,堆)保留在哪里。
请给我一些很好的链接,这样我也可以理解虚拟内存及其整个机制,因为我发现的链接并没有完全解释虚拟内存。
答案 0 :(得分:3)
谁在乎虚拟内存是大于还是小于交换区域?这有什么不同? (例如,如果您将2GB文件映射为只读,使用2GB虚拟内存,但没有交换空间,只需要少量的物理内存。)
操作系统只是扩展了进程的虚拟内存空间。它只是改变一个会计分录。在尝试修改地址空间的内容之前,不需要物理内存。 (实际上,该过程本身可能会这样做,只是要求操作系统在需要更大的块时扩展其虚拟内存空间。)
它们保留在物理内存中(假设它们开始出现故障),直到操作系统选择将它们移动到别处或丢弃它们为止。如果将它们移动到其他位置或丢弃,则在通过页面错误访问它们时会将其重新分页或重新创建。 (操作系统将物理内存管理为一种宝贵的资源,按照它认为最好的方式授予它。)
顺便说一下,在大多数32位操作系统上,操作系统本身占用1GB或2GB的虚拟内存空间,只剩下2GB或3GB的进程。在64位操作系统上,操作系统不占用任何空间,因此完整的4GB可用于32位进程。
答案 1 :(得分:2)
1)每个进程都有4GB的虚拟内存空间,但不需要一次全部分配。操作系统指定MMU物理内存的哪些部分映射到其虚拟空间,以及哪些部分根本没有映射。访问未映射的部分将导致处理器出现故障,操作系统通常会生成段错误。还有一个“not present”标记告诉处理器内存区域不在物理内存空间但在交换空间中,因此处理器出现故障,操作系统将页面交换回物理内存,然后恢复它停止的过程。要描述进程页表,您只需要几个字节的内存,因此100个进程在实际请求之前不会使用那么多内存。
2)有许多内存分配算法。通常操作系统一次只分配大块内存,因此对malloc()的调用有时只会导致对操作系统的调用,但大多数情况下,它是处理微管理的C标准库实现细节。无法保证超出数组范围的访问会产生seg错误,因为它可能是之前malloc'ed的不同数组的一部分,或者是标准库为将来跟踪的可用空间的一部分分配,因此不会出现段错误。但是,有像valgrind这样的调试工具会检测到这样的错误。
3)每个段所在位置的详细信息取决于操作系统,但对于通用且可移植的代码,无需知道。
有关所有这些主题的详细信息,请参阅osdev wiki,特别是paging和memory allocation上的部分。
答案 2 :(得分:0)
首先:32位表示32位。没有更多的位来处理更多的内存空间。 多处理器系统不是新发明。使用32位,您只能处理4gig空间。有一些解决方法,如PAE http://en.wikipedia.org/wiki/Physical_Address_Extension。
第二和第三......我现在还不确定它是如何运作的。但请看一下http://en.wikipedia.org/wiki/Virtual_memory
答案 3 :(得分:0)
您的严重误解是虚拟内存和内存之间存在差异。从进程POV开始,没有区别,进程只访问内存,操作系统负责在物理(RAM)和虚拟内存之间交换部分数据。
1)进程地址空间最高可达4GB并不意味着每个进程分配4GB。操作系统根据需要为它们分配内存。
2)OS以块为单位给出内存(* 1)。当你执行malloc时,管理程序内存的malloc函数在内部获得所需的空间在进程内存内并返回指针(可能在进程中它们从操作系统请求额外的内存,但它是不需要)。
3)从一开始就开始,这是一个操作系统问题。每个操作系统都可以决定他们虚拟化哪些部分以及哪些部分不虚拟,有减少交换次数的复杂策略。
* 1请注意,我谈的是内存,而不是VM。应用程序不知道其内存的哪些部分是虚拟的或物理的,它们对它们是透明的。