http://www.ibm.com/developerworks/cn/linux/l-cn-slub/

内核对象缓冲区管理

Linux 内核在运行过程中,常常会需要经常使用一些内核的数据结构(对象)。例如,当进程的某个线程第一次打开一个文件的时候,内核需要为该文件分配一个称为 file 的数据结构;当该文件被最终关闭的时候,内核必须释放此文件所关联的 file 数据结构。这些小块存储空间并不只在某个内核函数的内部使用,否则就可以使用当前线程的内核栈空间。同时,这些小块存储空间又是动态变化的,不可能像物理内存页面管理使用的 page 结构那样,有多大内存就有多少个 page 结构,形成一个静态长度的队列。而且由于内核无法预测运行中各种不同的内核对象对缓冲区的需求,因此不适合为每一种可能用到的对象建立一个“缓冲池”,因为那样的话很可能出现有些缓冲池已经耗尽而有些缓冲池中却又大量空闲缓冲区的现象。因此,内核只能采取更全局性的方法。

我们可以看出,内核对象的管理与用户进程中的堆管理比较相似,核心问题均是:如何高效地管理内存空间,使得可以快速地进行对象的分配和回收并减少内存碎片。但是内核不能简单地采用用户进程的基于堆的内存分配算法,这是因为内核对其对象的使用具有以下特殊性:

  1. 内核使用的对象种类繁多,应该采用一种统一的高效管理方法。
  2. 内核对某些对象(如 task_struct)的使用是非常频繁的,所以用户进程堆管理常用的基于搜索的分配算法比如First-Fit(在堆中搜索到的第一个满足请求的内存块)和 Best-Fit(使用堆中满足请求的最合适的内存块)并不直接适用,而应该采用某种缓冲区的机制。
  3. 内核对象中相当一部分成员需要某些特殊的初始化(例如队列头部)而并非简单地清成全 0。如果能充分重用已被释放的对象使得下次分配时无需初始化,那么可以提高内核的运行效率。
  4. 分配器对内核对象缓冲区的组织和管理必须充分考虑对硬件高速缓存的影响。
  5. 随着共享内存的多处理器系统的普及,多处理器同时分配某种类型对象的现象时常发生,因此分配器应该尽量避免处理器间同步的开销,应采用某种 Lock-Free 的算法。

如何有效地管理缓冲区空间,长期以来都是一个热门的研究课题。90 年代初期,在 Solaris 2.4 操作系统中,采用了一种称为“slab”(原意是大块的混凝土)的缓冲区分配和管理方法,在相当程度上满足了内核的特殊需求。

Linux(内核和用户态的)动态内存管理相关推荐

  1. Linux对用户态的动态内存管理

    Linux对内核态内存分配请求与用户态内存分配请求处理上分别对待 Linux本身信任自己,因此Linux内核请求分配多少内存,就会马上分配相同数量的内存出来. 但内核本身不相信应用程序,而且通常应用程 ...

  2. Linux用户态进程的内存管理

    上一篇我们了解了内存在内核态是如何管理的,本篇文章我们一起来看下内存在用户态的使用情况,如果上一篇文章说是内核驱动工程师经常面对的内存管理问题,那本篇就是应用工程师常面对的问题. 相信大家都知道对用户 ...

  3. linux 内核空间 缺页,Linux-3.14.12内存管理笔记【缺页异常处理(1)】

    发布时间:2017-06-18 15:57:06 缺页异常是很常见的现象,但是其来源有两种,一种是真实的异常,这是由于内存访问的地址未分配并未映射而产生的访问了非法地址的情况:另外一种是虚拟内存已经分 ...

  4. 内存区划分;内存分配;堆、栈概念分析;动态内存管理数据结构及程序样例;核心态与用户态...

    一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放 2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初 ...

  5. Linux内核和用户空间通信的方法

    Linux内核和用户空间通信的方法(二)- 使用netlink   作者:Kendo 2006-9-3 这是一篇学习笔记,主要是对<Linux 系统内核空间与用户空间通信的实现与分析>中的 ...

  6. linux 内核与用户空间通信之netlink使用方法

    Linux中的进程间通信机制源自于Unix平台上的进程通信机制.Unix的两大分支AT&T Unix和BSD Unix在进程通信实现机制上的各有所不同,前者形成了运行在单个计算机上的Syste ...

  7. linux内核打开文件数,放开Linux内核对用户进程可打开文件数和TCP连接的限制

    一. 检查linux内核 uname -a lsb_release -a 二.用户进程可打开文件数限制 1)vim /etc/security/limits.conf *       -      n ...

  8. 从结构体、内存池初始化到申请释放,详细解读鸿蒙轻内核的动态内存管理

    摘要:本文带领大家一起剖析了鸿蒙轻内核的动态内存模块的源代码,包含动态内存的结构体.动态内存池初始化.动态内存申请.释放等. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列九 动态内存Dyna ...

  9. LiteOS内核源码分析:动态内存之Bestfit分配算法

    本文分享自华为云社区<LiteOS内核源码分析系列十三 动态内存Bestfit分配算法>,原文作者:zhushy . 内存管理模块管理系统的内存资源,它是操作系统的核心模块之一,主要包括内 ...

最新文章

  1. windows 常用thread方法
  2. 完美设置“Word表格中文字上下居中”
  3. Android证书通过keytool获取sha1、sha256、MD5
  4. C++ 容易犯错误的模型
  5. Oracle官方文档网址收录
  6. Unix哲学,Microservices和DDD (2)
  7. ElementUI el-time-picker-只显示小时、分钟,分并添加范围校验
  8. 上一局APP玩边画边猜,第1次见人使用道具,我的游戏体验上升了
  9. 给力登场:15款免费的Windows系统工具
  10. C#实现DataTable按天分组并计数
  11. ServletContext作用功能详解
  12. uml的图与代码的转换——类图
  13. k-近邻算法进行回归拟合
  14. 用CIL写程序:从“call vs callvirt”看方法调用
  15. python爬取图书信息_Python爬取当当、京东、亚马逊图书信息代码实例
  16. 缓存穿透、击穿、雪崩什么的分不清楚?看了这篇文章后,我明白了
  17. Yolov5学习笔记(1)——训练出自己的模型
  18. emv交易流程介绍_EMV交易指标简介
  19. Python笔记_第四篇_高阶编程_再议装饰器和再议内置函数
  20. android studio JNI Cmake Erro at 运行失败

热门文章

  1. oracle数据库常用关键字以及写法
  2. 【FPGA】相关介绍
  3. dealloc 的水,很深?
  4. C#类型转换 (非原创)
  5. CPU : Intel CPU命名规则
  6. JDBC及DBUtils
  7. 写了这么久前端,你知道浏览器原理吗?
  8. 微信公众号的搭建-第五天-自定义菜单
  9. 函数的递归调用(专题)
  10. 不要使用Android Studio的Git Commit了----记一次debug