深入理解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、
深入理解Linux内核-内存管理的更多相关文章
- Linux内核内存管理算法Buddy和Slab: /proc/meminfo、/proc/buddyinfo、/proc/slabinfo
slabtop cat /proc/slabinfo # name <active_objs> <num_objs> <objsize> <objpersla ...
- 深入理解Linux中内存管理
前一段时间看了<深入理解Linux内核>对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看 ...
- linux内核 内存管理
以下内容汇总自网络. 在早期的计算机中,程序是直接运行在物理内存上的.换句话说,就是程序在运行的过程中访问的都是物理地址. 如果这个系统只运行一个程序,那么只要这个程序所需的内存不要超过该机器的物理内 ...
- Linux内核内存管理架构
内存管理子系统可能是linux内核中最为复杂的一个子系统,其支持的功能需求众多,如页面映射.页面分配.页面回收.页面交换.冷热页面.紧急页面.页面碎片管理.页面缓存.页面统计等,而且对性能也有很高的要 ...
- linux内核内存管理(zone_dma zone_normal zone_highmem)
Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数 ...
- 【Linux】深入理解Linux中内存管理
主题:Linux内存管理中的分段和分页技术 回顾一下历史,在早期的计算机中,程序是直接运行在物理内存上的.换句话说,就是程序在运行的过程中访问的都是物理地址. 如果这个系统只运行一个程序,那么只要这个 ...
- Linux内核——内存管理
内存管理 页 内核把物理页作为内存管理的基本单位.内存管理单元(MMU,管理内存并把虚拟地址转换为物理地址)通常以页为单位进行处理.MMU以页大小为单位来管理系统中的页表. 从虚拟内存的角度看,页就是 ...
- Linux内核内存管理子系统分析【转】
本文转载自:http://blog.csdn.net/coding__madman/article/details/51298718 版权声明:本文为博主原创文章,未经博主允许不得转载. 还是那张熟悉 ...
- Linux内核内存管理
<Linux内核设计与实现>读书笔记(十二)- 内存管理 内核的内存使用不像用户空间那样随意,内核的内存出现错误时也只有靠自己来解决(用户空间的内存错误可以抛给内核来解决). 所有内核 ...
- linux内核--内存管理(二)
一.进程与内存 所有进程(执行的程序)都必须占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等.不过进程对这些内存的管理方式因内存用途不一而不尽相同,有些内 ...
随机推荐
- XML文件生成C++代码(基于pugixml)
简述 在一个项目中需要用到XML的解析和生成,知乎上有人推荐rapidxml和pugixml等库.RapidXML一看库还比较大,就先研究一下pugixml了. 因为对解析XML的需求不大(都是一些很 ...
- Android实现中文汉字笔划(笔画)、中文拼音排序、英文排序
发布时间:2018-11-16 技术:Android 概述 最近要做一个类似微信的,在登录界面选择国家地区的功能,微信有中文汉字笔画排序以及中文拼音排序等几种方式,如下所示: 简体中文 拼音排 ...
- 【CAS单点登录视频教程】 第04集 -- tomcat下配置https环境
目录 ----------------------------------------- [CAS单点登录视频教程] 第06集[完] -- Cas认证 学习 票据认证FormsAuthenticati ...
- java 结束程序进程 代码
结束firefox的进程,一句代码就够了,如下: Runtime.getRuntime().exec("taskkill /F /IM firefox.exe"); 结束qq: R ...
- mysql/mariadb基于ssl的主从复制
当mysql/mariadb跨越互联网进行复制时别人可以窃取到mysql/mariadb的复制信息, 这些信息是明文的, 因此存在不安全性, 这里通过ssl对复制的信息进行加密 1. 创建证书中心 在 ...
- 【Android】详解Android的menu菜单
在软件应用过程中,菜单的存在是必不可少的,我这次讲一下,我对android菜单的一个基础做法吧 Android的菜单分为三种类型:选项菜单(Option Menu).上下文菜单(Context Men ...
- php,perl计算crc
PHP版: <?php echo getCrc32("/var/www/html/resource/koc_data/2013_03/01/1ck65e.koc") ; # ...
- 反射已经"Out",动态编译才能"Hold"住
Net支持反射功能以后,确实使我们Net程序眼前一亮啊,真是太神奇了,只需要传入字符串就可以完成功能.可以说,反射功能的引入,使我们在处理某些问题上更加得心应手. 传统的Db管理软件中,数据库字段的频 ...
- 面试必备:HashMap源码解析(JDK8)
1 概述 本文将从几个常用方法下手,来阅读HashMap的源码. 按照从构造方法->常用API(增.删.改.查)的顺序来阅读源码,并会讲解阅读方法中涉及的一些变量的意义.了解HashMap的特点 ...
- Android App卡顿慢优化之解决内存抖动及内存泄漏
前面一篇博客说到了,内存抖动的第二种情况,就是必须在短时间内创建对象,但是要控制数量:这个问题目前可以使用对象池的方法解决. 3)Object Pools 在程序里面经常会遇到的一个问题是短时间内创建 ...