首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >虚拟内存?

虚拟内存?
EN

Stack Overflow用户
提问于 2012-07-24 07:02:34
回答 4查看 2.3K关注 0票数 7

我对这些问题非常困惑。

  1. 在32位处理器上,每个进程都有4GB的虚拟内存。但是,如果每个进程都有4gb的空间,那么在运行100个进程的情况下,每一个进程都会有一个巨大的空间--这比交换区域更大。有人能解释一下吗?我很困惑。
  2. 操作系统如何将内存分配给进程?假设一个进程有a = malloc(2)。谁将把这个内存分配给进程?操作系统会将这2位字节的内存分配给进程吗? (我们访问a2,它会产生分割错误)。
  3. 进程的不同部分留在哪里(代码、数据、堆栈、堆)在主内存中还是在次要内存中。

请给我一些好的链接,这样我也可以理解虚拟内存及其整个机制,因为我找到的链接没有完全解释虚拟内存。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-07-24 07:06:02

  1. 谁在乎虚拟内存是大还是小?这有什么区别?(比方说,如果您映射一个2GB文件只读,它使用2GB的虚拟内存,但不需要交换空间,只需要少量的物理内存。)
  2. 操作系统简单地扩展了进程的虚拟内存空间。只是换了个会计分录。在尝试修改地址空间的内容之前,不需要物理内存。(实际上,这个过程很可能是自己做的,只要求操作系统在需要更大块时扩展其虚拟内存空间。)
  3. 它们一直保存在物理内存中(假设它们一开始就有故障),直到操作系统选择将它们移到别处或丢弃它们为止。如果它们被移到其他地方或被丢弃,则当通过页面错误访问它们时,它们将被传回或重新创建。(操作系统将物理内存作为一种宝贵的资源进行管理,并将其授予它认为最好的资源。)

顺便说一句,在大多数32位OSes上,操作系统本身占用1GB或2GB的虚拟内存空间,只有2GB或3GB才能被进程真正使用。在64位OSes上,操作系统不占用任何空间,因此完整的4GB可供32位进程使用。

票数 3
EN

Stack Overflow用户

发布于 2012-07-24 13:18:12

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

2)内存分配算法很多。通常,操作系统一次只分配大内存块,因此对malloc()的调用有时只会导致对操作系统的调用,但是大多数情况下,处理微管理的是C标准库实现细节。不能保证超出数组界限的访问会产生seg错误,因为它可能是先前错误的另一个数组的一部分,或者是标准库正在跟踪的用于未来分配的空闲空间的一部分,因此不会分割错误。但是,还有一些调试工具,如val差制,可以检测此类错误。

3)每个段所处位置的细节取决于操作系统,但对于通用和可移植的代码,不需要知道。

有关所有这些主题的更多信息,请参阅奥斯德夫 wiki,特别是关于寻呼内存分配的部分。

票数 3
EN

Stack Overflow用户

发布于 2012-07-24 07:10:05

首先:32位意味着32位。没有更多的位来寻址更多的内存空间。多处理器-系统不是新发明。使用32位,您只能寻址4G空间。有一些解决办法,比如PAE 扩展

第二和第三。我不太清楚今天是怎么回事。但是看看内存

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11625729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档