一种Linux操作系统的内存分配方法及释放方法与流程

文档序号:12363552阅读:503来源:国知局
一种Linux操作系统的内存分配方法及释放方法与流程

本发明涉及计算机存储技术领域,特别是涉及一种Linux操作系统的内存分配方法及释放方法。



背景技术:

在Linux操作系统中,内存的管理和分配工作是影响系统稳定运行的重要因素。现有的分配方法是基于伙伴算法,伙伴算法最大限度的减少了内存的碎片,其数据结构中包括链表和位图,链表将同一级别的内存块组织在一起,位图标示了每一个内存块对应的伙伴块的状态,在内存分配时要根据该状态决定内存如何分配。满足以下条件的两个内存块互为伙伴块:两个内存块的大小相同,两个内存块的物理位置相邻且两个内存块的地址的只有最后一位不相同(地址连续)。伙伴算法的思想就是将物理内存分成11个链表,每个链表包含的是大小为2的整数次幂,分别为1,2,4,8......512,1024的内存块。

举例来说要分配大小为256的内存块,会先到块大小为256的链表中查找空闲块,若有,则将块大小为256的链表中的其中一个空闲块分配给进程;若没有,则去大小为512的链表中进行查找,将大小为512的内存块平均分为两部分,一部分分配给进程,一部分插入大小为256的链表中。若大小为512的链表中还没有,到大小为1024的链表中查找,将大小为1024的内存块平均分为三部分,取出大小为256的内存块,将剩下的大小为512的内存块和大小为256的内存块分别插入到大小为512的链表中和大小为256的链表中。

以上是内存块分配的过程,内存块释放的过程则是相反的。在分配过程中由大的内存块分解而成的小的内存块中没有被分配的内存块将一直等着被分配的内存块被释放从而和其合并,合并的操作正是在内存块释放的过程中,因而伙伴系统能避免内存碎片。每一个内存块都有一个伙伴块,两个伙伴块都是空闲时会组成一个大的内存块,将新的内存块组织在该链表的上一级链表中。

尽管伙伴算法非常经典,但是也存在缺陷。比如,合并要求过于严格,只能是满足伙伴关系的内存块才能合并。例如,有两个内存块,虽然两个内存块的大小相同,物理位置相邻但是由于二者的地址不连续,例如最后两位不相同,则两个内存块就不满足伙伴关系,因而也不能合并成为一个大的内存块,导致出现较多小的内存块不能合并成大的内存块,降低了内存的分配和利用效率。

由此可见,如何提高系统的内存分配和利用效率是本领域技术人员亟待解决地问题。



技术实现要素:

本发明的目的是提供一种Linux操作系统的内存分配方法及释放方法,用于提高系统的内存分配和利用效率。

为解决上述技术问题,本发明提供一种Linux操作系统的内存分配方法,,包括:

S10:判断所述Linux操作系统中是否包含有符合内存分配请求的内存空间;如果是,进入步骤S11;

S11:判断第一链表是否包含有所述内存分配请求对应的目标内存块;如果否,则进入步骤S12;

S12:根据所述内存分配请求对应的目标级别在第二链表中确定出第二目标子链表;

S13:判断所述第二目标子链表中是否包含有所述目标内存块;如果是,进入步骤S14,如果否,进入步骤S15;

S14:返回所述目标内存块的地址;

S15:缩减分配给所述Linux操作系统自身的内存,返回步骤S10;

其中,所述第一链表包含多个级别的第一子链表,分别用于存储多个级别的内存块,所述第一链表的伙伴规则为:若两个内存块的大小相同、物理位置相邻且两个内存块的地址除最后一位都相同时,则所述两个内存块互为伙伴块,第一位图指示所述第一链表中的内存块的状态;

所述第二链表包含多个级别的第二子链表,分别用于存储多个级别的内存块,所述第二链表的伙伴规则为:若两个内存块的大小相同、物理位置相邻且两个内存块的地址除最后两位都相同时,则两个内存块互为伙伴块,第二位图指示所述第二链表中的内存块的状态。

优选地,步骤S11具体包括:

S110:根据当前的目标级别在所述第一链表中确定出第一目标子链表;

S111:判断当前的第一目标子链表是否包含有空闲的内存块;如果是,则确定所述第一链表包含有所述内存分配请求对应的目标内存块,如果否,进入步骤S112;

S112:将目标级别+1,并判断当前的目标级别是否大于最大级别;如果是,则确定所述第一链表未包含有所述内存分配请求对应的目标内存块,如果否,返回步骤S110。

优选地,如果当前第一目标子链表包含有所述内存分配请求对应的目标内存块,则在步骤S111之后还包括:

S20:在所述第一目标子链表中将所述目标内存块删除,并将所述目标内存块的地址发送给分配进程。

