当前课程知识点:操作系统(RISC-V) >  第六讲 虚拟存储概念 >  6.2 覆盖和交换 >  6.2 覆盖和交换

返回《操作系统(RISC-V)》慕课在线视频课程列表

6.2 覆盖和交换在线视频

6.2 覆盖和交换

下一节:6.3 局部性原理

返回《操作系统(RISC-V)》慕课在线视频列表

6.2 覆盖和交换课程教案、知识点、字幕

好 接下来我们讲交换和覆盖

这两种做法呢实际上是

我们在前面已经讨论到过的

但是为了能更好地说明

虚拟存储的作用和它的基本原理

我们有必要把前面这两个呢

再细化一下进行介绍

覆盖技术是说我有一个进程

要在内存当中运行 但是这个内存较小

而我的程序比较大 那没法再给它运行

我怎么做这个事 那它的做法呢是说

我需要把程序依据它的逻辑结构

把它划分成若干个功能相对独立的模块

然后把那些相互之间

没有调用关系的模块呢分成一组

它们共享一块内存区域 这样的话

我就可以让通过这种共享呢

让整个进程占用的存储空间变小

从而在一个小内存的系统上能运行

那具体说起来呢 在这里面呢我们就是

把程序的模块呢划分成必要的部分和可选部分

必要部分通常是一些常用的功能

而可选部分是些不常用 或者说在一些交替用的

那这些常用的呢让它常驻内存

而这些可选的部分呢 我只在它要用的时候

我把它装入内存 那有了这种做法之后呢

那是说这种不存在调用关系的

我可以把它相互覆盖

把它放到同一块内存区域里头来

好 那这种做法我们具体看看它怎么做呢

这地方呢给出来的是一个例子

说我有一个程序 它呢分成了六个模块

每个模块的大小呢在这儿有了标定

基本上是20 30 40 50这几个尺寸

然后它总共的大小呢是加在一起

是190K 那现在呢假定说

我在一个一台计算机系统上运行它

它的物理内存不够190K

那这时候你肯定没办法在上面运行了

好 那这时候呢我希望通过

我应用程序的处理使得可以让它能运行

那我们怎么办呢 先把它分成

按照相互独立的这几块

按照相互之间调用关系我把它分组

A和这些都有关系 它自己一组

B呢它和C E F都没关系

那我把C跟它分成一组

好 这个D呢 它肯定是要单独一组

因为这是一绺 好 那它和E和F是没有调用关系

它们俩可以在一组 E和F呢也是一样的

所以它们仨一组

这时候我怎么给它分配存储空间呢

是每一组里头我按它最大的来分配

那这时候呢我们分配完了是这样一种

A给20K B和C呢一个50 一个30我给50

剩下这个E F D这三个呢分别是30 20 40 我给40

我分了这样几块之后

那这时候它运行的时候会是啥样子呢

刚开始运行的时候A B和D在内存里头

它们之间运行 好运行到一段时间之后

那开始C调用的时候调用E

那这时候我把B和D换出去

然后把C和E拿进来

这时候在执行中间这一段

假定说你是在做数据处理

好 那它是可以运行的

好 等处理完了之后

那最后我要把结果输出来这是用的F

这时候F交换过来

因为这个F呢我们这一绺的大小

是以它们三块最大来弄的

所以这F放进来呢肯定是没问题的

好 用这种做法之后

我总共占用的存储空间是多少

40 50 20加在一起110 那它是可以运行的

好 那这样以来的话如果说你的系统里

只有110K的物理内存

那这个大一点的程序就没有办法运行

通过这种改造之后 使用覆盖技术

我写出来的程序跟你的功能是一样的

但是这时候它可以在110K的内存上运行

好 通过这种办法呢我可以

减少一个应用程序内存占用量

从而可以在小的 小内存的系统上运行

那这时候问这种做法需要了解这个关系

我现在这个画法是最优的吗

那实际上在这儿我们可以给出另一种划分办法

那A是独立一个模块

但是第二步呢我把B原来是和C放在一起

这俩差挺远

好 那这时候呢我把C B E和F放在一起

这两块呢它尺寸比较接近

好 那这时候我给它50K

而把最后一个呢C和D它俩放在一起

它俩都是30 这时候搁30

把这尺寸接近的放在一起之后呢

相互之间没有调用关系放在一起

好 这时候它合在一起

这几个加在一起是100 这个会更小

