当前课程知识点:操作系统 >  第八讲 虚拟存储概念 >  8.6 缺页异常 >  8.6 缺页异常

返回《操作系统》慕课在线视频课程列表

8.6 缺页异常在线视频

8.6 缺页异常

下一节:9.1 页面置换算法的概念

返回《操作系统》慕课在线视频列表

8.6 缺页异常课程教案、知识点、字幕

接下来我们介绍缺页异常

那么缺页异常呢

在我们前面讲页式存储管理里说

缺页异常就是发现页表项当中这一页

不在物理内存当中我就会产生缺页异常

缺页异常把相应的内容读到内存里头来

我再重新执行这条指令

这是我们前面对缺页异常的描述

那实际上在缺页异常里头呢

还有很多要处理的内容

我们现在先来介绍一下缺页异常的处理流程

那在这儿我们现在有一个图来说明这个过程

首先是我在CPU里头呢要访问一条指令

比如说load M

这条指令呢它会找m所对应的页表项

找到这一项之后 如果这一项是有效的

那这时候呢或者是驻留位是为1

好 这时候它就直接去访问去了

如果这一页是无效的

那这时候就会产生缺页异常

缺页异常呢就会导致操作系统的

缺页异常服务例程的执行

这个缺页异常服务例程它干什么呢

它缺页之后那首先第一个它得找到

对应着那一页在外存当中存在什么地方

如果说有这一页之后找到了

那这时候呢我把这一页读到内存里头来

读到内存里头来就会带来一个问题

我在内存里我到哪去找这一页

我肯定要找空闲的页面

如果找着那这时候呢我把这一页读进来

并且回身要修改相应的页表项

那页表项修改

修改完了之后然后我再重新执行这条指令

OK 这样以来的话 我这个缺页异常呢

就算是 大致的流程就算处理完了

但是在这个过程当中如果说

这个你要找空闲页找不着

那这时候怎么办呢

那这时候我们还需要把这个流程

再对这一段呢再做一个细化

那也就是我们这边说的

说我缺页异常我要在这里

要去找空闲的物理页面

如果能找着那这事没问题了

直接蹦到我们刚才说的复制

说的后面一步 如果没找着呢

那这时候我就得把另外一页把它写出去

我根据页面置换算法来找

找一页我不常用的我把它替换出去

假定说这一页的物理页帧号是F

它对应的逻辑页号是Q

好 我就找到这一项

那么找到这一项之后我把它淘汰掉

这时候我又有一个要判断的

这个Q对应的这一项是否修改过

如果修改过那你直接把它扔掉是不行的

我还必须把这一页呢写到外存当中去

给它找另外一个地方把它写那儿去

然后写完了之后呢

这一项我就可以拿回来用了

那在这之前呢还有一个事

要修改这个Q所对应的页表项的内容

把这一项置为是无效

以便于你下次再来访问的时候

这一项我已经分配给别人了

好 那如果说这写完了之后

那这时候E 就是我们刚才说到这儿

也就相当于我这儿有了一个空闲的页帧了

我把相应的这个P对应的这一页

把它装到这里头来 然后这是我们这里说的五这一步

修改P对应着的页表项的驻留位

表示这一页我已经把它对到这儿来了

好 然后这里的6对应这一步

我重新执行产生缺页异常的这一条指令

整个这个处理流程就算处理完了

那么有了这些介绍之后呢

我们说对这个缺页异常呢有一个了解

但是如果说你和实际的操作系统代码当中

缺页异常处理相比较这个流程仍然是非常简化

那实际代码里头比这处理又要复杂一些

这个希望大家再去看实际代码来逐步

把这个过程细化和加以理解

好 那接下来我们还有一个问题是说

我们刚才把在外存里找的那一页

外存那个地方我怎么去找它呢

那这个时候我的外存保存这一页放在哪

我必须很方便地找

在我们现在的操作系统里呢有两种搞法

一种搞法呢是说

我直接做一个分区叫兑换区

这在Linux Unix都是这么干的

另一个呢 我是可以用一个文件来存这些东西

在文件里头我采用特殊的格式

来映射这些页面

因为在这头我通常都是固定大小的页面

所以它的文件可以针对这种做法来做优化

好 这是我往哪放的事

这时候是不是所有东西

全放这里头呢也不是这样

因为我们在外存当中的这些

进程地址空间里的内容

有一些是我可以放到这里头兑换区里头的

而另外一些呢你比如说像我们这里说到

可能选择另外这样两种 一种是代码

我本来代码是在可执行文件里头的

那如果说你生生给它另整一个地方

