内存管理

内存管理

使用物理内存,不安全。

交换:

运行时把进程载入内存,不运行时放回磁盘。利用基址寄存器和界限寄存器计算动态地址。没法动态分配堆内存。

覆盖:

把程序分为很多段,先装入段0,运行完段0再装入段1,有空间就放在段0上边,否则就覆盖段0。

虚拟内存:让程序只有一部分被调入内存的情况下运行。

动态分区分配算法

使用物理内存,程序载入找内存中连续的内存。

  • 首次适应算法:从低向高找。
  • 最佳适应算法:优先找空间最小的连续内存。
  • 最坏:优先找空间最大的连续内存。
  • 临近适应算法:从上次分配的内存地址开始往后找。

虚拟内存(分页技术)

将程序的地址空间分割成很多页,每一页的连续地址空间由操作系统映射到物理地址,这样进程中的所有地址可以写成:页号+页内偏移。进程不需要把所有页装入内存,只需维护一个页表(每个进程),如果该页号可以在页表查询到,将其映射到物理页号,物理页号+页内偏移就是物理地址。否则发生缺页中断,使用页面置换算法从页表中删除一页(如果该页修改位为1,则要将其写入硬盘再删除),然后将缺失的页从硬盘装入内存后再查询页表。

快表 TLB

提出快表是由于一个现象:大多数的程序会频繁访问其中少量页面。所以将这些少量页面制作一个快表加速虚拟地址转换。

与页表对应的是MMU中的快表,访问快表(寄存器)要比访问页表(内存)快得多,由于快表中虚拟页号不是连续的,没法使用索引的方法访问,但MMU内部会并行检查所有快表项。

页面置换算法

发生缺页中断时需要从内存中选择一个页面置换出去。

最优页面置换算法

前提知道页面访问序列,然后淘汰未来最远会访问到的页面。

NRU最近未使用(时钟置换算法)

将一个页面用读写(R,M)位标记,分为4类页面:

  1. 没访问,没修改(0,0)
  2. 没访问,修改过(0,1)
  3. 访问过,没修改(1,0)
  4. 访问过,修改过(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秒使用的页面集合被称为它的工作集。如果内存无法容下整个工作集,那运行过程会产生很多缺页中断,称为颠簸。淘汰没有在工作集中的页面。

分段

使得代码和数据在逻辑上被分开,段是一个逻辑实体。

posted @ 2024-02-29 13:46  hellozhangjz  阅读(22)  评论(0)    收藏  举报