那是不是它是最小的

如果说你要严格去来讨论这个问题

那是相当复杂的 所以在这儿呢

这个给程序员的开销是很大的

那我们说在实际的系统里头呢

在我们的DOS操作系统上

这是历史上用过的 里头有个Turbo Pascal

那这是它的集成开发环境

使用Pascal语言的

好 那在这个环境里呢

它提供了这种Overlay的覆盖技术

那有了这个支持之后

那实际上它这里面是有一堆库支持

你在这里头呢这个模块的换入换出

和模块之间的关系的这种指定

好 那这时候说它的开发难度是会增加的

因为我要确定人首先要用程序员

来对模块进行划分 划分完了之后

还要确定它们之间的覆盖关系

那这时候呢 我的编程难度是增加的

与此同时我的执行时间呢也会有所增加

那这时候呢需要 原来我们执行的时候

是你把190K一块读入内存

然后你就开始执行了 后面就没有开销了

好 而在这儿呢

我不但要在刚开始的时候我读入一部分

那后来呢

我还会把另一部分再读进来

那这种呢就会导致你的执行时间会增强

那这种做法呢我们觉得它会有问题

好 另一种做法交换技术

这种做法呢是增加正在运行的程序

或者说需要运行程序的空间

这和我们前面说那个问题不太一样

说 我原来呢是一个程序的内存空间就不够用了

现在这儿呢 实际上讨论的是说

我一个程序你肯定要够用的

然后我只是当前这个程序呢

由于多道的程序运行使得

另一个应用程序占用了内存空间

使得它的空间不够

它并不讨论一个程序在所有内存空间里

用的时候它仍然不够的情况

好 那在这儿说 我们怎么做呢 你把那些

如果说你多个进程 同时在内存里头

我把那些另一些进程就把它暂停

并且放到外存里去

这样的话我的空间不就够用了吗

当前正在运行的或者说你需要运行的进程

它的地址空间就增大了

那这时候呢需要注意一条

它换入换出的基本单位是整个进程

那这个单位呢导致了不像我们刚才的

覆盖我是程序内部的事

好 然后 这时候有两个基本操作 一个是换出

我把一个进程的整个地址空间保存到外存里去

跟它对应着呢是换入 我把某个进程

在外存当中某个进程读到内存里头来让它能运行

那这是以进程为单位的交换技术

这种做法呢我们在前面也有这样一个示意图说

我在这里头两个进程 一个进程在内存里头

一个进程在外面 那现在说我要想让它运行

它需要的空间大 我就把它换出来

然后把它换进去 然后这样的话

它的空间呢就能够运行了

如果说这空间足够的时候呢

一半它也能进行的 我就可以让它俩在内存里头

这样你 你这个交替运行的时候

它的速度就很快 但这时候呢空间不够

好 这是交换

我们使用交换技术可以把一些

暂停执行的进程放到外存里头去

但这时候呢也会有一些麻烦

就是说首先第一个我们遇到麻烦

是说我在什么时候来进行交换

那这时候呢通常情况下我在内存不够的时候

或者有不够可能性的时候

比如说我一个正在执行的进程

它的内存空间不够用了

这时候我必须把另外一些暂停执行的

并且在内存里的

把它整个进程地址空间兑换到外存当中

这时候我这个可以扩大

另一种情况是说我有一个进程要执行

现在内存里可用的空闲空间不够用

好 那这时候我就把暂停的另外一些进程呢

倒到外存里面去 这时候它可以来运行

那这是时机

再有一个是交换区域的大小

也就是说我倒到外存里头去

放在外存里头这些进程映象

它要占多大空间呢

需要把所有的暂停的用户进程

全部保存到外存当中

这时候呢它是需要占用一定的存储空间的

还有一个问题是说 我换入的时候

那你是否能放回到原处呢 如果说不放回到原处

我原来的函数调用或者说有跳转 这些你怎么办

那这个时候呢我们说它的做法是

需要采用动态的地址映射的办法

而这些前面关于交换和覆盖的这种技术准备

都为我们的虚拟存储打下基础

好 那我们对它做一个比较 对于覆盖来说

它是在程序内部模块之间的

跟程序外边没关系 好 这时候它是一个进程

在物理空间里运行它就不够了

好 那这时候说我们需要兑换的呢

覆盖进行交换的呢是这个

没有调用关系的模块之间

程序员必须知道这种逻辑覆盖关系