去把它复制过去保存这是没必要的

所以这时候代码是直接指向你的可执行文件

而还有一些就是共享库 这些库呢 实际上

也是它有相应的目标文件来存放

这时候呢 你也没必要把它复制到这里头来

因为这两项内容呢我们都是不去修改的

好 其它的数据段 堆栈段那这些呢

你都可以放到你的兑换区里头

和兑换空间里头

好 最后一个问题我们来讨论

虚拟页式存储管理的性能

我们如何来评价

虚拟页式存储管理的性能呢

在这呢我们定义了一个指标

叫做有效存储访问时间

这个有效存储访问时间呢

如果说你是在页式存储管理里头没有虚拟的话

那么它就是访存的时间

因为我所有的内容都在内存里头

我直接读就可以 读内存的时间是固定的

大家是一致的 但是有了虚拟之后

那我们就只能有一部分是

直接从内存当中访问的

而另外一部分呢我是从硬盘上读的

那从硬盘上读呢 要涉及到缺页异常的处理时间

那这时候根据你缺页率

缺页率E减P那是你的内存访问

而概率P呢你是从硬盘上访问

这俩加到一起平均下来就是

你的存储访问的有效访问时间

那下面我们用一个例子来说

假定我访问内存的时间是10个纳秒

而一次访问磁盘的时间是5个毫秒

而在这里头缺页率设置为P

那缺页里头有一些需要做过修改的

页修改概率为Q 那这时候

我的有效存储访问时间是多少呢

在这儿这个表达 10纳秒乘以1减缺页率P

那这时候存储在内存里情况的访问

然后剩下的是会在磁盘上的访问

我们在这儿缺页异常处理时间

主要是你磁盘访问时间

而代码执行时间我们在这儿忽略不计了

好 那在这里头呢 基本上是说5个毫秒

是10个纳秒的50万倍

50万倍乘在这里头来

然后这边呢缺页率是概率P

然后在这里头呢它是乘1

还要加上一项什么呢

对于修改过的我是两个5毫秒

那这时候再加上一个Q

这个P乘Q是你这个缺页情况下再加上页修改

这俩搁在一起那最后是我们的有效时间

如果你想让这个最后这个

有效存储访问时间和这个10纳秒不相上下

或者稍微大一点的话

那么这个时候你的缺页率这个P必须足够小

以至于可以把这个50万倍基本上给抵消了

那这样以来的话我这个地方有效时间

才会可以和原来的存储访问相一致

那这是我们说虚拟页式存储管理的性能

那到这个地方呢

我们关于虚拟存储管理的概念就讲完了

那我们在这里还有一个问题没有涉及

就是我们在这里说我缺页中断

中断完了之后我要用页面置换算法

来选择一个页面来 用来存我先要加进来东西

那这个地方如何选择呢

这是我们下一次要讨论页面置换算法的内容

好 那今天的课就上到这里 下课

操作系统课程列表:

第零讲 在线教学环境准备

-0.1 Piazza讨论区

--piazza访问和使用

--html

-0.2 在线实验平台

--实验平台使用帮助

--平台使用帮助

--Gitlab使用帮助

--IBM内部账号初始化

-0.2在线实验平台

--Raw HTML

第一讲 操作系统概述

-1.1 课程概述

--视频

-第一讲 操作系统概述--练习

-1.2 教学安排

--视频

-1.3 什么是操作系统

--Video

-1.4 为什么学习操作系统,如何学习操作系统

--Video

-1.5 操作系统实例

--视频

-1.6 操作系统的演变

--视频

-1.7 操作系统结构

--视频

第二讲 实验零 操作系统实验环境准备

-2.1 前言和国内外现状

--2.1 前言和国内外现状

-2.2 OS实验目标

--2.2 OS实验目标

-2.3 8个OS实验概述

--2.3 8个OS实验概述

-2.4 实验环境搭建

--2.4 实验环境搭建

-2.5 x86-32硬件介绍

--2.5 x86-32硬件介绍

-2.6 ucore部分编程技巧

--2.6 ucore部分编程技巧

-2.7 演示实验操作过程

--2.7 演示实验操作过程

--Q6

--Q7

--Q10

第三讲 启动、中断、异常和系统调用

-3.1 BIOS

--3.1 BIOS

-3.2 系统启动流程

--3.2 系统启动流程

-3.3 中断、异常和系统调用比较

--3.3 中断、异常和系统调用比较

-第三讲 启动、中断、异常和系统调用--3.3 中断、异常和系统调用比较

-3.4 系统调用

--3.4 系统调用

