auto commit
This commit is contained in:
parent
063b7f9ae0
commit
890b9aaae1
|
@ -242,7 +242,7 @@ Linux 的系统调用主要有以下这些:
|
||||||
|
|
||||||
## 进程调度算法实现
|
## 进程调度算法实现
|
||||||
|
|
||||||
以下只是假象系统上的调度算法实现。源代码:[Process-Scheduling](https://github.com/CyC2018/Algorithm/tree/master/Process-Scheduling/src)
|
以下只是假象系统上的调度算法实现。源代码:[Scheduling](https://github.com/CyC2018/Algorithm/tree/master/Process-Scheduling/src)
|
||||||
|
|
||||||
### 1. FCFS
|
### 1. FCFS
|
||||||
|
|
||||||
|
@ -1006,6 +1006,8 @@ Linux 中管道通过空文件实现。
|
||||||
|
|
||||||
在程序运行过程中,如果要访问的页面不在内存中,就发生缺页中断从而将该页调入内存中。此时如果内存已无空闲空间,系统必须从内存中调出一个页面到磁盘对换区中来腾出空间。
|
在程序运行过程中,如果要访问的页面不在内存中,就发生缺页中断从而将该页调入内存中。此时如果内存已无空闲空间,系统必须从内存中调出一个页面到磁盘对换区中来腾出空间。
|
||||||
|
|
||||||
|
页面置换算法和缓存淘汰策略类似。在缓存系统中,缓存的大小有限,当有新的缓存到达时,需要淘汰一部分已经存在的缓存,这样才有空间存放新的缓存数据。
|
||||||
|
|
||||||
页面置换算法的主要目标是使页面置换频率最低(也可以说缺页率最低)。
|
页面置换算法的主要目标是使页面置换频率最低(也可以说缺页率最低)。
|
||||||
|
|
||||||
### 1. 最佳
|
### 1. 最佳
|
||||||
|
@ -1022,13 +1024,17 @@ Linux 中管道通过空文件实现。
|
||||||
|
|
||||||
开始运行时,先将 7, 0, 1 三个页面装入内存。当进程要访问页面 2 时,产生缺页中断,会将页面 7 换出,因为页面 7 再次被访问的时间最长。
|
开始运行时,先将 7, 0, 1 三个页面装入内存。当进程要访问页面 2 时,产生缺页中断,会将页面 7 换出,因为页面 7 再次被访问的时间最长。
|
||||||
|
|
||||||
### 2. 先进先出
|
### 2. 最近最久未使用
|
||||||
|
|
||||||
> FIFO, First In First Out
|
> LRU, Least Recently Used
|
||||||
|
|
||||||
所选择换出的页面是最先进入的页面。
|
虽然无法知道将来要使用的页面情况,但是可以知道过去使用页面的情况。LRU 将最近最久未使用的页面换出。
|
||||||
|
|
||||||
该算法会将那些经常被访问的页面也被换出,从而使缺页率升高。
|
为了实现 LRU,需要在内存中维护一个所有页面的链表。当一个页面被访问时,将这个页面移到链表表头。这样就能保证链表表尾的页面时最近最久未访问的。因为每次访问都需要更新链表,因此这种方式实现的 LRU 代价很高。
|
||||||
|
|
||||||
|
<div align="center"><img src="https://latex.codecogs.com/gif.latex?4,7,0,7,1,0,1,2,1,2,6"/></div> <br>
|
||||||
|
|
||||||
|
<div align="center"> <img src="../pics//eb859228-c0f2-4bce-910d-d9f76929352b.png"/> </div><br>
|
||||||
|
|
||||||
### 3. 最近未使用
|
### 3. 最近未使用
|
||||||
|
|
||||||
|
@ -1038,32 +1044,28 @@ Linux 中管道通过空文件实现。
|
||||||
|
|
||||||
当发生缺页中断时,操作系统检査所有的页面并根据它们当前的 R 位和 M 位的值,把它们分为 4 类:
|
当发生缺页中断时,操作系统检査所有的页面并根据它们当前的 R 位和 M 位的值,把它们分为 4 类:
|
||||||
|
|
||||||
* 第 0 类: 没有被访问,没有被修改
|
- 第 0 类: 没有被访问,没有被修改
|
||||||
* 第 1 类: 没有被访问,已被修改
|
- 第 1 类: 没有被访问,已被修改
|
||||||
* 第 2 类: 已被访问,没有被修改
|
- 第 2 类: 已被访问,没有被修改
|
||||||
* 第 3 类: 已被访问,已被修改
|
- 第 3 类: 已被访问,已被修改
|
||||||
|
|
||||||
NRU 算法随机地从类编号最小的非空类中挑选一个页面淘汰之。
|
NRU 算法随机地从类编号最小的非空类中挑选一个页面淘汰之。
|
||||||
|
|
||||||
算法隐含的意思是,在最近一个时钟滴答中 (典型的时间是大约 20ms) 淘汰一个没有被访问的已修改页面要比一个被频繁使用的 “十净” 页面好。NRU 主要优点是易于理解和能够有效地被实现,虽然它的性能不是最好的,但是已经够用了。
|
算法隐含的意思是,在最近一个时钟滴答中 (典型的时间是大约 20ms) 淘汰一个没有被访问的已修改页面要比一个被频繁使用的“十净” 页面好。NRU 主要优点是易于理解和能够有效地被实现,虽然它的性能不是最好的,但是已经够用了。
|
||||||
|
|
||||||
### 4. 最近最久未使用
|
### 4. 先进先出
|
||||||
|
|
||||||
> LRU, Least Recently Used
|
> FIFO, First In First Out
|
||||||
|
|
||||||
虽然无法知道将来要使用的页面情况,但是可以知道过去使用页面的情况。LRU 将最近最久未使用的页面换出。
|
选择换出的页面是最先进入的页面。
|
||||||
|
|
||||||
可以用栈来实现该算法,栈中存储页面的页面号。当进程访问一个页面时,将该页面的页面号从栈移除,并将它压入栈顶。这样,最近被访问的页面总是在栈顶,而最近最久未使用的页面总是在栈底。
|
该算法会将那些经常被访问的页面也被换出,从而使缺页率升高。
|
||||||
|
|
||||||
<div align="center"><img src="https://latex.codecogs.com/gif.latex?4,7,0,7,1,0,1,2,1,2,6"/></div> <br>
|
|
||||||
|
|
||||||
<div align="center"> <img src="../pics//eb859228-c0f2-4bce-910d-d9f76929352b.png"/> </div><br>
|
|
||||||
|
|
||||||
### 5. 第二次机会算法
|
### 5. 第二次机会算法
|
||||||
|
|
||||||
FIFO 算法可能会把经常使用的页面置换出去,为了避免这一问题,对该算法做一个简单的修改:
|
FIFO 算法可能会把经常使用的页面置换出去,为了避免这一问题,对该算法做一个简单的修改:
|
||||||
|
|
||||||
当页面被访问 (读或写) 时设置该页面的 R 位为 1。需要替换的时候,检查最老页面的 R 位。如果 R 位是 0,那么这个页面既老又没有被使用,可以立刻置换掉; 如果是 1,就将 R 位清 0,并把该页面放到链表的尾端,修改它的装入时间使它就像刚装入的一样,然后继续从链表的头部开始搜索
|
当页面被访问 (读或写) 时设置该页面的 R 位为 1。需要替换的时候,检查最老页面的 R 位。如果 R 位是 0,那么这个页面既老又没有被使用,可以立刻置换掉;如果是 1,就将 R 位清 0,并把该页面放到链表的尾端,修改它的装入时间使它就像刚装入的一样,然后继续从链表的头部开始搜索
|
||||||
|
|
||||||
<div align="center"> <img src="../pics//ecf8ad5d-5403-48b9-b6e7-f2e20ffe8fca.png"/> </div><br>
|
<div align="center"> <img src="../pics//ecf8ad5d-5403-48b9-b6e7-f2e20ffe8fca.png"/> </div><br>
|
||||||
|
|
||||||
|
@ -1073,9 +1075,7 @@ FIFO 算法可能会把经常使用的页面置换出去,为了避免这一问
|
||||||
|
|
||||||
> Clock
|
> Clock
|
||||||
|
|
||||||
需要用到一个访问位,当一个页面被访问时,将访问位置为 1。
|
第二次机会算法需要在链表中移动页面,降低了效率。时钟算法使用环形链表将页面链接起来,再使用一个指针指向最老的页面。
|
||||||
|
|
||||||
首先,将内存中的所有页面链接成一个循环队列,当缺页中断发生时,检查当前指针所指向页面的访问位,如果访问位为 0,就将该页面换出;否则将该页的访问位设置为 0,给该页面第二次的机会,移动指针继续检查。
|
|
||||||
|
|
||||||
<div align="center"> <img src="../pics//5f5ef0b6-98ea-497c-a007-f6c55288eab1.png"/> </div><br>
|
<div align="center"> <img src="../pics//5f5ef0b6-98ea-497c-a007-f6c55288eab1.png"/> </div><br>
|
||||||
|
|
||||||
|
@ -1131,7 +1131,7 @@ FIFO 算法可能会把经常使用的页面置换出去,为了避免这一问
|
||||||
|
|
||||||
优先调度与当前磁头所在磁道距离最近的磁道。
|
优先调度与当前磁头所在磁道距离最近的磁道。
|
||||||
|
|
||||||
虽然平均寻道时间比较低,但是不够公平。如果新到达的磁道请求比一个在等待的磁道请求近,那么在等待的磁道请求会一直等待下去,也就是出现饥饿现象。具体来说,两边的磁道请求更容易出现饥饿现象。
|
虽然平均寻道时间比较低,但是不够公平。如果新到达的磁道请求总是比一个在等待的磁道请求近,那么在等待的磁道请求会一直等待下去,也就是出现饥饿现象。具体来说,两边的磁道请求更容易出现饥饿现象。
|
||||||
|
|
||||||
<div align="center"> <img src="../pics//4e2485e4-34bd-4967-9f02-0c093b797aaa.png"/> </div><br>
|
<div align="center"> <img src="../pics//4e2485e4-34bd-4967-9f02-0c093b797aaa.png"/> </div><br>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user