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

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

3天内不再提示

Linux中的物理内存的具体分配情况

454398 来源: Chinaunix 作者:StolennnXB 2020-09-23 11:26 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Linux当中,物理内存的划分之前已经写过一篇了,今天来讲讲内存的具体分配

首先,内存被分成一个一个的节点,每个节点由不同的区域组成,当在区域内部需要使用物理内存的时候,就是今天要讲的伙伴系统登场的时候了。

首先,各个内存区域的空闲可用物理内存被分割成一个一个的链表,每个链表当中的元素表示的空闲页的大小都是相同的,且都是2的整数次幂,这一个个的链表,就按照整数次幂(之后叫order)的大小排列在一个数组当中。

当系统需要分配一个大小为k的空间的时候,会先将k按照2^order对其,之后就会先从本地节点上,按照order从小到达的次序去遍历各个链表,直到找到刚好匹配。如果没有刚好匹配,则需要在更大的链表上拿下一个更大块的内存,取出自己需要的之后,还要将剩下的部分塞回到对应order的链表之上。如果当前节点的所有链表均没有匹配,则需要在其他节点上“远程调度”,这种情况对应的消耗会比较大。

以上就是简单的讲述了伙伴系统的功能,其分配的基本单位是页,一般为4k

由于buddy-system的基本单位为4k,但是内核当中的数据结构没有那么大,而且频繁分配释放也会造成大量不必要的消耗,这时候就需要slab分配器出场了(它在嵌入式的兄弟叫slob,大型机上的兄弟较slub),其实slab的功能不仅仅是一个分配器,也是一个缓存管理器,其运行在伙伴系统之上。我们熟知的task_struct等很多内核结构都是由它来管理的。

当我们要申请一个slab缓存的时候,需要制定要缓存的固定类型,比如task_struct,这样,当slab拿到物理内存的时候,它就会把整块的内存排好,只用于存放task_struct,其他的数据类型也一样,另外,所有的slab缓存是通过链表连在一起的。

当确定了slab缓存的类型之后,它就会根据固定类型的数据长度,选取对齐位置,选择和是的padding进行对其,这个padding可以用来设置一些下一个空闲量偏移之类的东西。

这样,当内核需要用到某一种数据类型的时候,就会先根slab去要,slab如果没有,slab就会去找buddy-system,拿到物理内存之后,就按照请求划分,返回调用方想要的。

