zoukankan      html  css  js  c++  java
  • 深入理解Linux内核-内存管理

    内核如果给自己分配动态内存

    动态内存:RAM的某些部分被永久打分配给内核,用来存放内核代码以及静态内核数据结构;剩余的部分被称为动态内存

    连续物理内存区管理:

    页框管理:
    1、页大小的选择,通常情况下主存和磁盘之间传输小数据块更高效,所以Linux选择4kb点页框
    2、页描述符:page结构,32字节;存放在mem_map数组中;占整个RAM的大概1%空间,即每页框(4kB)一个描述符(32B),1/128.
    3、非一致内存访问(NUMA):CPU对不同内存单元的访问时间不相同;因为CPU和内存的相对位置不一样,可能导致访问时间不一样。
    4、一致内存访问(UMA)


    内存区管理:
    理想情况,内核对页框对访问没有任何限制,可以任意访问每一个页框。实际上受到硬件限制:
    1、ISA总线的直接内存存取(DMA)处理器只能对RAM的前16MB寻址
    2、大容量的32位计算机中,CPU不能直接访问所有的物理内存,因为线性地址空间太小。
    应对方式,分管理区:
    1、ZONE_DMA(16MB)、ZONE_NORMAL(16MB-896MB)、ZONE_HIGHMEM(896MB-)
    2、保留页框池:1、满足内存请求时,如果有足够的空闲内存可以使用,请求被立即满足;否则,必须回收一些内存,并且将发出请求的内核控制路径阻塞;
            2、但是有些内核控制路径不能被阻塞,此时这条内核控制路径应当产生原子内存分配请求,原子请求不被阻塞,如果没有空闲页,分配失败。
            3、为避免失败,内核为原子内存分配请求保留了一个页框池,只有在内存不足时使用。
    4、根据ZONE_DMA, ZONE_NORMAL大小比例分配保留池
    3、伙伴系统算法:1、将空闲页框分11个块链表,每个块链表分别包含大小为1、2、4、8、16、32、64、128、256、512、1024个连续的页框
    2、假如申请256个页框,就去256的链表查找,如果没有去512查找,如果有就将512分两半,一半满足请求,一半放到256的链表中。
             3、对不同对管理区使用不同的伙伴系统

    slab内存分配方法:
    1、频繁使用的数据结构也会频繁的分配和释放,应当缓存它们
    2、频繁分配和释放内存必然会导致内存碎片。为了避免这种情况,空闲链表的缓存会连续的存放。因为已经释放的数据结构又回放回空闲链表,因此不会导致碎片。
    3、回收的对象可以立即投入下一次分配,因此对于频繁的分配和释放,空闲链表能提高其性能。
    4、如果分配器能知道对象、页、高速缓存等的大小这样的概念,它会做出更加明智的决策。
    5、如果让部分缓存专属于单个处理器,那么,分配和释放就可以在不加SMP锁的情况下进行。
    6、如果分配器是与NUMA相关的,它就可以从相同到内存节点为请求者进行分配。
    7、对存放的对象进行着色,以防止多个对象映射到相同的高速缓存行。

    slab层的设计:
    1、slab 由一个或者多个物理上连续的页组成,通常为一页。
    2、高速缓存(即空闲链表)被分成多个slab
    3、slab 存在三种状态:满、半满、空
    4、slab负责内存紧缺情况下所有底层点对齐、着色、分配、释放、回收。

    栈上道静态分配:
    1、内核栈小而且固定,用户栈大而且动态
    2、栈大小为4~16KB
    3、因为内核没有在管理内核栈上面做足工作,当内核栈溢出时,就可能修改了附近的数据例如thread_info。

    中断栈:
    1、历史上,中断处理程序和被中断的进程使用同一个栈
    2、现在中断栈为每个进程提供一个用户处理中断程序的栈


    非连续物理内存区管理:
    1、将内存映射到连续的页框时最好的选择,这样会充分利用高速缓存并获得较低的平均访问时间。
    2、如果对内存区的访问不是很频繁,通过连续的线性地址访问非连续多页框就很有意义,优点是避免了外碎片,缺点时打乱内核页表。
    3、非连续内存区的大小必须是4k的倍数

    高端内存的映射:
    1、高于896MB的所有物理内存的范围大都是高端内存
    2、高端内存不会永久的活着自动地映射到内核地址空间,尽管x86能寻址4GB,开启PAE之后能达到64GB
    3、

  • 相关阅读:
    高并发 内核优化
    mysql 读写分离
    Jmeter使用入门
    Jenkins+Jmeter+Ant接口持续集成
    Android客户端稳定性测试——Monkey
    SVN客户端项目递归删除.svn目录
    Windows 下 php5+apache+mysql5 手工搭建笔记
    熟悉常用的Linux操作
    C语言文法
    词法分析实验报告
  • 原文地址:https://www.cnblogs.com/lipeil/p/4709893.html
Copyright © 2011-2022 走看看