通俗讲解计算机内存及页面置换算法

计算机存储体系

先来看这张计算机存储体系结构图。


计算机存储体系.png

从上图可以看到,越在上面的访问速度越快,但是容量越小,今天要说的就是内存那个环节。

内存是什么

  • 内存是可以记录二进制数据一种器件,它是连续的结构,可以随机读写,断电会丢失数据,所有程序必须从磁盘加载到内存中才能运行。

内存空间管理策略

  • 上面说了内存是一个连续的线性结构,一个4G的内存有很多个电容,把他们线性排在一起,那么就有034359738367个可以存bit的空位,计算机一般把8个bit合成一个byte存放,那么就有04294967295个byte,写成16进制就是 0x0 ~ 0xFFFFFFFF个地址,这个就是内存地址了,每个地址里面可以取出一个字节的数据。

现在有0xFFFFFFFF个地址,人们是怎么利用操作系统去管理和分配这些地址给程序使用的呢?

  • 为了方便说明问题,我把内存地址用10进制表示,转成16进制也是一样的,16进制不太方便人脑计算。我不用4G的内存讲,因为太多了,用0到99的内存空间即可说明问题。我尽量用通俗的语言说明问题,没有很复杂的概念,复杂的概念请翻看《操作系统原理》。

虚拟内存地址与实际物理地址

  • 在说怎么管理内存之前,先要说一下虚拟内存地址,最开始人们在程序直接使用实际的物理地址,如下图:
    假设程序a第一次启动被装载在1的位置,第二次启动装载在31的位置。
    程序a中有段代码 jmp 3,想去执行3那里的目标代码。

    物理地址.png

    显然第一次jmp是对的,但第二次操作系统把装在了31的位置,显然目标代码应该是33了,就应该把程序改为jmp 33,否则就出错了。
    这就是直接使用物理地址的弊端,每次启动都要重新改代码,或者把所有跳转的地方都+30,很麻烦。所以现代程序都不直接使用物理地址,而是用了虚拟地址,如下图
    地址转换.png

    使用了虚拟地址后,每个程序就认为自己是从0地址开始的就好了,不管加载到哪个地方,都不用在修改代码,通过一个段表就可以把虚拟地址转为实际的物理地址

  • 在编译器debug中可以看到 0x0012fee8 这些都是虚拟地址,物理地址操作系统不允许直接访问了。


    vc6.0.png

段式管理

  • 最开始人们用段式管理,但是段式管理会产生内存碎片,过程如下图
    内存碎片.png

    当程序c要加载进内存的时候,程序b前面的空间不够了,只能从b后面分配,于是b前面的空间就不能给c利用,成为了内存碎片
  • 操作系统为了避免这种情况,充分利用内存空间,当内存不够的时候,会采取内存紧缩,就是把所有程序都往左边挪动,全部紧紧的排在一起,但是实际中对4GB的内存空间进行紧缩的时候,需要5秒左右的时间,计算机经常卡机5秒你能忍?
  • 程序c分配内存的策略有首先适配法,最佳适配法等方法,考虑到篇幅就不展开讲了,我上面用的就是首先适配法,从左到右首次找到一个合适位置就分配。

页式管理

  • 由于段式管理的缺点(外部碎片,内存紧缩),人们后来发明了页式管理,通俗来说,页式管理就是把一定大小的物理空间当做一个页框,整个内存中就有很多个这样的页框,比如0到99的内存空间,按10个字节为一个页框,那么整个内存就分成了10页框,0到9是第0个页框,如下图:
    页框.png

    按照页式管理划分空间后,一个程序用一个页框要么使用页框全部空间,要么不能使用,不能说只用一点点,如果一个程序用不上那么多空间,也必须拿完,于是段式管理的外部碎片和内存紧缩的问题被解决了,提高了内存利用率,但是又产生内存内部碎片
  • 程序的页和页框的大小是一样的,页框大小如何确定?如果页框太大,产生的内部碎片也大,如果页框太小,导致页表变大,查找速度降低。例如4GB的内存,按照4KB分为一页,4GB / 4KB = 1048576项,查找起来自然慢了。

虚拟地址到物理地址转换过程

地址转换.png

上图还有个在不在位,这个位表示如果程序的页在页框中,那么直接转换,如果不在页框中,那么引发一个缺页中断,操作系统去磁盘上把缺失的页加载进内存,然后程序才继续往下运行。这里有个重点,运行中的程序不一定全部在内存中,也有可能在磁盘上,在磁盘上的那部分叫做虚拟内存!,那究竟程序的哪些页面在内存中,哪些页面在磁盘上,这里就涉及到页面置换算法

页面置换算法

一个程序的部分页面在内存中,部分页面在磁盘上,究竟怎么确定这些页面?
我选几个来说

  • 先进先出(FIFO)
    最简单的,最先进来的,就最先淘汰出去。缺点:有些频繁访问的页面也可能淘汰出去。
  • 二次机会(SC)
    最先进来的页面不一定最先出去,如果这个页面的访问标志是1,那么把它置为0,再给它一次机会,如果页面访问标志0,那么才置换出去。
  • 最近未使用(NRU)
    每个页面有两个标志位,标记是否访问,是否修改,显然那么没有怎么访问,没有修改的页面会被淘汰出去。
  • 最近最少使用(LRU)
    这个也很好理解,每个页面有个计数器,访问一次就加1,显然把访问次数很少的那些优先淘汰。
  • 此外还有老化算法,工作集算法,等等,限于篇幅(其实是我写累了)就不详细叙说了,我已经写了个实验代码,在这里可以看到。

段页式管理

最后是段页式管理,结合了段式页式的优缺点,把程序先分段,在每个段内再分页,来管理内存,windows操作系统就是用这个方法管理的,当然实际中更加复杂,绝对没有我说的这么简单,我只是通俗的说清原理,详情请看《操作系统原理》

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

推荐阅读更多精彩内容