≡菜单

Linux内存管理–虚拟内存和需求分页

内存管理是Linux内核完成的最复杂的活动之一。它具有与之相关的各种概念/问题。

本文是我们正在进行的UNIX内核概述系列的一部分。

在内核系列的上一篇文章中,我们讨论了有关 UNIX进程概述重入核.

在本文中,我们将尝试基于虚拟内存并按需进行分页,因为这些是与内存管理相关的一些重要概念。

虚拟内存

虚拟内存的概念是内存管理非常强大的方面之一。自从计算机的最初时代以来,已经感觉到对内存的需求超过了现有的物理内存。多年以来,许多解决方案用于解决此问题,其中最成功的就是虚拟内存的概念。

虚拟内存使您的系统看起来好像拥有比实际更多的内存。这听起来可能很有趣,并可能提示人们如何做到这一点。因此,让我们了解一下这个概念。

  • 首先,我们必须首先了解虚拟内存是映射到物理地址的内存地址层。
  • 在虚拟内存模型中,当处理器执行程序指令时,它将从虚拟内存中读取指令并执行该指令。
  • 但是在执行指令之前,它首先将虚拟内存地址转换为物理地址。
  • 此转换是根据虚拟地址到物理地址的映射完成的,而虚拟地址到物理地址的映射是根据页面表中包含的映射信息完成的(由OS维护)。

虚拟和物理内存分为固定长度的块(称为页面)。在此分页模型中,虚拟地址可以分为两部分:

  • 偏移量(最低12位)
  • 虚拟页面帧号(其余位)

每当处理器遇到虚拟地址时,它都会从中提取虚拟页帧号。然后,它将此虚拟页面框架号转换为物理页面框架号,而偏移量部分则帮助其转到物理页面中的确切地址。地址的这种转换是通过页表完成的。

从理论上讲,我们可以考虑一个页表包含以下信息:

  • 描述该条目是否有效的标志
  • 此项所描述的物理页面框架号
  • 访问有关页面的信息(例如只读,读写等)

通过虚拟页面框架号访问页面表,并将其用作页面表中条目的偏移量。例如,虚拟页面框架号为‘2’指向条目‘1’在页表中(条目号以‘0’ ).

在下图中,VPFN代表虚拟页面帧号,PFN表示物理页面帧号。

处理器可能会转到带有虚拟页面框架号的进程页面表条目,并发现该条目无效。在这种情况下是处理器’将控制权传递给内核并要求其解决问题的责任。不同的处理器以不同的方式传递控制,但是这种现象被称为‘page fault’。但是,如果该条目有效,则处理器将获取物理页的帧号,乘以页面的大小即可获得物理页的基地址,然后将偏移量相加即可获得确切的物理地址。

因此,现在我们了解到,通过虚拟内存的概念,每个进程都认为它可以使用所有范围的虚拟地址,因此,这种概念使系统看起来好像其物理内存多于实际可用的内存。

需求分页

在上一节中,我们了解到,如果处理器使用虚拟页面框架号转到进程页面表,而该表中没有条目,则出现两种情况。

  1. 进程尝试访问无效的内存地址
  2. 与虚拟地址对应的物理页未加载到物理内存中

Out of the two cases above, the case 1 is the case where the process tries to memory address which it is not allowed. In this case a 页面错误 is generated and the kernel terminates the process.

以防万一‘2’, as already explained, the physical page corresponding to the virtual address is not yet loaded into physical memory. In this case also a 页面错误 is generated and the kernel then tries to bring the required memory page into physical memory from hard disk.

由于将页面从硬盘放入物理内存的操作非常耗时,因此到此时,将在进程之间进行上下文切换,并执行一些其他进程。同时,先前进程的页面被带到物理内存中,并且页表被更新,然后该过程又从导致‘page fault’.

This is known as demand paging where all the memory pages corresponding to a process are not present in the physical memory at any given time. This saves the physical memory from clogging up with non-required memory pages while when necessary these pages can be brought into physical memory through  页面错误 (as explained above).

如果您喜欢这篇文章,您可能还会喜欢..

  1. 50个Linux Sysadmin教程
  2. 50个最常用的Linux命令(包括示例)
  3. 排名前25位的最佳Linux性能监视和调试工具
  4. 妈妈,我找到了! – 15个实用的Linux Find命令示例
  5. Linux 101 Hacks第二版电子书 Linux 101黑客手册

Bash 101 Hacks书 Sed和Awk 101黑客手册 Nagios Core 3书 Vim 101黑客手册

{ 10 评论… 加一 }

  • 纳伦德拉 2012年2月17日,上午8:49

    很好的文章,继续写作。

  • Himanshu 2012年2月17日,上午11:26

    @纳伦德拉
    谢谢

  • 安西尔·哈梅德(Ansil Hameed) 2012年2月20日,上午7:22

    简单明了…做得好。期待更多

  • 丹·圣安德烈 2012年3月1日,上午10:52

    我将对设备检测,驱动程序标识,模块加载,“new device”事件处理。这是发生在‘upstart’ or ‘systemd’随着设备的来来去去。

    我们认为这种行为是理所当然的,但我几乎看不到它应该如何发生的宝贵经验。我也相信,行为的差异也取决于发行版本的特性。

    ~~~ 8天;-/丹

  • 哈伦·安萨里 2013年2月8日,上午2:24

    做得好..很好的解释…

  • KK 2013年2月24日,上午7:20

    我想以实际的例子来看。

  • 2014年9月2日,上午12:26

    谢谢您的简单解释

  • 拉杰库玛·阿肖克(Rajkumar Ashok) 2015年8月18日,上午1:18

    好的工作和简单& clear

  • 巴沙 2017年4月17日,上午6:52

    好啊

  • 克里沙努发展 2017年5月9日,上午3:34

    这篇文章是史诗般的。
    每一点都很清晰

发表评论