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的次数

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

    关注

    3

    文章

    1376

    浏览量

    40319
  • Linux
    +关注

    关注

    87

    文章

    11319

    浏览量

    209822
收藏 人收藏

    评论

    相关推荐

    Linux下如何管理虚拟内存 使用虚拟内存时的常见问题

    Linux系统,虚拟内存管理是操作系统内核的一个重要功能,负责管理物理内存和磁盘上的交换空间。以下是对
    的头像 发表于 12-04 09:19 478次阅读

    什么是虚拟内存分页 Windows系统虚拟内存优化方法

    内存有限的情况下。 虚拟内存的作用 内存扩展 :虚拟内存允许系统使用硬盘空间作为额外的内存,从而
    的头像 发表于 12-04 09:16 401次阅读

    虚拟内存不足如何解决 虚拟内存物理内存的区别

    虚拟内存不足的解决方案 虚拟内存不足是计算机用户经常遇到的问题,尤其是在运行大型软件或多任务处理时。以下是一些解决虚拟内存不足问题的方法: 增加物理
    的头像 发表于 12-04 09:14 467次阅读

    求助,关于LM386芯片内ESD保护电路设计和引脚分配情况求解

    2、3输入引脚和1、7、8控制引脚和5输出引脚都共用这一个ESD保护电路呢? 如能介绍LM386芯片内ESD保护电路设计和引脚分配情况,将不胜感激!
    发表于 09-30 06:22

    逻辑内存物理内存的区别

    逻辑内存物理内存是计算机系统两个重要的概念,它们在计算机的运行和数据处理起着至关重要的作用。 1.
    的头像 发表于 09-27 15:38 770次阅读

    转载 golang内存分配

    Go 的分配采用了类似 tcmalloc 的结构.特点: 使用一小块一小块的连续内存页, 进行分配某个范围大小的内存需求. 比如某个连续 8KB 专门用于
    的头像 发表于 09-05 14:12 279次阅读
    转载 golang<b class='flag-5'>内存</b><b class='flag-5'>分配</b>

    内存管理的硬件结构

    常见的内存分配函数有malloc,mmap等,但大家有没有想过,这些函数在内核是怎么实现的?换句话说,Linux内核的内存管理是怎么实现的
    的头像 发表于 09-04 14:28 340次阅读
    <b class='flag-5'>内存</b>管理的硬件结构

    Linux内核的页面分配机制

    Linux内核是如何分配出页面的,如果我们站在CPU的角度去看这个问题,CPU能分配出来的页面是以物理页面为单位的。也就是我们计算机中常讲
    的头像 发表于 08-07 15:51 309次阅读
    <b class='flag-5'>Linux</b>内核<b class='flag-5'>中</b>的页面<b class='flag-5'>分配</b>机制

    FreeRTOS如何在中断调用内存分配函数?

    最近在玩FreeRTOS,遇到一个问题,就是不知如何在中断调用内存分配函数。pvPortMalloc函数中会调用xTaskResumeAll,而这个函数不能再中断调用,所以请问在中断中进行
    发表于 05-08 08:25

    物理内存模型的演变

    内存管理概述,主要是以Linux v2.6.11为例进行分析的,但是计算威廉希尔官方网站 在不断发展,新的存储架构、新的指令集架构、新的SoC架构等都对物理内存
    的头像 发表于 02-25 10:35 487次阅读

    Linux内核内存管理之内核非连续物理内存分配

    的主要优点是避免了外部碎片,而缺点是需要修改内核页表。显然,非连续内存区域的大小必须是4096的倍数。Linux使用非连续物理内存区的场景有几种:(1)为swap区
    的头像 发表于 02-23 09:44 1009次阅读
    <b class='flag-5'>Linux</b>内核<b class='flag-5'>内存</b>管理之内核非连续<b class='flag-5'>物理</b><b class='flag-5'>内存</b><b class='flag-5'>分配</b>

    Linux内核内存管理之ZONE内存分配

    内核中使用ZONE分配器满足内存分配请求。该分配器必须具有足够的空闲页帧,以便满足各种内存大小请求。
    的头像 发表于 02-21 09:29 916次阅读

    幅频特性和相频特性的具体物理意义是什么?

    幅频特性和相频特性的具体物理意义是什么? 幅频特性和相频特性是信号处理中非常重要的概念之一。它们描述了信号在频域中的幅度和相位随频率变化的情况,这对于分析和设计滤波器、调制解调器、等等具有至关重要
    的头像 发表于 02-05 09:08 6212次阅读

    拆解mmap内存映射的本质!

    mmap 内存映射里所谓的内存其实指的是虚拟内存,在调用 mmap 进行匿名映射的时候(比如进行堆内存分配),是将进程虚拟
    的头像 发表于 01-24 14:30 1803次阅读
    拆解mmap<b class='flag-5'>内存</b>映射的本质!

    linux内核主要由哪几个部分组成,作用是什么

    Linux内核主要由以下几个部分组成: 进程管理:Linux内核负责管理和调度系统的进程。它通过进程调度算法来决定哪个进程在什么时间运行以及如何分配系统资源。
    的头像 发表于 01-22 14:34 2715次阅读