diff --git a/thu_os/chp9.md b/thu_os/chp9.md index fc16d6b..20f6566 100644 --- a/thu_os/chp9.md +++ b/thu_os/chp9.md @@ -112,7 +112,7 @@ 我们说,进程在运行的整个生命周期内,对内存的需求是变化的,例如一个进程在刚开始运行的时候需要比较多的内存空间,在运行的后期进行收尾工作了,需要的内存空间也因此变少了。局部页面置换算法无法考虑到这种情况,从而各个时期分配给该进程的空间都是一样的,无法把一个进程多余的页面分配给其他更需要的进程使用。此外,不同的进程对内存的需求也不一样,一些进程需要更多的空间,另一些进程则较小的空间就可以满足,对于这种情况,局部页面置换算法也难以适应。 -全局页面置换算法就是基于这样的考虑产生的,它希望根据进程对内存需求量的变化,动态的调整分配给不同进程的内存页面,从而使得内存的利用率最高。 +全局页面置换算法就是基于这样的考虑产生的,它希望根据进程对内存需求量的变化,动态地调整分配给不同进程的内存页面,从而使得内存的利用率最高。 全局页面置换算法包括工作集置换算法和缺页率置换算法。 @@ -144,7 +144,7 @@ 可以看到,工作集置换算法,其实就是维护进程的常驻集与工作集时刻保持相等。 -为了实现工作集置换算法,只需要维护一个工作集链表。在访存时,将不再工作集中的页面换出内存;在发生缺页时,直接为换入的页面分配新的内存空间,并且更新工作集链表。这样,在每一次访问后,都可以保证工作集和常驻集的大小相等。 +为了实现工作集置换算法,只需要维护一个工作集链表。在访存时,将不在工作集中的页面换出内存;在发生缺页时,直接为换入的页面分配新的内存空间,并且更新工作集链表。这样,在每一次访问后,都可以保证工作集和常驻集的大小相等。 容易看出,工作集置换算法的开销很大。尽管在发生缺页时直接将页面换入就可以了,省去了其他算法寻找被换出页面的开销,但是这是以正常访问时的高成本维护为代价的。因为在正常访问时,需要遍历工作集链表,并且将不在其中的页面换出,遍历的时间复杂度为`O(n)`,此外还有换出页面的I/O开销。 @@ -165,13 +165,13 @@ 为了实现缺页率置换算法,可以给页表项增加引用位标志。在每次发生缺页时,计算从上次缺页到此次缺页的时间间隔$t_{current} - t_{last}$, + 如果$t_{current} - t_{last} > T$(T为阈值),则认为缺页率太低,置换该进程在$[t_{last}, t_{current}]$时间内没有被引用的页。 -+ 如果$t_{current} - t_{last} > T$,则认为缺页率太高,增加缺失页到工作集中。 ++ 如果$t_{current} - t_{last} < T$,则认为缺页率太高,增加缺失页到工作集中。 可以看到,缺页率算法的开销要比工作集置换算法小很多,因为在正常访存时不需要做过多的操作,只需要将被访问的页面的引用位置一即可。 > 两个全局页面置换算法的比较 -实际上,工作集置换算法和缺页率置换算法,在本质上,都是希望尽可能地跟踪进程运行周期内,对内存需求量的动态变化。工作集置换无疑具有更好的性能,因为每次访存后,工作集置换算法都会保证常驻集的大小等于工作集,但是也因为此,它执行起来需要更大的开销。缺页率置换算法则是开销与性能的一种折中。 +实际上,工作集置换算法和缺页率置换算法,在本质上,都是希望尽可能地跟踪进程运行周期内,对内存需求量的动态变化。工作集置换算法无疑具有更好的性能,因为每次访存后,工作集置换算法都会保证常驻集的大小等于工作集,但是也因为此,它执行起来需要更大的开销。缺页率置换算法则是开销与性能的一种折中。 ### 抖动与负载控制 diff --git a/thu_os/images/load_control.png b/thu_os/images/load_control.png index 9b5ace8..47a6cfc 100644 Binary files a/thu_os/images/load_control.png and b/thu_os/images/load_control.png differ