Solaris Slab Allocator –Magazines[1]

原创 2011年01月07日 16:38:00

Overview

经典的slab allocator算法在多CPU系统中scalability不是很好,因为它的slab list是一个全局结构,分配和释放的时候需要一个global lock来保护list数据,这样等于线性化了所有分配操作。为了弥补这个不足,Solaris提出了per-CPU cache的策略。基本思想就是为每个CPU维护一个可以容纳M个Object的Cache, 学名叫作Magazine, Magazine除了杂志的意思外,还有一个意思是‘弹药库’。资源分配时先向这个Magazine Layer申请,如果Magazine Layer空了,Magazine Layer会自动"装填弹药reload"!

下面这张图展示了整个流程:

image

为了改善多CPU下的性能,我们在Slab Layer之上,添加了Magazine Layer, Magazine Layer有两层,CPU Layer和Depot Layer。注意到cache_cpu是每个CPU一个的,如果当前的cache_cpu能够满足资源分配需求,就不需要involve全局锁。

以cache_cpu[0]来说,其实它维护了两个Magazine:loaded和Previous,图中的每个magazine都可容纳8个大小相同的objects。这里的实现是每个 magazine都是一个拥有M个指针的array。其行为类似于stack:

分配: obj = magazine[--rounds];
释放:   magazine[rounds++] = obj;

我这里给出magazine的定义:[感谢open solaris,使得源代码公开]

typedef struct umem_magazine {
     void    *mag_next;
     void    *mag_round[1];         /* one or more rounds */
} umem_magazine_t;

这里解释一下solaris为什么使用数组mag_round[1]来维护objects而不是使用list? 
  1. slab allocator的中心思想之一就是希望分配时直接拿到"准备好的constructed" object。使用listing会强迫被link的object的数据结构中含有object*的指针。于是每次分配和释放就会要修改处在object内部的指针。这样就破坏了constructed的原始状态,给分配和释放造成额外负担。
  2. slab allocator的设计初衷是可以用来管理"任何"资源。而被管理的资源object并不一定都是writable memory。

下一篇我会介绍solaris的magazine如何克服"抖动thrashing"问题,使得cache的missing rate不高于1/M。

有兴趣的同学可以参考英语原文:

Magazines and Vmem:
Extending the Slab Allocator to Many CPUs and Arbitrary Resources.

多核心Linux内核路径优化的不二法门之-slab与伙伴系统

作为这个系列的第一篇,我先来描述一下slab系统。因为近些天有和同事,朋友讨论过这个主题,而且觉得这个主题还算比较典型,所以就作为第一篇了。其实按照操作系统理论来讲,进程管理应该更加重要些,按照我自己...
  • dog250
  • dog250
  • 2015年09月16日 05:08
  • 4855

slab分配器原理

SLAB分配器 用一句话来描述的话,slab的框架就是讲内存按照
  • shybrian
  • shybrian
  • 2014年05月02日 22:16
  • 3185

Linux系统内存消失与slab使用之谜

http://tech.foolpig.com/2012/07/11/linux-memory-slab-inode/ Linux系统内存消失与slab使用之谜 JUL ...
  • c453787298
  • c453787298
  • 2014年02月10日 17:21
  • 2960

solaris挂载iso镜像\制作\复制

挂载 bash-3.00# lofiadm -a /export/home/root/software/iso/slax-6.0.0pre3.iso /dev/lofi/1 bash-3.00#...
  • zhaojian1988
  • zhaojian1988
  • 2013年04月16日 15:36
  • 1230

详解slab机制

http://blog.csdn.net/u010246947/article/details/10133101 目前有很多讲slab的文章,要么是纯讲原理画一堆图结合源码不深导致理解困难,要么是纯...
  • cosmoslhf
  • cosmoslhf
  • 2015年01月15日 16:34
  • 9925

Solaris下如何修改文件创建时间及查询

Solaris下如何修改文件创建时间及查询 实验演示: 1、核对时间 [root@S1011:/]# date Tue Jul 15 21:37:01 CDT 2014 --若时间不正确请先按...
  • huangyanlong
  • huangyanlong
  • 2014年07月15日 23:10
  • 2114

详解slab机制(1) slab是什么

目前有很多讲slab的文章,要么是纯讲原理画一堆图结合源码不深导致理解困难,要么是纯代码注释导致理解更困难,我在猛攻了一周时间后,细致总结一下slab,争取从原理到源码都能细致的理解到并立刻达到清楚的...
  • u010246947
  • u010246947
  • 2013年08月21日 09:29
  • 2166

NGINX原理 之 SLAB分配机制

NGINX原理分析 之 SLAB分配机制
  • RoyalApex
  • RoyalApex
  • 2013年09月15日 23:42
  • 6125

buddy和slab那些事

说起buddy(伙伴系统)和slab的由来,我们得首先知道另外两个概念,什么叫内存的“内部碎片”什么叫内存的“外部碎片” buddy和slab的由来: 内部碎片:        内部碎片...
  • u014645605
  • u014645605
  • 2017年08月03日 13:15
  • 287

Linux内核源代码情景分析-内存管理之slab-分配与释放

首先说缓存区的数据结构:struct kmem_cache_s { /* 1) each alloc & free */ /* full, partial first, then free */ ...
  • jltxgcy
  • jltxgcy
  • 2015年03月04日 19:32
  • 1483
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Solaris Slab Allocator –Magazines[1]
举报原因:
原因补充:

(最多只允许输入30个字)