优选地,在步骤S20之后还包括:

S21:根据所述第二位图判断所述目标内存块是否影响所述第二链表中对应的伙伴块,如果是,则进入步骤S22,如果否,进入步骤S14。

S22:删除所述第二链表中所述目标内存块对应的伙伴块。

优选地,如果所述Linux操作系统中未包含有符合所述内存分配请求的内存空间,则在步骤S10之后还包括:

S23:调用守护进程以向所述Linux操作系统释放内存;返回步骤S10。

一种Linux操作系统的内存释放方法,包括:

S30:确定当前的待释放内存块对应的目标级别;

S31:判断第一链表中是否包含有当前的待释放内存块的伙伴块,如果否,则进入步骤S32;

S32:判断所述第二链表中是否包含有当前的待释放内存块的伙伴块,如果是,进入步骤S33,如果否,则进入步骤S34;

S33:合并当前的待释放内存块及其伙伴块,并加入到所述第二链表相应的第二子链表中;

S34:将当前的待释放内存块加入到所述第一链表相应的第一子链表中;

其中,所述第一链表包含多个级别的第一子链表,分别用于存储多个级别的内存块,所述第一链表的伙伴规则为:若两个内存块的大小相同、物理位置相邻且两个内存块的地址除最后一位都相同时,则所述两个内存块互为伙伴块,第一位图指示所述第一链表中的内存块的状态;

所述第二链表包含多个级别的第二子链表,分别用于存储多个级别的内存块,所述第二链表的伙伴规则为:若两个内存块的大小相同、物理位置相邻且两个内存块的地址除最后两位都相同时,则两个内存块互为伙伴块,第二位图指示所述第二链表中的内存块的状态。

优选地,步骤S31具体包括:

S310:根据所述目标级别在第一链表中查找对应的第一目标子链表;

S311:判断所述第一目标子链表中是否包含有当前的待释放内存块的伙伴块,如果是,则确定所述第一链表中包含有当前的待释放内存块的伙伴块;如果否,则确定所述第一链表中未包含有当前的待释放内存块的伙伴块。

优选地,如果所述第一目标子链表中包含有当前的待释放内存块的伙伴块,则步骤S311之后还包括:

步骤S35:合并当前的待释放内存块及其伙伴块以作为新的待释放内存块,并判断当前的待释放内存块的级别是否小于最大级别;如果是,返回步骤S31,如果否,进入步骤S34。

本发明所提供的Linux操作系统的内存分配方法,在现有伙伴算法的数据结构上,增加了第二链表和第二位图,当在第一链表中没有得到内存分配请求的内存空间时,可以在第二链表中进一步尝试,减少了内存分配请求失败的几率。由于第二链表中将不符合第一链表中的伙伴规则的内存块进一步选取,能够把一部分内存块由非伙伴关系变为伙伴关系,从而加入到分配的队列中,从而提高了内存分配的效率,提高了内存空间的利用率。

本发明所提供的Linux操作系统的内存释放方法,在现有伙伴算法的数据结构上,增加了第二链表和第二位图,当在第一链表中没有实现将待释放内存块合并时,可以在第二链表中进一步尝试,减少了内存释放请求失败的几率。由于第二链表的伙伴规则与第一链表的伙伴规则不同,因此,能够把一部分内存块由非伙伴关系变为伙伴关系,从而实现内存块的合并。由此可见,提高了待释放内存块合并的几率,减小了操作系统的内存碎片。

附图说明

为了更清楚地说明本发明实施例,下面将对实施例中所需要使用的附图做简单的介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例提供的一种Linux操作系统的内存分配方法的流程图;

图2为本发明实施例提供的另一种Linux操作系统的内存分配方法的流程图;

图3为本发明实施例提供的一种Linux操作系统的内存释放方法的流程图;

图4为本发明实施例提供的另一种Linux操作系统的内存释放方法的流程图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下,所获得的所有其他实施例,都属于本发明保护范围。

本发明的核心是提供一种Linux操作系统的内存分配方法及分配方法。

为了使本技术领域的人员更好地理解本发明方案,下面结合附图和具体实施方式对本发明作进一步的详细说明。

图1为本发明实施例提供的一种Linux操作系统的内存分配方法的流程图。如图1所示,Linux操作系统的内存分配方法,包括:

S10:判断Linux操作系统中是否包含有符合内存分配请求的内存空间。如果是,进入步骤S11。

在具体实施中,首先要接收内存分配请求,内存分配请求表示当前需要将操作系统中的一部分内存空间分配出来以便进行使用。因此,如果操作系统中的内存空间不符合内存分配请求的要求的话,则不能完成内存分配请求的任务。通常操作系统的内存空间不符合要求的情况是当前的内存空间小于内存分配请求所需要的内存空间。只有在操作系统的内存空间符合要求的前提下,后续的步骤才能进行。

