• 《现代操作系统》笔记-内存管理3


    接上

    内存管理

    页置换算法

    1. 随机挑选一个置换

    缺点:有可能置换出频繁使用的页

    2. 最佳页置换算法

    缺陷: 前提是必须要知道接下来哪些页面要使用,完全理想的情况,不可能实现。但可作为衡量算法优劣的标准,结果越接近的越优秀。

    3. 最近未使用算法(Not Recently Used)

    页表中节点的访问位(Reference)和修改位(Modified):当被访问后,R位会被设置;当被修改后,M位会被修改。但每过一个周期,R位会被全部清空,M位不变(因为要被写会磁盘)。

    R位和M位在某一时刻可能存在几种情况

    a. 未访问,未修改
    b. 未访问,修改 (发生在刚刷新之后)
    c. 访问,未修改
    d. 访问,修改

    依顺序淘汰相应的页面。

    NRU淘汰页的思路: 淘汰掉已经修改的但至少一个周期(20毫秒左右)未访问的页比淘汰频繁使用的页要好。

    4. 先进先出页置换算法 (FIFO)

    先进入的页先被淘汰。

    缺点:有可能淘汰频繁使用的页

    5. 第二次机会页置换算法 (Second Chance) —— FIFO改进

    逐个查找所有的页,如果它已经被访问过(R位被设置),则清空R位,并重置进入内存的时间为当前,移动至队尾。直到找到一个未被访问过的页。(如果都被访问过,则退化为FIFO算法,第1个被淘汰)

    6. 时钟页面置换算法(Clock) —— Second Chance改进

    将页面像时钟一样排成环形,指针开始时指向最“老”的页面,之后同第二次机会算法一致。优化了“第二次机会”中的反复移动页面。

    7. 最近最少使用算法 (Least Recently Used)

    现象:过去频繁使用的页在未来也会被频繁使用。

    要维护一个链表,最近最多使用的页在最前面,最近最少使用的页在最后面,缺页时淘汰最后面的。

    缺点: 每次访问页面都要更新链表,代价太高。即使硬件实现也较为复杂。

    8. 软件模拟LRU

    (1)实现最不频繁使用NFU(Not Frequently Used)

    每次时钟中断后,将R位的值添加到计数器,淘汰计数最小的页(与LRU相比没有“最近”的概念)

    缺点:在多通道编译器(multipass compiler)中,在某个通道会频繁使用一部分内存,在另一通道会使用另一部分。在刚刚执行另一通道时,新调入的内存会因使用较少而马上被淘汰。由于在该通道执行,又要马上调入(因为没有“最近”的概念)

    (2)改进——加入老化(aging)

    在向计数器添加R位的值时,先右移一位,将新值添加到最左侧(相当于为最近使用的页添加了权重)。

    缺点:

    a. 都有相同的周期未使用时,不能明确哪个是最后被使用。—— 因为不是每次访问内存都更新页状态

    b. 计数器的位数有限,只能监测最近短时间的数据。例如计数器是8位,那么前9次访问过的页和前1000次访问的页表现相同。

    9. 工作集页面置换算法 (Working Set)

    之前的页面置换算法均为请求调页(demand paging),它们总是在需要时才加载。程序执行时对内存的访问是局部性的,因此恢复进程时可以预先调页(prepaging)

    程序每执行几个指令发生的缺页异常被称为颠簸(thrashing)

    工作集概念:最近k个最常使用的页。随着k的增大,工作集的容量的增加先快后慢,无限趋近一个值。因为程序不能取得比它的地址空间更大的内存,而且很少有程序会用尽地址空间(这是假设程序所需内存一直增加的最坏情况下)。

    缺点:每次内存访问都要遍历维护的页状态表,将所有页面左移,在右侧添加最近访问的页面,删除重复的页并排序(维护程序集),开销太大,从未使用。

    改进: 将最近k个改为最近 t 时间内访问的页

    一个进程从它开始执行到当前所实际使用的CPU时间总数被称为当前实际运行时间(current virtual time)。在要淘汰页面时,对时间进行比较:

    a. 已经访问过的页,将R位清空,将最后使用时间设置为当前实际运行时间
    b. 在 t 时间外的且未访问的页,淘汰
    c. 在 t 时间内但未访问的页页,记录下时间。在未找到其它合适页的情况下,淘汰时间最久远的
    d. 在最近的一次时钟周期内都被访问了,则随机淘汰。倾向于淘汰未被修改的页。

    10. 工作集时钟页面置换算法(WS Clock)

    将页状态表像时钟一样环形排列,淘汰算法与工作集页面置换算法相同。实现简单,性能较好,被广泛使用。

    理论上,所有的页面都有可能被调度到磁盘I/O,写回磁盘。但为了降低磁盘阻塞,需要限制最大n个页面可以被写回。一旦达到了n,被修改的页就不能被写回磁盘。

    指针走过一轮后可能出现的情况:

    a. 至少有一次写操作被调度

    待写操作完成后,淘汰第一个已经被写回的页面即可(此处的第一个页面不一定是第一个找到页面,因为写回指令可能被重排序)。

    b. 没有调度过写操作

    所有的页面都在工作集中,因此没有调度过一次写操作。随机置换一个未被修改的页面(扫描中需要记录干净的页面)。如果没有干净页面,则选定当前页并写回磁盘后置换。

  • 相关阅读:
    增量更新代码步骤记录
    软件缺陷管理基本流程
    数据库语言(三):MySQL、PostgreSQL、JDBC
    eclipse的使用
    数据库语言(二):SQL语法实例整理
    windows下MySql没有setup.exe时的安装方法
    数学:完全独立于实际场景的情况下定义的概念,可以正确的描述世界
    数学语言和程序语言的对比:面向过程与面向集合&命题
    iOS开发之IMP和SEL(方法和类的反射)
    iOS之UIButton的normal和selected状态切换
  • 原文地址:https://www.cnblogs.com/battor/p/memory_management_03.html
Copyright © 2020-2023  润新知