如果是释放固定的类型,也不是直接返还给物理内存,slab依旧持有,方便下一次调用的是时候,直接从缓存拿,而较少调用buddy-system的次数

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

    关注

    4

    文章

    1436

    浏览量

    42492
  • Linux
    +关注

    关注

    88

    文章

    11628

    浏览量

    217987
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Linux Swap交换空间详解:Android编译内存不足?这样扩充立竿见影

        在  Linux  系统使用过程,你是否遇到过  “ 内存不足 ”  的报错?比如编译  Android  源码时,明明按教程操作,却因物理
    的头像 发表于 12-06 08:10 3178次阅读

    FLASH的代码是如何得到运行的呢

    指令的地址。正常情况下自动加“4”,遇到分支跳转的时候,由跳转指令设置值。那么指针是什么?指针是一个变量的地址,在含有操作系统(比如Linux、Windows)即硬件层面含有内存管理单元(MMU)的
    发表于 12-04 08:06

    从代码执行看单片机内存分配

    怎么分配和存储的,这些问题都和内寸有关系。 首先,单片机的内存可以大小分为ram和rom,这里就不再解释ram和rom的区别了,我们可以将其等效为flash和sram,其中根据flash和sram的定义
    发表于 12-02 07:58

    为什么单片机很少使用malloc,而PC程序频繁使用呢?

    (如Linux、Windows)会通过虚拟内存内存分页和内存保护机制管理内存,极大地降低了由于动态分配
    发表于 11-20 06:55

    请问e203定义的地址空间是虚拟地址还是物理地址?

    蜂鸟e203实现的是物理地址,硬件端与软件端的地址分配相同,从而确定软件开发过程能操作底层寄存器。 硬件端:在总线分发模块sirv_icb1to16_bus定义好各个端口寄存器的地址区间, 软件端
    发表于 11-11 06:20

    RTThread线程退出后rt_malloc动态创建的资源没有释放怎么解决?

    测试过程,在一个线程中用rt_malloc动态创建4KB的资源,在线程运行过程中用rt_thread_delete()使线程退出,用memtrace查看内存分配情况,动态创建的4KB的资源仍然存在
    发表于 10-13 07:06

    FAQ_MA35_Family M4 RAM如何调整M4的内存分配

    FAQ_MA35_Family M4 RAM如何调整M4的内存分配
    发表于 09-02 06:07

    如何使用LAX_CODEGEN启用动态内存分配

    我目前正在探索NXP_MBDToolbox_LAX。lax_codegen 生成的代码基于静态分配。我想管理大型向量,如何使用 LAX_CODEGEN 启用动态内存分配
    发表于 04-10 08:09

    如何查看S32DSS32平台的内存分配

    大家好,我正在使用 s32DS for s32 平台,我想查看我的项目的内存分配。我想知道分配给对象的内存以及它们被分配到哪里,例如 SRA
    发表于 04-09 07:30

    golang内存分配

    作者:钱文 Go 的分配采用了类似 tcmalloc 的结构.特点: 使用一小块一小块的连续内存页, 进行分配某个范围大小的内存需求. 比如某个连续 8KB 专门用于
    的头像 发表于 03-31 15:00 384次阅读
    golang<b class='flag-5'>内存</b><b class='flag-5'>分配</b>

    Nand flash 和SD卡(SD NAND)存储扇区分配表异同

    软件界面中找到 SD 卡对应的磁盘。 右键点击该磁盘,选择 “打开分区表” 选项,即可查看 SD 卡的分区表信息,包括存储扇区的分配情况。在分区表,可以看到每个分区的起始扇区、结束扇区、扇区总数等
    发表于 03-13 10:45

    hyper v 内存,hyper v 内存设置的操作步骤和方法是什么?

    在利用Hyper-V搭建和管理虚拟机的过程,合理设置虚拟机的内存至关重要。内存分配是否恰当,会直接影响到虚拟机的运行性能和稳定性。若内存
    的头像 发表于 01-24 15:22 1104次阅读
    hyper v <b class='flag-5'>内存</b>,hyper v <b class='flag-5'>内存</b>设置的操作步骤和方法是什么?

    hyper 内存,Hyper内存:如何监控与优化hyper-v虚拟机的内存使用

    :如何监控与优化hyper-v虚拟机的内存使用。    在虚拟化环境,合理监控和优化Hyper-V虚拟机的内存使用对于提升性能和资源利用率至关重要。本文将详细介绍如何监控Hyper-V虚拟机的
    的头像 发表于 01-24 14:15 1681次阅读
    hyper <b class='flag-5'>内存</b>,Hyper<b class='flag-5'>内存</b>:如何监控与优化hyper-v虚拟机的<b class='flag-5'>内存</b>使用

    信道分配算法在通信中的应用

    算法是指在通信系统,如何将有限的信道资源分配给用户,以满足他们的通信需求,同时最大化频谱利用率和系统容量。这些算法需要考虑的因素包括信道的物理特性、用户的服务质量要求、信道的可用性等。 信道
    的头像 发表于 01-22 16:22 1188次阅读

    Linux服务器卡顿救星之一招释放Cache内存

    在程序运行结束后不会自动释放。这可能会导致程序频繁读写文件后可用物理内存变得很少,必要时(比如内存确实不够用),需要主动释放缓存内存。 注意:一般
    的头像 发表于 01-16 10:04 2162次阅读