【操作系统-01】内存管理
硬件存储结构
分层存储结构

缓存一致性
读写问题
(1)读命中 与 读不命中:逐层访问缓存读取内容
(2)写直达:把数据同时写入内存和 Cache
每次需要写回内存,性能较低
(3)写回:当发生写操作时,新的数据仅仅被写入 Cache Block 里,只有当修改过的 Cache Block「被替换」时才需要写到内存中
减少了数据写回内存的频率,这样便可以提高系统的性能
替换策略
希望保持缓存的高命中,对于一些频繁访问的数据我们希望可以一直留在内存中,而一些很少访问的数据希望可以在某些时机可以淘汰掉。
1. 传统LRU

(1)时间局部性:
每当发生读写不命中的情况,将当前页加入到LRU的头部,缓存满时,将尾部丢弃
(2)空间局部性
预读机制:每次向LRU中加载多个相邻的页
(3)问题
a.预读的问题(预读失效,污染缓存)
b.频繁替换问题
2. 改进LRU
(1)划分active区和in-active区
第一次读写:加入到in-active头部,并丢弃in-active的尾部。
第二次读写:从in-active提升到active头部,将active尾部下降为in-active。

3. 时钟算法

综合FIFO和LRU方法,将页面保存在环形链表中,表针指向最老的页面。
每当访问命中,将访问位置1;
每当访问不命中,触发缺页中断,将表针沿途的访问位置0,替换第一个访问位不为1的页面。
虚拟内存
虚拟内存
(1)虚拟地址为逻辑地址,可以防止不同进程间的内存污染。
(2)内存管理、分配(虚拟地址的分配)、释放的便捷性:将不连续的物理空间抽象为连续的地址空间。
段页式内存管理
-
段式管理:虚拟地址=段选择因子+段偏移量
每次分配的空间大小不一,容易产生内存外部碎片
-
页式管理:虚拟地址=页号+页偏移量
内存分配成大小相等的页,容易产生内存内部碎片
(1)页表=pair(虚拟页号, 物理页号)
(2)多级页表:如果某个一级页表的页表项没有被用到,也就不需要创建这个页表项对应的二级页表了,即可以在需要时才创建二级页表。
(3)TLB(快表):把经常使用到的页表页加入缓存中
-
linux下使用的段页式的内存管理
-
进程内存模型
操作系统为每个进程抽象出独立的虚拟内存空间,其内存模型如下:

malloc内存分配
分配方式
-
brk()系统调用从堆内存分配
-
mmap()系统调用从文件映射区分配
分配细节
1. brk()与mmap()
-
mmap:
访问容易触发缺页中断,频繁在用户态和内核态之间切换,效率低
-
brk:
频繁的分配释放容易产生内存碎片,发生内存泄漏
一般规定:<128KB使用brk();>128KB使用mmap()。
2. 调用时分配虚拟内存,访问时开辟物理内存
3. 预分配 与 延迟释放
- malloc():会预分配更大的空间作为内存池
- free():brk()方式申请的内存会保留,进程结束后归还操作系统;mmap()方式申请的内存会被释放。