首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

伙伴系统伙伴系统概述--Linux内存管理(十五)

在内核初始化完成之后, 内存管理的责任就由伙伴系统来承担. 伙伴系统基于一种相对简单然而令人吃惊的强大算法....内核如何记住哪些内存块是空闲的 分配空闲页面的方法 影响分配器行为的众多标识位 内存碎片的问题和分配器如何处理碎片 2 伙伴系统的结构 2.1 伙伴系统数据结构 系统内存中的每个物理内存页(页帧),都对应于一个...为快速检测内存中的连续区域, 内核采用了一种古老而历经检验的技术: 伙伴系统 系统中的空闲内存块总是两两分组, 每组中的两个内存块称作伙伴. 伙伴的分配可以是彼此独立的....但如果两个伙伴都是空闲的, 内核会将其合并为一个更大的内存块, 作为下一层次上某个内存块的伙伴. 下图示范了该系统, 图中给出了一对伙伴, 初始大小均为8页. 即系统中所有的页面都是8页的. ?...这种惯例与设计得很好的用户层应用程序没什么不同, 但在内核中忽略检查会导致严重得多的故障 内核除了伙伴系统函数之外, 还提供了其他内存管理函数. 它们以伙伴系统为基础, 但并不属于伙伴分配器自身.

3K50
您找到你想要的搜索结果了吗?
是的
没有找到

深度剖析 Linux 伙伴系统的设计与实现

伙伴系统的核心数据结构就封装在 struct zone 里,关于 struct zone 结构体的详细介绍感兴趣的朋友可以回看下笔者之前的文章 《深入理解 Linux 物理内存管理》中第五小节 “ 5...很长时间以来,物理内存碎片一直是 Linux 操作系统的弱点,所以内核在 2.6.24 版本中引入了以下方式来避免内存碎片。...伙伴必须是大小相同并且在物理内存上是连续的两个或者多个 page。 3. 伙伴系统的内存分配原理 在 《深入理解 Linux 物理内存分配全链路实现》 一文中的第二小节 " 2....但真正进入伙伴系统之前,内核还是做了很多铺垫工作,为了给大家解释清楚这些内容,我们还是需要重新回到上篇文章 《深入理解 Linux 物理内存分配全链路实现》 “5....我们都知道 Linux 管理内存的最小单位是 page,每个 page 描述 4K 大小的物理内存,但在一些内核使用场景中,比如 slab 内存池中,往往会向伙伴系统一次性申请多个普通内存页 page,

42731

伙伴系统之避免碎片--Linux内存管理(十六)

在固定分区管理算法中, 分给程序的内存空间往往大于程序所需的空间, 这剩余部分的空间不能被其他程序所用, 这就是”内部碎片” 1.2 今日内容(buddy伙伴系统如何避免碎片) Linux伙伴系统分配内存的大小要求...伙伴系统的基本原理已经在前面已经讨论过, 一个双链表即可满足伙伴系统的所有需求, 其方案在最近几年间确实工作得非常好。...只分配了4页,但可分配的最大连续区只有8页,因为伙伴系统所能工作的分配范围只能是2的幂次. ? 我提到内存碎片只涉及内核,这只是部分正确的。大多数现代CPU都提供了使用巨型页的可能性,比普通页大得多。...请注意很重要的一点, 页的迁移类型是预先分配好的, 对应的比特位总是可用, 与页是否由伙伴系统管理无关. 在释放内存时,页必须返回到正确的迁移链表。...这是将ZONE_MOVABLE集成到伙伴系统中所需的唯一改变!其余的可以通过适用于所有内存域的通用例程处理, 我们将在下文讨论

3.3K30

伙伴系统的概述

Linux内核内存管理的一项重要工作就是如何在频繁申请释放内存的情况下,避免碎片的产生。Linux采用伙伴系统解决外部碎片的问题,采用slab解决内部碎片的问题,在这里我们先讨论外部碎片问题。...因此Linux采用后者来解决外部碎片的问题,也就是著名的伙伴系统。 什么是伙伴系统伙伴系统的宗旨就是用最小的内存块来满足内核的对于内存的请求。...下面我们结合示意图来了解伙伴系统分配和回收内存块的过程。 ? 1 初始化时,系统拥有1M的连续内存,允许的最小的内存块为64K,图中白色的部分为空闲的内存块,着色的代表分配出去了得内存块。...,而struct zone中的struct free_area则是用来描述该管理区伙伴系统的空闲内存块的 struct zone { ... ......图中一共有32个页,只分配出了4个页框,但是能够分配的最大连续内存也只有8个页框(因为伙伴系统分配出去的内存必须是2的整数次幂个页框),内核解决这种问题的办法就是将不同类型的页进行分组。

91920

伙伴系统和slab机制

伙伴系统 Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表。...为了避免出现这种情况,Linux内核中引入了伙伴系统算法(buddy system)。...Buddy(伙伴的定义): 这里给出伙伴的概念,满足以下三个条件的称为伙伴: 1)两个块大小相同; 2)两个块地址连续; 3)两个块必须是同一个大块中分离出来的; Buddy算法的分配原理: 假如系统需要...slab机制 slab是Linux操作系统的一种内存分配机制。...其工作是针对一些经常分配并释放的对象,如进程描述符等,这些对象的大小一般比较小,如果直接采用伙伴系统来进行分配和释放,不仅会造成大量的内碎片,而且处理速度也太慢。