-第三讲 启动、中断、异常和系统调用--3.4 系统调用

-3.5 系统调用示例

--3.5 系统调用示例

-3.6 ucore+系统调用代码

--3.6 ucore+系统调用代码

第四讲 实验一 bootloader启动ucore os

-4.1 启动顺序

--4.1 启动顺序

-4.2 C函数调用的实现

--4.2 C函数调用的实现

-4.3 GCC内联汇编

--4.3 GCC内联汇编

-4.4 x86中断处理过程

--4.4 x86中断处理过程

-4.5 练习一

--4.5 练习一

-4.6 练习二

--4.6 练习二

-4.7 练习三

--4.7 练习三

-4.8 练习四 练习五

--4.8 练习四练习五

-4.9 练习六

--4.9 练习六

第五讲 物理内存管理: 连续内存分配

-5.1 计算机体系结构和内存层次

--5.1 计算机体系结构和内存层次

-5.2 地址空间和地址生成

--5.2 地址空间和地址生成

-5.3 连续内存分配

--5.3 连续内存分配

-5.4 碎片整理

--5.4 碎片整理

-5.5 伙伴系统

--5.5 伙伴系统

-第五讲 物理内存管理: 连续内存分配--5.6 练习

第六讲 物理内存管理: 非连续内存分配

-6.1 非连续内存分配的需求背景

--6.1 非连续内存分配的需求背景

-6.2 段式存储管理

-- 6.2 段式存储管理

-6.3 页式存储管理

--6.3 页式存储管理

-6.4 页表概述

--6.4 页表概述

-6.5 快表和多级页表

--6.5 快表和多级页表

-6.6 反置页表

--6.6 反置页表

-6.7 段页式存储管理

--6.7 段页式存储管理

-第六讲 物理内存管理: 非连续内存分配--6.8 练习

第七讲 实验二 物理内存管理

-7.1 了解x86保护模式中的特权级

--7.1 了解x86保护模式中的特权级

-第七讲 实验二 物理内存管理--7.1 了解x86保护模式中的特权级

-7.2 了解特权级切换过程

--7.2 了解特权级切换过程

-第七讲 实验二 物理内存管理--7.2 了解特权级切换过程

-7.3 了解段/页表

--7.3 了解段/页表

-第七讲 实验二 物理内存管理--7.3 了解段/页表

-7.4 了解UCORE建立段/页表

--7.4 了解ucore建立段/页表

-第七讲 实验二 物理内存管理--7.4 了解UCORE建立段/页表

-7.5 演示lab2实验环节

--7.5 演示lab2实验环节

第八讲 虚拟存储概念

-8.1 虚拟存储的需求背景

--8.1 虚拟存储的需求背景

-8.2 覆盖和交换

--8.2 覆盖和交换

-8.3 局部性原理

--8.3 局部性原理

-8.4 虚拟存储概念

--8.4 虚拟存储概念

-8.5 虚拟页式存储

--8.5 虚拟页式存储

-8.6 缺页异常

--8.6 缺页异常

第九讲 页面置换算法

-9.1 页面置换算法的概念

--9.1 页面置换算法的概念

-9.2 最优算法、先进先出算法和最近最久未使用算法

--9.2 最优算法、先进先出算法和最近最久未使用算法

-第九讲 页面置换算法--9.2 最优算法、先进先出算法和最近最久未使用算法

-9.3 时钟置换算法和最不常用算法

--9.3 时钟置换算法和最不常用算法

-第九讲 页面置换算法--9.3 时钟置换算法和最不常用算法

-9.4 Belady现象和局部置换算法比较

--9.4 Belady现象和局部置换算法比较

-第九讲 页面置换算法--9.4 Belady现象和局部置换算法比较

-9.5 工作集置换算法

--9.5 工作集置换算法

-第九讲 页面置换算法--9.5 工作集置换算法

-9.6 缺页率置换算法

--9.6 缺页率置换算法

-第九讲 页面置换算法--9.6 缺页率置换算法

-9.7 抖动和负载控制

--9.7 抖动和负载控制

第十讲 实验三 虚拟内存管理

-10.1 实验目标:虚存管理

--10.1 实验目标:虚存管理

-第十讲 实验三 虚拟内存管理--10.1 实验目标:虚存管理

-10.2 回顾历史和了解当下

-- 10.2 回顾历史和了解当下

-第十讲 实验三 虚拟内存管理--10.2 回顾历史和了解当下

-10.3 处理流程、关键数据结构和功能

--10.3 处理流程、关键数据结构和功能

-第十讲 实验三 虚拟内存管理--10.3 处理流程、关键数据结构和功能