S11:判断第一链表是否包含有内存分配请求对应的目标内存块。如果否,则进入步骤S12。

其中,第一链表包含多个级别的第一子链表,分别用于存储多个级别的内存块,第一链表的伙伴规则为:若两个内存块的大小相同、物理位置相邻且两个内存块的地址除最后一位都相同时,则两个内存块互为伙伴块,第一位图指示第一链表中的内存块的状态。通过第一位图就可以判断第一链表是否包含有内存分配请求对应的目标内存块。

本文中的级别是按照内存块的大小来区分的,同样大小的内存块具有同样的级别,不同大小的内存块具有不同的级别。本文中的目标内存块指的是与内存分配请求对应的内存块。例如,内存分配请求要需要的内存空间大小为512,则第一链表中大小为512对应的第一子链表中的空闲的内存块就目标内存块。可以理解的是,目标内存块是变化的,其变化与目标级别的变化是同步的。即,如果当前目标级别为2级,对应的第一链表中内存块的大小为4的第一子链表,此时目标内存块就是内存块的大小为4的第一子链表中空闲的内存块;如果当前目标级别为3级,对应的第一链表中内存块的大小为8的第一子链表,此时目标内存块就是内存块的大小为8的第一子链表中空闲的内存块。

S12:根据内存分配请求对应的目标级别在第二链表中确定出第二目标子链表。

第二链表包含多个级别的第二子链表,分别用于存储多个级别的内存块,第二链表的伙伴规则为:若两个内存块的大小相同、物理位置相邻且两个内存块的地址除最后两位都相同时,则两个内存块互为伙伴块,第二位图指示第二链表中的内存块的状态。

当有内存分配请求时,首先是根据内存分配请求对应的目标级别进行查找,即如果内存分配请求需要大小为512的内存块,则目标级别就是9级,则9级所在的第二子链表就是第二目标子链表。

S13:判断第二目标子链表中是否包含有目标内存块。如果是,进入步骤S14,如果否,进入步骤S15。

S14:返回目标内存块的地址。

S15:缩减分配给Linux操作系统自身的内存,返回步骤S10。

通过第二位图就可以判断第二链表是否包含有内存分配请求对应的目标内存块。当确定了第二目标子链表之后,就在该子链表中查看是否有空闲的内存块,如果有则该内存块就是目标内存块,则返回目标内存块的地址,并结束;如果第二目标子链表中不包含有目标内存块,则说明当前分配给Linux操作系统自身的内存较多,导致系统可用的内存较少,因此执行步骤S15。当缩减分配给Linux操作系统自身的内存后,操作系统中可用的内存空间就变多了,此时就可以继续执行步骤S10,这里不再赘述。

本实施例提供的Linux操作系统的内存分配方法,在现有伙伴算法的数据结构上,增加了第二链表和第二位图,当在第一链表中没有得到内存分配请求的内存空间时,可以在第二链表中进一步尝试,减少了内存分配请求失败的几率。由于第二链表中将不符合第一链表中的伙伴规则的内存块进一步选取,能够把一部分内存块由非伙伴关系变为伙伴关系,从而加入到分配的队列中,从而提高了内存分配的效率,提高了内存空间的利用率。

图2为本发明实施例提供的另一种Linux操作系统的内存分配方法的流程图。在上述实施例的基础上,步骤S11具体包括:

S110:根据当前的目标级别在第一链表中确定出第一目标子链表。

S111:判断当前的第一目标子链表是否包含有空闲的内存块;如果是,则确定第一链表包含有内存分配请求对应的目标内存块,如果否,进入步骤S112。

S112:将目标级别+1,并判断当前的目标级别是否大于最大级别;如果是,则确定第一链表未包含有内存分配请求对应的目标内存块,如果否,返回步骤S110。

在步骤S110-S112中,当确定了目标级别后,从目标级别开始,在第一链表中对应的子链表,即第一目标子链表中查找是否包含有空闲的内存块,如果该目标级别对应的子链表不包含空闲的内存块,则将目标级别+1,例如步骤S111的目标级别为3的话,则在步骤S112之后,目标级别就为4。由于链表中最大级别为10,因此,目标级别每增加一级,都需要判断是否大于最大级别,如果大于,则确定第一链表未包含有内存分配请求对应的目标内存块;如果不大于,则在下一级,即新的目标级别对应的在第一链表中确定出第一目标子链表,并重复上述步骤,这里不再所述。

在上述实施例的基础上,如果当前第一目标子链表包含有内存分配请求对应的目标内存块,则在步骤S111之后还包括:

S20:在第一目标子链表中将目标内存块删除,并将目标内存块的地址发送给分配进程。

在上述实施例的基础上,在步骤S20之后还包括:

