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