转载请注明原文地址: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是对于小对象的内存分配,很好地解决了页框内部的内存分配产生的碎片(内部碎片)问题。

Linux内存分配机制之伙伴系统和SLAB的更多相关文章

  1. linux内存分配机制

    这几天在观察apache使用内存情况,所以特意了解了下linux的内存机制,发现一篇写得还不错.转来看看. 一般来说在ps aux中看到的rss就是进程所占用的物理内存.但是如果将所有程序的rss加起 ...

  2. 深入理解Linux内存分配

    深入理解Linux内存分配 为了写一个用户层程序,你也许会声明一个全局变量,这个全局变量可能是一个int类型也可能是一个数组,而声明之后你有可能会先初始化它,也有可能放在之后用到它的时候再初始化.除此 ...

  3. 浅谈Linux内存管理机制

    经常遇到一些刚接触Linux的新手会问内存占用怎么那么多?在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然.这是Linux内存管理的一个优秀特性,在这 ...

  4. 了解linux内存管理机制(转)

    今天了解了下linux内存管理机制,在这里记录下,原文在这里http://ixdba.blog.51cto.com/2895551/541355 根据自己的理解画了张图: 下面是转载的内容: 一 物理 ...

  5. linux内存管理机制

    物理内存和虚拟内存 我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念. 物理内存就是系统 ...

  6. 【转载】Linux 内存管理机制

    在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然.这是Linux内存管理的一个优秀特性,主要特点是,无论物理内存有多大,Linux 都将其充份利用,将 ...

  7. Linux内存管理机制简析

    Linux内存管理机制简析 本文对Linux内存管理机制做一个简单的分析,试图让你快速理解Linux一些内存管理的概念并有效的利用一些管理方法. NUMA Linux 2.6开始支持NUMA( Non ...

  8. Memcache简介 & 内存分配机制

            关于这个东西里面到底应该存放数据网上一直有很多种说法,有的说sql进行md5之后作为键值,结果作为内容存放,也有人说按照业务逻辑错放,反正是炒的不亦乐乎.        本人经过将近2 ...

  9. 【转载】浅谈Linux内存管理机制

    经常遇到一些刚接触Linux的新手会问内存占用怎么那么多? 在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然.这是Linux内存管理的一个优秀特性,在 ...

随机推荐

  1. Logcat多tag过滤

    当Android设备通过usb连接成功后,在logcat中能看到很多log信息,但太多了很容易将我们关注的日志给淹没掉,所以我们需要过滤.如果接入了不同的SDK,那么log的tag可能会不同,所以有时 ...

  2. libcurl上传文件

    libcurl参数很多,一不小心就容易遇到问题.曾经就遇到过一个很蛋疼的问题:libcurl断点下载>>   这里主要汇总一下,libcurl上传的二种方式: 1.直接上传文件,类似for ...

  3. [Nginx] Nginx 配置location总结

    cp from : https://www.cnblogs.com/coder-yoyo/p/6346595.html location匹配顺序 "="前缀指令匹配,如果匹配成功, ...

  4. information_schema系列六(索引,表空间,权限,约束相关表)

    information_schema系列六(索引,表空间,权限,约束相关表) 1: STATISTICS 这个表提供的是关于表的索引信息:   INFORMATION_SCHEMA Name SHOW ...

  5. java常见反编译工具

    1.Java反编译插件 —— Jadclipse JadClipse是Jad的Eclipse插件,是一款非常实用而且方便地Java反编译插件,我们只需将下载的插件包复制到eclipse的plugins ...

  6. Keras教程

    In this step-by-step Keras tutorial, you’ll learn how to build a convolutional neural network in Pyt ...

  7. [转]mysql dual虚拟表

    From : http://thobian.info/?p=1035 虚拟表dual 其实我是今天第一次听说,虽然以前有过它的应用.说不定你也用过哦,看这条sql:select sysdate(); ...

  8. Log4cplus使用指南

    1.  Log4cplus简介 log4cplus是C++编写的开源的日志系统,前身是java编写的log4j系统,受Apache Software License保护,作者是Tad E. Smith ...

  9. 网关局域网通信协议V2.0

    http://docs.opencloud.aqara.cn/development/gateway-LAN-communication/ https://github.com/aqara/openc ...

  10. async和await的返回值——NodeJS, get return value from async await

    在ES6和ES5中promise的执行也有不同点(上述提到,ES6中promise属microtask:在ES5中,暂未接触到有api直接操作microtask的,所以.then的异步是用setTim ...