【操作系统-01】内存管理

硬件存储结构

分层存储结构

img

缓存一致性

读写问题

(1)读命中 与 读不命中:逐层访问缓存读取内容

(2)写直达:把数据同时写入内存和 Cache

每次需要写回内存,性能较低

(3)写回:当发生写操作时,新的数据仅仅被写入 Cache Block 里,只有当修改过的 Cache Block「被替换」时才需要写到内存中

减少了数据写回内存的频率,这样便可以提高系统的性能

替换策略

希望保持缓存的高命中,对于一些频繁访问的数据我们希望可以一直留在内存中,而一些很少访问的数据希望可以在某些时机可以淘汰掉。

1. 传统LRU

img

(1)时间局部性:

每当发生读写不命中的情况,将当前页加入到LRU的头部,缓存满时,将尾部丢弃

(2)空间局部性

预读机制:每次向LRU中加载多个相邻的页

(3)问题

a.预读的问题(预读失效,污染缓存)

b.频繁替换问题

2. 改进LRU

(1)划分active区和in-active区

第一次读写:加入到in-active头部,并丢弃in-active的尾部。

第二次读写:从in-active提升到active头部,将active尾部下降为in-active。

img

3. 时钟算法

时钟页面置换算法

综合FIFO和LRU方法,将页面保存在环形链表中,表针指向最老的页面。

每当访问命中,将访问位置1;

每当访问不命中,触发缺页中断,将表针沿途的访问位置0,替换第一个访问位不为1的页面。

虚拟内存

虚拟内存

(1)虚拟地址为逻辑地址,可以防止不同进程间的内存污染。

(2)内存管理、分配(虚拟地址的分配)、释放的便捷性:将不连续的物理空间抽象为连续的地址空间。

段页式内存管理

  1. 段式管理:虚拟地址=段选择因子+段偏移量

    每次分配的空间大小不一,容易产生内存外部碎片

  2. 页式管理:虚拟地址=页号+页偏移量

    内存分配成大小相等的页,容易产生内存内部碎片

    (1)页表=pair(虚拟页号, 物理页号)

    (2)多级页表:如果某个一级页表的页表项没有被用到,也就不需要创建这个页表项对应的二级页表了,即可以在需要时才创建二级页表

    (3)TLB(快表):把经常使用到的页表页加入缓存中

    MMU功能图
    1. linux下使用的段页式的内存管理

      img

进程内存模型

操作系统为每个进程抽象出独立的虚拟内存空间,其内存模型如下:

查看源图像

malloc内存分配

分配方式

  1. brk()系统调用从堆内存分配

  2. mmap()系统调用从文件映射区分配

分配细节

1. brk()与mmap()

  1. mmap:

    访问容易触发缺页中断,频繁在用户态和内核态之间切换,效率低

  2. brk:

    频繁的分配释放容易产生内存碎片,发生内存泄漏

一般规定:<128KB使用brk();>128KB使用mmap()

2. 调用时分配虚拟内存,访问时开辟物理内存

3. 预分配 与 延迟释放

  1. malloc():会预分配更大的空间作为内存池
  2. free():brk()方式申请的内存会保留,进程结束后归还操作系统mmap()方式申请的内存会被释放