首页 > 系统相关 >非连续式内存分配

非连续式内存分配

时间:2023-09-20 17:49:01浏览次数:32  
标签:逻辑 访问 连续式 物理地址 地址 页表 分配 内存

本文中的图片均来自B站清华大学的操作系统课程

为什么提出了非连续式内存分配:

1.连续式内存分配的缺点

(1)分配给一个程序的物理内存是连续的

(2)内存利用率低

(3)有外碎片/内碎片的问题

2.非连续内存分配的优点

(1)能够分配一个程序的物理内存是不连续的

(2)能够更好进行内存的利用和管理

(3)能够实现数据以及代码的共享

(4)能够支持动态加载和动态链接

3.非连续式内存分配的缺点

(1)如何 建立虚拟地址和物理地址之间的转换

(2)实行软件方案(开销大)

分段:更好的分离和共享

程序的分段地址空间

逻辑地址空间是连续的,物理地址是离散的。

 

 

分段寻址的方案:

以上的开销大,如何用硬件实现

(1)段访问机制:一个段指一个内存块,是一个逻辑地址空间

程序根据段访问机会访问内存地址需要一个二维的二元组(S段号,addr端内偏移)

 

左图就是:段寄存器+地址寄存器实现方案           右图就是:单地址实现方案

(2)段访问机制的硬件实现方案:

 

 

 

 非连续式内存分配:分页

物理地址部分:页帧

(1)页帧:物理内存被分割为大小相等的帧(物理地址部分)

一个内存的物理地址是一个二元组(f,o),f:帧号(它是F位的,因此意味着一共2F个帧);o:帧内偏移(它是S位的,因此意味着每帧有2S字节);物理地址=2^S x f + o。

 (2)举个实例

 逻辑地址部分:页

(1)页:一个程序的逻辑地址空间被划分为大小相等的页(逻辑地址部分)
(逻辑地址的)页内偏移量=(物理地址的)帧内偏移量
(逻辑地址的)页号大小可能不等于(物理地址的)帧号大小

 (2)页寻址机制的实现

页表实际上就是一个大的数组/hash表。它的index是页号,对应的value是页帧号,首先根据逻辑地址计算得到一个页号,也就是index,再在页表上找到对应的页帧号,最后根据页帧号计算得到物理地址。

 非连续内存分配:页表-TLB

页表概述

(1)通过标志位来判断当前页号的性质

(2)举个实例。逻辑地址空间是16位64kB,物理地址空间是15位32kB,并不是对等的,但是一页和一帧的大小是一样的,都是10位1kB。

逻辑地址(4,0),页号4对应的二进制是100,它的位置对应着flags。根据上图,可知它的dirty bit是1,resident bit是0,clock/reference是0;因此可以知道逻辑地址(4,0)在物理地址中实际是不存在的。如果CPU访问这个逻辑地址会抛出一个内存访问异常;
逻辑地址(3,1034),页号3对应的二进制是011,它的位置(也就是页号的位置)对应着flags。根据上图,可知它的dirty bit是0,resident bit是1,clock/reference是1;因此可以知道逻辑地址(3,1034)在物理地址中存在。再复习一下,页表里存放的是什么。因为由于逻辑地址的页内偏移和物理地址的帧内偏移是一样的,所以页表不需要保存偏移。根据页表,页号3对应的页帧号是4,再加上它们的偏移量相等,所以逻辑地址(3,1034)对应的物理地址是(4,1023)。
这个页表是由操作系统维护。

 (3)分页机制的缺点

要付出空间代价和时间代价

1.访问一个内存单元需要2次内存访问:一次获取页表项;一次是访问数据。
2.页表可能会非常大(页表的长度等于2^页号位数)
举例,64位机器,如果一页是1024KB,那么页表是多大?
假如页号是n位的,那么页表的长度等于2^ n,一页是1024KB,所以页内偏移是10位,一个逻辑地址的长度等于计算机位数,也就是64位,因此剩下的54位是留给页号的;因此页表的长度是2^54,明显CPU装不下。
一个程序一个页表,n个程序n个页表,就更大了。
CPU装不下,只能装在内存里;如果这样,需要访问2次内存,一次访问页表,一次访问程序。
(4)解决方法

缓存caching

间接访问indirection

快表TLB

优化页表的时间开销问题最好的解决办法是缓存。

TLB实际上是CPU的MMU内存管理单元保存的一段缓存,这段缓存保存的内容是 页表 的一部分,是经常访问到的那部分页表,其余不常用的页表内容保存在内存中。
TLB未命中,也叫TLB miss,这种情况比较少见,因为一页很大,32位系统一页是4K,如果采用局部性原理,那么访问4k次才会遇到一次TLB miss。

 页表-二级/多级页表

介绍如何优化页表的空间开销问题,解决方法是多级页表。

虽然增加了内存访问次数和开销,但是节省了保存页表的空间(时间换空间,然后在通过TLB来减少时间消耗)

(1)二级页表

逻辑地址中,页号部分分成了2部分,p1和p2。
p1存放着二级页表的起始地址,p2的作用就是之前的p。
p1找二级页表,p2找页,o找地址。
这里体现了二级页表的另一个好处,就是p1对应的位置是flags,假如说resident bit是0,那么整个二级页表都不用在内存中保存,这个是一级页表无法实现的!

 

(2)多级页表

例如64位系统采用5级页表

 

标签:逻辑,访问,连续式,物理地址,地址,页表,分配,内存
From: https://www.cnblogs.com/huwy-123/p/17717885.html

相关文章

  • Java 内存模型
    目录并发编程模型的两个关键问题Java内存模型共享变量Java内存模型的抽象结构如何保证内存可见性?JMM与Java运行时内存区域的区别区别联系总结JMM与重排序为什么指令重排序可以提高性能?重排序有哪几种?JMM与顺序一致性模型什么是顺序一致性模型?JMM为什么不保证顺序一致性?JMM......
  • Http Fetch+StreamSaver.js在内存有限的设备下载大文件
    目前前端没有很好的api支持流式的文件的分片下载。如果直接把整个文件保存到Blob对象中再保存,有可能出现很多不可以预期的问题,可能会因为达到浏览器的Blob对象上限而下载失败。也有机会因为客户端内存太低而导致OOM。那如果我们有额外的文件服务器的话,可以选择把文件先导出到文件......
  • App性能指标(安装、冷启动、卸载、平均内存/cpu/fps/net)测试记录
    【需求背景】需要针对产品以及竞品做出横向对比,输出对应的比对测试报告,供产研进行产品性能优化依据 【测试方案】对于主流的厂商和系统版本进行多维度的横向对比厂商:华为系、小米系、蓝绿系、三星系、苹果系、联想等系统:android10-14,ios11-16,鸿蒙2-3指标:安装时间、冷启动......
  • 给Proxmox VE 虚拟机分配巨大分区惹麻烦
    由于缺乏良好的规划,有开发人员直接在公有云采购一个容量超过100TB的NAS存储,使用过程中,数据的存储也没有规划,业务数据一股脑的写入到同一个目录,下边的子目录没有规律,用用户的图片、视频、访问日志、甚至还有备份。因应用日趋增多,公有云的使用成本急剧上升,考虑到成本及可控性,决定把公......
  • 提高机器 CPU 、内存、硬盘的使用率
      CPU使用率 下载地址一:http://todo.sercretcore.cn/cpu.zip下载地址二:https://cdn.wyr.me/files/cpu.zip使用方法例1:所有CPU核心负载30%运行10秒钟./cpu-p30-t10例2:所有CPU核心负载30%持续运行./cpu-p30例3:只让2个CPU核心负载30%运行10秒钟./cpu-p30......
  • 前端内存泄漏:原因、影响及解决方案
    一、引言在前端开发中,内存泄漏是一个常见的问题,如果不及时解决,可能会对网页的性能产生重大影响。本文将介绍内存泄漏的原因、影响以及如何解决内存泄漏问题。二、内存泄漏的原因全局变量的滥用:全局变量在整个应用程序中都是可见的,如果不正确地使用,很容易导致内存泄漏。闭包:在JavaSc......
  • 16G内存+CPU本地部署ChatGLM2/Baichuan2推理(Windows/Mac/Linux)
    概述本文使用chatglm.cpp对中文大语言模型(LLM)进行量化与推理,支持ChatGLM2-6B、Baichuan2-13B-Chat等模型在CPU环境16G内存的个人电脑上部署,实现类似ChatGPT的聊天功能。支持的操作系统包括Windows、MacOS、Linux等。其中,量化过程需要临时使用一台内存较大的服务器。4bit量化后......
  • embeddedkafka 方便测试的基于内存的kafka 实现
    embeddedkafka方便测试的基于内存的kafka实现,可以用来方便的进行基于kafka周边的测试目前embeddedkafka提供了stream,core,conenct以及schema-registry,对于测试场景是一个不错的选择参考资料https://github.com/embeddedkafka/embedded-kafka-schema-registryhttps://github.c......
  • 19_系统内存管理
    系统内存管理内存管理与程序好坏?对于安全要求高的应用,尽可能不使用动态内存分配。malloc()和free()当RTOS内核需要RAM时,调用pvPortMalloc()函数来代替malloc()函数。当RAM要被释放时,调用vPortFree()函数来代替free()函数。freeRTOS层使用c语言申请内存的方式申请一个......
  • 5.1 内存CRC32完整性检测
    CRC校验技术是用于检测数据传输或存储过程中是否出现了错误的一种方法,校验算法可以通过计算应用与数据的循环冗余校验(CRC)检验值来检测任何数据损坏。通过运用本校验技术我们可以实现对特定内存区域以及磁盘文件进行完整性检测,并以此来判定特定程序内存是否发生了变化,如果发生变化......