diff --git a/notes/计算机操作系统.md b/notes/计算机操作系统.md
index da19cbe3..2cb0616c 100644
--- a/notes/计算机操作系统.md
+++ b/notes/计算机操作系统.md
@@ -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
@@ -1006,6 +1006,8 @@ Linux 中管道通过空文件实现。
在程序运行过程中,如果要访问的页面不在内存中,就发生缺页中断从而将该页调入内存中。此时如果内存已无空闲空间,系统必须从内存中调出一个页面到磁盘对换区中来腾出空间。
+页面置换算法和缓存淘汰策略类似。在缓存系统中,缓存的大小有限,当有新的缓存到达时,需要淘汰一部分已经存在的缓存,这样才有空间存放新的缓存数据。
+
页面置换算法的主要目标是使页面置换频率最低(也可以说缺页率最低)。
### 1. 最佳
@@ -1022,13 +1024,17 @@ Linux 中管道通过空文件实现。
开始运行时,先将 7, 0, 1 三个页面装入内存。当进程要访问页面 2 时,产生缺页中断,会将页面 7 换出,因为页面 7 再次被访问的时间最长。
-### 2. 先进先出
+### 2. 最近最久未使用
-> FIFO, First In First Out
+> LRU, Least Recently Used
-所选择换出的页面是最先进入的页面。
+虽然无法知道将来要使用的页面情况,但是可以知道过去使用页面的情况。LRU 将最近最久未使用的页面换出。
-该算法会将那些经常被访问的页面也被换出,从而使缺页率升高。
+为了实现 LRU,需要在内存中维护一个所有页面的链表。当一个页面被访问时,将这个页面移到链表表头。这样就能保证链表表尾的页面时最近最久未访问的。因为每次访问都需要更新链表,因此这种方式实现的 LRU 代价很高。
+
+

+
+
### 3. 最近未使用
@@ -1038,32 +1044,28 @@ Linux 中管道通过空文件实现。
当发生缺页中断时,操作系统检査所有的页面并根据它们当前的 R 位和 M 位的值,把它们分为 4 类:
-* 第 0 类: 没有被访问,没有被修改
-* 第 1 类: 没有被访问,已被修改
-* 第 2 类: 已被访问,没有被修改
-* 第 3 类: 已被访问,已被修改
+- 第 0 类: 没有被访问,没有被修改
+- 第 1 类: 没有被访问,已被修改
+- 第 2 类: 已被访问,没有被修改
+- 第 3 类: 已被访问,已被修改
NRU 算法随机地从类编号最小的非空类中挑选一个页面淘汰之。
-算法隐含的意思是,在最近一个时钟滴答中 (典型的时间是大约 20ms) 淘汰一个没有被访问的已修改页面要比一个被频繁使用的 “十净” 页面好。NRU 主要优点是易于理解和能够有效地被实现,虽然它的性能不是最好的,但是已经够用了。
+算法隐含的意思是,在最近一个时钟滴答中 (典型的时间是大约 20ms) 淘汰一个没有被访问的已修改页面要比一个被频繁使用的“十净” 页面好。NRU 主要优点是易于理解和能够有效地被实现,虽然它的性能不是最好的,但是已经够用了。
-### 4. 最近最久未使用
+### 4. 先进先出
-> LRU, Least Recently Used
+> FIFO, First In First Out
-虽然无法知道将来要使用的页面情况,但是可以知道过去使用页面的情况。LRU 将最近最久未使用的页面换出。
+选择换出的页面是最先进入的页面。
-可以用栈来实现该算法,栈中存储页面的页面号。当进程访问一个页面时,将该页面的页面号从栈移除,并将它压入栈顶。这样,最近被访问的页面总是在栈顶,而最近最久未使用的页面总是在栈底。
-
-
-
-
+该算法会将那些经常被访问的页面也被换出,从而使缺页率升高。
### 5. 第二次机会算法
FIFO 算法可能会把经常使用的页面置换出去,为了避免这一问题,对该算法做一个简单的修改:
-当页面被访问 (读或写) 时设置该页面的 R 位为 1。需要替换的时候,检查最老页面的 R 位。如果 R 位是 0,那么这个页面既老又没有被使用,可以立刻置换掉; 如果是 1,就将 R 位清 0,并把该页面放到链表的尾端,修改它的装入时间使它就像刚装入的一样,然后继续从链表的头部开始搜索
+当页面被访问 (读或写) 时设置该页面的 R 位为 1。需要替换的时候,检查最老页面的 R 位。如果 R 位是 0,那么这个页面既老又没有被使用,可以立刻置换掉;如果是 1,就将 R 位清 0,并把该页面放到链表的尾端,修改它的装入时间使它就像刚装入的一样,然后继续从链表的头部开始搜索
@@ -1073,9 +1075,7 @@ FIFO 算法可能会把经常使用的页面置换出去,为了避免这一问
> Clock
-需要用到一个访问位,当一个页面被访问时,将访问位置为 1。
-
-首先,将内存中的所有页面链接成一个循环队列,当缺页中断发生时,检查当前指针所指向页面的访问位,如果访问位为 0,就将该页面换出;否则将该页的访问位设置为 0,给该页面第二次的机会,移动指针继续检查。
+第二次机会算法需要在链表中移动页面,降低了效率。时钟算法使用环形链表将页面链接起来,再使用一个指针指向最老的页面。
@@ -1131,7 +1131,7 @@ FIFO 算法可能会把经常使用的页面置换出去,为了避免这一问
优先调度与当前磁头所在磁道距离最近的磁道。
-虽然平均寻道时间比较低,但是不够公平。如果新到达的磁道请求比一个在等待的磁道请求近,那么在等待的磁道请求会一直等待下去,也就是出现饥饿现象。具体来说,两边的磁道请求更容易出现饥饿现象。
+虽然平均寻道时间比较低,但是不够公平。如果新到达的磁道请求总是比一个在等待的磁道请求近,那么在等待的磁道请求会一直等待下去,也就是出现饥饿现象。具体来说,两边的磁道请求更容易出现饥饿现象。