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

动态内存: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. eclipse svn新增文件不显示在文件列表,只有修改文件可以提交!

      1.情景展示 eclipse修改的文件可以正常提交,但是新增的文件没有显示在提交列表中,导致无法提交! 2.解决方案 选中要提交的文件-->右键-->Team-->提交 勾选上这 ...

  2. 【Linux】shell数组

    一.概念 shell数组就是一个元素集合,它把有限个元素用一个名字来命名,然后用编号对他们分区.这个名字称为数组名,用于区分不同内容的编号称为数组的下标. 二.shell数组的定义与增删改查 1.sh ...

  3. 比较MessageListActivity使用不同的layout

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  4. 构建高性能数据库缓存之redis主从复制

    一.什么是redis主从复制? 主从复制,当用户往Master端写入数据时,通过Redis Sync机制将数据文件发送至Slave,Slave也会执行相同的操作确保数据一致:且实现Redis的主从复制 ...

  5. linux中DHCP服务配置文件/etc/dhcpd.conf详细说明

    DHCP服务的配置 dhcpd.conf 是DHCP服务的配置文件,DHCP服务所有参数都是通过修改dhcpd.conf 文件来实现,安装后dhcpd.conf 是没有做任何配置的,将/usr/sha ...

  6. 老男孩linux实战培训初级班第二次课前考试题

    ################################################################ 本文内容摘录于老男孩linux实战运维培训中心课前考试题(答案部分) ...

  7. Android事件总线还能怎么玩?

    作者简介:何红辉,Android工程师,现任职于友盟. 顾名思义,AndroidEventBus是一个Android平台的事件总线框架,它简化了Activity.Fragment.Service等组件 ...

  8. C# WinForm开发系列 - DataGrid/DataGridView

    在WinForm开发中,DataGrid/DataGridView被广泛使用于绑定数据库中数据进行呈现.整理一些关于DataGrid/DataGridView使用的文章,涉及DataGrid/Data ...

  9. 【MyBatis】MyBatis之如何配置

    1,MyBatis简介 MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis 使用简 ...

  10. int和Integer之间的区别和联系

          在工作中使用==埋下的坑这篇博文中,我们看到当使用基本类型的时候==是完全没有问题的,部分或者混合使用基本类型和装箱基本类型的时候,就可能出现问题了,那么我们可能会想基本类型和装箱基本类型 ...