虚拟内存机制,页&页框&页表

计算机的存储系统

为什么要有虚拟内存

在早期的计算机中,是没有虚拟内存的概念的。我们要运行一个程序,会把程序全部装入内存,然后运行。
当运行多个程序时,经常会出现一下问题:

  • 进程地址空间不隔离,没有权限保护
    由于程序都是直接访问物理内存,所以一个进程可以修改其他的内存数据,甚至修改内核地址空间中的数据。
  • 内存使用效率低
    当内存空间不足时,要将其他程序暂时拷贝到硬盘,然后将新的程序装入装出,内存使用效率会十分低下。
  • 程序运行的地址不确定
    因为内存地址是随机分配的,所以程序运行的地址也是不确定的。

进程的虚拟地址空间

  1. 每个进程都有自己独立的4G内存空间
  2. 虚拟内存空间通过MMU来和真实的物理内存产生联系

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

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

Linux的虚拟内存技术

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

分页和分表

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

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

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

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

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

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

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

页表共享

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

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

虚拟内存带来的好处

进程内存管理

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

  • 内存完整性:由于虚拟内存对进程的"欺骗",每个进程都认为自己获取的内存是一块连续的地址。我们在编写应用程序时,就不用考虑大块地址的分配,总是认为系统有足够的大块内存。
  • 安全:由于进程访问内存时,都要通过页表来寻址,操作系统在页表的各个项目上添加各种访问权限标识位,就可以实现内存的权限控制。

数据共享

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

而在使用虚拟内存时,系统只需要将进程的虚拟内存地址指向库文件所在的物理内存地址。如上文图中所示,进程P1和P2的B地址都指向了物理地址C。
而通过使用虚拟内存使用共享内存很简单,系统只需要将各个进程的虚拟内存地址指向系统分配的共享内存地址即可。

SWAP

虚拟内存可以帮进程”扩充“内存。
前文提到了虚拟内存通过缺页中断为进程分配物理内存,内存总是有限的,如果所有的物理内存都被占用完怎么办
Linux提出SWAP的概念,Linux 中可以使用SWAP分区,在分配物理内存,但可用内存不足时,将暂时不用的内存数据先放到磁盘上,让有需要的进程先使用,等进程再需要使用这些数据时,再将这些数据加载到内存中,通过这种”交换"技术,Linux 可以让进程使用更多的内存。
实践和研究都证明:一个应用程序总是逐段被运行的,而且在一-段时间内会稳定运行在某一段程序里。
这也就出现了一个方法:如下图所示,把要运行的那一- -段程序自辅存复制到内存中来运行,而其他暂时不运行的程序段就让它仍然留在辅存。

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

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

作者:Peanutty
链接:https://blog.csdn.net/hhb442/article/details/109478334
来源:CSDN
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容

  • 概述 现代操作系统了提供了一种对主存的抽象概念,叫做虚拟内存。它为每个进程提供了一个非常大的,一致的和私有的地址空...
    要上班的斌哥阅读 16,416评论 2 55
  • 在早期的计算机中,是没有虚拟内存的概念的。我们要运行一个程序,会把程序全部装入内存,然后运行。会出现以下问题:1)...
    我的技术学习小站阅读 696评论 0 1
  • 1.如果把二进制程序全部加载到内存中,会出现一种情况就是明明内存还有空间,但是不够二进制程序的大小,所以也加载不了...
    zcxzcxczcx阅读 279评论 0 7
  • 内存是程序得以运行的基础,如何在有限的内存空间中运行较大的应用程序,曾经是一个难题,为了解决这个问题设计了许多方案...
    JunChow520阅读 9,357评论 0 11
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,564评论 0 11