Linux内存分配机制之伙伴系统和SLAB

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6539590.html 

    内核内存管理的一项重要工作就是如何在频繁申请释放内存的情况下,避免碎片的产生。这就要求内核采取灵活而恰当的内存分配策略。通常,内存分配一般有两种情况:大对象(大的连续空间分配)、小对象(小的空间分配)。针对不同的需求,Linux分别采取了伙伴系统算法和SLAB进行内存分配。

    伙伴系统:把所有的空闲页框分为11个块链表,每个块链表中的结点分别是大小为1,2,4,8,16,32,64,128,256,512和1024个连续页框的页框块。最大的页框块包含1024个连续页框,对应4MB大小的连续内存。假设要申请一个256个页框的块,则先从结点为256个连续页框块的链表中查找空闲块,如果没有,就去512个页框的链表中找,找到了则将页框块分为2个256个页框的块,一个分配给应用,另外一个移到256个页框的链表中。如果512个页框的链表中仍没有空闲块,继续向1024个页框的链表查找—分割—分配和转移。如果仍然没有,则返回错误。使用过的页框块在释放时,会主动将两个连续的页框块合并为一个较大的页框块,然后作为结点插入相应规格的链表中。

    伙伴系统很好地解决了外部碎片(页框之间的碎片)问题:

    如图,当前内存段中空闲的页框最大不过连续3个页框。如果此时申请4个连续页框大小的内存则只能去更大的空闲内存处截取了,久而久之,这些页框之间留下的空隙就成为了外部碎片。而伙伴系统对这些外部碎片进行管理(分配、合并),使得内存中的页框能尽量得到使用。

  

    SLAB:伙伴系统分配内存时是基于页框为单位的,比较大。如果是几十个字节的小内存分配怎么办呢?此时就需要用SLAB机制。slab分配器是基于对象进行管理的,所谓的对象就是内核中的数据结构(例如:task_struct,file_struct 等)。相同类型的对象归为一类,每当要申请这样一个对象时,slab分配器就从一个slab列表中分配一个这样大小的单元出去,而当要释放时,将其重新保存在该列表中,而不是直接返回给伙伴系统,从而避免内部碎片。slab分配器并不丢弃已经分配的对象,而是释放并把它们保存在内存中。slab分配对象时,会使用最近释放的对象的内存块,因此其驻留在cpu高速缓存中的概率会大大提高。也就是说:在内存中维护一个slab列表,列表项对应这各种数据结构大小的内存块;当有小对象申请内存时,直接从slab列表中找到对象类型的列表项,把相应大小的内存分配出去;对象用完后,释放掉对象并把对象所占的内存块归还到slab列表以供下一个同类型的对象使用。

     同理,由于SLAB是对于小对象的内存分配,很好地解决了页框内部的内存分配产生的碎片(内部碎片)问题。

             

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396516.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

this.$modal.confirm 自定义按钮关闭_自定义函数,让你玩转Excel得心应手

让“自动更正”输入统一的文本,你是不是经常为输入某些固定的文本,如《电脑报》而烦恼呢?那就往下看吧。1.执行“工具→自动更正”命令,打开“自动更正”对话框。2.在“替换”下面的方框中输入“pcw”(也可以是其他字符,“pcw”用小写),在“替换为”下面的方框中输…

CCF-CSP 最大的矩形

问题描述在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi。这n个矩形构成了一个直方图。例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3。请找出能放在给定直方图里面积最大的矩…

MySQL的主从复制云栖社区_MySQL-主从复制

前言前篇说了作为运维在数据库块最起码要会两大技能,今天来说说第二技能--主从复制随着业务的增长,一台数据库服务器以满足不了需求了,负载过重,这时候就需要减压,实现负载均衡读写分离,一主一从或一主多从…

mysql 数据分析的步骤_数据分析8个主要步骤

# 在对数据进行分析时,主要细分为明确目标、应用思维和如下8个具体步骤:1、读取数据2、清洗数据3、操作数据4、转换数据5、整理数据6、分析数据7、展现数据8、总结报告接下来将介绍使用python来具体处理数据,包括上面几个步骤的实现&#xff…

一、win7下安装yii2

作者:PHP学习网 出处:http://www.viphper.com/?p1159 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 之前在liunx上安装过yii…

vs dll必须和exe在同一个目录_Win10系统丢失 .dll 文件的三种解决方案教程

有时候开机或打开一个软件时,系统会提示无法启动程序,这是怎么回事呢?这是因为计算机丢失某个或某些dll文件,由于系统本身不存在这些运行库文件,需要进行添加才能使用该软件。方法一:下载丢失的.dll文件&am…

datagrid页面获取表单一条数据的例子

