操作系统内存管理笔记

操作系统内存管理笔记

声明

文章均为本人技术笔记,转载请注明出处https://segmentfault.com/u/yzwall

地址空间

物理地址

物理地址是内存中物理单元的集合,是地址转换的最终地址,进程在运行时执行指令和访问数据都通过物理地址访问驻村;

逻辑地址/虚拟地址

逻辑地址由CPU生成,面向编程人员,从0单元编号一直到物理内存的极限;
当装入程序将可执行代码载入主存时,逻辑地址必须通过地址重定位转换为物理地址;由于代码的存储空间在逻辑地址上连续,在物理地址上分散,因此基于逻辑地址实现虚拟内存技术;


操作系统角度:分页内存管理

引入分页机制:使得程序的逻辑地址连续,物理地址空间可以是非连续的;
操作系统把物理内存按照固定大小划分为页帧(Page Frame),在逻辑内存中对应为页(Page),外存按照同样固定大小划分为块(Block)

页面大小选择

页大小应为2的整数幂,页面太小导致页面数增加,页表增长,占用大量主存;页面过大会增加页内水平,降低内存利用率;

逻辑地址结构

逻辑地址结构[页号,页内偏移量]

  • 页面总数 = 2 ^ 页号位数;

  • 页面大小 = 2 ^ 页内偏移量位数(字节);

页表

页表,用来记录逻辑页与物理页框对应关系:页表项至少为:<逻辑页号,物理页框号>
大部分操作系统为每个进程分配一个页表,放置在主存中(由于页表通常比较大),进程控制块PCB中保存指向页表的指针;在实际应用中,为加快映射速度,多采用TLB快表作为页表高速缓存,扩大分页数量则采用多级页表机制;

逻辑地址映射物理地址

假设映射期间各参数合法:

  1. 获取页框号:根据页号,在页表中查找对应页框号

  2. 计算物理地址物理地址 = 物理页框号 * 页面大小 + 页内偏移量


用户角度:分段内存管理

引入分段机制:从开发人员角度出发,划分内存空间(逻辑地址空间和物理地址空间)为若干大小不必相等(可以相等)的段;

逻辑地址结构

逻辑地址结构[段号,段内偏移量];段号代表逻辑地址对应的物理地址的基址;

段表

段表项至少为<段号,段长>,根据逻辑地址结构,段长 = 2 ^ 段内偏移量位数

逻辑地址映射物理地址

假设映射期间各参数合法:

  1. 获取段长:根据段号在段表中查找段长

  2. 检查地址:检查段号 + 段内偏移量是否合法(段号 + 段内偏移量不超过段长

  3. 计算物理地址物理地址 = 段号 + 段内偏移量


段页式内存管理

逻辑地址结构

逻辑地址结构[段号,页号,页内偏移量]

段表与页表

操作系统为每个进程分配一张段表,整个内存空间划分为若干段,每个分段分配一张页表,段表寄存器负责存储进程的段表基址和段表长度

  • 段表项至少为:<段号,页表基址,页表长度>

  • 页表项至少为:<逻辑页号,物理页框号>

逻辑地址映射物理地址

假设映射期间各参数合法:

  1. 获取页表号:根据段表寄存器,访问段表,通过段号查找页表基址和页表长度;

  2. 获取物理页框号:根据页表基址和页号,查找页号对应的页框号;

  3. 计算物理地址物理地址 = 段号 + 页框号 * 页面长度 + 页内偏移量


参考

[1] http://www.cnblogs.com/felixfang/p/3420462.html

你可能感兴趣的:(操作系统内存管理笔记)