mirror of
https://github.com/CodePanda66/CSPostgraduate-408.git
synced 2023-05-21 21:49:33 +08:00
📝 finish OS_2_3
This commit is contained in:
@@ -5,5 +5,209 @@ title: 虚拟内存管理
|
||||
|
||||
### 1.1、虚拟内存引入的原因
|
||||
|
||||
连续分配方式和非连续分配方式都是分析如何将多个程序装入内存并行,它们的共同特点都是一次性(作业全部装入内存后才能执行)和驻留性(作业常驻内存直到运行结束)。为了实现让作业部分装入就可以运行,引入了虚拟内存管理技术。
|
||||
|
||||
### 1.2、局部性原理
|
||||
|
||||
大多数程序执行时,在一个较短的时间内仅使用程序的代码的一部分。相应的,程序所访问的存储空间也局限在某个区域。
|
||||
|
||||
+ **时间局部性**:一条指令的一次执行和下次执行,一个数据的一次访问和下次访问,都集中在一个较短的时间内。
|
||||
+ **空间局部性**:当前指令和邻近的几条指令,当前数据和邻近的数据,都集中在一个较小的区域内。
|
||||
|
||||
### 1.3、虚拟内存的定义及特征
|
||||
|
||||
基于局部性原理,在程序装入时,一方面可以将程序的一部分放入内存,而将其余部分放在外存,然后启动程序(**部分装入**)。在程序执行过程中,当所访问的信息不再内存中时,再由操作系统将所需的部分调入内存(**请求调入**)。另一方面,操作系统将内存中暂时不使用的进程置换到外存上,从而腾出空间存放将要调入内存的信息(**置换功能**)。从效果上看计算机系统好像为用户提供了一个存储容量比实际内存大得多的存储器,这种从**逻辑上**扩充内存容量的存储器系统被称为**虚拟存储器**,其具有如下特征:
|
||||
|
||||
+ **离散性**:程序在内存中离散存储(分页分段也有离散性)
|
||||
+ **多次性**:一个作业可以多次调入内存
|
||||
+ **对换性**:作业运行过程中可以换入,换出
|
||||
+ **虚拟性**:从逻辑上扩充内存容量
|
||||
|
||||
### 1.4、实现虚拟内存的软硬件支持
|
||||
|
||||
+ 要有相当数量的**外存**,足以存放多个用户的程序
|
||||
+ 要有一定容量的**内存**,在处理器上运行程序必须亚欧一部分信息存放在内存中
|
||||
+ **中断机构**,当用户访问的部分不再内存中时中断程序运行
|
||||
+ **地址变换机构**,以动态实现虚地址到实地址的地址变换
|
||||
+ **相关数据结构**,段表或页表
|
||||
|
||||
## 2、请求分页存储管理方式
|
||||
|
||||
### 2.1、请求分页原理
|
||||
|
||||
请求分页存储管理方法在**作业地址空间的分页、存储空间的分块**等概念上和**基本分页存储管理方法**完全一样,只是增加了**请求调页、页面置换功能**。先将程序部分载入内存执行,当需要其他页面时再使用**请求调页**将其调入内存。同时还可以通过**置换功能**将暂时不用的页面置换到外存上,以腾出内存空间。
|
||||
|
||||
请求分页=基本分页+ 请求调页+页面置换
|
||||
|
||||
### 2.2、页表结构
|
||||
|
||||

|
||||
|
||||
页表项中各字段的作用如下:
|
||||
|
||||
+ **页号和物理块号**:和基本分页存储中一样,用于定义虚拟地址和物理地址之后的关
|
||||
+ **状态位**(存在位):标志页面是否在主存中
|
||||
+ **访问字段**:记录页面在最近一段时间内被访问的次数,或最近已有多久未被访问。
|
||||
+ **修改位**:表示页面调入内存后是否被修改过。内存中的页面在外存中都有副本,因此,若修改过,页面置换出内存时会一并修改外存上的副本。
|
||||
+ **外存地址**:指出页面在外存上的存放地址,供页面调入时使用
|
||||
|
||||
### 2.3、缺页中断与地址变换
|
||||
|
||||

