操作系统内存管理笔记
声明
文章均为本人技术笔记,转载请注明出处https://segmentfault.com/u/yzwall
地址空间
物理地址
物理地址是内存中物理单元的集合,是地址转换的最终地址,进程在运行时执行指令和访问数据都通过物理地址访问驻村;
逻辑地址/虚拟地址
逻辑地址由CPU生成,面向编程人员,从0单元编号一直到物理内存的极限;
当装入程序将可执行代码载入主存时,逻辑地址必须通过地址重定位转换为物理地址;由于代码的存储空间在逻辑地址上连续,在物理地址上分散,因此基于逻辑地址实现虚拟内存技术;
操作系统角度:分页内存管理
引入分页机制:使得程序的逻辑地址连续,物理地址空间可以是非连续的;
操作系统把物理内存按照固定大小划分为页帧(Page Frame),在逻辑内存中对应为页(Page),外存按照同样固定大小划分为块(Block)
页面大小选择
页大小应为2的整数幂,页面太小导致页面数增加,页表增长,占用大量主存;页面过大会增加页内水平,降低内存利用率;
逻辑地址结构
逻辑地址结构:[页号,页内偏移量]
页面总数 = 2 ^ 页号位数;
页面大小 = 2 ^ 页内偏移量位数(字节);
页表
页表,用来记录逻辑页与物理页框对应关系:页表项至少为:<逻辑页号,物理页框号>
大部分操作系统为每个进程分配一个页表,放置在主存中(由于页表通常比较大),进程控制块PCB中保存指向页表的指针;在实际应用中,为加快映射速度,多采用TLB快表作为页表高速缓存,扩大分页数量则采用多级页表机制;
逻辑地址映射物理地址
假设映射期间各参数合法:
获取页框号:根据页号,在页表中查找对应页框号
计算物理地址:
物理地址 = 物理页框号 * 页面大小 + 页内偏移量
用户角度:分段内存管理
引入分段机制:从开发人员角度出发,划分内存空间(逻辑地址空间和物理地址空间)为若干大小不必相等(可以相等)的段;
逻辑地址结构
逻辑地址结构:[段号,段内偏移量]
;段号代表逻辑地址对应的物理地址的基址;
段表
段表项至少为<段号,段长>
,根据逻辑地址结构,段长 = 2 ^ 段内偏移量位数
;
逻辑地址映射物理地址
假设映射期间各参数合法:
获取段长:根据段号在段表中查找段长
检查地址:检查段号 + 段内偏移量是否合法(段号 + 段内偏移量不超过段长)
计算物理地址:
物理地址 = 段号 + 段内偏移量
段页式内存管理
逻辑地址结构
逻辑地址结构:[段号,页号,页内偏移量]
;
段表与页表
操作系统为每个进程分配一张段表,整个内存空间划分为若干段,每个分段分配一张页表,段表寄存器负责存储进程的段表基址和段表长度
段表项至少为:
<段号,页表基址,页表长度>
页表项至少为:
<逻辑页号,物理页框号>
逻辑地址映射物理地址
假设映射期间各参数合法:
获取页表号:根据段表寄存器,访问段表,通过段号查找页表基址和页表长度;
获取物理页框号:根据页表基址和页号,查找页号对应的页框号;
计算物理地址:
物理地址 = 段号 + 页框号 * 页面长度 + 页内偏移量
;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。