操作系统-虚拟内存和页面置换算法

背景知识

  • 局部性原理
    1. 时间局限性:如果程序中某条执行被执行,则不久后该指令还可能被在次执行。如果某条数据被访问过,则不久以后该数据还可能被继续访问。产生时间局限性经典原因是存在程序中存在大量的循环操作
    2. 空间局限性:一旦程序访问了程序访问了某个存储单元,在不久以后其附近的存储单元也将被访问,即程序在一段时间内访问的地址可能集中在一定的范围之内,其典型情况便是程序的顺序执行(虽然存在过程调用,使程序的执行轨迹由一部分区域转向另一部分区域,,但研究表明,过程调用的深度在大多数情况下不超过5)。

虚拟存储器

  • 虚拟存储器基本工作情况
    基于程序的局部性原理可知,应用程序在运行前没必要将作业全部装入内存,而仅将当前要运行的少数页面装入内存便可运行,其余部分暂留在盘上。程序运行时,若它所要访问的页已调入内存,便可继续执行下去,但若未调入内存(称为缺页或缺段),便发出缺页/缺段请求,此时,os将利用请求调页/段功能将它们调入内存,以便进程能继续执行下去。如果此时内存已满,无法装入新的页/段,os还需利用页/段置换功能,将内存中暂时不用的页/段调至盘上,腾出足够的内存空间后,再将要访问的页/段调入内存,是程序继续执行下去。

  • 虚拟存储器的定义
    具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种储存器系统(基于程序的局部性原理)。其逻辑容量由内存容量和外存容量之和所决定,其运行速度接近内存,而每位成本却又接近于外存。

  • 虚拟存储器的实现方法

    1. 分页请求系统:在分页系统的基础上增加了请求调页功能和页面置换功能所形成的页面时虚拟存储系统。置换时以页为单位。
    2. 请求分段系统:在分段系统的基础上,增加了请求调段及分段置换功能所形成的段式虚拟存储系统。置换时以段为单位。

页面置换算法:

  1. 最佳置换算法:所选择的被淘汰页面是以后永不使用的,或是在最长时间内不再被访问的页面。但由于目前人们无法预知哪个页面时未来最长时间内不再被访问的,因此该算法是无法实现的。

  2. 先进先出(FIFO)页面置换算法:总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。实现方法为:把一个进程已调入内存的页面按先后次序链接成一个队列,并设置一个指针(称为替换指针),始终指向最老的页面。但是该算法与进程实际运行的规律不相适应,因为在进程中,有些页面经常被访问,比如含有全局变量,常用函数,例程等的页面,FIFO算法不能保证这些页面不被淘汰。不需要特定的硬件支持,实现方式简单

  3. 最近最久未使用(LRU)置换算法:选择最近最久未使用的页面予以淘汰,利用“最近的过去”,作为预测“最近的将来”的依据。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t。当需要淘汰一个页面时,选择现有页面中t值最大的淘汰。实现方法:可利用一个特殊的栈保存当前使用的各个页面的页面号。每当进程访问某页面时,便将该页面的页面号从栈中移出,再将它压入栈顶。因此栈顶始终是最新访问页面的编号,栈底永远是最近最久未被访问的页,若发生缺页中断,且内存已满的情况时,应选择栈底页面予以淘汰。需要特定的硬件支持,如寄存器和栈,实现方式较FIFO复杂

LRU算法的代码实现

from collections import OrderedDict

class LruCache():
    def __init__(self, size):
        self.size = size
        self.cache = OrderedDict()

    def get(self, key):
        if key in self.cache:
            self.cache.move_to_end(key)
            value = self.cache[key]
        else:
            value = None
        return value
    def set(self, key, value):
        if key in self.cache:
            self.cache[key] = value
            self.cache.move_to_end(key)
        else:
            if self.size <= len(self.cache):
                self.cache.popitem(last=False)
                self.cache[key] = value
            else:
                self.cache[key] = value

以上算法采用了collection库中的Orderdict类,该类为dict的一个子类,详情见官网,简单来说就是该类实现了有序dict。

以下为测试用例及输出结果:

a = LruCache(5)
for i in range(0, 4):
    a.set(i, i*10)

print(a.cache, a.cache.keys())
print(a.get(2))
print(a.cache, a.cache.keys())
a.set(6, 666)
print(a.cache, a.cache.keys())
a.set(8, 888)
print(a.cache, a.cache.keys())

C:\Users\19205\AppData\Local\Programs\Python\Python36-32\python.exe C:/Users/19205/Desktop/lru.py
OrderedDict([(0, 0), (1, 10), (2, 20), (3, 30)]) odict_keys([0, 1, 2, 3])
20
OrderedDict([(0, 0), (1, 10), (3, 30), (2, 20)]) odict_keys([0, 1, 3, 2])
OrderedDict([(0, 0), (1, 10), (3, 30), (2, 20), (6, 666)]) odict_keys([0, 1, 3, 2, 6])
OrderedDict([(1, 10), (3, 30), (2, 20), (6, 666), (8, 888)]) odict_keys([1, 3, 2, 6, 8])
  1. 最少使用(LFU)置换算法:该算法淘汰页面的依据是页面被访问的频率,选择在最近时期使用最少的页面作为淘汰页

  2. Clock置换算法

  3. 页面缓冲算法(PBA):显著降低了页面换进换出的频率,使磁盘I/O的操作次数大为减少,因而减少了页面换进换出的开销。实现方式:在内存中设置了两个链表:空闲页面链表:实际上该链表是一个空闲物理块链表,是系统掌握的空闲物理块,用于分配给频繁发生缺页的进程,以降低该进程的缺页率 。修改页面链表:它是由已修改的页面所形成的链表。设置该链表的目的是为了减少已修改页面换出的次数。


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

推荐阅读更多精彩内容

  • 8.1虚拟存储的需求背景 虚拟内存是非连续内存分配的一个延续,非连续内存分配在存储空间内可以连续也可以不连续。虚拟...
    龟龟51阅读 5,839评论 2 6
  • 1. 基础知识 1.1、 基本概念、 功能 冯诺伊曼体系结构1、计算机处理的数据和指令一律用二进制数表示2、顺序执...
    yunpiao阅读 5,249评论 1 22
  • 1. 虚拟存储器的基本概念 分析常规存储器管理不足的原因: 1)常规存储器管理方式的特征 一次性:作业在运行前一...
    盆栽木只阅读 1,302评论 0 0
  • 1. 虚拟存储器的基本概念 分析常规存储器管理不足的原因: 1)常规存储器管理方式的特征 一次性:作业在运行前一...
    Whocare_2f87阅读 1,074评论 0 0
  • 译:cod9 里约热内卢是南美第一个举办奥运会的城市,这座城市的居民对奥运的安全和成本问题百感交集,奥运给居民带来...
    cod9阅读 337评论 0 4