-10.4 页访问异常

--10.4 页访问异常

-第十讲 实验三 虚拟内存管理--10.4 页访问异常

-10.5 页换入换出机制

--10.5 页换入换出机制

-第十讲 实验三 虚拟内存管理--10.5 页换入换出机制

第十一讲 进程和线程

-11.1 进程的概念

--11.1 进程的概念

-第十一讲 进程和线程--11.1 进程的概念

-11.2 进程控制块

--11.2 进程控制块

-第十一讲 进程和线程--11.2 进程控制块

-11.3 进程状态

--11.3 进程状态

-第十一讲 进程和线程--11.3 进程状态

-11.4 三状态进程模型

--11.4 三状态进程模型

-11.5 挂起进程模型

--11.5 挂起进程模型

-第十一讲 进程和线程--11.5 挂起进程模型

-11.6 线程的概念

--11.6 线程的概念

-第十一讲 进程和线程--11.6 线程的概念

-11.7 用户线程

--11.7 用户线程

-第十一讲 进程和线程--11.7 用户线程

-11.8 内核线程

--11.8 内核线程

-第十一讲 进程和线程--11.8 内核线程

第十二讲 进程控制

-12.1 进程切换

--12.1 进程切换

-第十二讲 进程控制--12.1 进程切换

-12.2 进程创建

--12.2 进程创建

-第十二讲 进程控制--12.2 进程创建

-12.3 进程加载

--12.3 进程加载

-第十二讲 进程控制--12.3 进程加载

-12.4 进程等待与退出

--12.4 进程等待与退出

-第十二讲 进程控制--12.4 进程等待与退出

第十三讲 实验四 内核线程管理

-13.1 总体介绍

--13.1 总体介绍

-13.2 关键数据结构

--13.2 关键数据结构

-13.3 执行流程

--13.3 执行流程

-13.4 实际操作

--13.4 实际操作

第十四讲 实验五 用户进程管理

-14.1 总体介绍

--14.1 总体介绍

-14.2 进程的内存布局

--14.2 进程的内存布局

-14.3 执行ELF格式的二进制代码-do_execve的实现

--14.3 执行ELF格式的二进制代码-do_execve的实现

-14.4 执行ELF格式的二进制代码-load_icode的实现

--14.4 执行ELF格式的二进制代码-load_icode的实现

-14.5 进程复制

--14.5 进程复制

-14.6 内存管理的copy-on-write机制

--14.6 内存管理的copy-on-write机制

第十五讲 处理机调度

-15.1 处理机调度概念

--15.1 处理机调度概念

-第十五讲 处理机调度--15.1 处理机调度概念

-15.2 调度准则

--15.2 调度准则

-15.3 先来先服务、短进程优先和最高响应比优先调度算法

--15.3 先来先服务、短进程优先和最高响应比优先调度算法

-第十五讲 处理机调度--15.3 先来先服务、短进程优先和最高响应比优先调度算法

-15.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架

--15.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架

-第十五讲 处理机调度--15.4 时间片轮转、多级反馈队列、公平共享调度算法和uc

-15.5 实时调度和多处理器调度

--15.5 实时调度和多处理器调度

-第十五讲 处理机调度--15.5 实时调度和多处理器调度

-15.6 优先级反置

--15.6 优先级反置

-第十五讲 处理机调度--15.6 优先级反置

第十六讲 实验六 调度器

-16.1 总体介绍和调度过程

--16.1 总体介绍和调度过程

-16.2 调度算法支撑框架

--16.2 调度算法支撑框架

-16.3 时间片轮转调度算法

--16.3 时间片轮转调度算法

-16.4 Stride调度算法

--16.4 Stride调度算法

第十七讲 同步互斥

-17.1 背景

--17.1 背景

-17.2 现实生活中的同步问题

--17.2 现实生活中的同步问题

-第十七讲 同步互斥--17.2 现实生活中的同步问题

-17.3 临界区和禁用硬件中断同步方法

--17.3 临界区和禁用硬件中断同步方法

-第十七讲 同步互斥--17.3 临界区和禁用硬件中断同步方法

-17.4 基于软件的同步方法

--17.4 基于软件的同步方法

-第十七讲 同步互斥--17.4 基于软件的同步方法

-17.5 高级抽象的同步方法

--17.5 高级抽象的同步方法

-第十七讲 同步互斥--17.5 高级抽象的同步方法

第十八讲 信号量与管程

-18.1 信号量

--18.1 信号量

-第十八讲 信号量与管程--18.1 信号量

-18.2 信号量使用

