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

    文章

    1474

    浏览量

    43088
  • Linux
    +关注

    关注

    88

    文章

    11806

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    LuatOS的内存分配机制

    不同 LuatOS 硬件平台在内存布局上存在差异,Lua 运行内存、系统内存与 PSRAM 扩展内存分配方式各有区别。部分型号将系统与脚本
    的头像 发表于 04-16 12:37 62次阅读
    LuatOS的<b class='flag-5'>内存</b><b class='flag-5'>分配</b>机制

    Linux内核伙伴系统内存申请函数详解:从原理到实战

    Linux 内核内存管理是整个系统稳定运行的基石,而伙伴系统(Buddy System) 作为内核物理内存
    的头像 发表于 02-10 16:58 3717次阅读
    <b class='flag-5'>Linux</b>内核伙伴系统<b class='flag-5'>内存</b>申请函数详解:从原理到实战

    Linux内核大块内存申请:从场景到落地全解析

    网卡、硬盘等外设的 DMA 控制器,要求内存物理地址连续(无法识别虚拟地址映射),且需一次性分配大尺寸缓冲区(如 1GB 网络帧缓存)。
    的头像 发表于 02-09 16:41 781次阅读
    <b class='flag-5'>Linux</b>内核大块<b class='flag-5'>内存</b>申请:从场景到落地全解析

    Linux下扩充Swap交换空间:解决内存不足的实用指南,这些影响要注意!

    大家在使用 Linux 系统(比如常用的 Ubuntu)时,是不是偶尔会遇到 “内存不足” 的弹窗?比如运行大型编译任务、多开虚拟机、做数据分析,或者把 Linux 当服务器用的时候,物理
    的头像 发表于 02-09 16:33 501次阅读
    <b class='flag-5'>Linux</b>下扩充Swap交换空间:解决<b class='flag-5'>内存</b>不足的实用指南,这些影响要注意!

    【「Linux 设备驱动开发(第 2 版)」阅读体验】充分发挥硬件潜力

    地址转换以匹配相应的物理内存Linux系统,内核的每个进程都表示为一个task_struct结构体实例,该结构体实例表征并描述了这个
    发表于 02-04 22:30

    RK平台Linux IOMMU开发:从原理到实战

    在瑞芯微(RK)芯片的 Linux 开发,IOMMU(输入输出内存管理单元)是个关键部件 —— 它能实现设备虚拟地址(IOVA)与物理地址的转换,还能控制读写权限、处理缺页 / 总线
    的头像 发表于 02-04 16:24 2657次阅读
    RK平台<b class='flag-5'>Linux</b> IOMMU开发:从原理到实战

    Linux如何防止内存冲突?

    在聊这个话题之前,我们先回忆一下单片机系统是如何分配内存的?如果没有bootloader,那硬件环境起来之后就直接进入主程序运行,如果有引导程序bootloader,那就需要设置好跳转地址,否则设置不对,系统就无法启动了。
    的头像 发表于 01-30 16:51 1424次阅读
    <b class='flag-5'>Linux</b>如何防止<b class='flag-5'>内存</b>冲突?

    Linux如何修改ddr的分配容量

    在 U-Boot 修改 DDR 容量通常涉及以下几个步骤,尤其是在嵌入式系统,当更换或升级DDR内存芯片后:
    的头像 发表于 01-30 16:49 1532次阅读

    keilc语言的动态分配内存

    。 由于上述两种情况,该函数在使用时就需要注意,看下面的代码: 在使用realloc时我们要注意上述代码隐藏的风险。 2.常见的动态内存分配错误动态
    发表于 01-21 06:04

    【「Linux 设备驱动开发(第 2 版)」阅读体验】+读深入理解Linux内核内存分配

    每个内存地址是虚拟的,不是直接指向RAM的任何地址。当用户访问内存的存储单元时,都会进行地址转换以匹配相应的物理
    发表于 01-16 20:05

    嵌入式系统,动态分配内存可能发生的问题是什么?

    尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从堆(heap)动态分配内存的过程的。 那么嵌入式系统,动态分配
    发表于 12-22 09:42

    rk基于linux/android内存管理

    内存整体使用布局如下,以 ARM64 为例(常规情况):     上表的 Start Addr Offset 一栏表示基于 DDR base 的地址偏移; Fastboot 地址和大小由
    的头像 发表于 12-15 10:42 279次阅读
    rk基于<b class='flag-5'>linux</b>/android<b class='flag-5'>内存</b>管理

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

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

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

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

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

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