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”用小写),在“替换为”下面的方框中输…

php mysql 排名算法_MySQL PHP:优化排名查询和计数子查询

这是原始数据,并希望根据得分(count(tbl_1.id))对它们进行排名.[tbl_1]id | name1 | peter2 | jane1 | peter2 | jane3 | harry3 | harry3 | harry3 | harry4 | ron因此,制作临时表(tbl_2)来计算每个id的分数.SELECT id, name, COUNT( id ) AS scoreFROM tbl_1GROUP BY idORDER…

CCF-CSP 最大的矩形

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

Stack Overflow 2016年对50,000名开发人员进行的调查得出的见解

Today, Stack Overflow released the results of their 2016 survey of more than 50,000 developers.今天,Stack Overflow发布了他们2016年对50,000多名开发人员进行的调查的结果。 I’ve combed through this big document to bring you the most surprising ins…

web管理

1.站点根目录下查找是否被放置webshell***根据语句判断是不是PHP***脚本# find /storage/www/ -name "*.php" | xargs grep-in --color "eval("# grep -i --include*.php -r system\s*\( /storage/www/2.统计访问日志中来自同ip出现的次数分析盗链、***、机…

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

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

数据存储(SharedPreferences存储)

SharedPreferences是通过 键值对 的方式存储数据SharedPreferences是通过键值对的方式存储的 将数据存储到SharedPreferences中有3种方法:1.Context类中的getSharedPreferences()方法2.Activity类中的getPreferences()方法3.PreferencesManager类中的getDefaultShar…

编程程序的名称要记住吗_学习编程时要记住的5件事

编程程序的名称要记住吗by Kurt由库尔特 学习编程时要记住的5件事 (5 Things to Remember When You’re Learning to Program) Learning to program is challenging. Aside from choosing a language or setting up a development environment that you know nothing about, t…

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

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

python学习的一个定位_python学习之——selenium元素定位

web自动化测试按步骤拆分,可以分为四步操作:定位元素,操作元素,获取返回结果,断言(返回结果与期望结果是否一致),最后自动出测试报告。其中定位元素尤为关键,此篇是使用webdriver通过页面各个元…

Invoker

Invoker 是实体,dubbo外其他对象的转化。转载于:https://www.cnblogs.com/gtaxmjld/p/9786894.html

如何在开源社区贡献代码_如何在15分钟内从浏览器获得您的第一个开源贡献

如何在开源社区贡献代码Matt Mullenweg, founder of Automattic, recently offered this advice to aspiring developers: “Contribute to open source.”Automattic的创始人Matt Mullenweg最近向有抱负的开发人员提供了以下建议 :“ 致力于开源。 ” Mullenweg —…

小心情。

从一开始学习html到现在的nodejs,也有段时间了,那个时候什么都不知道,记得一两年之前还沉迷在一些网络技术的圈子里面,每天看着那些大牛,感觉都很是厉害,每一项技术总是那样的让我着迷,从易语言…

一、win7下安装yii2

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

js获取浏览器滚动条距离顶端的距离

js获取浏览器滚动条距离顶端的距离 一、jQuery获取的相关方法 jquery 获取滚动条高度获取浏览器显示区域的高度 :$(window).height(); 获取浏览器显示区域的宽度 :$(window).width(); 获取页面的文档高度 :$(document).height(); 获取页面的文…

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

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

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

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

utf-8转换gbk代码_将代码转换为现金-如何以Web开发人员的身份赚钱并讲述故事。...

utf-8转换gbk代码by Kurt由库尔特 将代码转换为现金-如何以Web开发人员的身份赚钱并讲述故事。 (Turning code to cash — How to make money as a Web Developer and live to tell the tale.) So you just learnt to code. You’re eager and anyone who can’t code thinks …

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

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

AHK-UMSS框架 (AHK通用修饰键解决方案,任何键都是修饰键)

AHK-UMSS框架 (AHK通用修饰键解决方案,任何键都是修饰键) 1 #Warn2 #NoEnv ; # 禁用环境变量检查:不检查空变量是否为"环境变量",可以极大地提高效率3 #Hotstring EndChars ◎ ; # 热字串终止符号设置:只把空格作为终止符,(文档上所说是不能单独用空格的…