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 算法可能会把经常使用的页面置换出去,为了避免这一问 优先调度与当前磁头所在磁道距离最近的磁道。 -虽然平均寻道时间比较低,但是不够公平。如果新到达的磁道请求比一个在等待的磁道请求近,那么在等待的磁道请求会一直等待下去,也就是出现饥饿现象。具体来说,两边的磁道请求更容易出现饥饿现象。 +虽然平均寻道时间比较低,但是不够公平。如果新到达的磁道请求总是比一个在等待的磁道请求近,那么在等待的磁道请求会一直等待下去,也就是出现饥饿现象。具体来说,两边的磁道请求更容易出现饥饿现象。