2018.04.16
由于 CPU 速度与硬盘和内存严重不匹配,所以出现了批处理系统,就是往内存中多装载几个程序。当出现 IO 阻塞时,执行另一个程序。
内存紧缩:将各个程序向内存一端移动,各个空闲内存自然合并成为一大块,以加载一个占内存较大的程序。
由于批处理系统中,所有程序都是从地址 0 开始的,为避免不同程序操作同一个地址,需要对程序所引用的物理地址进行重定位。
静态重定位,直接修改程序指令。但是出现内存紧缩时,需要对移动的程序再次重定位。
动态重定位,增加一个寄存器,用来保存程序的初始地址,遇到了地址有关的指令才计算真实的地址。
为了防止恶意程序越界访问别的程序数据,再增加一个寄存器,记录程序在内存中的长度。
内存管理单元,MMU,保存程序初始地址的寄存器 + 记录程序在内存中的长度的寄存器 + 计算内存地址方法。
技术发展,程序越来越大,该考虑让有限的内存装载更多的程序。
局部性原理:
指令、数据具有时间局部性。
存储单元具有空间局部性。
依据局部性原理,把程序分块,程序会倾向常执行某几块。
每一小块叫页框(page frame),内存装载以页框为单位。
工作集,working set,一个进程在给定的时间内所占用的内存大小。因为程序大部分时间只运行几个页框,这几个页框可以看作是一个工作集。
分块允许内存逐步装载程序,意味着:一个程序实际占用的内存比完全装载这个程序所占用的内存要小得多。
为了把程序分块,得先有个度量。就像要把一根木棒平均折成 5 段,得先有一把尺子。所以,先把整个程序装载到虚拟内存中,这个虚拟内存就像一把尺子,可以把程序平均分块。虚拟内存中,每一块叫页(page)。
需要一张页表来映射虚拟内存到物理内存。根据局部性原理,把最常用的页表项放入 CPU 缓存,归 MMU 管理。
如果程序访问虚拟内存某页,映射到物理内存中不存在,则产生缺页中断,由操作系统去硬盘调取。
如果装载新页框时,内存不足,就把某个页框置换到硬盘。
分段:从程序的角度,对程序更合理地分块。把程序分成代码段、数据段、堆栈段……,段表作映射也是需要的。但是在段的内部,仍然按照分页处理。
总的来说,一个虚拟内存地址在段表中根据段号找到页表地址,在页表中找到物理内存地址。