S21:根据第二位图判断目标内存块是否影响第二链表中对应的伙伴块,如果是,则进入步骤S22,如果否,进入步骤S14。

S22:删除第二链表中目标内存块对应的伙伴块。

由于第二链表中是包含特殊的伙伴块,如果互为伙伴块的一个内存块作为目标内存块的话,则另一个内存块有可能会受到影响而不能存在于第二链表中。第二位图指示第二链表中的内存块的状态,因此,需要通过第二位图判断目标内存块是否影响第二链表中对应的伙伴块,如果影响,则需要删除第二链表中目标内存块对应的伙伴块。

在上述实施例的基础上,如果Linux操作系统中未包含有符合内存分配请求的内存空间,则在步骤S10之后还包括:

S23:调用守护进程以向Linux操作系统释放内存;返回步骤S10。

图3为本发明实施例提供的一种Linux操作系统的内存释放方法的流程图。Linux操作系统的内存释放方法,包括:

S30:确定当前的待释放内存块对应的目标级别。

S31:判断第一链表中是否包含有当前的待释放内存块的伙伴块。如果否,则进入步骤S32。

其中,第一链表包含多个级别的第一子链表,分别用于存储多个级别的内存块,第一链表的伙伴规则为:若两个内存块的大小相同、物理位置相邻且两个内存块的地址除最后一位都相同时,则两个内存块互为伙伴块,第一位图指示第一链表中的内存块的状态。

第二链表包含多个级别的第二子链表,分别用于存储多个级别的内存块,第二链表的伙伴规则为:若两个内存块的大小相同、物理位置相邻且两个内存块的地址除最后两位都相同时,则两个内存块互为伙伴块,第二位图指示第二链表中的内存块的状态。

当有内存释放请求时,首先要确定待释放内存块的大小,以确定目标级别,例如待释放内存块的大小为512,则目标级别就是9级,需要在第一链表的第9级对应的第一子链表中判断是否有伙伴块与其合并。如果没有,则在第二链表中判断是否有伙伴块。由此可见,现对于现有技术,提高了待释放内存块合并的几率,从而减小操作系统的内存碎片。

S32:判断第二链表中是否包含有当前的待释放内存块的伙伴块。如果是,进入步骤S33,如果否,则进入步骤S34。

S33:合并当前的待释放内存块及其伙伴块,并加入到第二链表相应的第二子链表中。

可以理解的是,当两个内存块合并后,其等级就会+1,因此需要加入到下一级对应的第二子链表中。另外,还需要修改第二位图。

S34:将当前的待释放内存块加入到第一链表相应的第一子链表中。

如果第二链表中也没有相应的伙伴块,则说明该待释放内存块在当前无法进行合并,本发明中,将当前的待释放内存块加入到第一链表相应的第一子链表中。例如,待释放的内存块的级别为9级,则加入到第一链表中9级对应的第一子链表中。

本实施例提供的Linux操作系统的内存释放方法,在现有伙伴算法的数据结构上,增加了第二链表和第二位图,当在第一链表中没有实现将待释放内存块合并时,可以在第二链表中进一步尝试,减少了内存释放请求失败的几率。由于第二链表的伙伴规则与第一链表的伙伴规则不同,因此,能够把一部分内存块由非伙伴关系变为伙伴关系,从而实现内存块的合并。由此可见,提高了待释放内存块合并的几率,减小了操作系统的内存碎片。

图4为本发明实施例提供的另一种Linux操作系统的内存释放方法的流程图。在上述实施例的基础上,步骤S31具体包括:

S310:根据目标级别在第一链表中查找对应的第一目标子链表。

S311:判断第一目标子链表中是否包含有当前的待释放内存块的伙伴块,如果是,则确定第一链表中包含有当前的待释放内存块的伙伴块;如果否,则确定第一链表中未包含有当前的待释放内存块的伙伴块。

在上述实施例的基础上,如果第一目标子链表中包含有当前的待释放内存块的伙伴块,则步骤S311之后还包括:

步骤S35:合并当前的待释放内存块及其伙伴块以作为新的待释放内存块,并判断当前的待释放内存块的级别是否小于最大级别;如果是,返回步骤S31,如果否,进入步骤S34。

可以理解的是,如果在第一目标子链表中包含了当前待释放内存块的伙伴块,则合并之后就变为新的待释放内存块,只不过级别+1,此时当前的待释放内存块就是新的待释放内存块。如果新的待释放内存块的级别小于最大级别,则说明还可以进行合并,则返回步骤S31,如果是等于最大级别,则就不可以合并,流程结束。

以上对本发明所提供的提高系统的内存分配和利用效率进行了详细介绍。说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以对本发明进行若干改进和修饰,这些改进和修饰也落入本发明权利要求的保护范围内。

专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。

结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1