2.4K11

内存分配算法 伙伴系统

伙伴系统是常用的内存分配算法,linux内核的底层页分配算法就是伙伴系统伙伴系统的优点就是分配和回收速度快,减少外部碎片。...然后又看了一下linux4.8的buddy system实现,linux的buddy system主要进行page分配也是linux最底层的分配,其他的分配算法都是以这个分配为基础,在x86架构下一个page...linux对内存进行了分区包括低端内存区,高端内存区,dma区,而且还对numa架构做了很多处理,对页面也进行了分类,这些不是讨论的重点,现在主要是提取linux的buddy算法,只提取核心部分,可以在控制台下运行...最大的是10,也就是1024个基本单位,所以linux在x86下一次最多可分配4MB内存。  ...顺便学习下linux内核对链表的各种操作,代码实现 #include #include #include #include <assert.h

1.6K10

伙伴系统分配内存

分配掩码包含了__GFP_WAIT、__GFP_IO、__GFP_FS这三个标志位,换算成十六进制0xd0; alloc_pages()最终调用__alloc_pages_nodemask()函数,它是伙伴系统的核心函数...计算watermark水位的公式不算复杂,最后结果保存在每个zone的watermark数组中,后续伙伴系统和kswapd内核线程中用到; 回到get_page_from_freelist()函数,这里会读取...我们这里假设zone_watermark_ok()判断空闲页面充沛,接下来就会调用buffered_rmqueue()函数从伙伴系统中分配物理页面。...NULL; } 这里根据order数值兵分两路:一路是order等于0 的情况,也就是分配一个物理页面时,从zone->per_cpu_pageset列表中分配;另一路order大于0的情况,就从伙伴系统中分配...因为通常摘下来的内存块会比需要的内存大,切完之后需要把剩下来的内存块重新放回伙伴系统中。 expand()函数就是实现“切蛋糕”的功能。

1.7K10

Linux 内核 内存管理】伙伴分配器 ① ( 伙伴分配器引入 | 页块、阶 | 伙伴 )

文章目录 一、伙伴分配器引入 二、页块、阶 三、伙伴 一、伙伴分配器引入 ---- Linux 内核 初始化 完成之后 , 就会 丢弃 引导内存分配器 , 如 : bootmem 分配器 , memblock...分配器 ; 此时 , 使用 " 页分配器 “ 管理 ” 物理页 " , " 伙伴分配器 “ 就是 ” 页分配器 " , 其特点是 算法简单 , 性能高效 ; 二、页块、阶 ---- 伙伴分配器 有如下概念...2^1 = 2 个 连续的 " 物理页 " ; 2 阶页块是 2^2 = 4 个 连续的 " 物理页 " ; \vdots n 阶页块是 2^n 个 连续的 " 物理页 " ; 三、伙伴...的整数倍 ; ③ 合并页块 : 如果需要合并这两个 n 阶页块为 n + 1 阶页块 , 则第 1 页的 物理页 页号必须是 2^{n + 1} 整数倍 ; 0 页 与 1 页是伙伴...; 2 页 与 3 页是伙伴 ; 1 页 与 2 页不是伙伴 , 这两页如果合并成页块 , 其第一页的页号不是 2^{n + 1} 整数倍 ;

99320

腾讯看点投放系统介绍:推荐系统的进化伙伴

这其实是一件很难的事情,我们信息流的同学一直都在探索,其中投放系统就是探索的产物之一。 要说投放系统,推荐系统是绕不开的,因为投放系统就是为了解决推荐系统的问题而诞生的。那什么是推荐系统呢?...前端会去请求后台,后台又会去请求推荐系统,推荐系统再去内容池翻箱倒柜,找几篇这名用户最有可能喜欢的内容。那推荐系统是怎么知道用户喜欢什么类型的内容的呢?...刚刚我们一直在聊投放系统,那推荐系统和投放系统是什么关系呢? ? 首先,这两个系统有个本质的差别。...另一方面,投放系统又深刻地影响着推荐系统,我们从两个方面来看。...投放系统影响推荐系统的第二个方面是内容维度,对于一些长尾冷门的内容,我们的运营如果觉得优质的话,会通过投放系统投放出去,如果投放的目标人群比较准确,那么很快就会有很多用户阅读这些内容,推荐系统就会认为这些内容是热门内容

1.3K63

多核心Linux内核路径优化的不二法门之-slab与伙伴系统

