《现代操作系统》第3章读书笔记--内存管理(未完成)

    科技2022-07-12  131

    写在前面:本文仅供个人学习使用,如有侵权,请联系删除。文章中所用图片绝大多数来源于《现代操作系统(第4版)》,请读者支持原版。 内存(RAM) 是计算机中一种需要认真管理的重要资源。一个事实是程序大小的正常速度比内存容量的增长速度要快得多。正如帕金森定律所指出的:“不管存储器有多大,程序都可以把它填满。”在这一章中,我们将讨论操作系统是怎样对存储器创建抽象模型以及怎样管理它们的。

    每个程序员都梦想拥有这样的存储器:它是私有的、容量无限大的、速度无限快的,并且是永久性的(即断电时不会丢失数据)。当我们期望这样的存储器时,何不进一步要求它价格低廉? 遗憾的是,目前的技术还不能为我们提供这样的存储器。

    除此之外的选择是什么呢? 经过多年探索,人们提出了分层存储器体系(memory hierarchy) 的概念,即在这个体系中,计算机有若干兆(MB)快速、昂贵且易失性的高速缓存(cache),数千兆(GB)速度与价格适中且同样易失性的内存,以及几兆兆(TB)低速、廉价、非易失性的磁盘存储,另外还有诸如DVD和USB等可移动存储装置。操作系统的工作是将这个存储体系抽象为一个有用的模型并管理这个抽象模型。

    操作系统中管理分层存储器模型的部分称为存储管理器(memory manager) 。它的任务是有效地管理内存,即记录哪些内存是正在使用的,哪些内存是空闲的;在进程需要时为其分配内存,在进程使用完后释放内存。

    文章目录

    3.1 无存储器抽象3.2 一种存储器抽象:地址空间3.2.1 地址空间的概念3.2.2 交换技术3.2.3 空闲内存管理 3.3 虚拟内存3.3.1 分页3.3.2 页表3.3.3 加速分页过程3.3.4 针对大内存的页表 3.4 页面置换算法3.4.1 最优页面置换算法3.4.2最近未使用(NRU)页面置换算法3.4.3先进先出(FIFO)页面置换算法3.4.4 第二次机会页面置换算法3.4.5时钟页面置换算法3.4.6最近最少使用(LRU)页面置换算法3.4.7 用软件模拟LRU3.4.8 工作集页面置换算法3.4.9 工作集时钟页面置换算法3.4.10 页面置换算法小结 3.5 分页系统中的设计问题3.5.1 局部分配策略与全局分配策略3.5.2负载控制3.5.3 页面大小3.5.4 分离的指令空间和数据空间3.5.5 共享页面3.5.6 共享库3.5.7 内存映射文件3.5.8 清除策略3.5.9 虚拟内存接口 3.6 有关实现的问题3.6.1 与分页有关的工作3.6.2 缺页中断处理3.6.3指令备份3.6.4 锁定内存中的页面3.6.5 后备存储3.6.6 策略和机制的分离 3.7 分段3.7.1纯分段的实现3.7.2 分段与分页结合:MULTICS3.7.3 分段与分页结合:Intel x86 3.8 小结

    3.1 无存储器抽象

    最简单的存储器抽象就是根本没有抽象。每一个程序都直接访问物理内存。当一个程序执行如下指令

    MOVE REGISTER1,1000

    计算机会将位置为1000的物理内存中的内容移到REGISTER1中。因此,那时呈现给编程人员的存储器模型就是简单的物理内存:从0到某个上限的地址集合,每一个地址对应一个可容纳一定数目二进制位的存储单元,通常为8个。

    在这种情况下,要想在内存中同时运行两个程序是不可能的。如果第一个程序在2000 的位置写入一个新的值,将会擦掉第二个程序存放在相同位置上的所有内容,所以同时运行两个程序是根本行不通的,这两个程序会立即崩溃。

    不过即使存储器模型就是物理模型,还是存在一些可行选项的。图3-1展示了三种变体。 在a)中,操作系统位于RAM(随机访问存储器)的底部;在b)中,操作系统位于内存顶端的ROM(只读存储器)中;在C)中,设备驱动程序位于内存顶端的ROM中,而操作系统的其他部分则位于下面的RAM底部。第一种方案以前用于大型机和小型计算机,现在很少使用了。第二种方案被用在一些掌上电脑和嵌入式系统中。第三种方案用于早期的个人计算机中(例如运行MS-DOS的计算机),在ROM中的系统部分称为BIOS(Basic Input Output System,基本输入输出系统)。第一种和第三种方案的缺点是用户程序出现的错误可能摧毁操作系统,引发灾难性后果。

    当按这种方式组织系统时,通常同一时刻只能有一个进程在运行。一旦用户键入了一个命令,操作系统就把需要的程序从磁盘复制到内存中执行;当进行运行结束后,操作系统在用户终端显示提示符并等待新的命令。收到新的命令后,它把新的程序装入内存,覆盖前一个程序。

    在没有存储器抽象的系统中实现并行的一种方法是使用多线程来编程。由于在引入线程时就假设一个进程中的所有线程对同一

    在不使用存储器抽象的情况下运行多个程序

    3.2 一种存储器抽象:地址空间

    3.2.1 地址空间的概念

    基址寄存器与界限寄存器

    3.2.2 交换技术

    3.2.3 空闲内存管理

    3.3 虚拟内存

    3.3.1 分页

    3.3.2 页表

    3.3.3 加速分页过程

    3.3.4 针对大内存的页表

    3.4 页面置换算法

    3.4.1 最优页面置换算法

    3.4.2最近未使用(NRU)页面置换算法

    3.4.3先进先出(FIFO)页面置换算法

    3.4.4 第二次机会页面置换算法

    3.4.5时钟页面置换算法

    3.4.6最近最少使用(LRU)页面置换算法

    3.4.7 用软件模拟LRU

    3.4.8 工作集页面置换算法

    3.4.9 工作集时钟页面置换算法

    3.4.10 页面置换算法小结

    3.5 分页系统中的设计问题

    3.5.1 局部分配策略与全局分配策略

    3.5.2负载控制

    3.5.3 页面大小

    3.5.4 分离的指令空间和数据空间

    3.5.5 共享页面

    3.5.6 共享库

    3.5.7 内存映射文件

    3.5.8 清除策略

    3.5.9 虚拟内存接口

    3.6 有关实现的问题

    3.6.1 与分页有关的工作

    3.6.2 缺页中断处理

    3.6.3指令备份

    3.6.4 锁定内存中的页面

    3.6.5 后备存储

    3.6.6 策略和机制的分离

    3.7 分段

    3.7.1纯分段的实现

    3.7.2 分段与分页结合:MULTICS

    3.7.3 分段与分页结合:Intel x86

    3.8 小结

    Processed: 0.012, SQL: 8