|
||||
|
||||
在**请求分页存储管理系统**中,若所访问的页面在内存中,其地址变换过程与**分页存储管理**相同,若访问的页面不再内存中,则应先将该页面调入内存,再按照与基本分页存储管理相同的方式进行地址变换。
|
||||
|
||||
缺页中断与一般中断的区别:
|
||||
|
||||
+ 在指令执行期间产生和处理缺页中断。一般中断是在指令执行完毕后检查是否有中断请求到达。
|
||||
+ 一条指令可以产生多个缺页中断。
|
||||
|
||||
### 2.4、请求分页管理方式的优缺点
|
||||
|
||||
+ 优点:
|
||||
1. 可以离散存储程序,降低了碎片数量。
|
||||
2. 提供虚拟存储器,提高了主存利用率,有利于多道程序运行,方便用户。
|
||||
+ 缺点:
|
||||
1. 必须有硬件支持
|
||||
2. 某些情况下会产生抖动现象
|
||||
3. 程序最后一页仍然存在未被利用的部分空间
|
||||
|
||||
## 3、页面置换算法
|
||||
|
||||
+ 区分页面置换和连续分配中的交换区:页面置换的单位是页面,交换区的单位是整个进程
|
||||
+ 当发生缺页中断后,系统不一定执行页面置换算法,只有中断发生且内存中没有空闲块时才需要页面置换算法。
|
||||
|
||||
### 3.1、最佳置换算法(OPT)
|
||||
|
||||
在预知一个进程的页面引用的情况下,每次都淘汰以后不再使用的或者以后最迟再被使用的页面。
|
||||
|
||||
虽然最佳置换算法是最优解,其缺页率最低,但是由于实际往往无法实现预知以后会引用到的所有页面的信息而**无法实现。**
|
||||
|
||||
### 3.2、先进先出算法(FIFO)
|
||||
|
||||
每次总是淘汰最先进入内存的页面,也就是淘汰在内存驻留时间最长的页面。
|
||||
|
||||
实现简单,一个队列即可。不过其可能会产生 **Belady 异常**(缺页次数随着分配的物理块号的增加而增加),这是由于其忽略了,最早调入的页面往往就是使用最频繁的页面。所以其实际效果不好
|
||||
|
||||
### 3.3、最近最少使用算法(LRU)
|
||||
|
||||
选择最近最长时间没有被使用的页面予以淘汰。
|
||||
|
||||
其思想是用以前的页面引用情况来预测将来会出现的页面引用情况。可以用寄存器和栈实现,性能较好,是最接近最佳置换算法的。
|
||||
|
||||
### 3.4、时钟置换算法(CLOCK)
|
||||
|
||||
给每个页面设置一个**访问位**,用来标识该页最近有没有被访问过,CLOCK 维护一个内存中所有页面的**循环链表**(**长度固定**),当程序需要访问链表中存在时,该页面的访问位置为 1;否则,若程序要访问的页面没有在链表中,那就需要淘汰一个内存中的页面,于是一个指针从上次被淘汰页面的下一个位置开始顺序的去**遍历**这个循环链表,当这个指针指向的页面访问位为 1 时,就把该访问位清零,指正再向下移动,当指针指向的页面的访问位为 0 时,就选择淘汰掉这一页面,若遍历一遍链表仍没找到可以淘汰的页面就**继续遍历**下去。
|
||||
|
||||
也被称为最近未使用算法(NRU),是 LRU 和 FIFO 的折中,相比 LRU 少了很多硬件支持,实现更简单,但相比 FIFO 算法所需的硬件更多。
|
||||
|
||||
比较难理解的话,请结合具体的题目。
|
||||
|
||||
### 3.5 改进型时钟算法(CLOCK)
|
||||
|
||||
+ 从当前位置,第一次遍历**循环链表**且不做任何修改,淘汰第一个(访问位=0,修改位=0)的页面用于替换。
|
||||
+ 若第一次遍历没找到,开始第二次遍历,寻址(访问位=0,修改位=1)的页面用于替换,在此过程中将每一个非替换页面的访问位置为 0
|
||||
+ 若第二次遍历没找到,开始第三次遍历,此时所有页面的访问位均为 0,重新执行前面第一二次遍历的步骤,一定能找到替换页面
|
||||
|
||||
在时钟置换算法的基础上,改进型时钟算法考虑了**页面载入内存后是否被修改过的问题**,增加了**修改位**。可减少磁盘 I/O 次数,但是会在增加遍历次数
|
||||
|
||||
### 3.6、最不常用置换算法(LFU)
|
||||
|
||||
为每一页设置一个访问计数器,每当页面访问时,该页计数器加 1,发生缺页中断时,选择到当前时间为止访问次数最少(计数器值最小)的页面淘汰并将所有计数器清零。
|
||||
|
||||
### 3.7、页面缓冲算法(PBA)
|
||||
|
||||
PBA 算法用 FIFO 算法选择被置换页,但被选中的页面不是立即换出,而是归入两个链表之一。如果页面未被修改,就将其归入**空闲页面链表**末尾,否则将其归入**已修改页面链表**的末尾。这些空闲页面和已修改页面会在内存中**驻留一段时间**,如果再次被访问,只需将其移出返回给进程。需要调入新页时,将新的页面插入到空闲页面链表的第一个页面中,然后将其移出,当已修改页达到一定数目后,再将其一起写入磁盘,然后将其归入空闲页面链表。
|
||||
|
||||
PBA 是对 FIFO 的发展,通过建立置换页面的缓冲找回刚被置换的页面,从而减少系统 I/O 的消耗。
|
||||
|
||||
## 4、工作集与页面分配策略
|
||||
|
||||
### 4.1、工作集理论
|
||||
|
||||
基于局部性原理,为解决**抖动现象**,引入工作集概念,**工作集是最近 n 次内存访问的页面的集合**,n 为工作集窗口,也就是工作集的大小。
|
||||
|
||||
经常使用的页面会在工作集中,若一个页面不再使用,则它会被从工作集中移出,当一个进程寻址一个不在工作集内的页面时,会产生一个缺页中断,在处理缺页中断时,更新工作集并在需要时从磁盘中读入此页面。
|
||||
|
||||
工作集模型原理:
|
||||
|
||||
让操作系统监视各个进程的工作集,
|
||||
|
||||
+ 若有空闲的物理块,则可再调一个进程到内存以增加多道的程度,
|
||||
+ 若工作集的大小总和超过了所有可用的物理块的数量,则操作系统选择一个内存中的进程对换到磁盘中,以**减少内存中的进程数量来防止抖动的发生。**
|
||||
|
||||
正确选择工作集窗口大小,对存储器的有效利用率和系统吞吐率的提供都至关重要。
|
||||
|
||||
### 4.2、页面分配策略
|
||||
|
||||
在请求分页存储管理中,可以采用两种页面分配策略:即**固定分配和可变分配**。在页面置换时,也可采用两种策略:**全局置换和局部置换**,组合一下:
|
||||
|
||||
+ **固定分配局部置换**
|
||||
|
||||
为每个进程分配一定数目的物理块(**固定分配**)。
|
||||
|
||||
优点:进程之间不会争夺物理块,
|
||||
|
||||
缺点:可能导致有些进程因为物理块太少而频繁地缺页中断,而有些进程由于分配的物理块太多产生浪费。
|
||||
|
||||
采用算法决定每个进程分配多少物理块,常见算法有**平均分配算法**,**按比例分配算法**以及**考虑优先权的分配算法。**
|
||||
|
||||
+ **可变分配全局置换**
|
||||
|
||||
操作系统维护一个空闲物理块队列,每次有进程发生缺页时都从空闲物理块上取下一个分配给它。如果系统也没有空闲物理块了,则系统可能调出任何进程中的其中一页。
|
||||
|
||||
+ **可变分配局部置换**
|
||||
|
||||
为每个进程分配一定量的物理块后,每次发生缺页中断且内存中没有空闲物理块时,只让进程换出自己的某个内存页面,
|
||||
|
||||
+ 但当某个进程频繁发生缺页中断时,系统会为它分配额外的物理块,直到缺页率降低到合适程度为止。
|
||||
+ 当某进程缺页率特别低时,适当减少分配给它的物理块数量。
|
||||
|
||||
可变分配局部置换策略可以在获得比较高的内存空间利用率的同时,保证每个进程有较低的缺页率
|
||||
|
||||
### 4.3、页面调入策略
|
||||
|
||||
+ 请求调页策略
|
||||
|
||||
一个页面只有在被用到时才被调入内存中。
|
||||
|
||||
这种方式在进程刚启动时会频繁地出现缺页中断,其实现简单,但容易产生**抖动现象**
|
||||
|
||||
+ 预调页策略
|
||||
|
||||
将预计不久后会被用到的页面一并调入到内存,尽管暂时它们没有被用到。这是一种基于局部性原理的预测,通常用于程序的首次调入。
|
||||
|
||||
### 4.4、从何处调入页面
|
||||
|
||||
请求分页系统中的外存分为两部分:用于存放文件的文件区和用于存放对换页面的对换区。由于对换区采用连续分配方式,而文件区采用离散分配方式,因此对换区的磁盘 I/O 速度比文件区高。
|
||||
|
||||
当发生缺页请求时,调页情况分三种:
|
||||
|
||||
+ **系统拥有足够的对换区空间**:可以全部从对换区调入所需页面,以提高调页速度。这要求进程运行前,与该进程有关的文件就需要从文件区复制到对换区。
|
||||
+ **系统缺少足够的对换区空间**:凡是不会修改的文件,都直接从文件区调入,置换这些页面时也不必换出,下次调入依旧从文件区调;对于可能被修改的文件,就需要复制到对换区进行置换。
|
||||
+ **UNIX 方式**:与进程有关的文件都放在文件区,未运行过的进程的所有页面都直接从文件区调入,对于运行过但又被换出的页面,全部放在对换区,下次调入时从对换区调入。
|
||||
|
||||
## 5、抖动显现和缺页率
|
||||
|
||||
### 5.1、Belady 现象
|
||||
|
||||
**FIFO 算法**的缺页次数会随着所分配的物理块号的增加而增加。
|
||||
|
||||
原因时其忽略了最早调入的页面往往就是使用最频繁的页面,其置换特征与进程访问时的动态特征相矛盾,即被置换的页面并不是进程不会访问的。
|
||||
|
||||
### 5.2、抖动现象
|
||||
|
||||
刚淘汰的页面,过不久又要访问,并且调入不久后又调出,如此反复,使得系统浪费大量时间在页面的调入调出上,影响正常有效的工作。
|
||||
|
||||
原因是在请求分页系统中的每个进程都只能分配到所需全部内存空间的一部分。
|
||||
|
||||
### 5.3、缺页率
|
||||
|
||||
假定一个作业共有 n 页,系统分配给该作业 m 页的空间,如果该作业在运行过程中共需要访问 A 次页面,其中所访问页面不在内存需调入的次数为 F,则缺页率定义为 f=F/A,命中率为 1-f。
|
||||
|
||||
## 6、请求分段存储方式
|
||||
|
||||
和请求分页存储管理方式几乎一样,只是操作的基本单位**由页变为了段**。具体过程不再详述,几乎不会考。扩充后的段表项如下:
|
||||
|
||||

|
||||
|
||||
|
||||
Reference in New Issue
Block a user