伙伴系统 前面我们简短的体会了Linux内核的slab设计,不宜过长,太长了不易理解.但是最后,如果Level 3也没有获取page(s),那么最终会落到终极的伙伴系统。...注意,本文是关于优化的,不是伙伴系统的科普,所以我假设大家已经理解了伙伴系统。...Linux内核对伙伴系统针对单一页面的分配需求采取的批量分配“每CPU单一页面缓存”的方式!...为了维持“每CPU单一页面缓存”中页面的数量不会太多或太少(太多会影响伙伴系统,太少会影响CPU的需求),系统保持了两个值,当缓存页面数量低于low值的时候,便从伙伴系统中批量获取页面到池中,而当缓存页面数量大于...high的时候,便会释放一些页面到伙伴系统中。

1.1K30

Linux-3.14.12内存管理笔记【伙伴管理算法(3)】

前面分析了伙伴管理算法的初始化,在切入分析代码实现之前,例行先分析一下其实现原理。...伙伴管理算法(也称之为Buddy算法),该算法将所有空闲的页面分组划分为MAX_ORDER个页面块链表进行管理,其中MAX_ORDER定义: 【file:/include/linux/mmzone.h】...See . */ #ifndef CONFIG_FORCE_MAX_ZONEORDER #define CONFIG_FORCE_MAX_ZONEORDER (HPAGE_SHIFT...伙伴管理算法的释放过程是,满足条件的两个页面块称之为伙伴:两个页面块的大小相同且两者的物理地址连续。...当某块页面被释放时,且其存在空闲的伙伴页面块,则算法会将其两者合并为一个大的页面块,合并后的页面块如果还可以找到伙伴页面块,则将会继续与相邻的块进行合并,直至到大小为2^MAX_ORDER个页面为止。

97520

Linux系统|Linux系统应急响应

目录 排查用户相关的信息 排查进程端口相关的信息 查找恶意程序并杀掉 斩草除根 判断入侵方式,修复漏洞 当我们被告知一台Linux服务器被黑客入侵,黑客利用该服务器进行挖矿...w #显示已经登陆系统的用户列表,并显示用户正在执行的指令 users #显示当前登录系统的所有用户的用户列表 last #查看最近登录成功的用户及信息...,查看的是 /var/log/wtmp 文件 lastb #查看最近登录失败的用户及信息,查看的是 /var/log/btmp 文件 lastlog #显示系统中所有用户最近一次登录信息...#查看爆破用户名字典 总的来说,黑客入侵主机有下列几种情况: 通过 redis 未授权漏洞入侵(好多挖矿程序是通过这个) ssh 弱口令暴力破解 Web 程序漏洞入侵 参考文章: 记一次Linux...木马清除过程 相关文章:Redis未授权访问漏洞 Linux挖矿病毒的清除与分析 Linux下性能监控、守护进程与计划任务管理 来源:

9.5K20

Linux-3.14.12内存管理笔记【伙伴管理算法(4)】

此处承接前面未深入分析的页面释放部分,主要详细分析伙伴管理算法中页面释放的实现。页面释放的函数入口是__free_page(),其实则是一个宏定义。...具体实现: 【file:/include/linux/gfp.h】 #define __free_page(page) __free_pages((page), 0) 而__free_pages()的实现...其中order表示页面数量,如果释放的是单页,则会调用free_hot_cold_page()将页面释放至per-cpu page缓存中,而不是伙伴管理算法;真正的释放至伙伴管理算法的是__free_pages_ok...而while循环内,通过__find_buddy_index()获取与当前释放的页面处于同一阶的伙伴页面索引值,同时藉此索引值计算出伙伴页面地址,并做伙伴页面检查以确定其是否可以合并,若否则退出;接着if...最后判断当前合并的页面是否为最大阶,否则将页面放至伙伴管理链表的末尾,避免其过早被分配,得以机会进一步与高阶页面进行合并。末了,将最后的挂入的阶的空闲计数加1。 至此伙伴管理算法的页面释放完毕。

1K30

LinuxLinux系统调用

Linux系统调用 前言 操作系统——管理计算机硬件与软件资源的软件,是用户和系统交互的操作接口,为它上面运行的程序提供服务。...操作系统内核——操作系统的内核,负责管理系统的进程、内存、设备驱动程序、文件和网络系统。一个内核不是一套完整的操作系统。例如LinuxLinux操作系统——基于Linux内核的操作系统。...通常由Linux内核、shell(特殊的应用程序,提供运行其他程序的接口)、文件系统和应用程序组成。常见的有:Redhat、Fedora、Centos、Ubuntu和Android等。...Linux的运行空间: Linux的运行空间:内核空间+用户空间 ---- 内核空间——存放的是整个内核代码和所有内核模块,以及内核所维护的数据。 用户空间——用户程序的代码和数据。...---- 系统调用的实现 通过软件中断实现。 **软件中断:**它是通过软件指令触发的中断。Linux系统内核响应软件中断,从用户态切换到内核态,执行相应的系统调用。

27.8K10
领券