导图社区 第3章 内存管理
该模板是一张关于408考研,期末,操作系统内存管理思维导图,专为计算机专业学生、考研 / 软考备考者、计算机基础课程学习者打造,是系统梳理操作系统内存管理核心知识的高效学习工具。思维导图的结构化呈现方式,将内存管理概念、虚拟内存管理两大核心模块拆解为层级清晰、逻辑连贯的分支框架,同时融入高频考点标注、内存布局示意图,帮助使用者快速构建内存管理的知识体系,精准攻克地址转换、页面置换算法等重难点与高频考点。 对于计算机专业学生与考研 / 软考备考者而言,这份思维导图模板可直接用于课堂笔记整理、期末复习、考点梳理,将进程内存布局、地址转换、页面置换算法、内存分配策略等零散知识点系统化,降低理解与记忆难度,提升备考效率;对于计算机基础课程学习者,模板清晰呈现了内存管理的核心概念、原理与经典算法,可用于入门学习、知识框架搭建,快速建立对操作系统内存管理逻辑的整体认知。模板完整覆盖内存管理核心考点:从内存管理的基本原理、进程的内存映像与布局,到虚拟内存管理的实现方式、请求分页管理、页面置换算法(OPT/FIFO/LRU/CLOCK)、内存分配策略、抖动现象与工作集模型,均以思维导图形式清晰呈现,层级分明,便于快速查阅、重点标记与按需编辑修改,适配备考笔记、课程复习提纲、学习课件等多种场景。
编辑于2026-05-07 15:43:46这是一篇关于408考研,期末考试,计算机组成原理,输入输出系统思维导图,专为计算机专业学生、考研(如 408 统考)/ 软考备考者、计算机硬件底层原理学习者打造,是系统梳理 I/O 系统核心知识的高效学习工具。思维导图的结构化呈现方式,将 I/O 系统的基本概念、I/O 接口、I/O 控制方式、中断处理流程四大核心模块拆解为层级清晰、逻辑连贯的分支框架,同时融入高频考点标注、原理示意图与对比表格,帮助使用者快速构建输入 / 输出系统的知识体系,精准攻克 I/O 控制方式对比、DMA 传输原理、中断处理流程、磁盘调度算法等重难点与高频考点。对于计算机专业学生与考研 / 软考备考者而言,这份思维导图模板可直接用于课堂笔记整理、期末复习、考点梳理,将 I/O 接口的软硬件构成、程序查询 / 中断 / DMA 控制方式的差异、中断响应与处理全过程、磁盘调度计算等零散知识点系统化,降低理解与记忆难度,提升备考效率;对于计算机底层原理学习者,模板清晰呈现了主机与外设数据交互的完整逻辑,可用于入门学习、硬件原理学习的知识框架搭建,快速建立对计算机输入输出系统的整体认知。模板完整覆盖输入 / 输出系统核心考点:从 I/O 系统的基本概念、接口的分类与工作原理,到程序查询、中断、DMA 三种核心 I/O 控制方式的对比;从中断响应与完整处理流程,到磁盘调度算法、DMA 传输原理等计算类高频考点,均以思维导图形式清晰呈现,层级分明,便于快速查阅、重点标记与按需编辑修改,适配备考笔记、课程复习提纲、学习课件等多种场景。该模板借助万兴脑图软件绘制,助力计算机学习者高效掌握输入 / 输出系统核心知识。
这是一篇关于408考研,期末考试,计算机组成原理,总线的思维导图,专为计算机专业学生、考研 / 软考备考者、计算机底层原理学习者打造,是系统梳理总线系统核心知识的高效学习工具。思维导图的结构化呈现方式,将总线概述、总线仲裁、总线操作和定时、总线标准四大核心模块拆解为层级清晰、逻辑连贯的分支框架,同时融入关键原理示意图、性能计算要点与对比说明,帮助使用者快速构建总线系统的知识体系,精准攻克总线分类、仲裁方式、传输定时与性能分析等重难点与高频考点。对于计算机专业学生与考研 / 软考备考者而言,这份思维导图模板可直接用于课堂笔记整理、期末复习、考点梳理,将总线的特性与分类、集中式 / 分布式仲裁方式、同步 / 异步传输定时、总线性能指标计算等零散知识点系统化,降低理解与记忆难度,提升备考效率;对于计算机底层原理学习者,模板清晰呈现了计算机系统中各部件通过总线进行数据传输的完整逻辑,可用于入门学习、硬件原理学习的知识框架搭建,快速建立对计算机系统互连机制的整体认知。模板完整覆盖总线系统核心考点:从总线的基本概念、分类与特性,到总线仲裁的集中式与分布式实现;从总线操作的同步 / 异步 / 半同步定时方式,到总线标准与性能指标计算,均以思维导图形式清晰呈现,层级分明,便于快速查阅、重点标记与按需编辑修改,适配备考笔记、课程复习提纲、学习课件等多种场景。
这是一篇关于408考研,期末考试,计算机组成原理,中央处理器的思维导图,专为计算机专业学生、考研 / 软考备考者、计算机底层原理学习者打造,是系统梳理 CPU 核心知识的高效学习工具。思维导图的结构化呈现方式,将 CPU 的功能和基本结构、指令执行过程、数据通路、控制器、指令流水线、多处理器系统六大核心模块拆解为层级清晰、逻辑连贯的分支框架,同时融入高频考点标注、关键概念对比与计算要点,帮助使用者快速构建 CPU 工作原理的知识体系,精准攻克数据通路设计、流水线性能分析、中断处理流程等重难点与高频考点。对于计算机专业学生与考研 / 软考备考者而言,这份思维导图模板可直接用于课堂笔记整理、期末复习、考点梳理,将 CPU 结构、指令执行周期、数据通路设计、硬布线 / 微程序控制器对比、流水线冲突处理、多处理器系统分类等零散知识点系统化,降低理解与记忆难度,提升备考效率;对于计算机底层原理学习者,模板清晰呈现了 CPU 从指令取指到执行的完整工作流程,可用于入门学习、底层原理学习的知识框架搭建,快速建立对计算机核心部件的整体认知。模板完整覆盖中央处理器核心考点:从 CPU 的功能与基本结构、指令执行的完整过程,到数据通路的设计原理与分类;从硬布线与微程序控制器的工作原理与对比,到指令流水线的性能指标、冲突处理与多发技术;再到多处理器系统的基本概念与硬件多线程技术,均以思维导图形式清晰呈现,层级分明,便于快速查阅、重点标记与按需编辑修改,适配备考笔记、课程复习提纲、学习课件等多种场景。
社区模板帮助中心,点此进入>>
这是一篇关于408考研,期末考试,计算机组成原理,输入输出系统思维导图,专为计算机专业学生、考研(如 408 统考)/ 软考备考者、计算机硬件底层原理学习者打造,是系统梳理 I/O 系统核心知识的高效学习工具。思维导图的结构化呈现方式,将 I/O 系统的基本概念、I/O 接口、I/O 控制方式、中断处理流程四大核心模块拆解为层级清晰、逻辑连贯的分支框架,同时融入高频考点标注、原理示意图与对比表格,帮助使用者快速构建输入 / 输出系统的知识体系,精准攻克 I/O 控制方式对比、DMA 传输原理、中断处理流程、磁盘调度算法等重难点与高频考点。对于计算机专业学生与考研 / 软考备考者而言,这份思维导图模板可直接用于课堂笔记整理、期末复习、考点梳理,将 I/O 接口的软硬件构成、程序查询 / 中断 / DMA 控制方式的差异、中断响应与处理全过程、磁盘调度计算等零散知识点系统化,降低理解与记忆难度,提升备考效率;对于计算机底层原理学习者,模板清晰呈现了主机与外设数据交互的完整逻辑,可用于入门学习、硬件原理学习的知识框架搭建,快速建立对计算机输入输出系统的整体认知。模板完整覆盖输入 / 输出系统核心考点:从 I/O 系统的基本概念、接口的分类与工作原理,到程序查询、中断、DMA 三种核心 I/O 控制方式的对比;从中断响应与完整处理流程,到磁盘调度算法、DMA 传输原理等计算类高频考点,均以思维导图形式清晰呈现,层级分明,便于快速查阅、重点标记与按需编辑修改,适配备考笔记、课程复习提纲、学习课件等多种场景。该模板借助万兴脑图软件绘制,助力计算机学习者高效掌握输入 / 输出系统核心知识。
这是一篇关于408考研,期末考试,计算机组成原理,总线的思维导图,专为计算机专业学生、考研 / 软考备考者、计算机底层原理学习者打造,是系统梳理总线系统核心知识的高效学习工具。思维导图的结构化呈现方式,将总线概述、总线仲裁、总线操作和定时、总线标准四大核心模块拆解为层级清晰、逻辑连贯的分支框架,同时融入关键原理示意图、性能计算要点与对比说明,帮助使用者快速构建总线系统的知识体系,精准攻克总线分类、仲裁方式、传输定时与性能分析等重难点与高频考点。对于计算机专业学生与考研 / 软考备考者而言,这份思维导图模板可直接用于课堂笔记整理、期末复习、考点梳理,将总线的特性与分类、集中式 / 分布式仲裁方式、同步 / 异步传输定时、总线性能指标计算等零散知识点系统化,降低理解与记忆难度,提升备考效率;对于计算机底层原理学习者,模板清晰呈现了计算机系统中各部件通过总线进行数据传输的完整逻辑,可用于入门学习、硬件原理学习的知识框架搭建,快速建立对计算机系统互连机制的整体认知。模板完整覆盖总线系统核心考点:从总线的基本概念、分类与特性,到总线仲裁的集中式与分布式实现;从总线操作的同步 / 异步 / 半同步定时方式,到总线标准与性能指标计算,均以思维导图形式清晰呈现,层级分明,便于快速查阅、重点标记与按需编辑修改,适配备考笔记、课程复习提纲、学习课件等多种场景。
这是一篇关于408考研,期末考试,计算机组成原理,中央处理器的思维导图,专为计算机专业学生、考研 / 软考备考者、计算机底层原理学习者打造,是系统梳理 CPU 核心知识的高效学习工具。思维导图的结构化呈现方式,将 CPU 的功能和基本结构、指令执行过程、数据通路、控制器、指令流水线、多处理器系统六大核心模块拆解为层级清晰、逻辑连贯的分支框架,同时融入高频考点标注、关键概念对比与计算要点,帮助使用者快速构建 CPU 工作原理的知识体系,精准攻克数据通路设计、流水线性能分析、中断处理流程等重难点与高频考点。对于计算机专业学生与考研 / 软考备考者而言,这份思维导图模板可直接用于课堂笔记整理、期末复习、考点梳理,将 CPU 结构、指令执行周期、数据通路设计、硬布线 / 微程序控制器对比、流水线冲突处理、多处理器系统分类等零散知识点系统化,降低理解与记忆难度,提升备考效率;对于计算机底层原理学习者,模板清晰呈现了 CPU 从指令取指到执行的完整工作流程,可用于入门学习、底层原理学习的知识框架搭建,快速建立对计算机核心部件的整体认知。模板完整覆盖中央处理器核心考点:从 CPU 的功能与基本结构、指令执行的完整过程,到数据通路的设计原理与分类;从硬布线与微程序控制器的工作原理与对比,到指令流水线的性能指标、冲突处理与多发技术;再到多处理器系统的基本概念与硬件多线程技术,均以思维导图形式清晰呈现,层级分明,便于快速查阅、重点标记与按需编辑修改,适配备考笔记、课程复习提纲、学习课件等多种场景。
第三章 内存管理
3.1内存管理概念
内存管理的基本原理和要求
按字节编址
每个存储单元1字节 1B 8个二进制位
一个地址对应一个字节的数据
能存放一个字节
按字编址
每个存储单元1个字
一个地址能存放一个字
要看题目一个字对应多少位



