进程地址空间
https://www.jianshu.com/p/d63b00630a3c
虚拟内存:
基于局部性原理,我们在装入进程到内存的时候可以只将进程的启动那部分代码装入内存,就可以启动进程,操作系统提供请求调页和页面置换功能;
请求调页: 当进程在运行过程中需要使用外存的数据时,系统会将外存的页调入到内存中
页面置换: 当内存不足时,需要通过页面置换算法选择暂时不用的页放到外存;
缺页中断机制: 当访问一个页时,会通过页表的状态位判断当前这个页是否在内存中,如果不在,会触发一个缺页中断,内核会阻塞当前进程,执行IO操作,将外存的页调入到内存,如果内存不够,会通过页面置换算法置换出一个页;
页式存储
快表:如果没有快表,每一次地址转换都需要访问两次内存,一次查页表项,一次查物理地址
二级页表
段式内存管理
段页式存储
页面置换算法
1. 最佳
OPT, Optimal replacement algorithm
所选择的被换出的页面将是最长时间内不再被访问,通常可以保证获得最低的缺页率。
是一种理论上的算法,因为无法知道一个页面多长时间不再被访问。
2. 最近最久未使用
LRU, Least Recently Used
虽然无法知道将来要使用的页面情况,但是可以知道过去使用页面的情况。LRU 将最近最久未使用的页面换出。
为了实现 LRU,需要在内存中维护一个所有页面的链表。当一个页面被访问时,将这个页面移到链表表头。这样就能保证链表表尾的页面是最近最久未访问的。
因为每次访问都需要更新链表,因此这种方式实现的 LRU 代价很高。
4. 先进先出
FIFO, First In First Out
选择换出的页面是最先进入的页面。
该算法会将那些经常被访问的页面也被换出,从而使缺页率升高。
5. 第二次机会算法
FIFO 算法可能会把经常使用的页面置换出去,为了避免这一问题,对该算法做一个简单的修改:
当页面被访问 (读或写) 时设置该页面的 R 位为 1。需要替换的时候,检查最老页面的 R 位。如果 R 位是 0,那么这个页面既老又没有被使用,可以立刻置换掉;如果是 1,就将 R 位清 0,并把该页面放到链表的尾端,修改它的装入时间使它就像刚装入的一样,然后继续从链表的头部开始搜索。
6. 时钟
Clock
第二次机会算法需要在链表中移动页面,降低了效率。时钟算法使用环形链表将页面连接起来,再使用一个指针指向最老的页面。