• Linux内核中常见内存分配函数(一) 分类: arm-linux-Ubuntu 2013-08-08 17:57 582人阅读 评论(0) 收藏


    linux内核中采 用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系 统中,用到了四级页表。
      * 页全局目录(Page Global Directory)
      * 页上级目录(Page Upper Directory)
      * 页中间目录(Page Middle Directory)
      * 页表(Page Table)
      页全局目录包含若干页上级目录的地址,页上级目录又依次包含若干页中间目录的地址
    ,而页中间目录又包含若干页表的地址,每一个页表项指 向一个页框。linux中采用4KB大小的 页框作为标准的内存分配单元。
      多级分页目录结构
      伙伴系统算法
      在实际应用中,经常需要分配一组连续的页框,而频繁地申请和释放不同大小的连续页
    框,必然导致在已分配页框的内存块中分散了许多小块的 空闲页框。这样,即使这些页框是空闲的,其他需要分配连续页框的应用也很难得到满足。
      为了避免出现这种情况,linux内核中引入了伙伴系统算法(buddy system)。把所有的空
           闲页框分组为11个 块链表,每个块链表分别包含大小为1,2,4,8,16,32,64,128,256,512和1024个连续页框的页框块。最大可以申请1024个连续页框,对应4MB大小的连续内存。每个页框块的第一个页框的物理地址是该块大小的整数倍。
      假设要申请一个256个页框的块,先从256个页框的链表中查找空闲块,如果没有,就
    512个 页框的链表中找,找到了则将页框块分为2个256个 页框的块,一个分配给应用,另外一个移到256个页框的链表中。如果512个页框的链表中仍没有空闲块,继续向1024个页 框的链表查找,如果仍然没有,则返回错误。
      页框块在释放时,会主动将两个连续的页框块合并为一个较大的页框块。
      slab分 配器
      slab分配器源于 Solaris 2.4 的分配算法,工作于物理内存页框分配器之上,管理特
    定大小对象的缓存,进行快速而高效的内存分配。
      slab分配器为每种使用的内核对象建立单独的缓冲区。linux 内核已经采用了伙伴系统
    管理物理内存页框,因此 slab分配器直接工作于伙伴系统之上。每种缓冲区由多个 slab
    组成,每个 slab就是一组连续的物理内存页框,被划分成了固定数目的对象。根据对象大小的不同,缺省情况下一个slab 最多可以由 1024个页框构成。出于对齐等其它方面的要求,slab 中分配给对象的内存可能大于用户要求的对象实际大小,这会造成一定的内存浪费。

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    export,source
    zookeeper安装笔记
    centos修改启动顺序,登录后提示,启动级别,主机名,免密登录
    CentOS卸载系统自带的OpenJDK
    处理有外键约束的数据
    linux iptables
    centos httpd服务做yum本地源,以及安装Mysql
    Linux命令(一)grep查询
    LaTeX符号和图片
    LaTeX文章结构
  • 原文地址:https://www.cnblogs.com/mao0504/p/4706857.html
Copyright © 2020-2023  润新知