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

动态内存: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、

深入理解Linux内核-内存管理的更多相关文章

  1. Linux内核内存管理算法Buddy和Slab: /proc/meminfo、/proc/buddyinfo、/proc/slabinfo

    slabtop cat /proc/slabinfo # name <active_objs> <num_objs> <objsize> <objpersla ...

  2. 深入理解Linux中内存管理

    前一段时间看了<深入理解Linux内核>对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看 ...

  3. linux内核 内存管理

    以下内容汇总自网络. 在早期的计算机中,程序是直接运行在物理内存上的.换句话说,就是程序在运行的过程中访问的都是物理地址. 如果这个系统只运行一个程序,那么只要这个程序所需的内存不要超过该机器的物理内 ...

  4. Linux内核内存管理架构

    内存管理子系统可能是linux内核中最为复杂的一个子系统,其支持的功能需求众多,如页面映射.页面分配.页面回收.页面交换.冷热页面.紧急页面.页面碎片管理.页面缓存.页面统计等,而且对性能也有很高的要 ...

  5. linux内核内存管理(zone_dma zone_normal zone_highmem)

    Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数 ...

  6. 【Linux】深入理解Linux中内存管理

    主题:Linux内存管理中的分段和分页技术 回顾一下历史,在早期的计算机中,程序是直接运行在物理内存上的.换句话说,就是程序在运行的过程中访问的都是物理地址. 如果这个系统只运行一个程序,那么只要这个 ...

  7. Linux内核——内存管理

    内存管理 页 内核把物理页作为内存管理的基本单位.内存管理单元(MMU,管理内存并把虚拟地址转换为物理地址)通常以页为单位进行处理.MMU以页大小为单位来管理系统中的页表. 从虚拟内存的角度看,页就是 ...

  8. Linux内核内存管理子系统分析【转】

    本文转载自:http://blog.csdn.net/coding__madman/article/details/51298718 版权声明:本文为博主原创文章,未经博主允许不得转载. 还是那张熟悉 ...

  9. Linux内核内存管理

    <Linux内核设计与实现>读书笔记(十二)- 内存管理   内核的内存使用不像用户空间那样随意,内核的内存出现错误时也只有靠自己来解决(用户空间的内存错误可以抛给内核来解决). 所有内核 ...

  10. linux内核--内存管理(二)

    一.进程与内存     所有进程(执行的程序)都必须占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等.不过进程对这些内存的管理方式因内存用途不一而不尽相同,有些内 ...

随机推荐

  1. 〖Linux〗Ubuntu设定Proxy及忽略Proxy

    1. 设定代理:. ~/.proxyenv #!/bin/sh # for terminal export proxyserveraddr=123.123.123.123 export proxyse ...

  2. Android开发之使用HttpURLConnection进行POST请求

    一.前提准备 在开始实际编码之前,我们有必要先了解下将会用的类以及方法,进行一个大体的了解. 1.URL类 这个类主要的功能是定位到要获取资源的网址以及打开连接.比如下面的代码: URL realur ...

  3. python之函数用法setdefault()

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法setdefault() #D.get(k,d) #说明:k在D中,则返回 D[K], ...

  4. Mingw编译DLib

    Mingw编译DLib 因为机器上安装了qt-opensource-windows-x86-mingw530-5.8.0,所以准备使用其自带的mingw530来编译DLib使用. 因为DLib使用CM ...

  5. 【CAS单点登录视频教程】 第06集【完】 -- Cas认证 学习 票据认证FormsAuthentication

    目录 ----------------------------------------- [CAS单点登录视频教程] 第06集[完] -- Cas认证 学习 票据认证FormsAuthenticati ...

  6. 听听各位对Ubuntu的UI的看法

    2012-7-15 15:46    最近升级到Ubuntu 12.4 .发现其界面效果真的时越来越炫啦.我就在想,你Ubuntu你图什么啊, 你是以个Linux系统,你的重点在于让系统运行更稳定,更 ...

  7. 【Algorithm】回溯法与深度优先遍历的异同

    1.相同点: 回溯法在实现上也是遵循深度优先的,即一步一步往前探索,而不像广度优先那样,由近及远一片一片地扫. 2.不同点 (1)访问序 深度优先遍历: 目的是“遍历”,本质是无序的.也就是说访问次序 ...

  8. [转]expect实现ssh自动交互

    shell脚本实现ssh自动登录远程服务器示例: #!/usr/bin/expect spawn ssh root@192.168.22.194 expect "*password:&quo ...

  9. 使用java修改图片DPI

    修改以后可以直接用PS打开看效果 全部使用rt下的类,无需下载其他jar包 import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.imag ...

  10. 安卓listView实现下拉刷新上拉加载滑动仿QQ的删除功能

    大家对这些功能都是看的多了,然后对上拉刷新和下拉加载的原理都是非常清楚的,所以实现这功能其实也就是为了让大家能够从众多的同行们来进行比较学习而已,虽然即使是这样,但是面试的时候面试官还是会问你上拉和下 ...