Windows如何为多个进程分别提供4GB的地址空间 当它可以访问的总内存也限制为4GB。
我在Windows内存管理中找到的上述问题的解决方案 (撰文:Pankaj Garg)
解决方案:
要实现此目的,Windows使用x86处理器的功能(386和 以上)称为分页。分页允许软件使用不同的 内存地址(称为逻辑地址)比物理内存 地址。处理器的寻呼单元将该逻辑地址转换为 物理地址透明地解决。这允许每个进程 系统有自己的4GB逻辑地址空间。
任何人都可以帮助我以更简单的形式理解它吗?
答案 0 :(得分:5)
基本思想是你的物理RAM有限。一旦它填满,你开始在硬盘上存储东西。当进程请求当前在磁盘上的数据或要求新内存时,您将RAM中的页面传输到磁盘,然后在您实际需要的数据中进行分页。
操作系统维护一个名为page table的数据结构,以跟踪哪些逻辑地址对应于当前物理内存中的数据以及磁盘上的内容。
每个进程都有自己的虚拟地址空间,并使用此空间内的逻辑地址进行操作。操作系统负责将对给定进程和逻辑地址的请求转换为磁盘上的物理地址/位置。它还负责阻止进程访问属于其他进程的内存。
当进程请求当前不在物理内存中的数据时,会触发page fault。发生这种情况时,操作系统会选择一个页面移动到磁盘(如果物理内存已满)。有几个page replacement algorithms用于选择要踢出的页面。
答案 1 :(得分:3)
错误的原始假设是“当它可以访问的总内存也限制为4GB”时。这是不真实的,操作系统可以访问的总内存不是那么有限。
32位代码可以访问的32位地址存在限制。它是(1 <32),即4GB。但是,这只是同时访问的数量。想象一下,操作系统有卡A,B,......,F,应用程序一次只能访问四个。 App1可能会看到ABCD
,App2 - ABEF
,App3 - ABCF
。应用程序看到4,但OS管理6。
32位平面内存模型的限制并不意味着整个操作系统受到相同的限制。
答案 2 :(得分:2)
Windows使用一种称为虚拟内存的技术。每个进程都有自己的内存。这样做的原因之一是出于安全原因,禁止访问其他进程的内存。
正如您所指出的,分配的虚拟内存可能比实际的物理内存大。这是分页过程进入的地方。我对内存管理和微体系结构的了解有点生疏,所以我不想发布任何错误,但我建议你阅读http://en.wikipedia.org/wiki/Virtual_memory
如果您对更多文学感兴趣,我建议您阅读'结构化计算机组织 - Tannenbaum'
答案 3 :(得分:1)
虚拟地址空间不是RAM。这是一个地址空间。每个page
(页面的大小取决于系统)都可以取消映射(页面无处不可访问。它不存在),映射到文件(页面不能直接访问,其内容为存储在磁盘上,映射到RAM(这是你可以实际访问的页面)。
映射到RAM的页面可以交换或固定。固定页面永远不会被换出到磁盘。可交换页面与光盘上的某个区域相关联,可以写入该区域以释放它们正在使用的RAM。
映射到RAM的页面也可以是只读,只写,读写。如果它们是可写的,则可以直接写入或写入时复制。
可以相同地映射多个页面(在相同的地址空间内和跨越不同的地址空间)。这就是两个独立进程如何访问内存中的相同数据(可能在每个进程中的不同地址发生)。
在现代操作系统中,每个进程都有自己的地址空间。在32位操作系统上,每个进程都有4GiB的地址空间。在64位操作系统上,32位进程仍然只有4GiB(4千兆字节)的地址空间,但64位进程可能有更多。通常他们有18个EiB(18个exabinary字节,即18,874,368 TiB)。
地址空间的大小完全独立于RAM内存量和实际分配的空间量。您可以在具有1 GB RAM的计算机上拥有100个进程,每个进程具有18 EiB的地址空间。事实上,自从典型机器只有几兆字节或RAM时,Windows就为每个进程提供了4GiB的地址空间。
答案 4 :(得分:0)
假设上下文是32位系统:
除了http://en.wikipedia.org/wiki/Virtual_memory之外,内核给每个进程提供的内存抽象是4GB,一个进程实际上可以使用远小于4GB的进程,因为在每个进程中内核也映射到大多数进程中这个过程的页面。一般在NT系统中,4GB以下,内核使用2GB,内核使用1GB内核。
答案 5 :(得分:0)
我很久以前在使用Windows作为案例研究的操作系统课程中阅读了这篇文章。我给出的数字可能不准确,但它们可以让你对幕后发生的事情有所了解。从我记忆中来看:
在Windows中使用的内存模型是Demand Paging。在英特尔上,页面大小 4k 。最初,当您运行程序时,程序中只加载了4页4K。这意味着总共分配了 16k 的内存。程序可能更大,但不需要将整个程序一次加载到内存中。其中一些页面是数据页面,即您的变量和数据结构所在的可读/可写。而另一个是包含可执行代码的代码页,即代码段。 IP被设置为代码段的第一条指令,程序在分配4GB的印象下开始执行。
当需要更多页面时,您需要更多内存(数据段)或您的程序执行更多并需要其他可执行指令(代码段)Windows检查是否有足够的可用内存量。如果是,则加载这些页面并将其映射到进程的地址空间。如果内存不多,那么Windows会检查哪些页面已经使用了很长时间(这是针对所有进程运行的,而不仅仅是调用进程)。当它找到这样的页面时,它会将它们移动到Paging文件中以释放内存中的空间并加载所请求的页面。
如果有时您的程序从已经加载的某个dll调用代码,则只需将这些页面映射到您的进程的地址空间。没有必要再次加载这些页面,因为它们已经可以在内存中使用。因此,它避免了重复,节省了空间。
因此理论上,这些进程使用的内存比可用内存多,并且可以使用4GB的内存,但实际上只有一部分进程被加载。
(如果你发现它有用,请标记我的答案)