Please enable JavaScript.
Coggle requires JavaScript to display documents.
ch7_part2:从内核的角度管理内存 - Coggle Diagram
ch7_part2:从内核的角度管理内存
按需分页
懒惰
先分配好虚拟地址,但是页尚未分配
系统说它已经分配好了,实际上它直到被调用时才真正分配内存
malloc只是包含了虚拟地址页的分配,当该地址被调用时MMU发现虚拟页是无效的,所以产生一个叫pagefault的中断
当所有的页框都被分配完--需要交换区的帮助
交换区:在永久存储设备里保存的一块地址空间
至少和物理空间一样大
系统可以支持的进程最大大小 = 物理地址空间+交换区空间-内核地址空间,不需要在内存加载所有数据,需要使用时用pagefault调页,页帧被占满时触发页面替换
访问时间=(1-p)ma +p*PagefaultTime
实现了over-commitment,可以支持大的进程的启动和多任务的并行启动
页面替换算法
FIFO:注意当一个页在页面中并且再次被访问时不会改变它的进入时间-----与LRU区别
LRU:注意当页面中的页被再次访问到时会改变它的年龄-----与FIFO区别
最优算法:不关心实现已经知道了未来的执行顺序,替换当前页面中离下一次被使用的时间最长的页
二次机会算法:查找引用位,为0替换,为1给第二次机会并清除引用位,使用队列实现
belody异常:页帧增加但是page fault的数量反而增加的异常
最优算法和LRU算法不会出现
堆算法也不会出现:特征:n个页帧的情况总是n+1个页帧的情况的子集,例如LRU,n个最常使用的页框也必然是n+1个最常用的页框的子集
虚拟内存
CPU上有MMU单元来处理地址转换
工作
内存返回存储在物理地址中的指令
CPU对指令进行译码,注意指令中存储的也是虚拟地址
在MMU的帮助下物理地址被检索出来
CPU要取指时虚拟地址被送至MMU,然后它被转换成物理地址
优点
共享内存可以被实现了
内存增长可以被轻易实现:增长的物理内存不要求是连续的
不同的进程使用相同的虚拟地址,但可能被转换成不同的物理地址
MMU的实现和Paging
MMU的实现
通过查找表来完成,每个进程都有自己的查找表
分页:为了减少表的大小,将内存分为固定的块
MMU的查找表被称为页表
属性
相邻的虚拟地址不保证被映射到相邻的物理地址
同一页面内的虚拟地址总是映射到物理地址的同一页面
内存分配
页是内存分配的基本单位,分配是一个逐页的方式
问题:当进程使用的内存小于内存分配的大小时就会浪费内存,导致内部碎片
放置页
已分配的内存被分为一个个页,未分配的内存不包含任何页
然后页被放置在物理内存或交换区中,即磁盘
页表设计
有效:在内存中,无效:不在内存中,并不是说该页未分配
页表结构:多级页表(不希望在内存中连续分配页表)
性能提升
大页。减少对页表的访问次数
内部碎片化
删除重复数据
Caching:TLB
总结:虚拟地址只是一个表查询的实现,它的特殊之处在于该表查询位于CPU上,也就是一个硬件实现方法;每一个进程都有它自己的查找表
操作系统存储并管理所有进程的页表
给进程分配页面
COW:Copy-On-Write