这是比较麻烦的

而对于交换来说呢它是以进程整个地址空间

为单位来进行交换的

这时候呢我们不需要这个逻辑关系

它只会发生在进程之间

好 这一部分呢实际上可以由操作系统来做的

那上边这一部分可不可以由操作系统来做呢

那这事有难度 原因在于这地方这种逻辑关系

你操作系统没有办法很准确掌握的

好 那这样的话是说 我有没有可能以使用

由操作系统来做同时呢

我又是不是以整个进程为单位

是一部分一部分的

进程地址空间的一部分内容

我把它导入到外存里头去

这个时候有没有可能呢

那这就是我们下面要说到的

虚拟存储要来做的事情

操作系统(RISC-V)课程列表:

第一讲 操作系统概述

-1.1 课程概述

--课程概述

-1.2 教学安排

--视频

-1.3 什么是操作系统

--Video

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

--Video

-1.5 操作系统实例

--视频

-1.6 操作系统的演变

--视频

-1.7 操作系统结构

--视频

-1.8 OS实验概述

--视频

第二讲 操作系统与系统结构和程序设计语言

-2.1 从OS角度看计算机系统

--2.1 从OS角度看计算机系统

-2.2 从OS角度看RISC-V

--2.2 从OS角度看RISC-V

-2.3 Rust语言与系统编程

--2.3 Rust语言与系统编程

-2.4 RISC-V CPU启动

--2.4 RISC-V CPU启动

-2.5 RISC-V CPU启动进一步分析

--2.5 RISC-V CPU启动进一步分析

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

-3.1 基本概念与原理

--3.1 基本概念与原理

-3.2 硬件架构支持

--3.2 硬件架构支持

-3.3 中断处理机制

--3.3.1 中断处理机制–Overview

--3.3.2 中断处理机制–Detail-1

--3.3.3 中断处理机制–Detail-2

--3.3.4 中断处理机制–Detail-3

--3.3.5 中断处理机制–Summary

-3.4 系统调用

--3.4 系统调用

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

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

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

-4.2 地址空间和地址生成

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

-4.3 连续内存分配

--4.3 连续内存分配

-4.4 碎片整理

--4.4 碎片整理

-4.5 伙伴系统

--4.5 伙伴系统

-4.6 SLAB分配器

--4.6 SLAB分配器

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

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

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

-5.2 段式存储管理

-- 5.2 段式存储管理

-5.3 页式存储管理

--5.3 页式存储管理

-5.4 页表概述

--5.4 页表概述

-5.5 快表和多级页表

--5.5 快表和多级页表

-5.6 RISC-V页映射机制

--5.6 RISC-V页映射机制

-5.7 使能RISC-V页表

--5.7 使能RISC-V页表

第六讲 虚拟存储概念

-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 RISC-V缺页异常

--6.7 RISC-V缺页异常

第七讲 虚拟存储:局部页面置换算法

-7.1 页面置换算法的概念

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

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

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

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

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

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

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

-7.5 页表自映射

--7.5 页表自映射

第八讲 虚拟存储:全局页面置换算法

-8.1 工作集置换算法

--8.1 工作集置换算法

-8.2 缺页率置换算法

--8.2 缺页率置换算法

-8.3 抖动和负载控制

--8.3 抖动和负载控制

-8.4 面向缓存的页替换算法

--8.4.1 面向缓存的页替换算法-FBR

--8.4.2 面向缓存的页替换算法-LRU-K 2Q

--8.4.3 面向缓存的页替换算法-LIRS

第九讲 进程和线程

-9.1 进程的概念

--11.1 进程的概念

-9.2 进程控制块

--9.2 进程控制块

-9.3 进程状态

--9.3 进程状态

-9.4 三状态进程模型

--9.4 三状态进程模型

-9.5 挂起进程模型

--9.5 挂起进程模型

-9.6 线程的概念

--9.6 线程的概念

-9.7 用户线程

--9.7 用户线程

-9.8 内核线程

--9.8 内核线程

-9.9 进程地址空间与熔断 (meltdown) 漏洞

--9.9 进程地址空间与熔断 (meltdown) 漏洞

第十讲 进程和线程控制

-10.1 进程切换

--10.1 进程切换

-10.2 进程创建

--10.2 进程创建

-10.3 进程加载

--10.3 进程加载

-10.4 进程等待与退出

--10.4 进程等待与退出

