非连续内存分配

简介: 非连续内存分配

非连续内存分配


为什么要非连续内存分配?

  • 分段
  • 分页
  • 页表


连续内存分配的缺点:

  • 分配给一个程序的物理内存是连续的
  • 内存利用率较低
  • 有外碎片,内碎片的问题


非连续分配的优点:

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


非连续分配的缺点:

  • 如何简历虚拟地址和物理地址的转换
  • 软件方案
  • 硬件方案


硬件方案


分段


  • 程序的分段地址空间
  • 分段寻址方案
  • 一个段一个内存“块”:一个逻辑地址空间
  • 一个二维的二元组(s, addr):s 一个段号,addr 一段内偏移


分页


  • 分页地址空间
  • 划分物理内存至固定大小的帧:大小是2的幂
  • 划分逻辑地址空间至相同大小的页:大小是2的幂
  • 建立方案 转换落地地址为物理地址:
  • 页表
  • MMU/TLB
  • 帧:物理内存被分割成大小相等的帧
  • 页:一个程序的逻辑地址空间被划分为大小相等的页
  • 页寻址方案
  • 页表保存了逻辑地址-物理地址之间的映射关系
  • 页寻址机制
  • 页映射到帧
  • 页是连续的虚拟内存
  • 帧是非连续的物理内存
  • 不是所有的页都有对应的帧


页表


  • 每一个运行的程序都有一个页表


属于程序运行状态,会动态变化

PTRB:页表基址寄存器


  • 分页机制的性能问题:


访问一个内存单元需要2次内存访问:

一次用于获取页表项

一次用于访问数据


页表可能非常大

64位机器如果每页1024字节,那么一个页表大小会是多少?


如何处理:


缓存 TLB


缓存TLB使用associative memory 关联内存实现,具备快速访问性能

如果TLB命中,物理页号可以很快被获取

如果TLB未命中,对应的表项被更新到TLB中(跟CPU有关,可能由操作系统或者是硬件来实现)

间接访问

多级页表:通过把页号分为k个部分,来实现多级间接页表

建立页表


大地址空间问题


有大地址空间,前项映射页表变的繁琐


不是让页表与逻辑地址空间的大小相对应,而是让页表与物理空间的大小相对应


  • 基于页寄存器的方案


每个帧和一个寄存器关联,寄存器包括哟

residence bit 此帧是否被使用

occupier 对应的页号p

protection bits 保护位


  • 优点
  • 转换表的代销相对于物理内存来说很小
  • 转换表的大小和逻辑地址大小无关
  • 缺点
  • 需要的信息对调了,即根据帧号可找到页号
  • 如何转换回来?
  • 在需要的反向页表中搜索想要的页号


  • 使用关联内存的方案
  • 基于hash计算的查找方案
目录
相关文章
|
6天前
|
人工智能 Java 5G
常见的Java内存溢出情况和实例
常见的Java内存溢出情况和实例
|
6天前
|
存储 算法 大数据
内存原理 | 内存分配 | 内存对齐
内存原理 | 内存分配 | 内存对齐
|
6天前
|
存储 程序员 编译器
【C/C++ 堆栈以及虚拟内存分段 】C/C++内存分布/管理:代码区、数据区、堆区、栈区和常量区的探索
【C/C++ 堆栈以及虚拟内存分段 】C/C++内存分布/管理:代码区、数据区、堆区、栈区和常量区的探索
46 0
|
6天前
|
缓存 Linux
内存学习(八):块分配器1
内存学习(八):块分配器1
40 0
八、OS非连续内存分配
八、OS非连续内存分配
八、OS非连续内存分配
七、OS连续内存分配
七、OS连续内存分配
七、OS连续内存分配
|
存储 IDE 编译器
函数内部分配的buffer过大导致堆栈溢出
函数内部分配的buffer过大导致堆栈溢出
373 0
函数内部分配的buffer过大导致堆栈溢出
|
安全 C++
C++指针的内存分配与内存安全
C++指针的内存分配与内存安全
109 0
|
容器
一.空间分配器
# 一.空间分配器 ### 分配内存: * 当容器需要空间来存放元素时,需要空间配置器(也就是分配器)分配内存,当分配的内存大于128个字节时,调用第一级配置器,调用malloc为其分配内存,当分配内存小于128个字节时,调用第二级配置器,检查对应的free-list上是否有可用区块,如果有的话,直接拿来用,如果没有的话调用rfill。
68 0
|
Java
常见的java内存溢出情况
常见的java内存溢出情况
134 0