当前课程知识点:操作系统(RISC-V) > 第六讲 虚拟存储概念 > 6.4 虚拟存储概念 > 6.4 虚拟存储概念
接下来我们介绍虚拟存储的基本概念
那在这里头呢我们前面已经说清楚了
交换和覆盖这两种技术所存在的问题
然后我们也说到了程序访问的时候
它的局部性特征
有了这个特征之后我们有可能来实现
一个虚拟存储系统
那么在这里呢虚拟存储呢
它的直观思路很简单
就是把不常用的部分 内存块 放到外存当中
那有了这一条我们就可以做到这件事情了
那具体的做法呢是这样的
程序在开始执行的时候
你需要把你的代码和数据加载到内存当中来
原来的加载呢是把整个进程的
地址空间内容全部加载进来
那现在变成什么呢
加载的时候只是将当前指令执行
所需要的部分这些页
或者是段加载到内存当中来
那这是起头的时候
然后在执行的过程当中因为你只加载了一部分
在指令执行过程当中有可能就是访问到
某一个指令或者访问到某一个数据的时候
这时候不占内存
这就是我们这里说的出现缺页或者是缺段
好 这时候怎么办呢
这个时候硬件处理器通知操作系统
将相应的页面或者段调入到内存里头
然后重新执行这条指令
那这是装载和执行过程当中
那如果说仅有这两条的话
就是刚开始装一部分 后面缺哪个装哪个
这样到最后结果是我们所有的全都装内存里头了
好 为了提高它的效率
操作系统呢会再多一件事
你需要监控进程地址空间里
在内存里的这些它的使用情况
把暂时不用的页面或段保存到外存当中去
这时候有个问题是说
我怎么知道哪些是暂时不用的
好 这就是我们后面讨论置换算法的时候
需要讨论的内容 好 这个基本原理呢
基本上我分成这样三条就足够了
那具体说起来呢
根据分块的大小我们还前面有
非连续物理内存分配的时候
讲到过有页式和段式
那在这里呢我们说到装入
或者说换出的部分是页面或者是段
那到这儿呢在前面只要有往外换
那就变成了加上虚拟
这时候我们就有虚拟页式和
虚拟段式这两种情况
好 有了这两种情况之后
那我们这个基本的概念就有了
好 那 我们说如果我们在这里
做成这种情况它会是一个什么效果
这我们前面也说过
根据目标我想建造一个抽象的地址空间
里头不管是在内存里头还是在外存里头
它是一个虚拟的地址空间
它实际上会映射到物理内存或者是磁盘
那这个时候呢我们可以得到什么特征
不连续 你的物理页面分配可以不连续
那这是我们前面非连续存储分配的特征
第二个呢虚拟地址空间也可以不连续
好 然后呢在这基础上
我们说由于我可以把一部分放到外存里头去
那这时候我就可以提供更大的用户空间
我可以执行我的进程大于你物理内存的情况下
我仍然可以在我的系统上执行
同时交换技术是把整个进程地址空间全换出去
这时候我可以把一部分换出去
从而使得我可用的空间更大
好 把这两条搁到一起之后
实际上就是虚拟存储改进了原来的覆盖和交换
两种技术的往前发展
那到这儿呢 我们就可以实现虚拟存储了
那我们具体说起来呢我们这里
需要什么样的支持技术
硬件需要地址转换
这个地址转换在我们前面讲的
非连续存储里头呢已经说过了
那我们在那基础上就需要
加上一个我如何能够知道它
不在内存里而在外存里头
这是硬件机构要做的事情
而操作系统呢就要来换入换出这件事情
是不能由硬件来做的 要由操作系统来做
到底我哪些装进来
哪些换出去是在你执行指令的过程当中
出现了异常我才来做这件事情
那具体装入的页面或者段是哪一个呢
是由你操作系统里头的监控来实现的
我知道哪些页面的使用情况
从而呢完成这样一点
好 这是我们说到的虚拟存储的基本做法
那后面我们会具体下来介绍说
虚拟页式它在里头到底怎么做的
-1.1 课程概述
--课程概述
-1.2 教学安排
--视频
-1.3 什么是操作系统
--Video
-1.4 为什么学习操作系统,如何学习操作系统
--Video
-1.5 操作系统实例
--视频
-1.6 操作系统的演变
--视频
-1.7 操作系统结构
--视频
-1.8 OS实验概述
--视频
-2.1 从OS角度看计算机系统
-2.2 从OS角度看RISC-V
-2.3 Rust语言与系统编程
-2.4 RISC-V CPU启动
-2.5 RISC-V CPU启动进一步分析
-3.1 基本概念与原理
-3.2 硬件架构支持
-3.3 中断处理机制
-3.4 系统调用
--3.4 系统调用
-4.1 计算机体系结构和内存层次
-4.2 地址空间和地址生成
-4.3 连续内存分配
-4.4 碎片整理
--4.4 碎片整理
-4.5 伙伴系统
--4.5 伙伴系统
-4.6 SLAB分配器
-5.1 非连续内存分配的需求背景
-5.2 段式存储管理
-- 5.2 段式存储管理
-5.3 页式存储管理
-5.4 页表概述
--5.4 页表概述
-5.5 快表和多级页表
-5.6 RISC-V页映射机制
-5.7 使能RISC-V页表
-6.1 虚拟存储的需求背景
-6.2 覆盖和交换
-6.3 局部性原理
-6.4 虚拟存储概念
-6.5 虚拟页式存储
-6.6 缺页异常
--6.6 缺页异常
-6.7 RISC-V缺页异常
-7.1 页面置换算法的概念
-7.2 最优算法、先进先出算法和最近最久未使用算法
-7.3 时钟置换算法和最不常用算法
-7.4 Belady现象和局部置换算法比较
-7.5 页表自映射
-8.1 工作集置换算法
-8.2 缺页率置换算法
-8.3 抖动和负载控制
-8.4 面向缓存的页替换算法
-9.1 进程的概念
-9.2 进程控制块
-9.3 进程状态
--9.3 进程状态
-9.4 三状态进程模型
-9.5 挂起进程模型
-9.6 线程的概念
-9.7 用户线程
--9.7 用户线程
-9.8 内核线程
--9.8 内核线程
-9.9 进程地址空间与熔断 (meltdown) 漏洞
-10.1 进程切换
-10.2 进程创建
-10.3 进程加载
-10.4 进程等待与退出
-10.5 rCore进程和线程控制
-11.1 处理机调度概念
-11.2 调度准则
-11.3 先来先服务、短进程优先和最高响应比优先调度算法
--11.3 先来先服务、短进程优先和最高响应比优先调度算法
-11.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架
--11.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架
-11.5 实时调度
-11.6 优先级反置
-11.7 rCore调度框架
-12.1 对称多处理与多核架构
-12.2 多处理器调度概述
-12.3 O(1)调度
-12.4 CFS调度
-12.5 BFS调度算法
-13.1 背景
--13.1 背景
-13.2 现实生活中的同步问题
-13.3 临界区和禁用硬件中断同步方法
-13.4 基于软件的同步方法
-13.5 高级抽象的同步方法
-14.1 信号量
--14.1 信号量
-14.2 信号量使用
-14.3 管程
--14.3 管程
-14.4 哲学家就餐问题
-14.5 读者-写者问题
-14.6 Rust语言中的同步机制
-15.1 死锁概念
-15.2 死锁处理方法
-15.3 银行家算法
-15.4 死锁检测
-15.5 并发错误检测
-16.1 进程通信概念
-16.2 信号和管道
-16.3 Linux信号机制
-16.4 消息队列和共享内存
-16.5 D-Bus机制
-16.6 Binder机制
-17.1 文件系统和文件
-17.2 文件描述符
-17.3 目录、文件别名和文件系统种类
-17.4 虚拟文件系统
-17.5 文件缓存和打开文件
-17.6 文件分配
-17.7 空闲空间管理和冗余磁盘阵列RAID
-18.1 FAT文件系统
-18.2.1 EXT4文件系统-历史
-18.2.2 EXT4文件系统-支持大容量存储
-18.2.3 EXT4文件系统-支持恢复异常
-18.3 ZFS文件系统
-19.1 I/O特点
-19.2 I/O结构
-19.3 I/O数据传输
-19.4 磁盘调度
-19.5 Linux I/O子系统
-20.1 Linux内核错误分析
-20.2.1 用rust写操作系统-系统编程语言rust
--20.2.1 用rust写操作系统-系统编程语言rust
-20.2.2 用rust写操作系统-rust与操作系统开发
--20.2.2 用rust写操作系统-rust与操作系统开发
-21.1 Background
-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
-22.1 Overview
-22.2.1 How VMM works - CPU
-22.2.2 How VMM works - memory & I/O