-10.5 rCore进程和线程控制

--10.5 rCore进程和线程控制

第十一讲 处理机调度

-11.1 处理机调度概念

--11.1 处理机调度概念

-11.2 调度准则

--11.2 调度准则

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

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

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

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

-11.5 实时调度

--11.5 实时调度

-11.6 优先级反置

--11.6 优先级反置

-11.7 rCore调度框架

--11.7 rCore调度框架

第十二讲 多处理机调度

-12.1 对称多处理与多核架构

--12.1 对称多处理与多核架构

-12.2 多处理器调度概述

--12.2 多处理器调度概述

-12.3 O(1)调度

--12.3 O(1)调度

-12.4 CFS调度

--12.4 CFS调度

-12.5 BFS调度算法

--12.5 BFS调度算法

第十三讲 同步互斥

-13.1 背景

--13.1 背景

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

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

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

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

-13.4 基于软件的同步方法

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

-13.5 高级抽象的同步方法

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

第十四讲 信号量与管程

-14.1 信号量

--14.1 信号量

-14.2 信号量使用

--14.2 信号量使用

-14.3 管程

--14.3 管程

-14.4 哲学家就餐问题

--14.4 哲学家就餐问题

-14.5 读者-写者问题

--14.5 读者-写者问题

-14.6 Rust语言中的同步机制

--14.6 Rust语言中的同步机制

第十五讲 死锁和并发错误检测

-15.1 死锁概念

--15.1 死锁概念

-15.2 死锁处理方法

--15.2 死锁处理方法

-15.3 银行家算法

--15.3 银行家算法

-15.4 死锁检测

--15.4 死锁检测

-15.5 并发错误检测

--15.5 并发错误检测

第十六讲 进程通信

-16.1 进程通信概念

--16.1 进程通信概念

-16.2 信号和管道

--16.2 信号和管道

-16.3 Linux信号机制

--16.3 Linux信号机制

-16.4 消息队列和共享内存

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

-16.5 D-Bus机制

--16.5 D-Bus机制

-16.6 Binder机制

--16.6 Binder机制

第十七讲 文件系统概念

-17.1 文件系统和文件

--17.1 文件系统和文件

-17.2 文件描述符

--17.2 文件描述符

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

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

-17.4 虚拟文件系统

--17.4 虚拟文件系统

-17.5 文件缓存和打开文件

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

-17.6 文件分配

--17.6 文件分配

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

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

第十八讲 文件系统实例

-18.1 FAT文件系统

--18.1 FAT文件系统

-18.2.1 EXT4文件系统-历史

--18.2.1 EXT4文件系统-历史

-18.2.2 EXT4文件系统-支持大容量存储

--18.2.2 EXT4文件系统-支持大容量存储

-18.2.3 EXT4文件系统-支持恢复异常

--18.2.3 EXT4文件系统-支持恢复异常

-18.3 ZFS文件系统

--18.3 ZFS文件系统

第十九讲 I/O子系统

-19.1 I/O特点

--19.1 I/O特点

-19.2 I/O结构

--19.2 I/O结构

-19.3 I/O数据传输

--19.3 I/O数据传输

-19.4 磁盘调度

--19.4 磁盘调度

-19.5 Linux I/O子系统

--19.5 Linux I/O子系统

第二十讲 内核与程序设计语言

-20.1 Linux内核错误分析

--20.1 Linux内核错误分析

-20.2.1 用rust写操作系统-系统编程语言rust

--20.2.1 用rust写操作系统-系统编程语言rust

-20.2.2 用rust写操作系统-rust与操作系统开发

--20.2.2 用rust写操作系统-rust与操作系统开发

第二十一讲 异步编程 (Asynchronous Programming)

-21.1 Background

--21.1 Background

-21.2 Futures in Rust

--21.2 Futures in Rust

-21.3 Generators and async/await

--21.3 Generators and async/await

-21.4 Self-Referential Structs & Pin

--21.4 Self-Referential Structs & Pin

-21.5 Waker and Reactor

--21.5 Waker and Reactor

第二十二讲 Virtual Machine Monitor

-22.1 Overview

--22.1 Overview

-22.2.1 How VMM works - CPU

--22.2.1 How VMM works - CPU

-22.2.2 How VMM works - memory & I/O

--22.2.2 How VMM works - memory & I/O

6.2 覆盖和交换笔记与讨论

也许你还感兴趣的课程:

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