操作系统笔记--非连续内存分配的分段、分页和页表

目录

1--非连续内存分配

2--分段

3--分页

4--页表


1--非连续内存分配

        在连续内存分配中,一个程序的内存空间是连续的,其内存利用率较低,且容易形成内碎片和外碎片的问题;

        在非连续内存分配中,一个程序的内存空间是非连续的,可以进行更好的内存管理和利用,支持代码共享和数据共享;

2--分段

        在非连续内存分配中,分段表示操作系统根据程序的段性质,将一个程序分离成不同部分(如运行栈、程序数据等),存储在不同的物理地址空间当中;

        这里需要明确一点,在分段中逻辑地址空间是连续的,而物理地址空间是不连续的;在逻辑地址空间中,一个程序的各个部分是连续存储的;而在物理地址空间当中,一个程序的各个部分是不连续存储的;

         上面的逻辑地址空间和物理地址空间会延伸出两者的映射问题,一般来说逻辑地址由段号偏移地址组成,逻辑地址的段号通过段表来寻找其在物理地址的映射(即段在物理地址的起始地址和长度等);

        通过操作系统事先建立的段表可以有效完成逻辑地址空间与物理地址空间的映射;

3--分页

        在分页管理中,物理空间会被划分为大小固定帧(Frame),而逻辑空间会被划分为与帧大小相同的页(Page)

        分段和分页的不同在于:分段管理中每一个段的长度是不确定的(长度可变),而在分页管理中每一个页的长度是确定的(长度不可变);

        在物理空间中,一个内存物理地址由帧号(f)帧内偏移(o)组成:

物理地址 = 2^S × f + o,S表示每一个帧共有 2^S 个字节,即由 S 位表示;

        在逻辑空间中,一个内存逻辑地址由页号(p)页内偏移(o)组成:

逻辑地址 = 2^S × p + o,S表示每一个页共有 2^S 个字节,即由 S 位表示;

        页号可通过操作系统建立的页表来映射到帧号,在分页中页号不一定与帧号相等,但页内偏移和帧内偏移一定相等;通过页表将页号映射到帧号,可以有效完成逻辑地址到物理地址的映射;

4--页表

        页表由多个页表项组成,即页表中的每一行表示一个页表项;页表项纪录的信息包括:页框号、有效位、访问位、修改位和保护位;

上述分页机制会带来以下问题:

        ① 访问一个内存单元需要 2 次的内存访问:一次用于获取页表项,一次用于访问数据;

        ② 页表很大:例如对于一个 64 位机器(逻辑地址空间为2^64),若每页的大小为 1024 字节(2^10),则一个页表的大小为 2^64 / 2^10 = 2^54 字节;

        通过 缓存 和 间接访问 的方法可以缓解页表很大的问题:

        缓存方法:TLB 缓存近期访问的页帧转换表项;

        间接访问:建立多级页表;例如二级页表,首先寻址一级列表找到对应二级页表的入口地址,当一级页表的某一页表项为空时(因为并不是所有内存都被使用),其对应的二级页表不存在,从而节省了二级页表的内存花销;

        ​​​​​​​反向页表:以帧号(f)作为 key,页号(p)作为 value,通过物理地址映射逻辑地址避免页表内存花销大的问题;

        ​​​​​​​​反向页表不依据进程的逻辑页号来生成页表,而是依据进程在内存的物理页号;即一个系统中大多数情况下都只存在一个反向页表(所有进程共同使用一张页表​​​​​​​),通过逻辑页号+进程ID进行 HASH,进而得到对应的物理页号;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值