操作系统的学习(3)——物理内存管理:非连续内存分配

连续分配内存的缺点:内存必须连续比较难达到,存在外碎片和内碎片,内存分配的动态修改困难以及内存的利用率较低。
非连续内存分配的设计目标:提高内存的利用效率和管理灵活性。
非连续内存分配允许一个程序使用非连续的物理地址空间,允许共享代码和数据并且支持动态加载以及动态链接。

非连续内存分配需要解决的问题:
1)如何实现虚拟地址和物理地址的转换(软件实现和硬件实现)。
2)如何选择非连续内存空间的大小(段式管理和页式管理)。

段式存储管理

段地址空间
主代码段、子模块代码段、公用库代码段、堆栈段、堆数据。初始化数据段、符号表等

段访问机制
段表示访问方式和存储数据等属性相同的一段地址空间。
每一个段对应一个连续的内存块,若干个段组成进程逻辑地址空间。
段访问:逻辑地址由二元组(s,addr)表示 s——段号 addr——段内偏移

当程序在CPU上执行,要访问一个存储单元时,首先找到逻辑地址(段号和段内偏移),先用段号查找进程的段表,段表中每一项对应一个段描述符,段表中每一项的基本内容是段的起始地址和长度,段表中的内容可以用操作系统的软件去控制。得到段的长度后,由硬件存储管理单元mmu就会把段的长度和偏移取出来作比较,看是否越界,如果越界就抛出异常,如果没有越界,就在MMU里利用段基址以及段的偏移就可以找到访问的内容。

页式存储管理:将物理地址空间分成的基本单位叫做页帧(大小为2^n),逻辑地址空间的基本单位为页面。帧和页的大小必须相同。

页面到页帧的转换
将物理地址组成一个二元组(f,o),f表示帧号,o为偏移量,s代表o偏移的位数。f位共有2^f个帧,s位,每帧有2^s字节。
物理地址 = f*2^s+o


页内偏移=帧内偏移 但通常 页号大小不等于帧号大小
将物理地址组成一个二元组(p,o),p表示页号,o为偏移量,s代表o偏移的位数。p位共有2^p个帧,s位,每帧有2^s字节。

页表:保存了逻辑地址到物理地址的对应关系
程序在CPU执行,执行时在逻辑地址里得到的地址表示为p o,用p去页表里去寻找与之对应的f,由于页面偏移与帧面偏移相同,这样就可以找到逻辑地址对应的物理地址。

快表(TLB):利用缓存机制来减少对内存的访问。
将近期访问的页表项缓存到CPU里,未使用快表的时候,逻辑页号在内存中去查找页表,找到物理页号,然后就可以得到物理地址;如果使用块表缓存后,在CPU里加上一组关联存储器,关联存储器拥有一个key值来查找所有同行的表项,类似于字典,通过key值匹配来找到物理地址,不需要去访问内存,但是如果没找到相应的key值,就还得去查找页表,然后才得到物理页号。

多级页表:通过间接引用的方式将页号分成若干级,来减少页表的长度来减少页表占用存储空间。

反置页表:减少页表占用存储空间的一种做法。
页寄存器和反置页面的思路:不让页表和逻辑地址空间大小对应而是让页表和物理地址空间大小对应,这样的话不论是进程数量增加和虚拟内存的增加都对页表占用空间没有影响。

页寄存器:每个帧与一个页寄存器关联,通过hash映射值查找对应页表项中的帧号。
寄存器内容包括 使用位(此帧是否被进程占用),占用页号(对应的页号p),保护位(约定页的访问方式(可读可写等))
好处:页表大小相对于物理内存而言很小。页表大小与逻辑地址空间大小无关。
缺点:页表信息对调后,需要依据帧号查找页号。在页寄存器中搜索逻辑地址中的页号,比较繁琐。

段页式存储管理:段式和页式的结合,在段式存储管理的基础上,给每个段加一级页表。
可以在段表的基址上加一个共享段,俩个不同的段表通过指向相同的页表基址,实现进程间段的共享

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值