首页 > 其他 > 详细

非连续内存分配

时间:2020-06-29 22:01:20      阅读:68      评论:0      收藏:0      [点我收藏+]

非连续内存分配

非连续分配的优点

  • 一个程序物理地址空间是非连续的
  • 更好的内存利用和管理
  • 允许共享代码与数据
  • 支持动态加载和动态链接

缺点:

  • 如何建立虚拟地址和物理地址之间的转换
    • 软件方案(开销过大)
    • 硬件方案
      • 分段
      • 分页

1、分段

  • 分段地址空间
  • 分段寻址
  1. CPU 收到 段号和偏移
  2. 段号若大于等于段表长度,则错误
  3. 偏移若大于等于段长 ,则错误
  4. 基址+偏移为物理地址

2、分页

与分段的区别:

  • 段长可变,而页长不可变(一般为2的幂)
  • 划分逻辑地址空间至与物理内存至相同的页(方便硬件实现)
  • 逻辑转物理方案
    • 页表
    • MMU(内存管理单元-CPU重要组成部分/TLB(快表)

帧(Frame)---物理地址

一个内存物理地址是一个二元组(f,0)

f------帧号(F位,共有2^F个帧)

o-----帧内偏移(S位,,没帧2^S字节)

物理地址 = f*2^S+o;

例如 16-bit地址空间,9-bit大小的页帧,

物理地址:(3,6)

物理地址= 1542


页(page)---逻辑地址

页内偏移大小=帧内偏移大小

页号大小<>帧号大小

一个逻辑地址是一个二元组(p,0)

p--- 页号(P位,2^P个页)

o---页内偏移(S位,每页有2^S字节)

逻辑地址= 2^S*p+o

页寻址机制:

  1. CPU得到(页号,页内偏移)
  2. 由页号对照页表得到页帧号
  3. 由页帧号以及页内(页帧内)偏移得到物理地址

页表:

就是一个大数组:

页表项内容:帧号,标志位

问题:

1、一个内存单元需要两次访问

2、页表可能非常大


TLB:

Key Value

速度快,代价高,记录经常访问的页表项,

当CPU得到逻辑地址,先查CPU中TLB,查不到再查内存中页表。

二级页表:

CPU得到一级页表号以及对应的二级页表号和偏移,从而得到页帧号(物理地址)。

由于一些没有在内存中的页表可以不占用空间,所有想对一级页表会省空间,而相应代价是访问时间提高,配合TLB使用会更好。

反向页表

由于正常的页表使用时会和逻辑地址大小会有对应关系的,逻辑空间越大,对应页表项越多。

使用反向页表时,会和物理地址空间大小建立对应关系。

页表是由页帧号对应页号。

使用页寄存器:

每个帧和一个寄存器关联,寄存器内容包括:

residence:此帧是否占用

对应页号p

保护位

例子:

物理内存大小:4K*4K = 16MB

页面大小:4k

页帧数:16/4 = 4k

页寄存器使用空间:(假设一个寄存器大小为8byte)

? 8*4k = 32k

页寄存器开销:32k/16m=0.2%

虚拟内存大小:任意

利:

? 转换表的大小相对于物理内存来说很小

? 转换表的大小跟逻辑地址空间大小无关

弊:

? 需要信息对调,即根据帧号可找到页号

? 如何转换为 根据页号找到帧号

? 需要在反向页表中搜索想要的页号

解决方案:

  1. 关联存储器

  2. 哈希

?

非连续内存分配

原文:https://www.cnblogs.com/deusjin/p/13210497.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!