kmalloc VS kmem_cache_alloc
2014-05-07 18:14
337 查看
Linux内核为需要动态分配内存的内核程序提供了kmalloc/kfree/kcalloc/krealloc函数接口,它们分别对应于C标准库的malloc/free/calloc/krealloc。除此之外,Linux还提供了kmem_cache_xxx系列系统调用,以提供比上述接口更低的时间复杂度和空间复杂度,那么两者的效率究竟能差多少,它们又各自适合于何种场合呢?
为了保证灵活性,Linux内存分配系统是分层设计的,这种层次设计使得整个设计更加明晰,每个层次都能简单而有效地进行局部优化,所以一般也能提供更好的性能,当然扩展性也更好了,不然SLUB[1]的出现就不可能那么轻松自然了。Linux内存系统自上而下分成以下几部分:
因为kmalloc是基于kmem_cache_create实现的,那么时间效率上kmalloc肯定是占不到任何便宜了,那么究竟能差多少呢?让我们先来看看相关代码:
出于效率上的考虑,上述函数为被声明为内联编译,81行的__builtin_constant_p是gcc的内建函数[3],它能够在编译时判定它的参数是否是编译时常量,如果是它将返回真,因为此函数为内联函数,并且__builtin_constant_p的参数为整型变量,所以判定仍有效。这也就意味着,如果你用如下方式调用kmalloc:
实际执行的将是82-79行的代码。为了能将这部分代码展开,我们不得不参考文件kmalloc_sizes.h的内容:
Linux内存系统的层次结构
为了保证灵活性,Linux内存分配系统是分层设计的,这种层次设计使得整个设计更加明晰,每个层次都能简单而有效地进行局部优化,所以一般也能提供更好的性能,当然扩展性也更好了,不然SLUB[1]的出现就不可能那么轻松自然了。Linux内存系统自上而下分成以下几部分:单位 | 接口 | 算法 |
动态大小 | kmalloc/kfree/krealloc/kcalloc | 按大小组织的缓存数组 |
固定大小 | kmem_cache_create/kmem_cache_destroy kmem_cache_alloc/kmem_cache_free | Slab[2] |
2^n页 | alloc_pages/free_pages __get_free_pages/__free_pages | 伙伴算法 |
kmalloc相对于kmem_cache_alloc的时间复杂度
因为kmalloc是基于kmem_cache_create实现的,那么时间效率上kmalloc肯定是占不到任何便宜了,那么究竟能差多少呢?让我们先来看看相关代码: 79 static inline void *kmalloc(size_t size, gfp_t flags) 80 { 81 if (__builtin_constant_p(size)) { 82 int i = 0; 83 #define CACHE(x) \ 84 if (size <= x) \ 85 goto found; \ 86 else \ 87 i++; 88 #include "kmalloc_sizes.h" 89 #undef CACHE 90 { 91 extern void __you_cannot_kmalloc_that_much(void); 92 __you_cannot_kmalloc_that_much(); 93 } 94 found: 95 return kmem_cache_alloc((flags & GFP_DMA) ? 96 malloc_sizes[i].cs_dmacachep : 97 malloc_sizes[i].cs_cachep, flags); 98 } 99 return __kmalloc(size, flags); 100 } |
ptr = kmalloc(128, GTP_KERNEL); |
1 #if (PAGE_SIZE == 4096) 2 CACHE(32) 3 #endif 4 CACHE(64) 5 #if L1_CACHE_BYTES < 64 6 CACHE(96) 7 #endif 8 CACHE(128) 9 #if L1_CACHE_BYTES < 128 10 CACHE(192) 11 #endif 12 CACHE(256) 13 CACHE(512) 14 CACHE(1024) 15 CACHE(2048) 16 CACHE(4096) 17 CACHE(8192) 18 CACHE(16384) 19 CACHE(32768) 20 CACHE(65536) 21 CACHE(131072) 22 #ifndef CONFIG_MMU 23 CACHE(262144) 24 CACHE(524288) 25 |
相关文章推荐
- kmalloc VS kmem_cache_alloc [转]
- kmalloc VS kmem_cache_alloc
- kmalloc vs kmem_cache_alloc
- kmalloc VS kmem_cache_alloc
- Samsung_tiny4412(驱动笔记09)----alloc_pages,kmalloc,vmalloc,kmem_cache,class
- 内核IPSec代码中xfrm_input.c中关于kmem_cache_alloc的使用分析
- Linux中的内存分配和释放之kmem_cache_alloc()函数分析
- 内存管理-SLAB(分配SLAB对象kmem_cache_alloc())
- 高速dma缓冲使用。kmem_cache_alloc,kmem_cache_create,struct kmem_cache。内核dma
- kmem_cache_alloc, kmem_cache_create, struct kmem_cache
- vmalloc,kmalloc,get_free_page,kmem_cache_create分配内存实例
- 内存管理API之kmem_cache_alloc
- Linux开发心得总结9 - Linux中的内存分配和释放之kmem_cache_alloc()函数分析
- HttpRuntime.Cache vs. HttpContext.Current.Cache
- Linux 物理内存分配器中 kmem_cache 的使用
- Linux SLUB分配器之四(kmem_cache初始化代码分析)
- asp.net Cache vs memcached
- HttpContext.Current.Cache vs. HttpRuntime.Cache
- Nginx错误ngx_slab_alloc() failed: no memory in cache keys zone "nginx_uwsgi_cache"解决方法
- 内存管理-SLAB(创建SLAB高速缓存kmem_cache_create())