2014-09-20 94 views
0

虚拟页面被映射到VM机制中的物理页面。一旦新的页面必须被分页,物理页面就会被清除。
我总是假定页面输入/输出页面是交换区域或实际映射到虚拟机的文件区域。
我已经读过Linux在启动时将所有物理页面映射到虚拟页面(这就是为什么监视工具显示内核保留的内存,我猜)。
所以我的问题是,这种方法有什么好处?虚拟页面在物理页面被驱逐之前并不物理存在于磁盘上,并且页面的页面进出页面的代价很高,这是不可避免的。此外,在我看来,将原先保留给内核的所有这些页面传递给请求它们的各种进程会更加复杂。
我在这里误解了什么?Linux上的虚拟内存

回答

-1

Linux虚拟内存(通常是虚拟内存)用于抽象物理内存以允许操作系统控制内存访问。内核维护从虚拟地址映射到物理地址的页表。

分页内存用于指当前存储在磁盘(交换)中的页面被带入内存。分页出内存是指将页面写入磁盘(交换)并从内存中清除。这允许将更频繁使用的页面保存在更快的存储中,并且将不常用的页面保存在较慢的存储中。

虚拟内存还允许操作系统和进程使用比系统上存在的实际物理内存更多的内存。

+0

我的问题是Linux方法的好处是什么将所有物理页面映射到VM页面启动?无论如何都不能避免交换成本。 – Cratylus 2014-09-20 21:53:59

+0

老实说,我不认为它实际上是因为内核需要按需映射页面。例如,考虑'sbrk'或'mmap',或者甚至只是堆栈地址上的页面错误。内核在启动时必须初始化页表,并告诉CPU页表在哪里。 – Jason 2014-09-20 22:04:48

+0

@Cratylus也许你在谈论免费网页?物理内存需要被跟踪以实际分配它。这不是任何操作系统所独有的。启动后,需要通过[MMU](https://en.wikipedia.org/wiki/Memory_management_unit)访问内存,这需要假设页表结构是有效的。 – Jason 2014-09-21 00:57:55

0

映射所有物理页面简化了将某些内容加载到即将初始化的内存中。初始页面映射没有被分配给任何进程(仅仅是内核),但是这样做可以简化和加速数据,代码,内核结构到新分配的内存的I/O和/或拷贝,可能仅仅使用memcpy()memset() 。从逻辑上讲,虚拟内存页面不应被视为仅映射到文件的一部分:它们可以是堆栈,堆,文件系统关联缓存或驱动程序数据结构。在这些情况下,虚拟空间将不会映射到任何内容。

我几年没有看过相关的源代码,但是至少在具有1 + G内存的现代系统上分页到交换文件往往是可以避免的。它的效率至少高出两倍(可能超过10倍),以便取消映射一些长时间未访问的只读页面,并将其重新映射到当前所需的任何页面。只有修改过的页面需要写入交换。

如果您想查看截然不同的分页和交换条件,请告诉内核使用更少的内存。将mem=64M(或更少)添加到Linux引导参数。

+0

1)'......这样做可以简化和加速数据的I/O和/或复制......'但是实际上可以避免的开销是多少?如果页面没有被映射,唯一的开销就是将它添加到Page Table.Right中?其余的即拷贝将是相同的。PT修改是如此昂贵还是我在这里困惑? 2)'....它的效率至少高出一倍(可能超过10倍),以便取消映射某个只读页面......但如果不使用交换,则虚拟机大小与物理内存相同。认为VM大小= swap +物理内存,所以交换空间越多越好。 – Cratylus 2014-09-21 11:44:47