【问题背景】 最近在做ITOO考评的时候想从页面获取表单选中的数据: 【代码】 在数据网格(datagrid)组件包含两种方法来检索选中行数据: getSelected:取得第一个选中行数据,如果没有选中行,则返回…

Spring+SpringMVC+MyBatis+easyUI整合基础篇(十)SVN搭建

前言 前面一篇文章讲了一下版本控制,但其实这一篇并没有打算讲细节的,感觉应该自己去动手弄一下,后来考虑了一下,版本控制真的挺重要的,如果自己实在搭建不好反而不去使用的话,真的有点可惜,当然…

串口数据波形显示_【专题教程第6期】SEGGER的J-Scope波形上位机软件,RTT模式波形上传可飙到500KB/S...

【专题教程第6期】SEGGER的J-Scope波形上位机软件,RTT模式波形上传速度可狂飙到500KB/S左右说明:1、在实际项目中,很多时候,我们需要将传感器或者ADC的数值以波形的形式显示。通常的解决办法是用串口上位机,USB接口上位…

JavaScript-基础入门.0014.JavaScript内置对象

2019独角兽企业重金招聘Python工程师标准>>> 简单介绍: 说明: 内置对象就是不依赖宿主环境在程序执行之前已经存在的对象,不必显式的实例化内置对象,前面已经介绍了大部分内置对象,而Global和Math两个单体内置对象比较特殊,所以单独讲. Global对象: 说明: Js中不属于…

Java中字符串连接符(+)和append的区别

参考链接:https://www.jianshu.com/p/849f1d443b3a 文章结构: 第一部分:对的原理进行分析 第二部分: 和 append 循环对比(贴出代码,以及分别循环后的反编译字节码,来对两者进行对比)…

百度seo排名点击器_SEO整站优化思路 - 百度seo排名点击

原出处:超级排名系统原文链接:SEO整站优化思路 - 超级排名系统整站优化的大体思路包括哪些?下面超级排名系统小编详细给大家讲解下:一、建站优化我们在建立网站之前与建立网站的时候需要做的优化,包括标题优化、描述关…

unity 天空盒_Unity自定义可编程渲染管线(SRP)(二)——编写第一个自定义SRP

一句话描述,我们可以把SRP分解成两个部分,分别是SRP Asset,SRP Instance。SRP AssetSRP Asset是一个Unity Asset文件,用来存储渲染管线的特定配置信息,包含的信息有:游戏物体是否应该投射阴影;使…

【design pattern】工厂方法模式和抽象工厂模式

前言 设计模式分为三大类: 创建型模式:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式; 结构型模式:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式; 行为型模式&#xff1…

弹簧触摸开关原理图_10年老电工经验之谈:常见的开关电源那些事儿

随着电控系统中对控制回路安全性要求提高,控制回路的工作电压是越来越趋于直流低压化。由此,控制回路内各种使用直流电源的传感器、中小微型直流继电器等电器装置是日益增多。也正因如此,电控系统内不同品牌的开关电源也相应地多了起来。因牵…

erlang mysql连接超时_Erlang数据库-(一)Erlang与Mysql的连接

下载:http://download.csdn.net/detail/hjhjava/7088277把该文件的东西全部编译好,然后根据下面的解释就可以操作Mysql的。很简单~-record(row,{a1 0, a20}).%% 第一个参数是该链接的名字(根据它来操作Mysql),第二参数是本机号(ip地址)%% &a…

管理活动目录域服务实训_管理学院学生党支部开展实践教育基地服务活动

红星E校有态度 有温度 可关注为进一步加强党的建设,深化管理学院学生党支部与实践基地的互动性,2020年9月11至12日,管理学院学生党支部协助白鹤村村委实践基地完成第七次人口普查相关工作,共计6名预备党员参与。工作开始前的培训会…

mysql 汉编码 的选_peewee连接mysql汉语言数据编码_mysql

peewee连接mysql中文数据编码系统是win7 x64python 2.7.6的site.py里面编码设定为 utf-8py文件首行指定 #coding:utf-8mysql 5.5.38安装时指定代码为utf-8peewee的连接数据库代码为:db MySQLDatabase(host 127.0.0.1, user root, passwd 1, database mz, chars…

配置windows失败,还原更新,请勿关机

最近给同事装系统,偶尔会出现如下问题: 如果是这种情况,只能耐心等待了,因为关机也没用! 转载于:https://www.cnblogs.com/lijy/p/5327844.html

使用uicollectionView时需要注意的问题

1.UICollectionView使用流水布局——UICollectionViewFlowLayout时,需要满足条件: 每个item(即cell)的大小是一样的,不仅是宽度,还有高度。这样,当collectionview的宽度发生变化时,item能将其动态填充。ite…