当前位置: 技术问答>linux和unix
请问kmem_cache_alloc_node作用
来源: 互联网 发布时间:2016-07-27
本文导语: struct kmem_cache *cache; struct skb_shared_info *shinfo; struct sk_buff *skb; cache = fclone ? skbuff_fclone_cache : skbuff_head_cache; // Get the HEAD skb = kmem_cache_alloc_node(cache, gfp_mask & ~__GFP_DMA, node); 以上是linux网络驱动中的一...
struct kmem_cache *cache;
struct skb_shared_info *shinfo;
struct sk_buff *skb;
cache = fclone ? skbuff_fclone_cache : skbuff_head_cache;
// Get the HEAD
skb = kmem_cache_alloc_node(cache, gfp_mask & ~__GFP_DMA, node);
以上是linux网络驱动中的一句. 调试时候cache=0. 请问kmem_cache_alloc_node是不是申请一段内存给skb指针?
struct skb_shared_info *shinfo;
struct sk_buff *skb;
cache = fclone ? skbuff_fclone_cache : skbuff_head_cache;
// Get the HEAD
skb = kmem_cache_alloc_node(cache, gfp_mask & ~__GFP_DMA, node);
以上是linux网络驱动中的一句. 调试时候cache=0. 请问kmem_cache_alloc_node是不是申请一段内存给skb指针?
|
确实是分配一段内存给skb指针
这里分配的内存是通过slab分配器分配的
因为一个经常用到的数据结构,如果经常申请和释放,效率和内存碎片不好解决。
使用slab分配器,事先分配好一片内存(struct kmem_cache *cache; )专门供某种数据类型(struct sk_buff *)使用,分配不过是返回一个已经申请好的指针,释放也不是真的释放,下次再申请这样的数据类型,就能继续使用。
kmem_cache_alloc_node 是 kmem_cache_alloc的在numa构架上的扩展,
如果指定的 NUMA 节点与本处理器所在节点不一致,则先从指定节点上获取 slab,替换处理器活动 slab,然后分配对象。
这里分配的内存是通过slab分配器分配的
因为一个经常用到的数据结构,如果经常申请和释放,效率和内存碎片不好解决。
使用slab分配器,事先分配好一片内存(struct kmem_cache *cache; )专门供某种数据类型(struct sk_buff *)使用,分配不过是返回一个已经申请好的指针,释放也不是真的释放,下次再申请这样的数据类型,就能继续使用。
kmem_cache_alloc_node 是 kmem_cache_alloc的在numa构架上的扩展,
如果指定的 NUMA 节点与本处理器所在节点不一致,则先从指定节点上获取 slab,替换处理器活动 slab,然后分配对象。