当前位置:   article > 正文

linux虚拟内存管理页表,虚拟内存机制,页&页框&页表

虚拟内存管理能够输入访问页的页码序列

计算机的存储系统

690bb41966bf

为什么要有虚拟内存

在早期的计算机中,是没有虚拟内存的概念的。我们要运行一个程序,会把程序全部装入内存,然后运行。

当运行多个程序时,经常会出现一下问题:

进程地址空间不隔离,没有权限保护

由于程序都是直接访问物理内存,所以一个进程可以修改其他的内存数据,甚至修改内核地址空间中的数据。

内存使用效率低

当内存空间不足时,要将其他程序暂时拷贝到硬盘,然后将新的程序装入装出,内存使用效率会十分低下。

程序运行的地址不确定

因为内存地址是随机分配的,所以程序运行的地址也是不确定的。

进程的虚拟地址空间

每个进程都有自己独立的4G内存空间

虚拟内存空间通过MMU来和真实的物理内存产生联系

690bb41966bf

计算机明明没有那么多内存(n个进程的话就需要n*4G内存)

虚拟内存和物理内存如何建立起来联系的呢

Linux的虚拟内存技术

Linux把虚存空间分成若干个大小相等的存储分区,Linux把这样的分区叫做页。为了换入、换出的方便,物理内存也按大小分成若干个块。由于物理内存中的块空间是用来容纳虚拟页的容器,所以物理内存中的块叫做页框。

页与页框是Linux实现虚拟内存技术的基础。

690bb41966bf

分页和分表

我们知道系统里面的单位都是Byte字节。如果将每一个虚拟内存的Byte都对应到物理内存的地址,每个条目最少需要8字节,(32位虚拟内存->32位物理地址),在4G内存的情况下,就需要32GB的空间来存放对照表,那么这张表就大得真正的物理地址也放不下,于是操作系统引入了==页(page)==的概念。

在系统启动时,操作系统将整个物理内存以4K为单位,划分为各个页。之后进行内存分配时,都以页为单位,那么虚拟内存页对应物理内存页的映射表就大大减小了,4G内存,只需要8M的映射表即可,一些进程没有使用到的虚拟内存,也并不需要保存映射关系,而且Linux还为大内存设计了多级页表,可以进一步减少内存消耗。操作系统虚拟内存到物理内存的映射表,就被称为页表。

虚拟内存的页,物理内存的页框及页表

物理内存和虚拟内存被分为页框和页之后,其存储单元原来的地址都被自然地分成了两段,并且这两段各自代表着不同的意义:高段位分别是页框和页码,它们是识别页框和页的编码;低段位分别叫做页框偏移量和页内偏移量,它们是存储单元在页框和页内的地址编码。下图就是两段虚拟内存和物理内存分页之后的情况:

690bb41966bf

为了使系统可以正确的访问虚存页在对应页框中的映像,在把一个页映射到某个页框上的同时,就必须把页码和存放该页映像的页框码填入一个叫做页表的表项中。这个页表就是之前提到的映射记录表。一个页的示意图如下所示:

690bb41966bf

页模式下,虚拟地址、物理地址转换关系的示意图如下所示:

690bb41966bf

也就是说:处理器遇到的地址都是虚拟地址。虚拟地址和物理地址都分成页码(页框码)和偏移量两部分。在由虚拟地址转换成物理地址的过程中,偏移量不变。而页码和页框码之间的映射就在一个映射记录表(页表)中。

页表共享

在多程序系统中,常常有多个程序需要共享同一段代码或数据的情况。在分页管理的存储器中,这个事情很好办:让多个程序共享同一个页面即可。

具体的方法是:使这些相关程序的虚拟空间的页面在页表中指向内存中的同一个页框。这样,当程序运行并访问这些相关页面时,就都是对同一个页框中的页面进行访问,而该页框中的页就被这些程序所共享。下图是3个程序共享一个页面的例子:

690bb41966bf

虚拟内存带来的好处

进程内存管理

它有助于进程进行内存管理,主要体现在:

内存完整性:由于虚拟内存对进程的"欺骗",每个进程都认为自己获取的内存是一块连续的地址。我们在编写应用程序时,就不用考虑大块地址的分配,总是认为系统有足够的大块内存。

安全:由于进程访问内存时,都要通过页表来寻址,操作系统在页表的各个项目上添加各种访问权限标识位,就可以实现内存的权限控制。

数据共享

通过虚拟内存更容易实现内存和数据的共享。

在进程加载系统库时,总是先分配一块内存,将磁盘中的库文件加载到这块内存中,在直接使用物理内存时,由于物理内存地址唯一,即使系统发现同一个库在系统内加载了两次,但每个进程指定的加载内存不一样,系统也无能为力。

而在使用虚拟内存时,系统只需要将进程的虚拟内存地址指向库文件所在的物理内存地址。如上文图中所示,进程P1和P2的B地址都指向了物理地址C。

而通过使用虚拟内存使用共享内存很简单,系统只需要将各个进程的虚拟内存地址指向系统分配的共享内存地址即可。

SWAP

虚拟内存可以帮进程”扩充“内存。

前文提到了虚拟内存通过缺页中断为进程分配物理内存,内存总是有限的,如果所有的物理内存都被占用完怎么办

Linux提出SWAP的概念,Linux 中可以使用SWAP分区,在分配物理内存,但可用内存不足时,将暂时不用的内存数据先放到磁盘上,让有需要的进程先使用,等进程再需要使用这些数据时,再将这些数据加载到内存中,通过这种”交换"技术,Linux 可以让进程使用更多的内存。

实践和研究都证明:一个应用程序总是逐段被运行的,而且在一-段时间内会稳定运行在某一段程序里。

这也就出现了一个方法:如下图所示,把要运行的那一- -段程序自辅存复制到内存中来运行,而其他暂时不运行的程序段就让它仍然留在辅存。

690bb41966bf

当需要执行另一端尚未在内存的程序段(如程序段2) ,如下图所示,就可以把内存中程序段1的副本复制回辅存,在内存腾出必要的空间后,再把辅存中的程序段2复制到内存空间来执行即可:

690bb41966bf

在计算机技术中,把内存中的程序段复制回辅存的做法叫做"换出”,而把辅存中程序段映射到内存的做法叫做"换入”。经过不断有目的的换入和换出,处理器就可以运行一个大于实际物理内存的应用程序了。

作者:Peanutty

链接:https://blog.csdn.net/hhb442/article/details/109478334

来源:CSDN

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/163352
推荐阅读
相关标签
  

闽ICP备14008679号