From e43959e1c6d80319445c423de9e2937ff1ea313a Mon Sep 17 00:00:00 2001 From: Shine wOng <1551885@tongji.edu.cn> Date: Fri, 22 Nov 2019 08:43:22 +0800 Subject: [PATCH] add conclusion on belady -- belady.md and some modifications. --- cod/chp1.md | 2 +- thu_os/belady.md | 19 +++++++++++++++++++ thu_os/chp8.md | 2 +- thu_os/chp9.md | 2 +- 4 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 thu_os/belady.md diff --git a/cod/chp1.md b/cod/chp1.md index 70dc0ef..ad2d055 100644 --- a/cod/chp1.md +++ b/cod/chp1.md @@ -1,7 +1,7 @@ 计算机组成原理第一章知识脉络 ========================= -本章讨论的主要内容是数据通路(data path)的设计,关键在于如果实现一个ALU。 +本章讨论的主要内容是数据通路(data path)的设计,关键在于如何实现一个ALU。 为了实现一个计算机(computing machine),首要的当然是要能够实现基本的计算功能。而为了实现计算功能,首先需要将数据在计算机中表示,这包括字符型数据,定点数(整数)以及浮点数,这里主要讨论定点数的表示。将定点数在计算机中表示,最简单直白的方法就是直接将它的二进制形式存储在计算机中,新增一位符号位来表示它的正负,这就是原码表示法。然而原码表示法具有一些致命性的缺陷,比如原码的计算不服从加法性质;为了构造一种复合加法性质的表示法,就产生了反码。反码的确是可以进行加法和减法运算的,但是在反码表示法下,`0`将具有两种反码表示,可以将反码简单加`1`来规避这种情况,这就是补码表示法。现代计算机中数据的存储几乎都是采用补码。 diff --git a/thu_os/belady.md b/thu_os/belady.md new file mode 100644 index 0000000..29ba178 --- /dev/null +++ b/thu_os/belady.md @@ -0,0 +1,19 @@ +栈式页面置换算法不会出现belady现象的证明 +===================================== + +## LRU算法 + +对于`最近最久未使用算法(LRU, Least Recently Used)`,是不会出现`belady`异常(belady anomaly)的,证明如下: + +设分配给当前进程的页面数量为`n`,令$S_n$为当前时刻`t`,某个进程驻留在内存中的所有页面的集合。要证明`LRU`不会出现`belady`异常,即证对于任意的`k > 0`,给进程分配的页面数量为`n + k`时,对于同一个页面访问序列,$S_n$总是$S_{n+k}$的一个子集。不妨简单地令`k = 1`,`k > 1`的情况同理。以下归纳地证明该结论。 + +- . `t = 1`时,$S_n$和$S_{n+1}$都只包含同一个页面,结论成立。 +- . 假设$t < t_{k - 1}$时,该结论成立。 +- . 当$t = t_k$时,设此时访问的页面为$c_k$。以下分为三种情况讨论: + + $c_k \in S_n$,则显然$c_k \in S_{n+1}$,访问$c_k$不会引发缺页异常,因此访问$c_k$后假设显然成立。 + + $c_k \in S_{n+1}$但是$c_k \notin S_n$,此时对于序列$S_n$会引发一次缺页异常,导致其中一个页面被换出以及$c_k$被换入,此时仍然保持$S_n \subset S_{n+1}$,假设成立。 + + $c_k \notin S_n$并且$c_k \notin S_{n+1}$,此时两个集合都会产生缺页异常。假设此时$S_n$中被换出的页面为$x_1$,若$S_{n+1}$被换出的页面也是$x_1$,则假设仍然成立;否则,设$S_{n+1}$中被换出的页面为$x_2, x_2 \neq x_1$,由于是采用`LRU`算法,则$x_2$必然是比$x_1$`更久未被使用`的页面,倘若$x_2 \in S_n$,则$S_n$中被换出的页面也应该是$x_2$,而不是使用相对频繁的$x_1$,这与假设矛盾,故$x_2 \notin S_n$,缺页异常处理完毕后原假设仍然成立。 + +证毕。 + +实际上,对于`最优置换算法`(OPT),以及`恢复计数`的`最不常用算法`(LFU, Least Frequently Used),都可以类似地证明不会出现`belady`异常。然而,其他的页面置换算法,包括`FIFO`,`时钟置换算法`(clock)以及`改进的时钟置换算法`,`不恢复计数`的`最不常用算法`,则都可以构造出出现`belady`异常的实例。 \ No newline at end of file diff --git a/thu_os/chp8.md b/thu_os/chp8.md index d49917c..d734e1a 100644 --- a/thu_os/chp8.md +++ b/thu_os/chp8.md @@ -74,7 +74,7 @@ EAT = 访存时间 * (1-p) + 缺页异常处理时间 * 缺页率p ``` -这里的缺页异常处理时间,其实主要就是考虑访存的开销。考虑到如果在内存中的页面被修改过,则还需要将该页面写回到外存中,就比一般的缺页异常处理多了一次访存,设页修改的概率为q,则 +这里的缺页异常处理时间,其实主要就是考虑访问外部存储器的开销。考虑到如果在内存中的页面被修改过,则还需要将该页面写回到外存中,就比一般的缺页异常处理多了一次访存,设页修改的概率为q,则 ``` EAT = 访存时间(1–p) + 磁盘访问时间p(1+q) diff --git a/thu_os/chp9.md b/thu_os/chp9.md index 20f6566..26a81d8 100644 --- a/thu_os/chp9.md +++ b/thu_os/chp9.md @@ -62,7 +62,7 @@ 发生`belady`现象的原因,是页面置换算法的置换特征与进程访问内存的动态特征矛盾了,例如前面提到的每次刚被换出的页面,恰好是下一次访存会访问的页面。即被置换出去的页面,并不一定是进程近期不会再访问的。 -以后可能会写一个证明,对于栈式的页面置换算法,例如最优页面置换算法,是不会出现`belady`现象的。像是`FIFO`这样的队列式的算法,就比较够呛。 +对于栈式的页面置换算法,例如最优页面置换算法,是不会出现`belady`现象的,证明放在了[这里](belady.md)。像是`FIFO`这样的队列式的算法,就比较够呛。 ### 最近最久未使用算法(LRU)