G06F12/02
1.一种在内核中高速分配连续内存的方法,其特征在于:步骤如下:
步骤1:在32位系统上作地址划分,使一次申请的最小单元为4MB;
步骤2:每一个单元使用一个位图表示是否已经被申请;
步骤3:系统分配时计算所申请的内存需要的最小单元个数;
步骤4:查内存模块位图,若出现满足个数的连续个最小单元位图为1,则分配;若不成功,返回继续申请。
2.如权利要求1所述一种在内核中高速分配连续内存的方法,其特征在于:所述步骤1地址划分方法为选取该32位地址的高5位用作32个整型块的寻址,用次高5位用作整型变量内部所对应位的寻址,用其他22位作为4M空间的首地址。
3.如权利要求1所述一种在内核中高速分配连续内存的方法,其特征在于:所述位图为1表示未被占用,若为0表示已经占用。
技术领域
本发明涉及数据存储领域,具体涉及一种在内核中告诉分配连续内存的方法。
背景技术
在Linux内核态申请连续空间,根据内存管理算法,一次最多申请2的order次方个页面的空间。如果要申请连续大内存,需要自己的管理结构。一种管理策略就是将计算机的所有内存块全部申请下来,然后对这些内存块进行排序。到合适的内存块,释放其他内存块。另外一种管理结构是采用链表管理,把每次在内核态申请到的空间都串到链上,同时管理这些空间。如果发现申请到的空间和链表上的空间连续就将合并空间,查看合并后的空间是否满足要求,如果满足就申请下该块。上述两种策略都需要消耗大量的内存空间,效率低下。
采用位图策略,可以有效减小内存空间。例如,如果要分配4G的连续内存,在32位机器上只需要32个整型变量就可以维护管理这个结构,大大节省了内存空间。另外,它的操作更是简单,只需要简单的6条位操作语句,再加上一个判断就可以完成内核态连续大内存的申请。
发明内容
本发明目的是采用位图管理实现了一个在内核空间申请连续大内存的高效的方法。
一种在内核中高速分配连续内存的方法,步骤如下:
步骤1:在32位系统上作地址划分,使一次申请的最小单元为4MB;
步骤2:每一个单元使用一个位图表示是否已经被申请;
步骤3:系统分配时计算所申请的内存需要的最小单元个数;
步骤4:查内存模块位图,若出现满足个数的连续个最小单元位图为1,则分配;若不成功,返回继续申请。
本发明的一种优选技术方案在于:所述步骤1地址划分方法为选取该32位地址的高5位用作32个整型块的寻址,用次高5位用作整型变量内部所对应位的寻址,用其他22位作为4M空间的首地址。
本发明的另一种优选技术方案在于:所述位图为1表示未被占用,若为0表示已经占用。
本发明利用最少的存储资源在内核态实现了对连续内存的申请管理,提高了效率,同时本发明实现结构简单清晰,有较好的可扩展性。
附图说明
图1是本发明原理示意图
具体实施方案
在32位系统上,在内核态一次申请4M连续内存(order=10),返回一个32位的地址。可以选取该32位地址的高5位(31---27位)用作32个整型块的寻址,用次高5位(26---22位)用作整型变量内部所对应位的寻址,用其他22位(21---0)作为4M空间的首地址。上图是一个内存的片段,每位代表一个4M的空间。如果要在内核态申请连续的N个4M的空间,只需要在内存块中出现连续的N个1即可。
例如,某一时刻申请一个4M的空间,返回地址为0x12345678,解析高5位00010,次高5位01000,可以确定在整个地址空间偏移为00010的32位中的01000位置1,如上图中b所示。现在需要做的就是判断新置的位是否可以和该位的前面或后面相连构成满足需要的连续的内存块数的要求,如上图所示是32个整型变量里面的3个,某时刻申请了一个地址,经计算填到了a里面的第8位,b和c里面的位用x来表示(x等于0或1)。利用下面的6步操作,再加 上一个判断就可以判断是否在a中的某位置1,就可以和b中的位构成连续的符合要求的内存。
下面是具体的操作步骤:
(1)tmpb=~b;
(2)tmp=tmpb &(tmpb-1);
(3)tmp=tmp^tmpb;
(4)tmp-=-1;
(5)tmpa=a>>(32-shift_bit);
(6)tmpc=tmp|tmpa;
(7)if(tmpc>=(1<<shift_bit)-1)
成功到;
else
继续申请,返回第一步。
本文发布于:2024-09-23 14:21:36,感谢您对本站的认可!
本文链接:https://www.17tex.com/tex/1/87025.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |