0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何解决内存碎片与内存交换效率慢的问题

麦辣鸡腿堡 来源:程序猿阿星 作者:程序猿阿星 2023-10-09 16:57 次阅读

内存分页

分段的好处是能产生连续的内存空间,但是会出现大量内存碎片与内存交换效率低的问题

先思考一下怎么解决这两个问题,内存碎片是由多个不连续的小物理内存空间造成,如果把这些不连续的小物理内存空间组合起来,是不是解决了这个问题?同样的,内存交换的时候我们保证交换的数据小,是不是能提高内存交换的效率?

这个办法就是内存分页,分页是把整个虚拟与物理空间切成一段段固定尺寸的大小,这样一个连续并且尺寸固定的空间,我们叫页,在 Linux 下,每一页的大小为4KB。(虚拟空间是指存储一套虚拟地址的空间)

虚拟地址与物理地址是通过页表来映射,虚拟空间内的虚拟地址一定是连续的,物理地址不一定,但可以通过连续的虚拟地址把多个不连续的物理内存组合使用。

图片

而当进程访问的虚拟地址在页表中查不到时,系统会产生一个缺页异常,进入系统内核空间分配物理内存、更新进程页表,最后再返回用户空间,恢复进程的运行。

分页方式是如何解决内存碎片与内存交换效率慢的问题呢?内存碎片的解决:

因为使用内存的单位变成固定大小的页,所以每个程序的虚拟空间维护的也是连续的页(虚拟地址),通过页表再映射到物理内存页,虽然映射的物理内存页不连续,但是虚拟空间是连续的,可以让它们组合起来使用,但这也只能解决外部内存碎片问题,没有解决内部内碎片问题,因为每页都有固定大小,可能某一页只使用了部分,依然会造成一些浪费。

内存交换效率慢的解决:

之前说过,减少交换数据的大小,可以提高内存交换效率,分页方式是这样解决的,如果内存空间不够时,操作系统会把其他正在运行的进程中的「最近没被使用」的内存页释放掉,也就是加载到硬盘,称为换出,一旦需要的时候再加载进来,称为换入。所以一次性写入硬盘的也只有一个页或几个页,内存的交换效率自然就提升了。

分页方式使加载程序的时候,不再需要一次性都把程序加载到物理内存中。完全可以在进行虚拟内存和物理内存的页之间的映射之后,并不真的把页加载到物理内存里,而是只有在程序运行中,需要用到对应虚拟内存页里面的指令和数据时,再加载到物理内存里面去(用大白话说,当你需要用到的时候才会去使用对应的物理内存)。

在内存分页方式下,虚拟地址和物理地址是如何映射的?

在分页机制下,每个进程都会分配一个页表,虚拟地址会分为两部分,页号和页内偏移量,页号作为页表的索引,页表包含物理页每页所在物理内存的基地址,页内偏移量+物理内存基地址就组成了物理内存地址,如下图所示

图片

就是下面这几步

页号找到页表中的页项

获取页项的物理页号基地址

偏移量+物理页号基地址计算出物理内存地址

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6512

    浏览量

    87601
  • 内存
    +关注

    关注

    8

    文章

    2767

    浏览量

    72771
  • 操作系统
    +关注

    关注

    37

    文章

    6288

    浏览量

    121887
  • 地址
    +关注

    关注

    1

    文章

    31

    浏览量

    10606