程序的装入和链接
即从写程序到程序运行
编辑源代码文件
编译
把高级语言翻译为机器语言
编译程序
将用户源代码编译成若干个目标模块
每一个模块的逻辑地址的编制都是相互独立的,都是从0开始
链接
链接程序
由目标模块生成装入模块
形成逻辑地址
装入(装载)
装入程序
装入模块装入内存
装入后形成物理地址
链接的三种方式
静态链接
在程序运行之前
将目标模块,及所需库函数链接,形成完整的装入模块(可执行文件)
链接后形成完整的逻辑地址
解决的问题
对相对地址进行修改
变换外部调用符号
装入时动态链接
将各目标模块装入内存时,边装入边链接的链接方式
放入内存时才会链接
优点
便于修改和更新
便于实现与目标模块的共享
运行时动态链接
在程序执行中需要该目标模块时,才对它进行链接
装入时同时进行链接
其优点是便于修改和更新,便于实现对目标模块的共享
提升对内存的利用率
需要用的的模块才装入内存
装入的三种方式
关键
如何将指令中的逻辑地址转换成物理地址
绝对装入/静态装入
在编译时直接将程序的逻辑地址转换成物理地址
编译时产生绝对地址
编译、链接后得到的装入模块的指令直接就使用了绝对地址
编译
知道程序将放到内存中的位置,编译程序产生绝对地址的目标代码
装入程序按照装入模块中的地址,将程序和数据装入内存。
程序中使用的绝对地址
可在编译或汇编时给出
通常情况下都是编译或汇编时再转换为绝对地址
可由程序员直接赋予
特点
地址转换由编译器完成,而不是操作系统
换一台设备就无法运行
适用
只适用于单道程序环境
单道程序阶段,无操作系统
静态重定位/可重定位装入
装入时对地址进行“重定位”——将逻辑地址转换为物理地址
装入程序负责地址转换
装入程序——操作系统的一部分
重定位
装入时对目标程序中的指令和数据的修改过程
eg.装入的起始物理地址为100,则所有地址相关的参数都 +100
特点
地址变换是在装入时一次完成
装入后不能改变
一个作业装入内存时
必须分配其要求的全部连续内存空间
如果没有足够的内存,就不能装入该作业
装入位置
允许将装入模块装入内存的任何位置
但不允许进程在内存中移动
作业一旦进入内存后,在运行期间就不能再移动,也不能再申请内存空间
适用
早期的多道批处理操作系统
动态重定位/动态运行时装入
运行时将逻辑地址转换为物理地址
需要一个重定位寄存器的支持
最终地址是程序中的逻辑地址和重定位寄存器二者相加
特点
装入时依然保持使用逻辑地址
地址转换在执行时进行
可将程序分配到不连续的存储区中
允许进程在内存中移动
装入后有可能被换出
优点
在程序运行前只需装入它的部分代码即可投入运行
在程序运行期间,根据需要动态申请分配内存
便于程序段的共享
可以向用户提供一个比存储空间大得多的地址空间
适用
现代操作系统采用的方式
动态重定位的过程依赖于
可重定位装入程序
在重定位的过程中执行
重定位寄存器/也称基址寄存器
用于存放进程的基地址
地址变换机构
用于将指令中的逻辑地址与重定位寄存器中的基地址相加得到物理地址
内存管理的功能有:
内存空间的分配和回收
连续分配管理方式
单一连续分配
固定分区分配
动态分区分配
非连续分配管理方式
内存空间的扩充(实现虚拟性)
操作系统需要提供某种技术从逻辑上对内存空间进行扩充
地址转换
操作系统负责实现逻辑地址到物理地址的转换
三种方式
绝对装入
可重定位装入
动态运行时装入
存储保护/内存保护
保证各进程在自己的内存空间内运行,不会越界访问
两种方式
设置上下限寄存器
在CPU中设置一对上、下限寄存器
存放进程的上、下限地址
进程的指令要访问某个地址时,CPU检查是否越界
利用重定位寄存器、界地址寄存器进行判断
重定位寄存器(又称基址寄存器
硬件
存放的是进程的起始物理地址
装入模块存放的起始位置
单处理机时,系统处理器在同一时刻只能执行一条指令或访问数据,只需在切换程序执行时重置寄存器内容,整个系统设置一个重定位寄存器
实现将逻辑地址转换为物理地址
界地址寄存器(又称限长寄存器)
存放的是进程的最大逻辑地址
进程的内存映像
用户栈
存储所以和函数调用有关的信息
每调用一次函数就要保存上一层函数的信息
同时开辟新的空间存储被调用函数的相关信息
动态增加/减少
只读代码/数据
编译链接之后的机器指令在程序运行过程中不会发生改变
只读数据
const关键字修饰的变量
存储在只读代码/数据
宏定义的常量
不专门分配存储空间,在预编译阶段,会将代码中的x替换为 1024
立即数
存储在程序指令之中
内存空间的扩充
覆盖和交换
覆盖技术
解决程序大小超过物理内存总和的问题
覆盖技术的思想
1. 将程序分为多个段(多个模块)
常用的段常驻内存,不常用的段在需要时调入内存。
2. 内存
固定区
只有一个
存放最活跃的程序段
常驻内存
调入后就不再调出(除非运行结束)
覆盖区
可以有多个
存放不常用的段
需要用到时调入内存,用不到时调出内存
不可能同时被访问程序段可共享一个覆盖区
按照自身逻辑结构
必须由程序员声明覆盖结构,操作系统完成自动覆盖。
缺点
对用户不透明,增加了用户编程负担。
只用于早期的操作系统中
交换技术
交换(对换)技术的设计思想
进程在内存与磁盘间动态调度
内存紧张时,换出某些进程以腾出内存空间,再换入某些进程
换出的进程放在对换区
中级调度(内存调度),就是要决定将哪个处于挂起状态的进程重新调入内存
个人理解:提前行为,对换是解决措施
注
交换通常在许多进程运行且内存吃紧时进行,而系统负荷降低就暂停。
例如:在发现许多进程运行时经常发生缺页,就说明内存紧张,此时可以换出一些进程;如果缺页率明显下降,就可以暂停换出。
可优先换出阻塞进程;可换出优先级低的进程;为了防止优先级低的进程在被调 入内存后很快又被换出,有的系统还会考虑进程在内存的驻留时间…
PCB 会常驻内存,不会被换出外存
PCB常驻内存原因
进程在外存的存放位置信息,记录在PCB中,操作系统可以根据PCB当中的记录信息对这些进程进行管理
换出进程并不是将进程相关的所有数据一个不漏地换出外存
具有对换功能的操作系统中,通常把磁盘空间分为文件区和对换区
覆盖与交换的区别
覆盖是在同一个程序或进程中的
交换是在不同进程(或作业)之间的
虚拟存储技术
内存分配方式
连续分配管理方式
连续分配:
系统为用户进程分配的必须是一个连续的内存空间
补充
内部碎片和外部碎片
内部碎片
分配给某进程的内存区域中,有些部分没有用上
开始分配过多
外部碎片
是指内存中的某些空闲分区由于太小而难以利用。
反复交换产生的
可以通过紧凑(拼凑,Compaction)技术来解决外部碎片
内存中空闲空间的总和可以满足某进程的要求,但由于进程需要的是一整块连续的内存空间,因此这些碎片不能满足进程的需求。用紧凑技术来解决
采用动态重定位方式
单一连续分配
内存被分为系统区和用户区
系统区
通常位于内存的低地址部分
用于存放操作系统相关数据
用户区
用于存放用户进程相关数据
特点
内存中只能有一道用户程序
用户程序独占整个用户区空间
不支持多道程序并发运行
只支持单道程序
无外部碎片,有内部碎片
优点
实现简单;无外部碎片;
可以采用覆盖技术扩充内存;
不一定需要采取内存保护(eg:早期的 PC 操作系统 MS-DOS)。
缺点
只能用于单用户、单任务的操作系统中:
有内部碎片
存储器利用率极低
固定分区分配
用户空间划分为若干个固定大小的分区
每个分区中只装入一道作业
特点
无外部碎片,有内部碎片
作业装入内存后位置不会改变
作业在内存中占用连续的存储空间
分区大小系统启动时确定,可以不同但预先固定
分区大小相等
缺乏灵活性
很适合用于用一台计算机控制多个相同对象的场合
比如:钢铁厂有n个相同的炼钢炉,就可把内存分为n个大小相等的区域存放n个炼钢炉控制程序
分区大小不等
增加了灵活性,可以满足不同大小的进程需求
根据常在系统中运行的作业大小情况进行划分
但大小固定
如:划分多个小分区、适量中等分区、少量大分区
分区说明表
操作系统建立的一个数据结构
数组(或链表)
实现分区的分配和回收
每个表项对应一个分区
通常按分区大小排列
每个表项包括对应分区的大小、起始地址、状态(是否已分配)
用户程序要装入内存时
操作系统内核程序根据用户程序大小检索该表
找到一个满足大小、未分配的分区,分配给该程序,修改状态为“已分配”
优点
实现简单,无外部碎片。
缺点
a. 当用户程序太大时,可能所有的分区都不能满足需求
不得不采用覆盖技术来解决
会降低性能
b. 会产生内部碎片,内存利用率低。
注
硬件地址变换机构一般用于动态重定位的情况
单一连续分配和固定分区分配采用的是静态重定位
不需要硬件地址变换机构
由装入程序或操作系统来完成地址转换
动态分区分配/可变分区分配
特点
不会预先划分内存分区
在进程装入内存时,根据进程的大小动态地建立分区
系统分区的大小和数目是可变的
支持多道程序
没有内部碎片,但是有外部碎片
记录内存的使用情况
空闲分区表
每个空闲分区对应一个表项。表项中包含分区号、分区大小、分区起始地址等信息
注
各表项的顺序不一定按照地址递增顺序排列
具体的排列方式需要依据动态分区分配算法来确定
空闲分区链
每个分区的起始部分和末尾部分分别设置前向指针和后向指针。起始部分处还可记录分区大小等信息
分区的分配与回收
分区的回收
两个相邻的空闲分区合并为一个
情况一:回收区的后面有一个相邻的空闲分区
情况二:回收区的前面有一个相邻的空闲分区
三个相邻的空闲分区合并为一个
情况三:回收区的前、后各有一个相邻的空闲分区
新增一个表项
情况四:回收区的前、后都没有相邻的空闲分区
相邻的空闲分区要合并
动态分区分配算法
分类
基于顺序搜索的动态分区分配算法
首次适应算法
算法思想
每次都从低地址开始查找
分区排列顺序
空闲分区以地址递增的次序排列
每次分配内存时顺序查找空闲分区链(或空闲分区表)
找到大小能满足要求的第一个空闲分区。
优点
综合看性能最好
算法开销小
回收分区后一般不需要对空闲分区队列重新排序
最佳适应算法
算法思想
优先使用更小的空闲区。
分区排列顺序
空闲分区按容量递增次序链接
每次分配内存时顺序查找空闲分区链(或空闲分区表)
找到大小能满足要求的第一个空闲分区。
分配后计算剩余空闲分区并重新排序
优点
会有更多的大分区被保留下来,更能满足大进程需求
缺点
会产生很多太小的、难以利用的碎片
算法开销大
回收分区后可能需要对空闲分区队列重新排序
最大适应算法(Largest Fit)
算法思想
优先使用最大的连续空闲区
分区排列顺序
空闲分区按容量递减次序链接
分配时顺序查找
优点
可以减少难以利用的小碎片
缺点
大分区容易被用完,不利于大进程
算法开销大
重新排序
邻近适应算法/循环首次适应算法
算法思想
改进首次适应算法低地址部分出现很多小的空闲分区,而每次分配查找时,都要经过这些分区,增加了查找的开销的问题
分区排列顺序
空闲分区以地址递增的顺序排列(可排成一个循环链表
每次分配内存时从上次查找结束的位置开始查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。
优点
不用每次都从低地址的小分区开始检索
算法开销小
内存分区大小发生变化,也不需要对链表进行重新排列
缺点
会使高地址的大分区也被用完
基于索引搜索的动态分区分配算法
快速适应算法
将空闲分区根据容量大小进行分类,对每一类具有相同容量的所有空闲分区,单独设立一个空闲分区链表
索引表,记录有哪些容量,每个被记录的容量都对应一个列表
查索引表
如果没有恰好相等的,找能满足的最小的
查链表区
找第一个空闲分配
伙伴系统/伙伴算法
无论已分配分区或空闲分区,大小都为2的k次幂(k为整数,1<=k<=m)
索引表
所有空闲分区都是2的k次幂
最坏的情况下需要对2的k次方大小的空闲空间进行k次分割
哈希算法
构造一张以空闲分区大小为关键字的哈希表
每个表项记录了一个对应的空闲分区链表表头指针
更好的时间性能
算法开销
为了保证空闲分区按照规定顺序排列
对整个空闲分区链进行重新排序
非连续分配方式
基本分页管理方式
思想
把进程分页,各个页面可离散地放到各个的内存块中
概念
内存
页框
内存空间分为大小相等的分区
(比如:每个分区4KB)
一个分区就是一个“页框”
页框=页帧=内存块=物理块=物理页面
页框号
每个页框的编号
页框号从0开始
页框号=页帧号=内存块号=物理块号=物理页号
进程
页/页面
进程的逻辑地址空间也分为与页框大小相等的部分
每个部分称为一个“页”或“页面”
页号
每个页面的编号
页号也是从0开始的
操作系统以页框为单位为各个进程分配内存空间
进程的页面分别放入一个页框中
进程的页面与内存的页框有一一对应的关系
各个页面不必连续存放,可以放到不相邻的各个页框中。
对主存的访问依旧是以字节或者字为单位
分页存储有可能产生内部碎片
页表项不会跨页框存取
进程的最后一个页面可能没有一个页框那么大
内存的页框划分可能有剩余,但操作系统会直接忽略,仅管理完整的页框DeepSeek
页框不能太大,否则可能产生过大的内部碎片造成浪费
页表
页表
记录进程页面和在内存中实际存放位置的页框号之间的映射关系
操作系统在程序装入内存时建立
每个进程一张
存在PCB(进程控制块)中
每一页对应一个页表项
每个页表项由“页号”和“块号”组成
每个页表项的长度是相同的
物理上只存储块号,页号不占用存储空间
页号连续,可以不存储
页号隐含
由内存块的数量可推算出页表项中块号至少占多少字节
数量计算出比特要扩大为字节
计算机分配存储空间以字节为单位而不是以比特为单位
存储页表需要
页表项所占字节数*(n+1)B
注
页表记录的只是内存块号,而不是内存块的起始地址!
每个页表项占多少字节?
初步计算
内存块号用多少字节表示
为了方便页表的查询,让一个页表项占更多的字节,使得每个页面恰好可以装得下整数个页表项
进程页表通常是装在连续的内存块中的
按照字节编制,内存一行代表1B
因此可以根据页表始址推算出要得到的页表项的位置
计算
逻辑地址结构
页号+页偏移量
页内偏移量
K 位表示“页内偏移量”,说明该系统中一个页面的大小是 2^K 个内存单元
页号
M 位表示“页号”,则说明在该系统中,一个进程最多允许有 2^M 个页面
逻辑地址空间2^16页
去除页内偏移量的位数(如页目录号加页号共16位)
个人理解:页不是说大小要乘以页面大小,存储空间的单位只有B,bit,字
概念区分
页表长度
指的是这个页表中总共有几个页表项,即总共有几个页
越界判断
和进程页面数量有关
进程有几个页面
页表项长度
每个页表项占多大的存储空间
和页框数有关
注意单位B和bit
页面大小/页面长度
一个页面占多大的存储空间
根据单位可以得知计算机按照哪种方式进行编址
如:页面大小1K字节
按照字节编址
页内偏移量的位数
页面大小为 2^KB,用二进制数表示逻辑地址,则末尾K 位即为页内偏移量,其余部分就是页号
页面大小刚好是 2 的整数幂有什么好处?
①逻辑地址的拆分更加迅速
末尾K位
②物理地址的计算更加迅速
拼接
逻辑地址转物理地址
例题
计算
逻辑地址A对应的实际物理地址=J号页面在内存中的起始地址+页内偏移量W
页号
页号P= 逻辑地址A/ 页面大小(取除法的整数部分)
查页表,找对应的页框号J
页表中页号P对应的页表项地址=页表起始地址F+页号P*页表项长度
取出该页表项内容J
页内偏移量
页内偏移量= 逻辑地址% 页面大小(取除法的余数部分)
页内偏移量占k位,页面大小为2^k
J号内存块的起始地址=」*内存块大小
从0开始,因此是块号*而不是块号-1
二进制表示
将二进制表示的内存块号和页内偏移量拼接就可以得到最终的物理地址
单位
K,M,G,T
2^10
分页存储管理(页式管理)的地址是一维的
确定了页面大小,逻辑地址结构就确定了
给逻辑地址,可自动算出页号、页内偏移量
基本地址变换机构
用于实现逻辑地址到物理地址转换的一组硬件机构
页表寄存器(PTR)
作用
存放页表在内存中的起始地址F 和页表长度M。
注
进程未执行时,页表的始址和页表长度放在进程控制块(PCB)中
进程被调度时,操作系统内核会把它们放到页表寄存器中。
比较页号P和页表长度M
页号是从0开始的,而页表长度至少是1,因此P=M时也会越界
地址变换过程

CPU想访问一个逻辑地址,到实际访问对应的内存单元,共进行两次访存操作
查询页表
页表存储在内存中
实际访问目标内存单元
逻辑地址转物理地址
由硬件自动完成的,不需要操作系统或其他软件的干预
CPU
将虚拟地址分解为页号和页内偏移量
硬件
页表寄存器和内存管理单元(MMU)
将页号转换为物理地址,再拼接上页内偏移量,得到最终的内存物理地址
具有快表的地址变换机构
概念
快表
相联寄存器(TLB, translation lookaside buffer )
本质
高速缓存
TLB不是内存(RAM)!!
当进程切换时快表的内容也需要被清除
TLB 和普通Cache 的区别
TLB 中只有页表项的副本,而普通Cache 中可能会有其他各种数据的副本
TLB是一种专用的硬件
作用
用来存放最近访问的页表项的副本
可以加速地址变换的速度
当TLB命中时,地址转换不需要任何内存访问
高速缓存的思想
将近期会频繁访问到的数据放到更高速的存储器中,暂时用不到的数 据放在更低速存储器中。
慢表
内存中的页表
查询页表需要访问内存(访存操作)

CPU给出逻辑地址
由硬件算得页号、页内偏移量
越界判断
将页号与快表中的所有页号进行比较。
命中
要访问的页表项在快表中有副本
直接从中取出该页号对应的内存块号
将内存块号与页内偏移量拼接形成物理地址
访问该物理地址对应的内存单元
访问某个逻辑地址需一次访存
访问一个逻辑地址的平均耗时应该将其包括在内
计算题易错!
未命中
访问内存中的页表
找到对应页表项,得到对应的内存块号
将内存块号与页内偏移量拼接形成物理地址
访存
访问某个逻辑地址需要两次访存
注
在找到页表项后,应同时将其存入快表
局部性原理
时间局部性:
条指令很有可能再次执行;
数据很可能再次被访问
程序中存在大量的循环
空间局部性:
附近的存储单元很有可能被访问
很多数据在内存中都是连续存放的
例:某系统使用基本分页存储管理,并采用了具有快表的地址变换机构。访问一次快表耗时 1us,访问一次内存耗时 100us。若快表的命中率为 90%,那么访问一个逻辑地址的平均耗时是多少?
易错
即使快表命中,也会访存
(1+100) * 0.9 + (1+100+100) * 0.1 = 111 us
快表和慢表同时查找,平均耗时应该是(1+100) * 0.9+ (100+100)*0.1=110.9 us
若未采用快表机制,则访问一个逻辑地址需要100+100 = 200us
两级页表
单级页表存在的问题
1. 页表必须连续存放
当页表很大时,需要占用很多个连续的页框
2. 没有必要让整个页表常驻内存
进程在一段时间内可能只需要访问某几个特定的页面。
逻辑地址位数+页面大小
可以计算进程最多有多少个页面,页表项
页内偏移量
页目录表/外层页表/顶层页表
把页表再分页并离散存储,然后再建立一张页表记录页表各个部分 的存放位置
页表项存放在内存块中
每个内存块刚好可以放入一个分组
eg,页面大小4KB,每个页表项4B,每个页面可存放1K个页表项,因此每1K个连续的页表项为一组,每组刚好占一个内存块,再将各组离散地放到各个内存块中
页面大小
计算出一组能有多少页表项
建立了二级页表的页号,和在内存中存放的块号之间的关系
逻辑地址结构
一级页号(页目录号)+二级页号(页表索引)+页内偏移量
表示前两个的位数
都表示第几个页表项
和页面大小以及存储一个页表项的所需大小有关
第一次检索,将页表索引看作偏移量,每次+页表项大小
地址和地址的地址的区别
表示偏移量的位数和页面大小有关
每次+1
字节编址
本质区别:存储页表项几行存储一个,存储数据一行一个,因此位数少
如何实现地址变换
①按照地址结构将逻辑地址拆分成三部分
②从PCB中读出页目录表始址,再根据一级页号查页目录表,找到下一级页表在内存中的存放位置
③根据二级页号查二级页表,找到最终想访问的内存块号
④结合页内偏移量得到物理地址
计算
针对问题二
虚拟存储技术
在需要访问页面时才把页面调入内存
可以在页表项中增加一个标志位,用于表示该页面是否已经调入内存
若想访问的页面不在内存中,则产生缺页中断(内中断/异常),然后将目标页面从外存调入内存
内中断
优点
解决了单级页表的两大问题
内存空间利用率上升
缺点
逻辑地址变换的时候需要进行更多一次的访存
注意
采用多级页表机制,各级页表的大小不能超过一个页面
在多级页表中,页表基址寄存器存放的是顶级页表的起始物理地址
页面大小/页表项大小=每个页面最多可存放的页表项个数
可以确定各下级页号位数
eg,每个页面可存放2^10个页表项
各级页表最多包含2^10个页表项,二级页号10位
访存次数
单级页表结构 两次访存
两级页表的访存次数(假设没有快表机构)
第一次访存:访问内存中的页目录表
第二次访存:访问内存中的二级页表
第三次访存:访问目标内存单元
多级页表的访存次数(假设没有快表机构)
N 级页表访问一个逻辑地址需要N+ 1次访存
基本分段存储管理方式
进程的地址空间
按照程序自身的逻辑关系划分为若干个段名,每段从0开始编址
按照逻辑功能模块划分
在低级语言中,程序员使用段名来编程
编译程序会将段名转换为段号
内存分配规则
以段为单位进行分配
每个段在内存中占据连续空间
各段之间可以不相邻
程序分多个段,各段离散地装入内存
与“分页”最大的区别
离散分配时所分配地址空间的基本单位不同
优点
程序可读性更高

地址结构
二维
段号(段名)+段内地址(段内偏移量)
段号的位数决定了每个进程最多可以分几个段
段内地址位数决定了每个段的最大长度是多少
段表
进程逻辑段和物理内存的映射关系
每个段对应一个段表项
段号,段长,段基址
段在内存中的起始位置(又称“基址”)
各个段表项的长度是相同的。段号隐含
每个段长可能不同
需要检查段内偏移量是否越界
地址变换过程

1.由逻辑地址得到段号、段内地址
2.段号与段表寄存器中的段长度比较,检查是否越界
3.由段表始址、段号找到对应段表项
4.根据段表中记录的段长,检查段内地址是否越界
位数限制偏移量不会越界
5.由段表中的"基址+段内地址”得到最终的物理地址
6.访问目标单元
分段与分页的比较
1.
页是信息的物理单位
分页的主要目的是为了实现离散分配,提高内存利用率。
段是信息的逻辑单位
分段的主要目的是更好地满足用户需求
2.
分页
是系统管理上的需要
是系统行为,对用户是不可见
分段
一个段通常包含着一组属于一个逻辑模块的信息
分段对用户可见,用户编程时需要显式地给出段名
分段方式对低级语言程序员和编译器可见
3.
页
大小固定且由系统决定
段
段的长度不固定,决定于用户编写的程序
4.
分页
用户进程地址空间是一维的
程序员只需给出一个记忆符即可表示一个地址。
分段
用户进程地址空间是二维的
程序员在标识一个地址时,既要给出段名,也要给出段内地址
5.
分段比分页更容易实现信息的共享和保护。
实现共享:
只需要让各进程的段表项指向同一个段即可实现共享
页面不是按逻辑模块划分的。可能一个页面中只有一个部分允许其他进程访问,因此很难实现共享。

并不意味着页式存储实现的共享容易发生越界访问,进程P1、P2的逻辑地址空间还是独立的,内存访问有越界保护。(容易发生同步互斥性问题)
6.
页式存储管理
程序如何分页是在装入作业时决定
段式存储管理
程序如何分段是在用户编程时决定
7. 访问一个逻辑地址需要几次访存?
分页(单级页表):
第一次访存--查内存中的页表
第二次访存--访问目标内存单元
分段:
第一次访存--查内存中的段表
第二次访存--访问目标内存单元
分段系统中也可以引入快表机构,可以少一次访问, 加快地址变换速度。
段页式管理方式
分页、分段的优缺点分析
分页
优点
内存空间利用率高,不会产生外部碎片,只会有少量的页内碎片
缺点
不方便按照逻辑模块实现信息的共享和保护
分段
优点
很方便按照逻辑模块实现信息的共享和保护
缺点
如果段长过大,为其分配很大的连续空间会很不方便
段式管理会产生外部碎片
类似动态分区分配
也可以用“紧凑”来解决,但有较大时间代价
将进程按逻辑模块分段,再将各段分页
逻辑地址结构
(段号,页号,页内偏移量)
用户要提供段号、段内地址。
段号+页号+页内偏移量
段号的位数决定了每个进程最多可以分几个段
页号位数决定了每个段最大有多少页
页内偏移量决定了页面大小、内存块大小是多少
页号+页内偏移量
段内地址再拆分
段页式管理的地址结构是二维的。
用户给两个数
一维用户给一个数
“分段” 对用户是可见的
程序员编程时需要显式地给出段号、段内地址
将各段“分页”对用户不可见
系统会根据段内地址自动划分页号和页内偏移量
段表、页表
每个段对应一个段表项
段表项由段号、页表长度、页表存放块号(页表起始地址)组成
每个段表项长度相等,段号是隐含的
每个页面对应一个页表项
页表项由页号、页面存放的内存块号组成
每个页表项长度相等,页号是隐含的。
一个进程对应一个段表,可能对应多个页表
地址转换过程

1.由逻辑地址得到段号、页号、页内偏移量
2.段号与段表寄存器中的段长度比较,检查是否越界
3.由段表始址、段号找到对应段表项
4. 根据段表中记录的页表长度,检查页号是否越界
5.由段表中的页表地址、页号得到查询页表,找到相应页表项
6.由页面存放的内存块号、页内偏移量得到最终的物理地址
7.访问目标单元
访问一个逻辑地址所需访存次数
第一次一查段表、第二次一查页表、第三次一访问目标单元
可引入快表机构,以段号和页号为关键字查询快表,即可直接找到最终的目标页面存放位置。引入快表后仅需一次访存
注
分区存储管理
是满足多道程序设计的最简单的存储管理方案
特别适合嵌入式等微型设备
分页、分段和段页式存储管理
需要特定的数据结构支持
如页表、段表等
硬件
提高性能
提供快存和地址加法器等
代价高
3.2虚拟内存管理
虚拟内存的基本概念
传统存储管理
连续分配
单一连续分配
固定分区分配
动态分区分配
非连续分配
基本分页存储管理
基本分段存储管理
基本段页式存储管理
传统存储管理方式的特征、缺点
内存利用率不高
很多暂时用不到的数据也会长期占用内存
一次性
作业必须一次性全部装入内存后才能开始运行
①作业很大时,不能全部装入内存,导致大作业无法运行;
②当大量作业要求运行时,由于内存无法容纳所有作业,因此只有少量作业能运行,导致多道程序并发度下降。
驻留性
一旦作业被装入内存,就会一直驻留在内存中,直至作业运行结束
浪费内存资源
虚拟存储技术
补充内存逻辑空间的技术
虚拟内存的定义和特征
基于局部性原理,在程序装入时,将程序中很快会用到的部分装入内存,暂时用不到的部分留在外存,就可以让程序开始执行。
程序执行过程中
当所访问的信息不在内存时
由操作系统负责将所需信息从外存调入内存,然后继续执行程序
操作系统提供请求调页(或请求调段)功能
内存空间不够
由操作系统负责将内存中暂时用不到的信息换出到外存
操作系统要提供页面置换(或段置换)的功能
请求分页存储管理与基本分页存储管理的主要区别
不必将作业全部一次性装入内存,会缺页
虚拟内存
在操作系统的管理下,在用户看来似乎有一个比实际内存大得多的内存
操作系统虚拟性的一个体现
实际的物理内存大小没有变,只是在逻辑上进行了扩充
虚拟内存的最大容量
是由计算机的地址结构(CPU寻址范围)确定的
使得进程可用地址空间能达到的上限,但外存显然达不到这个大小
虚拟内存的实际容量
虚拟内存的实际容量= min(内存和外存容量之和,CPU寻址范围)
虚拟存储器实际可用容量的最大值
内存和硬盘的大小仅决定
注
虚拟地址空间的大小由底层的虚拟内存管理机制和操作系统决定
C 语言中 malloc()函数返回的是虚拟地址
问应该采用几级页表等类型题目,同时给实地址位数和虚拟地址位数,计算要用虚拟地址位数
虚拟内存的主要特征
多次性
无需在作业运行时一次性全部装入内存
允许被分成多次调入内存
对换性
作业运行时无需一直常驻内存
允许在作业运行过程中,将作业换入、换出
虚拟性
从逻辑上扩充了内存的容量,使用户看到的内存容量,远大于实际的容量
虚拟内存技术的实现
建立在离散分配的内存管理方式基础上
请求分页存储管理
请求分段存储管理
请求段页式存储管理
有请求机制的支持
页式虚拟存储管理
主要特点
不要求将作业同时全部装入主存的连续区域
离散式存储管理(包括页式存储管理)的特点
不要求将作业装入主存连续区域
在非虚拟存储器中,作业必须全部装入内存且在运行过程中也一直驻留内存
程序链接方式
运行时动态链接
虚拟地址
程序访问内存时使用的地址
操作系统负责将其转换为物理地址
物理地址是在程序运行时才确定
请求分页管理方式
页表机制
请求页表增加了四个字段
状态位/存在位/有效位
是否已调入内存
当存在位为0时,地址变换不能用页表项里的页框号,那个数字代表着被换出前所在内存位置,要根据置换算法找新换到的内存位置。
访问字段A
记录最近被访问次数,或上次访问的时间
供置换算法选择换出页面时参考
修改位M
页面调入内存后是否被修改过
只有修改过的页面才需在置换时写回外存
外存地址
页面在外存中的存放位置

缺页中断机构
当访问的页面不在内存时
产生缺页中断,请求调页
操作系统的缺页中断处理程序处理中断
缺页的进程阻塞,放入阻塞队列
调页完成后再将其唤醒,放回就绪队列
内存中有空闲块
为进程分配一个空闲块
将所缺页面装入该块,并修改页表中相应的页表项
缺页不一定需要页面置换
内存中没有空闲块
由页面置换算法选择一个页面淘汰
若该页面在内存期间被修改过,则要将其写回外存
未修改过的页面不用写回外存
注
若某个页面被换出外存,则快表中的相应表项也要删除
快表中有的页面一定是在内存中的,否则可能访问错误的页面
一条指令在执行期间,可能产生多次缺页中断
如:copy A to B,即将逻辑地址A中的数据复制到逻辑地址B,而A、B属于不同的页面,则有可能产生两次中断
地址变换机构
请求分页的地址变换过程
查找页表项,检查页面是否在内存中
和分页存储管理的区别
新增步骤1:
请求调页(查到页表项时进行判断)
新增步骤2:页面置换(需要调入页面,但没有空闲内存块时进行)
新增步骤3:需要修改请求页表中新增的表项

①只有“写指令”才需要修改“修改位”。并且,一般来说只需修改快表中的数据,只有要将快表项删除时才需要写回内存中的慢表。这样可以减少访存次数。
②和普通的中断处理一样, 缺页中断处理依然需要保留CPU现场。
③需要用某种“页面置换算法”来决定一个换出页面
④⑤换入/换出页面都需要启动慢速的I/O操作,可见,如果换入/换出太频繁,会有很大的开销
注
页面调入内存后,需要修改慢表,同时也需要将表项复制到快表中。
在具有快表机构的请求分页系统中,访问一个逻辑地址时,若发生缺页,则地址变换步骤是:
查快表(未命中)——查慢表(发现未调入内存)——调页(调入的页面对应的表项会直接加入快表)——查快表(命中)——访问目标内存单元
页面置换算法
最佳置换算法(OPT,Optimal)
算法规则
优先淘汰最长时间内不会被访问的页面

优点
最低的缺页率
性能最好
缺点
无法实现
操作系统无法提前预判页面访问序列
只有在进程执行的过程中才能知道接下来会访问到的是哪个页面
先进先出置换算法(FIFO)
算法规则
优先淘汰最先进入内存的页面
实现方法
把调入内存的页面根据调入的先后顺序排成一个队列
队列的最大长度取决于系统为进程分配了多少个内存块
需要换出页面时选择队头页面
队列类算法,有Belady 异常
优点
实现简单
缺点
性能差
与进程实际运行时的规律不适应
先进入的页面也有可能最经常被访问
Belady 异常
当为进程分配的物理块数增大时,缺页次数不减反增的异常现象。
只有FIFO算法会出现Belady 异常,LRU和OPT算法永远不会出现Belady异常
最近最久未使用置换算法(LRU,least recently used)
算法规则
优先淘汰最近最久没访问的页面
实现方法
页表项新增‘访问字段’
记录该页面自上次被访问以来所经历的时间t
堆栈类算法
手动做题

逆向检查此时在内存中的几个页面号
在逆向扫描过程中最后一个出现的页号就是要淘汰的页面。
优点
性能好
最接近最佳置换算法
缺点
实现困难,开销大
需要对所有的页进行排序
需要专门的寄存器和栈的硬件支持
时钟置换算法(CLOCK算法或最近未用算法NRU,Not Recently Used)
特点
一种性能和开销较均衡的算法
堆栈类算法
简单的CLOCK 算法
实现方法
页表项新增“访问位”
当某页被访问时,其访问位置为1
最近没访问过,访问位为0
将内存中的页面都通过链接指针链接成一个循环队列
淘汰一个页面时
检查页的访问位
如果是0,就选择该页换出
如果是1,则将它置为0,暂不换出,继续检查下一个页面
扫描轮数
简单的CLOCK 算法选择一个淘汰页面最多会经过两轮扫描
简单的时钟置换算法仅考虑到一个页面最近是否被访问过。
优点
实现简单
算法开销小
缺点
未考虑页面是否被修改过
改进的CLOCK算法
事实上,如果被淘汰页没有被修改过,就不需要执。只有被淘汰的页面被修改过时,才需要写回外存。
思想
考虑
有没有被访问过
页面有没有被修改过
I/O操作写回外存
实现方法
“修改位"
修改位=0,表示页面没有被修改过
修改位=1,表示页面被修改过
将所有可能被置换的页面排成一个循环队列(u访问位,m修改位)
第一轮:从当前位置开始扫描到第一个(0, 0)的帧用于替换
本轮扫描不修改任何标志位
第二轮:若第一轮扫描失败,则重新扫描,查找第一个(0, 1)的帧用于替换
本轮将所有扫描过的帧访问位设为0
第三轮:若第二轮扫描失败,则重新扫描,查找第一个(0, 0)的帧用于替换
本轮扫描不修改任何标志位
第四轮:若第三轮扫描失败,则重新扫描,查找第一个(0, 1)的帧用于替换。
优先级
第一优先级:最近没访问,且没修改的页面 第二优先级:最近没访问,但修改过的页面 第三优先级:最近访问过,但没修改的页面 第四优先级:最近访问过,且修改过的页面
扫描轮数
改进型CLOCK置换算法选择一个淘汰页面最多会进行四轮扫描
优点
算法开销小
性能也不错
页面分配策略
驻留集与分配策略
驻留集
请求分页存储管理中给进程分配的物理块的集合
系统为某个进程分配了n个物理块=某个进程的驻留集大小是n
在采用了虚拟存储技术的系统中,驻留集大小一般小于进程的总大小。
驻留集太小
缺页频繁
抖动现象
大量的时间来处理缺页,实际用于进程推进的时间少
驻留集太大
多道程序并发度下降
资源利用率降低
分配给进程的存储量越小,则任何时候驻留在主存中的进程数越多,从而可以提高处理机的时间利用效率
分配方式
固定分配
驻留集大小不变
操作系统为每个进程分配一组固定数目的物理块
运行期间不再改变
可变分配
驻留集大小可变
先为进程分配一定数目的物理块,在进程运行期间根据情况适当增加或减少
置换方式
局部置换
发生缺页时只能选进程自己的物理块进行置换。
全局置换
可将操作系统保留的空闲物理块分配给缺页进程
空闲物理块队列
可选择一个未锁定的页面换出外存
再将该物理块分配给缺页的进程
未锁定的页面
系统会锁定一些页面,这些页面中的内容不能置换出外存(如:重要的内核数据可以设为“锁定”)
置换策略

固定分配局部置换
进程运行前就分配一定数量物理块,缺页时只能换出进程自己的某一页
缺点
很难在刚开始就确定合适的物理块个数
可根据进程大小、优先级、程序员给出的参数来确定为一个进程分配的内存块数
灵活性低
可变分配全局置换
只要进程发生缺页,都将获得新的物理块
缺点
盲目地给进程增加物理块,从而导致系统多道程序的并发能力下降
被选中的进程拥有的物理块会减少,缺页率会增加。
可变分配局部置换
频繁缺页的进程,多分配一些物理块
缺页率很低的进程,回收一些物理块
缺点
更复杂的实现
更大的开销
区分
可变分配全局置换:
只要缺页就给分配新物理块
可变分配局部置换:
要根据发生缺页的频率来动态地增加或减少进程的物理块
调入页面的时机
预调页策略
思想
预测不久之后可能访问到的页面,将它们预先调入内存
缺点
预测成功率低
适用
策略主要用于进程的首次调入,由程序员指出应该先调入哪些部分
运行前的调入
请求调页策略
思想
进程在运行期间发现缺页时才将所缺页面调入内存
优点
这种策略调入的页一定会被访问到
缺点
I/O开销较大
每次只能调入一页,每次调页都要磁盘I/O操作
适用
运行期间的调入
发现缺页再调页
从外存调入页面
外存(磁盘)分为两部分
文件区
主要用于存放文件
主要追求存储空间的利用率
采用
离散分配方式
提高存储空间利用率
对换区
只占磁盘空间的小部分
存放对换页面/被换出的进程数据
主要追求换入换出速度
对换的速度直接影响到系统的整体速度
I/O速度比文件的速度更快
采用
连续分配方式
提高换入换出的速度
存在三种情况
系统拥有足够的对换区空间
特点
在进程运行前,需将进程相关的数据从文件区复制到对换区
页面的调入、调出都是在内存与对换区之间进行
优点
保证页面的调入、调出速度很快
系统缺少足够的对换区空间
直接从文件区调入
没有被修改的数据
换出时不必写回磁盘
下次需要时再从文件区调入
被修改的数据
换出/调出时需写回磁盘对换区
下次需要时再从对换区调入
UNIX方式
运行之前与进程有关的的数据全部放在文件区
第一次调入从文件区
未使用过的页面,都可从文件区调入
再次调入调出在对换区
被使用过的页面需要换出,则写回对换区,下次需要时从对换区调入
抖动(颠簸)现象
频繁的页面调度行为
刚刚换出的页面马上又要换入内存,刚刚换入的页面马上又要换出外存
产生抖动的主要原因
进程频繁访问的页面数目高于可用的物理块数(分配给进程的物理块不够)
防止抖动
撤销部分进程
减少所要用到的页面数
注
对换区大小和进程优先级和抖动无关
工作集
工作集
指在某段时间间隔里,进程实际访问页面的集合
根据工作集的大小来确定驻留集的大小
一般来说,驻留集大小不能小于工作集大小

窗口尺寸
工作集大小可能小于窗口尺寸
内存映射文件
内存映射文件
将文件映射到进程的虚拟地址空间
是系统调用
操作系统向上层程序员提供的功能
特性
以访问内存的方式读/写文件
进程关闭文件时,操作系统负责将文件数据写回磁盘,并解除内存映射
多个进程可以映射同一个文件,实现共享
操作系统会将虚拟地址空间映射到相同的物理内存上(修改页表)
用页表实现映射
不同进程对同一个文件映射出的虚拟地址空间相互独立
物理内存中,一个文件对应同一份数据
当一个进程修改文件数据时,另一个进程可以立马"看到”
按需加载文件的部分
类比:进程共享数据
都映射到同一个共享内存段
页号/段号不一定相等
在不同进程的地址空间中的位置可能不同
两个页对应的页框号一定相等
物理内存中的位置必然相同
优点
程序员编程更简单
方便程序员访问文件数据
已建立映射的文件,可按访问内存的方式读写
方便多个进程共享同一个文件
文件数据的读入/写出完全由操作系统负责,I/O效率可以由操作系统负责优化
如预读入,缓写出等优化I/O的效率
传统的文件访问方式:
open系统调用
打开文件
seek系统调用
将读写指针移到某个位置
read系统调用
从读写指针所指位置读入若干数据(从磁盘读入内存)
write系统调用
将内存中的指定数据,写回磁盘(根据读写指针确定要写回什么位置)
内存映射文件的方式
open系统调用
打开文件
mmap系统调用
将文件映射到进程的虚拟地址空间
返回一个指针,指向映射区域的起始地址
之后
以访问内存的方式访问文件数据
起始地址和偏移量来访问后面某些区域
文件数据的读入、写出由操作系统自动完成
进程关闭文件时,操作系统自动将文件被修改的数据写回磁盘
方便程序员访问文件数据
注
操作系统只是建立了文件数据和内存之间的一个映射关系
并没有把文件数据直接读入内存
相当于一个缺页状态
比如访问2会产生缺页,操作系统自动将那一块数据读入主存
程序员不用再调用read函数,读入数据的过程由操作系统自动完成

补充
int 型数据占4B
指令相关性
如果指令2的执行要用到指令1的结果,则这两条指令是相关的
2必须在1后面执行,无法乱序
程序分多个段,各段离散地装入内存
将内存块号与页内偏移量拼接形成物理地址