前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >allocater

allocater

作者头像
瓜大三哥
发布2018-02-24 16:25:25
6060
发布2018-02-24 16:25:25
举报
文章被收录于专栏:瓜大三哥

此程序相当于Linux里面的一个slab内存分配器

一、Slab

内存slab分配器最初思想来自Solaris的内核态小数据结构(一页以内)的内存分配,受到Solaris的影响,Linux内核也采用类似思想来减少页内碎片,其基本思想是:一次向内核获取整数页,slab根据数据结构的大小进行划分为一个个小的数据结构,当需要时直接从该链表上摘取一个返回应用程序,当应用程序释放时,而非真正释放,只需要该空间放回到链表中,当分散的一页多块又聚集一页时,又会拼成一页,同时判断slab空闲的页数,如果空闲页超过一定的页数,就会向系统释放一定的页数。一个slab分配器只能管理一个指定大小的数据结构分配。

由于对象是从 slab 中进行分配和释放的,因此单个 slab 可以在 slab 列表之间进行移动。例如,当一个 slab 中的所有对象都被使用完时,就从 slabs_partial 列表中移动到 slabs_full 列表中。当一个 slab 完全被分配并且有对象被释放后,就从 slabs_full 列表中移动到 slabs_partial 列表中。当所有对象都被释放之后,就从 slabs_partial 列表移动到 slabs_free 列表中

二、函数功能

1.static void yaffs_deinit_raw_tnodes(struct yaffs_dev *dev)//将挂在dev设备上的tnodes 释放掉

2.static void yaffs_init_raw_tnodes(struct yaffs_dev *dev)//将挂在dev设备上的tnodes初始化

3.static int yaffs_create_tnodes(struct yaffs_dev *dev, int n_tnodes)//创建n_todes个节点数

new_tnodes = kmalloc(n_tnodes * dev->tnode_size, GFP_NOFS);

创建好以后,再将之链接起来放在tnl = kmalloc(sizeof(struct yaffs_tnode_list), GFP_NOFS);

4.struct yaffs_tnode *yaffs_alloc_raw_tnode(struct yaffs_dev *dev)//进行分配

5.void yaffs_free_raw_tnode(struct yaffs_dev *dev, struct yaffs_tnode *tn)//释放一个tnode放到freelist中

6.static void yaffs_init_raw_objs(struct yaffs_dev *dev)//为obj进行初始化

7.static void yaffs_deinit_raw_objs(struct yaffs_dev *dev)//释放obj

8.static int yaffs_create_free_objs(struct yaffs_dev *dev, int n_obj)//创建n_obj个objs

new_objs = kmalloc(n_obj * sizeof(struct yaffs_obj), GFP_NOFS);同样需要将之链接在一个the free list

9.struct yaffs_obj *yaffs_alloc_raw_obj(struct yaffs_dev *dev)//分配obj

10.void yaffs_free_raw_obj(struct yaffs_dev *dev, struct yaffs_obj *obj)//将obj放入对应的free list

11.void yaffs_deinit_raw_tnodes_and_objs(struct yaffs_dev *dev)

yaffs_deinit_raw_tnodes(dev);

yaffs_deinit_raw_objs(dev);

12.void yaffs_init_raw_tnodes_and_objs(struct yaffs_dev *dev)

allocator = kmalloc(sizeof(struct yaffs_allocator), GFP_NOFS);

if (allocator) {

dev->allocator = allocator;

yaffs_init_raw_tnodes(dev);

yaffs_init_raw_objs(dev);

}

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-05-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 瓜大三哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 此程序相当于Linux里面的一个slab内存分配器
  • 一、Slab
    • 由于对象是从 slab 中进行分配和释放的,因此单个 slab 可以在 slab 列表之间进行移动。例如,当一个 slab 中的所有对象都被使用完时,就从 slabs_partial 列表中移动到 slabs_full 列表中。当一个 slab 完全被分配并且有对象被释放后,就从 slabs_full 列表中移动到 slabs_partial 列表中。当所有对象都被释放之后,就从 slabs_partial 列表移动到 slabs_free 列表中
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档