收藏 人收藏

    评论

    相关推荐

    C语言malloc申请内存时的碎片问题

    解决问题:malloc在申请内存的时候,内存碎片问题会导致原本内存大小足够,却申请大内存失败。
    发表于 08-06 16:58 1014次阅读
    C语言malloc申请<b class='flag-5'>内存</b>时的<b class='flag-5'>碎片</b>问题

    嵌入式系统中内存碎片产生过程说明

    在嵌入式系统中,内存是十分有限而且是十分珍贵的,用一块内存就少了一块内存,而在分配中随着内存不断被分配和释放,整个系统内存区域会产生越来越多
    发表于 09-21 12:22 270次阅读
    嵌入式系统中<b class='flag-5'>内存</b><b class='flag-5'>碎片</b>产生过程说明

    请问mymalloc会产生内存碎片吗?

    malloc申请内存在释放后,会产生内存碎片,所以UCOSIII内有专门的内存申请。原子哥视频(UCOSIII视频19讲)最后的时候说可以用原子哥自己的mamalloc函数来申请
    发表于 10-16 04:35

    如何避免内存碎片的产生

    考试题型:单选 8 道,不定项 2 道,编程 2 道,问答 1 道考点:进程间通讯的方式,linux的基本指令(考了grep,chmod),根据代码给出运行的结果问答题:简述内存碎片的定义,如何避免
    发表于 12-21 07:50

    基于内存交换的网闸系统研究

    本内容详细介绍了基于内存交换的 网闸 系统研究
    发表于 06-10 16:43 22次下载
    基于<b class='flag-5'>内存</b><b class='flag-5'>交换</b>的网闸系统研究

    虚拟内存是什么_虚拟内存有什么用

    虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存
    发表于 11-01 10:03 9598次阅读
    虚拟<b class='flag-5'>内存</b>是什么_虚拟<b class='flag-5'>内存</b>有什么用

    基于线段树的内存管理方法

    现有的内存管理的工作多集中在内存分配的效率上,实时性较好,但易产生内存碎片。为此,提出基于线段树的高效
    发表于 12-27 14:06 2次下载
    基于线段树的<b class='flag-5'>内存</b>管理方法

    如何避免Linux的物理内存碎片

    Linux buddyy系统是linux kernel比较稳定的一个模块,但是并不是说它没有缺陷,Linux内存管理系统自诞生之日,就一直存在物理内存碎片化的问题:在系统启动并且运行很长一段时间
    的头像 发表于 05-01 16:43 5243次阅读
    如何避免Linux的物理<b class='flag-5'>内存</b><b class='flag-5'>碎片</b>化

    虚拟内存是什么意思

    虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存
    的头像 发表于 03-14 14:50 6908次阅读

    你知道linux kernel内存碎片防治技术?

    Linux kernel组织管理物理内存的方式是buddy system(伙伴系统),而物理内存碎片正式buddy system的弱点之一,为了预防以及解决碎片问题,kernel采取了
    发表于 05-10 10:59 822次阅读

    OPPO内存碎片化引擎的作业

    OPPO宣传的内存碎片化引擎是个什么东西?它有何作用?针对上述问题,ColorOS官方微博特地发文科普,我们一起来看看。
    的头像 发表于 03-15 16:20 3441次阅读

    探索内存交换的新出路

    内存交换技术是当内存紧缺的时候,将内存中的页面交换交换设备中(如zRAM,SSD等)。随着SS
    的头像 发表于 07-26 09:11 463次阅读
    探索<b class='flag-5'>内存</b><b class='flag-5'>交换</b>的新出路

    FreeRTOS内存碎片是怎么来的

    内存碎片 在看 FreeRTOS的内存分配方法之前我们先来看一下什么叫做内存碎片,看名字就知道是小块的、
    的头像 发表于 07-30 10:29 554次阅读
    FreeRTOS<b class='flag-5'>内存</b><b class='flag-5'>碎片</b>是怎么来的

    什么是内存碎片Linux

    什么是内存碎片内存碎片在Linux很早的时候就已经出现了,了解早期内存碎片产生的历史,有利于
    的头像 发表于 10-08 10:12 373次阅读
    什么是<b class='flag-5'>内存</b><b class='flag-5'>碎片</b>Linux

    内存分段是如何产生内存碎片

    内存分段 程序包含若干个逻辑分段,如可由代码段、数据段、栈段、堆段组成,每个分段都有不同的属性,所以内存以分段的形式把这些段分离出来进行管理 在内存分段方式下,虚拟地址和物理地址是如何映射的? 分段
    的头像 发表于 10-09 16:28 637次阅读
    <b class='flag-5'>内存</b>分段是如何产生<b class='flag-5'>内存</b><b class='flag-5'>碎片</b>的