没有合适的资源?快使用搜索试试~ 我知道了~
Linux内存管理之malloc、vmalloc、kmalloc
需积分: 40 23 下载量 16 浏览量
2017-10-31
19:35:13
上传
评论 2
收藏 624KB PDF 举报
温馨提示
试读
5页
Linux内存管理之malloc、vmalloc、kmalloc, 区别,相似之处
资源推荐
资源详情
资源评论
linux内存管理之malloc、vmalloc、kmalloc的区别
1、kmalloc和vmalloc是分配的是内核的内存内核的内存 ,malloc分配的是用户的内存用户的内存
2、kmalloc保证分配的内存在物理上是连续物理上是连续 的,内存只有在要被DMA访问的时候才需要物理上连续,,malloc和和vmalloc保证的是在虚拟地虚拟地
址址空间上的连续
3、kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大
4、vmalloc比kmalloc要慢。尽 管在某些情况下才需要物理上连续的内存块,但是很多内核代码都用kmalloc来获得内存,而不是
vmalloc。这主要是出于性能的考虑。 vmalloc函数为了把物理内存上不连续的页转换为虚拟地址空间上连续的页,必须专门建立页表
项。糟糕的是,通过vmalloc获得的页必须一个个地进 行映射,因为它们物理上是不连续的,这就会导致比直接内存映射大得多的TLB抖
动,vmalloc仅在不得已时才会用--典型的就是为了获得大块内存时。
malloc的实现原理
malloc函数的实质体现在, 它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表(全局变量,一个内存块的链表指针)。调用
malloc函数时,它沿连接表寻找一个大到足以满 足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大
小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存 传给用户,并将剩下的那块(如果有的话)返回到连接表
上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存 片段,如果这时用户申请一个大的
内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地 检查各内存
片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。 malloc()在操作系统中的实现 在 C 程序中,多次使用malloc ()
和 free()。不过,您可能没有用一些时间去思考它们在您的操作系统中是如何实现的。
本节将向您展示 malloc 和 free 的一个最简化实现的代码,来帮助说明管理内存时都涉及到了哪些事情。 在大部分操作系统中,内存
分配由以下两个简单的函数来处理:
void *malloc (long numbytes):
该函数负责分配 numbytes 大小的内存,并返回指向第一个字节的指针。
void free(void *firstbyte):
如果给定一个由先前的 malloc 返回的指针,那么该函数会将分配的空间归还给进程的“空闲空间”。
malloc_init 将是初始化内存分配程序的函数。它要完成以下三件事:将分配程序标识为已经初始化,找到系统中最后一个有效内存地址,
然后建立起指向我们管理的内存的指针。这三个变量都是全局变量:
如前所述,被映射的内存的边界(最后一个有效地址)常被称为系统中断点或者当前中断点。在很多 UNIX? 系统中,为了指出当前系统
中断点,必须使用sbrk(0) 函数。 sbrk 根据参数中给出的字节数移动当前系统中断点,然后返回新的系统中断点。使用参数 0 只是返回当
前中断点。这里是我们的 malloc 初始化代码,它将找到当前中断点并初始化我们的变量
现在,为了完全地管理内存,我 们需要能够追踪要分配和回收哪些内存。在对内存块进行了 free 调用之后,我们需要做的是诸如将它们
标记为未被使用的等事情, 并且, 在调用 malloc 时, 我们要能够定位未被使用的内存块。 因此, malloc返回的每块内存的起始处首先要
有这个结构:
资源评论
WANGZHEN`
- 粉丝: 432
- 资源: 44
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功