auto commit

This commit is contained in:
CyC2018 2018-06-20 11:35:11 +08:00
parent 063b7f9ae0
commit 890b9aaae1

View File

@ -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?47071012126"/></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?47071012126"/></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>