欢迎来到站长教程网!

Nginx

当前位置:主页 > 服务器教程 > Nginx >

Linux2.6中的Slab层

时间:2019-11-09|栏目:Nginx|点击:

还记得一个进程创建的时候是什么给它分配的“进程描述符”吗?没错,是slab分配器,那么,这个slab分配器是个什么东西呢?

分配和释放数据结构是所有内核中最普遍的操作之一。为了便于结构的频繁分配和回收,编程人员常常会用到空闲链表。空闲链表中包含可供使用的,已经分配好的数据结构块。当代码需要一个新的数据结构实例时,就可以从空闲链表中抓取一个,而不需要再去执行一些分配内存的代码,这样不仅高效而且使用简单。以后,当不需要这个数据结构时,我们不能简单的释放这块内存,而是需要把它放回空闲链表中,毕竟,下次使用的时候我们还要使用呢。

在内核中,空闲链表面对的一个主要问题就是不能全局控制。当可用内存变得紧缺时,内核无法通知每个空闲链表,让其收缩缓存的大小以便释放出一些内存来。实际上,内核根本不知道存在任何空闲链表。为了解决这个问题,Linux内核引入了slab层的概念。slab分配器扮演了通用数据结构缓存层的角色。

slab层把不同的对象划分为高速缓存,其中每个高速缓存组中存放的都是不同类型的数据结构对象。例如,一个高速缓存用于存放进程描述符,另一个高速缓存用于存放i节点。

之后,这些高速缓存又被划分为slab。slab由一个或多个物理上连续的页组成。一般情况下,slab也就仅仅一页。每个高速缓存可以由多个slab组成,下图显示的就是高速缓存,slab,数据结构对象三者的关系:

Linux2.6中的Slab层

每个slab都包含一些数据成员,这里的成员指的是缓存的数据结构。每个slab处于三种状态之一:满,部分满或空。

当内核的某一部分需要一个对象时,就要由slab分配了,首先考虑的是部分满的slab,如果不存在部分满的slab则去空的slab分配,如果也不存在空的slab,则内核需要申请页重新分配高速缓存。

slab层的管理是在每个高速缓存的基础上的,通过给整个内核一个简单的接口来完成的。通过接口就可以创建和撤销高速缓存,并在高速缓存内分配和释放对象。高速缓存及其slab的复杂管理完全通过slab层的内部机制来处理。当你创建了一个高速缓存之后,slab层所起的作用就像一个专用的分配器,可以为具体的对象类型进行分配。

相关阅读:

Linux Slab分配器(一)--概述

Linux Slab分配器(二)--初始化

Linux Slab分配器(三)--创建缓存

Linux Slab分配器(四)--分配对象

Linux Slab分配器(五)--释放对象

Linux Slab分配器(六)--创建Slab和销毁Slab

Linux Slab分配器(七)--销毁缓存

上一篇:Linux2.6--Linus电梯

栏    目:Nginx

下一篇:Ubuntu 13.04 安装 GCC 4.8.1

本文标题:Linux2.6中的Slab层

本文地址:http://www.jh-floor.com/fuwuqijiaocheng/Nginx/123339.html

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:888888 | 邮箱:888888#qq.com(#换成@)

Copyright © 2002-2017 青云站长教程网 版权所有 琼ICP备xxxxxxxx号