auto commit
This commit is contained in:
parent
34a463b688
commit
9439942f26
|
@ -698,7 +698,7 @@ FIFO 常用于客户-服务器应用程序中,FIFO 用作汇聚点,在客户
|
|||
|
||||
为了更好的管理内存,操作系统将内存抽象成地址空间。每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一页。这些页被映射到物理内存,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。当程序引用到一部分不在物理内存中的地址空间时,由硬件执行必要的映射,将缺失的部分装入物理内存并重新执行失败的指令。
|
||||
|
||||
从上面的描述中可以看出,虚拟内存允许程序地址空间中的每一页都映射到物理内存,也就是说一个程序不需要全部调入内存就可以运行,这使得有限的内存运行大程序称为可能。例如有一台计算机可以产生 16 位地址,那么一个程序的地址空间范围是 0\~64K。该计算机只有 32KB 的物理内存,虚拟内存技术允许该计算机运行一个 64K 大小的程序。
|
||||
从上面的描述中可以看出,虚拟内存允许程序不用将地址空间中的每一页都映射到物理内存,也就是说一个程序不需要全部调入内存就可以运行,这使得有限的内存运行大程序称为可能。例如有一台计算机可以产生 16 位地址,那么一个程序的地址空间范围是 0\~64K。该计算机只有 32KB 的物理内存,虚拟内存技术允许该计算机运行一个 64K 大小的程序。
|
||||
|
||||
<div align="center"> <img src="../pics//7b281b1e-0595-402b-ae35-8c91084c33c1.png"/> </div><br>
|
||||
|
||||
|
@ -717,7 +717,7 @@ FIFO 常用于客户-服务器应用程序中,FIFO 用作汇聚点,在客户
|
|||
|
||||
在程序运行过程中,如果要访问的页面不在内存中,就发生缺页中断从而将该页调入内存中。此时如果内存已无空闲空间,系统必须从内存中调出一个页面到磁盘对换区中来腾出空间。
|
||||
|
||||
页面置换算法和缓存淘汰策略类似。在缓存系统中,缓存的大小有限,当有新的缓存到达时,需要淘汰一部分已经存在的缓存,这样才有空间存放新的缓存数据。
|
||||
页面置换算法和缓存淘汰策略类似,可以将内存看成磁盘的缓存。在缓存系统中,缓存的大小有限,当有新的缓存到达时,需要淘汰一部分已经存在的缓存,这样才有空间存放新的缓存数据。
|
||||
|
||||
页面置换算法的主要目标是使页面置换频率最低(也可以说缺页率最低)。
|
||||
|
||||
|
@ -741,7 +741,9 @@ FIFO 常用于客户-服务器应用程序中,FIFO 用作汇聚点,在客户
|
|||
|
||||
虽然无法知道将来要使用的页面情况,但是可以知道过去使用页面的情况。LRU 将最近最久未使用的页面换出。
|
||||
|
||||
为了实现 LRU,需要在内存中维护一个所有页面的链表。当一个页面被访问时,将这个页面移到链表表头。这样就能保证链表表尾的页面时最近最久未访问的。因为每次访问都需要更新链表,因此这种方式实现的 LRU 代价很高。
|
||||
为了实现 LRU,需要在内存中维护一个所有页面的链表。当一个页面被访问时,将这个页面移到链表表头。这样就能保证链表表尾的页面时最近最久未访问的。
|
||||
|
||||
因为每次访问都需要更新链表,因此这种方式实现的 LRU 代价很高。
|
||||
|
||||
<div align="center"><img src="https://latex.codecogs.com/gif.latex?4,7,0,7,1,0,1,2,1,2,6"/></div> <br>
|
||||
|
||||
|
@ -751,18 +753,16 @@ FIFO 常用于客户-服务器应用程序中,FIFO 用作汇聚点,在客户
|
|||
|
||||
> NRU, Not Recently Used
|
||||
|
||||
首先,系统为毎一页面设置了两个状态位。当页面被访问 (读或写) 时设置 R 位; 当页面 (即修改页面) 被写入时设置 M 位。当启动一个进程时,它的所有页面的两个位都由操作系统设置成 0,R 位被定期地 (比如在每次时钟中断时) 清零,以区别最近没有被访问的页面和被访问的页面。
|
||||
每个页面都有两个状态位:R 与 M,当页面被访问时设置页面的 R=1,当页面被修改时设置 M=1。其中 R 位会定时被清零。可以将页面分成以下四类:
|
||||
|
||||
当发生缺页中断时,操作系统检査所有的页面并根据它们当前的 R 位和 M 位的值,把它们分为 4 类:
|
||||
- R=0,M=0
|
||||
- R=0,M=1
|
||||
- R=1,M=0
|
||||
- R=1,M=1
|
||||
|
||||
- 第 0 类: 没有被访问,没有被修改
|
||||
- 第 1 类: 没有被访问,已被修改
|
||||
- 第 2 类: 已被访问,没有被修改
|
||||
- 第 3 类: 已被访问,已被修改
|
||||
当发生缺页中断时,NRU 算法随机地从类编号最小的非空类中挑选一个页面将它换出。
|
||||
|
||||
NRU 算法随机地从类编号最小的非空类中挑选一个页面淘汰之。
|
||||
|
||||
算法隐含的意思是,在最近一个时钟滴答中 (典型的时间是大约 20ms) 淘汰一个没有被访问的已修改页面要比一个被频繁使用的“十净” 页面好。NRU 主要优点是易于理解和能够有效地被实现,虽然它的性能不是最好的,但是已经够用了。
|
||||
NRU 优先换出已经被修改的脏页面(R=0,M=1),而不是被频繁使用的干净页面(R=1,M=0)。
|
||||
|
||||
### 4. 先进先出
|
||||
|
||||
|
@ -776,11 +776,10 @@ NRU 算法随机地从类编号最小的非空类中挑选一个页面淘汰之
|
|||
|
||||
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>
|
||||
|
||||
第二次机会算法就是寻找一个最近的时钟间隔以来没有被访问过的页面。如果所有的页面都被访问过了,该算法就简化为纯粹的 FIFO 算法。
|
||||
|
||||
### 6. 时钟
|
||||
|
||||
|
@ -902,7 +901,7 @@ gcc -o hello hello.c
|
|||
|
||||
- 可执行目标文件:可以直接在内存中执行;
|
||||
- 可重定向目标文件:可与其它可重定向目标文件在链接阶段合并,创建一个可执行目标文件;
|
||||
- 共享目标文件:这是一种特殊的可重定向目标文件,可以在加载或者运行时被动态加载进内存并链接;
|
||||
- 共享目标文件:这是一种特殊的可重定向目标文件,可以在运行时被动态加载进内存并链接;
|
||||
|
||||
## 动态链接
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user