我对这些问题非常困惑。
a = malloc(2)。谁将把这个内存分配给进程?操作系统会将这2位字节的内存分配给进程吗?
(我们访问a2,它会产生分割错误)。请给我一些好的链接,这样我也可以理解虚拟内存及其整个机制,因为我找到的链接没有完全解释虚拟内存。
发布于 2012-07-24 07:06:02
顺便说一句,在大多数32位OSes上,操作系统本身占用1GB或2GB的虚拟内存空间,只有2GB或3GB才能被进程真正使用。在64位OSes上,操作系统不占用任何空间,因此完整的4GB可供32位进程使用。
发布于 2012-07-24 13:18:12
1)每个进程都有4gb的虚拟内存空间,但不需要一次性分配。操作系统向MMU指定哪些物理内存部分映射到其虚拟空间,哪些部分根本没有映射。对未映射的部分的访问将导致处理器出现故障,而操作系统通常会生成分段错误。还有一个“不存在”的标记,它告诉处理器内存区域不在物理内存空间中,而是在交换空间中,因此处理器故障和操作系统将页面转换回物理内存,然后恢复其中断的进程。要描述一个进程页表,您只需要几个字节的内存,因此100个进程在实际请求之前不会使用那么多内存。
2)内存分配算法很多。通常,操作系统一次只分配大内存块,因此对malloc()的调用有时只会导致对操作系统的调用,但是大多数情况下,处理微管理的是C标准库实现细节。不能保证超出数组界限的访问会产生seg错误,因为它可能是先前错误的另一个数组的一部分,或者是标准库正在跟踪的用于未来分配的空闲空间的一部分,因此不会分割错误。但是,还有一些调试工具,如val差制,可以检测此类错误。
3)每个段所处位置的细节取决于操作系统,但对于通用和可移植的代码,不需要知道。
有关所有这些主题的更多信息,请参阅奥斯德夫 wiki,特别是关于寻呼和内存分配的部分。
发布于 2012-07-24 07:10:05
首先:32位意味着32位。没有更多的位来寻址更多的内存空间。多处理器-系统不是新发明。使用32位,您只能寻址4G空间。有一些解决办法,比如PAE 扩展。
第二和第三。我不太清楚今天是怎么回事。但是看看内存
https://stackoverflow.com/questions/11625729
复制相似问题