当Windows可以访问的总内存也被限制为4GB时,Windows如何为多个进程分配4GB的地址空间?

Windows可以访问的总内存也被限制为4GB时,Windows如何为多个进程分配4GB的地址空间?

上述问题的解决scheme,我发现在Windows内存pipe理(作者:Pankaj Garg)

解:

要实现这个Windows使用称为分页的x86处理器(386及以上)的function。 分页允许软件使用与物理内存地址不同的内存地址(称为逻辑地址)。 处理器的分页单元将这个逻辑地址透明地转换成物理地址。 这使得系统中的每个进程都有自己的4GB逻辑地址空间。

任何人都可以帮助我以更简单的forms来理解它吗?

Solutions Collecting From Web of "当Windows可以访问的总内存也被限制为4GB时,Windows如何为多个进程分配4GB的地址空间?"

基本的想法是,你有有限的物理RAM。 一旦填满,你开始存储在硬盘上的东西。 当一个进程请求当前在磁盘上的数据,或者要求新的内存时,通过将内存传送到磁盘,然后页面输入实际需要的数据,从RAM中剔出一个页面。

操作系统维护一个称为页表的数据结构,以跟踪哪些逻辑地址对应于当前物理内存中的数据以及磁盘上的东西。

每个进程都有自己的虚拟地址空间,并使用这个空间内的逻辑地址进行操作。 操作系统负责将给定进程和逻辑地址的请求转换成磁盘上的物理地址/位置。 它也负责防止进程访问属于其他进程的内存。

当进程请求当前不在物理内存中的数据时,会触发页面错误 。 发生这种情况时,操作系统选择一个页面移动到磁盘(如果物理内存已满)。 有几个页面替换算法来选择页面踢出。

原来的错误假设是“当它可以访问的总内存也被限制在4GB”。 这是不真实的,内存操作系统可以访问的总内存不受限制。

32位代码可以访问的32位地址是有限制的。 (1 << 32)是4 GB。 但是这只能同时访问。 想象一下,操作系统有卡片A,B,… F,应用程序一次只能访问四个卡片。 App1可能会看到ABCD ,App2 – ABEF ,App3 – ABCF 。 应用程序看到4,但操作系统管理6。

32位平面内存模式的限制并不意味着整个操作系统受到相同的限制。

Windows使用称为虚拟内存的技术。 每个进程都有自己的记忆。 其中一个原因是由于安全原因,禁止访问其他进程的内存。

正如你所指出的,分配的虚拟内存可能比实际的物理内存大。 这是寻呼进程的地方。 我对内存管理和微体系结构的知识有点生疏,所以我不想发布任何错误,但我建议阅读http://en.wikipedia.org/wiki/Virtual_memory

如果您对更多文献感兴趣,我建议您阅读“结构化计算机组织 – Tannenbaum”

虚拟地址空间不是RAM。 这是一个地址空间。 每个page (页面大小取决于系统)都可以被取消映射(页面无处不在,不可访问,不存在),映射到文件(页面不能直接访问,其内容存储在磁盘上) ,映射到RAM(这是您可以实际访问的页面)。

映射到RAM的页面可以交换或固定。 固定的页面将永远不会换出到磁盘。 可交换页面与光盘上的一个区域相关联,并且可以写入该区域以释放它们正在使用的RAM。

映射到RAM的页面也可以只读,只写,读写。 如果它们是可写的,则它们可以是可直接写入的或写入时拷贝的。

多个页面(都在相同的地址空间和跨越单独的地址空间)可以被相同地映射。 这我怎么两个单独的进程可以访问内存中的相同数据(这可能发生在每个进程的不同地址)。

在现代操作系统中,每个进程都有自己的地址空间。 在32位操作系统上,每个进程具有4GiB的地址空间。 在64位操作系统上,32位进程仍然只有4GiB(4千兆字节)的地址空间,但64位进程可能有更多。 通常他们有18个EIB(18个字节,即18,874,368个TiB)。

地址空间的大小完全独立于RAM内存量和实际分配的空间量。 在一台机器上有一个RAM的地址空间,每个地址空间可以有100个进程。 实际上,从典型的机器只有几兆字节或RAM的时间开始,Windows就已经为每个进程提供了4GiB的地址空间。

假设上下文是32位系统:

除了http://en.wikipedia.org/wiki/Virtual_memory&#x5916; ,内核给每个进程的内存抽象是4GB,一个进程实际上可以使用的远远小于4GB,因为在每个进程中内核也是映射在进程的大部分页面上。 一般在4GB的NT系统中,2GB被内核使用,而在* nix系统中1GB被内核使用。

我很早以前在Windows操作系统课程中阅读过这个案例。 我给出的数字可能并不准确,但他们可以给你一个关于幕后发生的事情的体面的想法。 从我能记得的事情来看:

在Windows中使用的内存模型是Demand Paging 。 在英特尔,页面大小为4k 。 最初,当您运行一个程序时,只有4个4K的页面从您的程序中加载。 这意味着总共分配了16k的内存。 程序可能更大,但不需要立即将整个程序加载到内存中。 其中一些页面是数据页面,即可读/写的变量和数据结构。 而另一个是包含可执行代码即代码段的代码页。 IP被设置为代码段的第一条指令,程序在分配4GB的印象下开始执行。

当需要进一步的页面时,您需要更多的内存(数据段),或者您的程序执行得更远,并且需要其他可执行指令(代码段)。Windows会检查是否有足够的可用内存量。 如果是,则将这些页面加载并映射到进程的地址空间中。 如果没有多少内存可用,那么窗口会检查哪些页面在一段时间内还没有被使用(这是针对所有进程而不仅仅是调用进程的)。 当它找到这样的页面时,它将它们移动到分页文件以释放内存中的空间并加载所请求的页面。

如果有时你的程序调用某个已经加载的dll的代码,那么窗口只是将这些页面映射到你的进程的地址空间。 不需要再次加载这些页面,因为它们已经在内存中可用了。 从而避免重复,节省空间。

所以从理论上说,进程使用的内存比可用的要多,可以使用4GB的内存,但实际上只有进程的一部分是一次加载的。

如果您觉得有用,请标记我的答案