内存管理
使用物理内存,不安全。
交换:
运行时把进程载入内存,不运行时放回磁盘。利用基址寄存器和界限寄存器计算动态地址。没法动态分配堆内存。
覆盖:
把程序分为很多段,先装入段0,运行完段0再装入段1,有空间就放在段0上边,否则就覆盖段0。
虚拟内存:让程序只有一部分被调入内存的情况下运行。
动态分区分配算法
使用物理内存,程序载入找内存中连续的内存。
- 首次适应算法:从低向高找。
- 最佳适应算法:优先找空间最小的连续内存。
- 最坏:优先找空间最大的连续内存。
- 临近适应算法:从上次分配的内存地址开始往后找。
虚拟内存(分页技术)
将程序的地址空间分割成很多页,每一页的连续地址空间由操作系统映射到物理地址,这样进程中的所有地址可以写成:页号+页内偏移。进程不需要把所有页装入内存,只需维护一个页表(每个进程),如果该页号可以在页表查询到,将其映射到物理页号,物理页号+页内偏移就是物理地址。否则发生缺页中断,使用页面置换算法从页表中删除一页(如果该页修改位为1,则要将其写入硬盘再删除),然后将缺失的页从硬盘装入内存后再查询页表。
快表 TLB
提出快表是由于一个现象:大多数的程序会频繁访问其中少量页面。所以将这些少量页面制作一个快表加速虚拟地址转换。
与页表对应的是MMU中的快表,访问快表(寄存器)要比访问页表(内存)快得多,由于快表中虚拟页号不是连续的,没法使用索引的方法访问,但MMU内部会并行检查所有快表项。
页面置换算法
发生缺页中断时需要从内存中选择一个页面置换出去。
最优页面置换算法
前提知道页面访问序列,然后淘汰未来最远会访问到的页面。
NRU最近未使用(时钟置换算法)
将一个页面用读写(R,M)位标记,分为4类页面:
- 没访问,没修改(0,0)
- 没访问,修改过(0,1)
- 访问过,没修改(1,0)
- 访问过,修改过(1,1)
将所有页面组成一个循环队列,最多扫描4轮。
- 第一轮:遇到R=0 and M=0时置换。(0,0)
- 第二轮:遇到R=0 and M=1时置换,同时将扫过的节点R置为0。(0,1)
- 第三轮:遇到R=0 and M=0时置换。(1,0)
- 第三轮:遇到R=0 and M=1时置换。(1,1)
LRU 最近最久未使用
访问过的页面放在队首,队尾页面淘汰。具体实现:用哈希表映射到双向链表节点,同时维护队首和队尾节点,这样get和put操作可以达到O(1)。
工作集页面置换
一个进程过去k秒使用的页面集合被称为它的工作集。如果内存无法容下整个工作集,那运行过程会产生很多缺页中断,称为颠簸。淘汰没有在工作集中的页面。
分段
使得代码和数据在逻辑上被分开,段是一个逻辑实体。
标签:管理,置换,内存,访问,算法,页表,页面 From: https://www.cnblogs.com/hellozhangjz/p/18043529