当Windows可以访问的总内存也限制在4GB时,它如何为每个进程提供4GB地址空间

当Windows可以访问的总内存也限制在4GB时,它如何为每个进程提供4GB地址空间,windows,memory-management,process,operating-system,virtual-address-space,Windows,Memory Management,Process,Operating System,Virtual Address Space,Windows如何为多个进程分别提供4GB地址空间 当它可以访问的总内存也被限制为4GB时 我在Windows内存管理中找到的上述问题的解决方案 (作者:Pankaj Garg) 解决方案: 为了实现这一点,Windows使用x86处理器(386和 上面)称为分页。分页允许软件使用不同的 内存地址(称为逻辑地址)大于物理内存 地址。处理器的分页单元将此逻辑地址转换为 物理地址是透明的。这就允许系统中的每一个进程 系统有自己的4GB逻辑地址空间 有人能帮我以更简单的形式理解它吗?Windows使用

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

我在Windows内存管理中找到的上述问题的解决方案 (作者:Pankaj Garg)

解决方案:

为了实现这一点,Windows使用x86处理器(386和 上面)称为分页。分页允许软件使用不同的 内存地址(称为逻辑地址)大于物理内存 地址。处理器的分页单元将此逻辑地址转换为 物理地址是透明的。这就允许系统中的每一个进程 系统有自己的4GB逻辑地址空间


有人能帮我以更简单的形式理解它吗?

Windows使用一种称为虚拟内存的技术。每个进程都有自己的内存。这样做的原因之一是出于安全原因,禁止访问其他进程的内存

正如您所指出的,分配的虚拟内存可能比实际物理内存大。这就是分页过程开始的地方。我对内存管理和微体系结构的知识有些生疏,所以我不想发表任何错误的文章,但我建议大家阅读


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

基本思想是您的物理RAM有限。一旦它填满了,你就开始在硬盘上存储东西。当一个进程请求当前在磁盘上的数据,或者请求新内存时,您可以通过将其传输到磁盘来从RAM中弹出一页,然后将实际需要的数据分页

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

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


当进程请求当前不在物理内存中的数据时,将触发。发生这种情况时,操作系统会选择一个页面移动到磁盘(如果物理内存已满)。有几种方法可用于选择要退出的页面。

错误的原始假设是“当它可以访问的总内存也限制在4GB时”。这是不真实的,操作系统可以访问的总内存没有那么有限


32位代码可以访问的32位地址有一个限制。它是(1假设上下文是32位系统:


除此之外,内核对每个进程的内存抽象是4GB,一个进程实际上可以使用远小于4GB的内存,因为在每个进程中,内核也映射到进程的大部分页面。通常在4GB之外的NT系统中,2GB由内核使用,而在*nix系统中1GB由内核使用。

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

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

映射到RAM的页面也可以是只读的、只读的、读写的。如果它们是可写的,它们可以是直接可写的或写时复制的

多个页面(在相同的地址空间内和跨不同的地址空间)可以相同地映射。这就是两个单独的进程如何访问内存中的相同数据(可能发生在每个进程的不同地址)

在现代操作系统中,每个进程都有自己的地址空间。在32位操作系统上,每个进程都有4GiB的地址空间。在64位操作系统上,32位进程仍然只有4GiB(4 GB二进制字节)的地址空间,但64位进程可能有更多的地址空间。通常它们有18个EiB(18个二进制字节,即18874368个TiB)


地址空间的大小完全独立于RAM内存量和实际分配的空间量。在一台具有1GB RAM的机器上,您可以有100个进程,每个进程的地址空间为18 EiB。事实上,自典型机器出现故障以来,windows一直为每个进程提供4GB的地址空间st几兆字节或RAM。

我很久以前在以Windows为案例的操作系统课程中读到了这篇文章。我给出的数字可能不准确,但它们可以让你对幕后发生的事情有一个很好的了解。从我的回忆中:

在windows中使用的内存模式为。在Intel上,页面大小为4k。最初运行程序时,程序中每4k只加载4个页面。这意味着总共分配了16k内存。程序可能更大,但无需立即将整个程序加载到内存中。其中一些pages是数据页,即变量和数据结构所在的可读/可写页面。而其他是包含可执行代码(即代码段)的代码页。IP设置为代码段的第一条指令,程序在分配4GB的印象下开始执行

当需要更多的页面时,即您请求更多的内存(数据段),或者您的程序进一步执行并需要其他可执行指令(代码段),Windows检查是否有足够的内存