mirror of
https://github.com/Penguin-SAMA/2024-Postgraduate-408.git
synced 2026-02-02 18:11:20 +08:00
compelte ch3
This commit is contained in:
BIN
OperatingSystem/ch3/assets/0.jpeg
Normal file
BIN
OperatingSystem/ch3/assets/0.jpeg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 142 KiB |
@@ -537,3 +537,180 @@ CPU访问的页面不存在于内存中时,会产生缺页中断来调入相
|
||||
|
||||
## 3.2.4 页面置换算法
|
||||
|
||||
置换页面的完整过程可以概括为以下三步:
|
||||
|
||||
- 根据当前为该进程分配的页框数和其已使用页框数,判断是否页框已满。根据相关策略,确定是否置换。
|
||||
|
||||
当所有页框已被使用时:
|
||||
|
||||
- 若为可变分配,则额外分配页框。
|
||||
- 若为固定分配,则需要置换。
|
||||
|
||||
- 确定置换范围:
|
||||
|
||||
- 局部置换,只能从属于当前进程的页面选取。
|
||||
- 全局置换,既可以从当前进程页面中选取,也可从其他用户进程页面中选取。
|
||||
|
||||
- 按照一定的页面置换方法,选取一个合适的页面。
|
||||
|
||||
### 1. 最佳置换算法(OPT)
|
||||
|
||||
最佳置换算法选择的被淘汰页面是以后永不使用的页面,或者是在最长时间内不再被访问的页面,以保证获得最低的缺页率。
|
||||
|
||||
❗由于人们目前无法预知进程在内存下的若干页面中哪个是未来最长时间内不再被访问的,因而该算法无法实现,但可以利用这个算法去评价其他算法。
|
||||
|
||||
### 2. 先进先出页面置换算法(FIFO)
|
||||
|
||||
FIFO算法是指每次置换都将最早被调入的页面调出内存。该算法是基于队列实现的,存在Belady异常。即在一定情况下,增加为进程分配的页框数,缺页率反而会增加。
|
||||
|
||||
| 页面走向 | 4 | 3 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 | 1 | 5 |
|
||||
| -------- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
|
||||
| 物理块1 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 1 | 1 |
|
||||
| 物理块2 | | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
|
||||
| 物理块3 | | | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
|
||||
| 物理块4 | | | | 1 | 1 | 1 | 5 | 5 | 5 | 5 | 5 | 5 |
|
||||
| 是否缺页 | Y | Y | Y | Y | N | N | Y | N | N | N | Y | N |
|
||||
|
||||
❗FIFO没有利用上局部性原理,其性能极差,所以几乎不会被使用。
|
||||
|
||||
### 3. 最近最久未使用置换算法(LRU)
|
||||
|
||||
选择最近最长时间未访问过的页面予以淘汰,它认为过去一段时间内未访问过的页面,在最近的将来可能也不会被访问。
|
||||
|
||||
该算法为每个页面设置一个访问字段,用来记录页面自上次被访问以来所经历的时间,淘汰页面时选择现有页面中值最大的予以淘汰。
|
||||
|
||||
| 页面走向 | 4 | 3 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 | 1 | 5 |
|
||||
| --------------- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
|
||||
| 物理块1(表尾) | 4 | 4 | 4 | 4 | 3 | 2 | 1 | 1 | 1 | 5 | 4 | 3 |
|
||||
| 物理块2 | | 3 | 3 | 3 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 |
|
||||
| 物理块3 | | | 2 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 | 1 |
|
||||
| 物理块4(表头) | | | | 1 | 4 | 3 | 5 | 4 | 3 | 2 | 1 | 5 |
|
||||
| 是否缺页 | Y | Y | Y | Y | N | N | Y | N | N | Y | Y | Y |
|
||||
|
||||
❗LRU算法的性能较好,但需要寄存器和栈的硬件支持。LRU是堆栈类的算法。理论上可以证明,堆栈类算法不可能出现Belady异常。FIFO算法基于队列实现,不是堆栈类算法。
|
||||
|
||||
### 4. 最少使用置换算法(LFU)
|
||||
|
||||
LFU算法是指将最近使用次数最少的页面置换出内存。
|
||||
|
||||
LFU算法与LRU算法的思想相同,其区别只在于,LRU关注的是某一页面上一次使用的时间,而LFU关注的是页面在最近一段时间内的使用频率。
|
||||
|
||||
### 5. 简单的时钟置换算法(CLOCK)
|
||||
|
||||
时钟置换算法将所有页面链接成一个循环队列,每个页面置一个访问位,每次该页面被访问到,都将访问位设为1。当发生置换时,查询指针前进一位。若所指向的页面访问位为0,则换出该页。若访问位为1,则将其置为0,且查询指针前进一位。循环往复直到找到第一个访问位为0的页面换出,实际上一次换出最多进行两轮扫描。
|
||||
|
||||
CLOCK算法是LRU的一种近似算法,它并不追求严格的最近最久未使用,可以认为是将最近较久未访问的页面换出。CLOCK算法实现起来相对较简单,不需要太多的硬件支持。
|
||||
|
||||
### 6. 改进的时钟算法(CLOCK)
|
||||
|
||||
将一个页面换出时,若该页已被修改过,这要将该页写回磁盘,若该页未被修改过,则不必将它写回磁盘。
|
||||
|
||||
在**改进型CLOCK算法**中,增加了置换位代价——修改位。
|
||||
|
||||
改进后的CLOCK算法按照如下的优先级来选择调出页面(P表示访问位,M表示修改位) :
|
||||
|
||||
- (P = 0, M = 0):最近未被访问且未被修改,优先级最高。
|
||||
- (P = 0, M = 1):最近未被访问但被修改,优先级次之。
|
||||
- (P = 1, M = 0):最近有被访问但未被修改,优先级第三。
|
||||
- (P = 1, M = 1):最近有被访问且被修改,优先级最低。
|
||||
|
||||
在实际的实现中,系统要寻找的是属于第一类或第二类的页面,然后将其换出,最多扫描四轮。具体流程如下:
|
||||
|
||||
- 第一轮,寻找第一类,找到第一个即换出,未找到则进行第二轮。
|
||||
- 第二轮,寻找第二类,找到第一个即换出,并且每次查找失败都将该页面的访问位置为0,若未找到则进行第三轮。
|
||||
- 第三轮,寻找第一类,找到第一个即换出,未找到则进行第四轮。
|
||||
- 第四轮,寻找第二类,找到第一个即换出,这一轮是一定能找到的。
|
||||
|
||||
### 7. 页面置换算法总结
|
||||
|
||||
| 方法 | 概述 | 优缺点 |
|
||||
| :---------: | ------------------------------------------------------------ | ------------------------------------------------------------ |
|
||||
| OPT | 置换时把将来不会再使用或者最长时间不再使用的页面调出。 | 性能最好,但是无法实现,可作为衡量算法性能的标杆。 |
|
||||
| FIFO | 置换时将最早被调入的页面调出内存。 | 实现简单,但性能较差且存在Belady异常。 |
|
||||
| LRU | 置换时将最长时间未被使用的页面置换出内存。 | 性能较好,接近OPT。但是实现复杂,需要特定的硬件支持。 |
|
||||
| CLOCK | 循环扫描页面,将首个访问位=0的页面置换出内存。遇见访问位=1的页面时,将其访问位置为0。 | 实现简单,效果略差于LRU。未考虑页面是否修改,写磁盘次数多于改进型CLOCK。 |
|
||||
| 改进型CLOCK | 看[改进的时钟算法](### 6. 改进的时钟算法) | 实现简单,效果好于CLOCK但依旧略差于LRU。 |
|
||||
|
||||
### 3.2.5 内存映射文件
|
||||
|
||||
内存映射文件是指进程通过发起一个系统调用,实现从进程对应磁盘文件到其虚拟内存空间中某部分的映射。这一机制可以提升系统的I/O效率,从而减少虚拟存储器带来的I/O开销。
|
||||
|
||||

|
||||
|
||||
在一般的I/O操作中,从磁盘调入的文件会先写入到交换缓冲区,然后再统一由CPU写入到用户区。
|
||||
|
||||
内存映射文件的具体步骤:
|
||||
|
||||
- 进程通过系统调用将文件映射到其虚拟内存空间的一部分,但实际上并未将这一文件调入到物理内存。
|
||||
- 进程需要访问该文件的内容时查询页表,发现映射的文件并未调入物理内存,产生缺页异常。
|
||||
- 从交换缓冲区寻找所需页面,若无则从磁盘调入相应页面。
|
||||
- 此后进程可使用指针直接对该文件进行操作,若写操作产生了脏数据,系统会自动在一段时间后将其写回磁盘。
|
||||
|
||||
## 3.2.6 虚拟存储器性能分析
|
||||
|
||||
### 1. 访问内存的有效时间
|
||||
|
||||
#### 不考虑快表
|
||||
|
||||
考虑一级页表,设访问内存时间为$\alpha$,处理缺页中断的时间为$\beta$。
|
||||
|
||||
- **若所访问的页面在内存中:**
|
||||
- 系统第一次访问内存中页表,获得访问页的物理地址,用时$\alpha$
|
||||
- 第二次访问内存,获得访问页,用时$\alpha$
|
||||
- $EAT=\alpha+\alpha$
|
||||
- **若所访问的页面不在内存中:**
|
||||
- 访问内存中页表,发现访问页未调入内存,用时$\alpha$
|
||||
- 进行缺页中断处理,用时$\beta$
|
||||
- 获得物理地址后进行第二次访问内存,获得访问页,用时$\alpha$
|
||||
- $EAT=\alpha+\beta+\alpha$
|
||||
- 引入缺页率概念,若缺页则时间的计算应当是第二种情况,反之是第一种。
|
||||
- 可以计算出系统的EAT计算公式为(设缺页率为$f$):$EAT=(1-f)\times(\alpha+\alpha)+f\times(\alpha+\beta+\alpha)$
|
||||
- 化简如下:$EAT=2\alpha+f\times\beta$
|
||||
- 即至少会有两次对内存的的访问,而缺页中断只有在出现缺页时需要。
|
||||
|
||||
#### 考虑快表的情况
|
||||
|
||||
设访问快表的时间为$\epsilon$。
|
||||
|
||||
- **访问页在内存且其页表项在快表中:**
|
||||
- 访问快表,获得访问页的物理地址,用时$\epsilon$
|
||||
- 访问内存。获得访问页,用时$\alpha$
|
||||
- $EAT=\epsilon+\alpha$
|
||||
- **访问页在内存,但其页表项未被调入快表:**
|
||||
- 系统访问快表,未命中,用时$\epsilon$
|
||||
- 访问内存中的页表,获得物理地址,用时$\alpha$
|
||||
- 第二次访问快表对其进行修改,用时$\epsilon$
|
||||
- 第二次访问内存,获得访问页,用时$\alpha$
|
||||
- $EAT=\epsilon+\alpha+\epsilon+\alpha$
|
||||
- **访问页不在内存中,自然快表也不能命中:**
|
||||
- 系统访问快表,未命中,用时$\epsilon$
|
||||
- 访问内存页表,发现访问页未被调入内存,用时$\alpha$
|
||||
- 进行缺页中断处理,用时$\beta$
|
||||
- 页面被调入后修改快表,用时$\epsilon$
|
||||
- 使用获得的物理地址访问内存获得访问页,用时$\alpha$
|
||||
- $EAT=\epsilon+\alpha+\beta+\epsilon+\alpha$
|
||||
- 考虑快表命中率$\rho$和虚拟存储器缺页率$f$后,系统$EAT$计算如下:
|
||||
- $EAT=\rho\times(\epsilon+\alpha)+(1-\rho)\times(1-f)\times(\epsilon+\alpha+\beta+\epsilon+\alpha)+(1-\rho)\times f \times\beta$
|
||||
- 化简:$EAT=\epsilon+\alpha+(1-\rho)\times(\epsilon+\alpha)+(1-\rho)\times f \times\beta$
|
||||
|
||||
## 3.2.7 抖动和工作集
|
||||
|
||||
### 1. 抖动
|
||||
|
||||
在页面置换过程中,一种最糟糕的情形是,刚刚换出的页面马上又要换入主存,刚刚换入的页面马上又要换出主存,这种频繁的页面调入行为被称为**抖动**或**颠覆**。
|
||||
|
||||
> 系统发生抖动的根本原因是,系统中同时运行的进程太多,由此分配给每个进程的物理块太少,不能满足进程正常运行的基本要求,致使每个进程在运行时频繁地出现缺页,必须请求系统将所缺页面调入内存。
|
||||
|
||||
抖动是进程运行时出现的严重问题,必须采取相应措施解决它。
|
||||
|
||||
### 2. 工作集
|
||||
|
||||
工作集是指在某段时间间隔内,进程要访问地页面集合。基于局部性原理,可以用最近访问过的页面来确定工作集。
|
||||
|
||||
工作集可以记为一个二元函数$w(t, \Delta)$,$t$表示当前的时刻,$\Delta$表示一段时间间隔,通常将这一段时间称为工作集的“窗口尺寸”,即$t$在$t$时刻接下来的$\Delta$长度的时间里,进程实际需要访问页面的集合。
|
||||
|
||||
### 3. 抖动的预防方法
|
||||
|
||||
- 采取局部置换策略。
|
||||
- 利用工作集概念(即调入新作业时,需要利用工作集理论来确认该次调入是否会对系统缺页率产生较大影响。)
|
||||
- 选择暂停进程:发现系统缺页率过高时,将一些进程暂停,释放内存空间并将其交给缺页率较高的进程使用。
|
||||
|
||||
Reference in New Issue
Block a user