kmalloc、vmalloc、kmem_cache_alloc的区别

  • kmalloc()
#include <linux/slab.h>
void *kmalloc(size_t size , int flags);   				 //使用kfree();释放内存

其中flags参数有必要讲一下:一般代码中会用GFP_KERNEL和GFP_ATOMIC两种。
GFP_KERNEL 常规的分配标志,可能会阻塞,但并不是始终使用。
GFP_ATOMIC 这个标志用在中断处理程序、下半部、持有自旋锁以及其他不能睡眠的地方。
注意:kmalloc能够分配的内存块大小,存在一个上限。
kzalloc()
用kzalloc申请内存的时候,效果等同于先是用kmalloc()申请空间,然后用memset()来初始化,所有申请的元素都被初始化为0.


static inline void *kzalloc(size_t size, gfp_t flags)
{
	return kmalloc(size, flags | __GFP_ZERO);

vmalloc()

#include <linux/vmalloc.h>
void *vmalloc(unsigned long size);     //使用vfree();释放内存
  • 两者区别
    1、 vmalloc()分配的内存虚拟地址是连续的,而物理地址无须连续。而kmalloc()确保页在物理地址上是连续的,自然虚拟地址也是连续的。硬件设备用的的任何内存区都必须是物理上连续的块,而不仅仅是虚拟地址连续上的块。
    2、 vmalloc()相比较于kmalloc()效率不高,因为获得的页必须转换为虚拟地址空间上连续的页,必须专门建立页表项。
    3、 vmalloc()仅在不得已时才使用——典型的就是为了申请大块内存。该函数可能睡眠,因此不能从终端上下文中调用,也不能从其他不允许阻塞的情况下进行调用。

顺带提一句,kmalloc和vmalloc分配的是内核的内存,malloc分分配的是用户的内存。

kmem_cache_alloc

void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)

kmalloc是基于kmem_cache_create实现的;
如果是申请固定大小的内存空间,kmalloc和kmem_cache_alloc时间效率相当。kmem_cache_create申请的内存大小是固定的。
因为kmalloc所利用的内存块的大小是事先定义好的,所以很多情况下会产生内部碎片,浪费空间,而kmem_cache_alloc由于内存大小也是量身定做的缘故则不会。但是,有一点是kmem_cache_alloc所不能做到的,那就是动态大小的内存空间,这个任务是非kmalloc莫属。

在这里插入图片描述

Add

phys_to_virt/virt_to_phys

在这里插入图片描述

对于提供了MMU的处理器而言,Linux提供了复杂的存储管理系统,使得进程所能访问的内存达到4GB。进程的4GB内存空间被人为的分为两个部分:用户空间与内核空间。用户空间地址分布从0到3GB(PAGE_OFFSET,在0x86中它等于0xC0000000),3GB到4GB为内核空间。

内核空间中,从3G到vmalloc_start这段地址是物理内存映射区域(该区域中包含了内核镜像、物理页框表mem_map等等),比如VMware虚拟系统内存是160M,那么3G~3G+160M这片内存就应该映射物理内存。在物理内存映射区之后,就是vmalloc区域。
对于160M的系统而言,vmalloc_start位置应在3G+160M附近(在物理内存映射区与vmalloc_start期间还存在一个8M的gap来防止跃界),vmalloc_end的位置接近4G(最后位置系统会保留一片128k大小的区域用于专用页面映射),
  kmalloc和get_free_page申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因此存在较简单的转换关系,virt_to_phys()可以实现内核虚拟地址转化为物理地址。

kmalloc_tag和alloc_page的区别:
http://blog.chinaunix.net/uid-20564848-id-72946.html
https://blog.csdn.net/ilufam1314/article/details/122498961

不连续的内存可能cache友好性低

__GFP_NOWARN

NUMA ( Non-Uniform Memory Access),非均匀访问存储模型,这种模型的是为了解决smp扩容性很差而提出的技术方案,如果说smp 相当于多个cpu 连接一个内存池导致请求经常发生冲突的话,numa 就是将cpu的资源分开,以node 为单位进行切割,每个node 里有着独有的core ,memory 等资源,这也就导致了cpu在性能使用上的提升,设计原理就是访问本地资源(本地内存、I/O槽口)的速度远远高于访问远地资源(其他node的资源)的速度,但是同样存在问题就是多个node 之间的资源交互非常慢,当cpu增多的情况下,性能提升的幅度并不是很高,无法实现性能的现象增加。所以可以看到很多明明有很多core的服务器却只有2~4个node区。

mmap()函数:
在这里插入图片描述

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值