allocater

此程序相当于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);

}

原文发布于微信公众号 - 瓜大三哥(xiguazai_tortoise)

原文发表时间:2016-05-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏desperate633

Java并发之Slipped conditions什么是Slipped conditions一个关于Slipped conditions的具体例子

所谓Slipped conditions,就是说, 从一个线程检查某一特定条件到该线程操作此条件期间,这个条件已经被其它线程改变,导致第一个线程在该条件上执行了...

7910
来自专栏大内老A

ASP.NET Core的配置(4):多样性的配置来源[中篇]

我们在本篇文章中会介绍三种针对物理文件的ConfiguationProvider,它们分别是针对JSON文件的JsonConfiguationProvider,...

20980
来自专栏Java进阶之路

springboot创建及使用多线程的几种方式

1.8K50
来自专栏技术博客

Asp.Net Web API 2第十六课——Parameter Binding in ASP.NET Web API(参数绑定)

阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.h...

10130
来自专栏用户3030674的专栏

java线程控制方法

1.Thread.sleep() 让线程进入睡眠状态,放弃CPU的占用暂停若干毫秒 使用方法:

12910
来自专栏老马说编程

(72) 显式条件 / 计算机程序的思维逻辑

上节我们介绍了显式锁,本节介绍关联的显式条件,介绍其用法和原理。显式条件也可以被称做条件变量、条件队列、或条件,后文我们可能会交替使用。 用法 基本概念和方法...

19960
来自专栏杂烩

大话HelloWord是如何出现在面前的-浅谈虚拟机运行流程

    初学Java,大都会用记事本写个Hello Word,然后用CMD编译出class文件,最后执行一下。当控制台输出Hello Word的时候,一个简单的...

16520
来自专栏闻道于事

JavaWeb(七)Cookie,EL表达式,标准标签库

Cookie Cookie概述 Cookie译为小型文本文件或小甜饼,Web应用程序利用Cookie在客户端缓存服务器端文件。Cookie是以键值对形式存储在客...

43960
来自专栏转载gongluck的CSDN博客

UNPv13:#第3章#套接字编程简介

IPv4套接字地址结构 POSIX规范只要求3个字段:sin_family、sin_addr和sin_port。 #include <netinet/in.h>...

34750
来自专栏JavaEdge

JedisSentinelPool源码分析

1. 概述 Redis-Sentinel作为官方推荐的HA解决方案,Jedis也在客户端角度实现了对Sentinel的支持,主要实现在JedisSentinel...

37640

扫码关注云+社区

领取腾讯云代金券