--18.2 信号量使用

-第十八讲 信号量与管程--18.2 信号量使用

-18.3 管程

--18.3 管程

-第十八讲 信号量与管程--18.3 管程

-18.4 哲学家就餐问题

--18.4 哲学家就餐问题

-18.5 读者-写者问题

--18.5 读者-写者问题

第十九讲 实验七 同步互斥

-19.1 总体介绍

--19.1 总体介绍

-19.2 底层支撑

--19.2 底层支撑

-第十九讲 实验七 同步互斥--19.2 底层支撑

-19.3 信号量设计实现

--19.3 信号量设计实现

-第十九讲 实验七 同步互斥--19.3 信号量设计实现

-19.4 管程和条件变量设计实现

--19.4 管程和条件变量设计实现

-第十九讲 实验七 同步互斥--19.4 管程和条件变量设计实现

-19.5 哲学家就餐问题

--19.5 哲学家就餐问题

第二十讲 死锁和进程通信

-20.1 死锁概念

--20.1 死锁概念

-第二十讲 死锁和进程通信--20.1 死锁概念

-20.2 死锁处理方法

--20.2 死锁处理方法

-第二十讲 死锁和进程通信--20.2 死锁处理方法

-20.3 银行家算法

--20.3 银行家算法

-第二十讲 死锁和进程通信--20.3 银行家算法

-20.4 死锁检测

--20.4 死锁检测

-第二十讲 死锁和进程通信--20.4 死锁检测

-20.5 进程通信概念

--20.5 进程通信概念

-第二十讲 死锁和进程通信--20.5 进程通信概念

-20.6 信号和管道

--20.6 信号和管道

-第二十讲 死锁和进程通信--20.6 信号和管道

-20.7 消息队列和共享内存

--20.7 消息队列和共享内存

-第二十讲 死锁和进程通信--20.7 消息队列和共享内存

第二十一讲 文件系统

-21.1 文件系统和文件

--21.1 文件系统和文件

-第二十一讲 文件系统--21.1 文件系统和文件

-21.2 文件描述符

--21.2 文件描述符

-第二十一讲 文件系统--21.2 文件描述符

-21.3 目录、文件别名和文件系统种类

--21.3 目录、文件别名和文件系统种类

-第二十一讲 文件系统--21.3 目录、文件别名和文件系统种类

-21.4 虚拟文件系统

--21.4 虚拟文件系统

-第二十一讲 文件系统--21.4 虚拟文件系统

-21.5 文件缓存和打开文件

--21.5 文件缓存和打开文件

-第二十一讲 文件系统--21.5 文件缓存和打开文件

-21.6 文件分配

--21.6 文件分配

-第二十一讲 文件系统--21.6 文件分配

-21.7 空闲空间管理和冗余磁盘阵列RAID

--21.7 空闲空间管理和冗余磁盘阵列RAID

-第二十一讲 文件系统--21.7 空闲空间管理和冗余磁盘阵列RAID

第二十二讲 实验八 文件系统

-22.1 总体介绍

--22.1 总体介绍

-第二十二讲 实验八 文件系统--22.1 总体介绍

-22.2 ucore 文件系统架构

--22.2 ucore 文件系统架构

-第二十二讲 实验八 文件系统--22.2 ucore 文件系统架构

-22.3 Simple File System分析

--22.3 Simple File System分析

-第二十二讲 实验八 文件系统--22.3 Simple File System分析

-22.4 Virtual File System分析

--22.4 Virtual File System分析

-第二十二讲 实验八 文件系统--22.4 Virtual File System分

-22.5 I/O设备接口分析

--22.5 I/O设备接口分析

-第二十二讲 实验八 文件系统--22.5 I/O设备接口分析

-22.6 执行流程分析

--22.6 执行流程分析

第二十三讲 I/O子系统

-23.1 I/O特点

--视频

-第二十三讲 I/O子系统--23.1 I/O特点

-23.2 I/O结构

--816C80A0F5E3B8809C33DC5901307461

-第二十三讲 I/O子系统--23.2 I/O结构

-23.3 I/O数据传输

--C58221E14388B9DB9C33DC5901307461

-第二十三讲 I/O子系统--23.3 I/O数据传输

-23.4 磁盘调度

--567A3F1FCBFB3F4C9C33DC5901307461

-第二十三讲 I/O子系统--23.4 磁盘调度

-23.5 磁盘缓存

--C327536B80D25CE79C33DC5901307461

-第二十三讲 I/O子系统--23.5 磁盘缓存

html

-html

--html

8.6 缺页异常笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。