CN111813710A - 避免Linux内核内存碎片方法、设备及计算机存储介质 - Google Patents

避免Linux内核内存碎片方法、设备及计算机存储介质 Download PDF

Info

Publication number
CN111813710A
CN111813710A CN202010950426.9A CN202010950426A CN111813710A CN 111813710 A CN111813710 A CN 111813710A CN 202010950426 A CN202010950426 A CN 202010950426A CN 111813710 A CN111813710 A CN 111813710A
Authority
CN
China
Prior art keywords
page
memory
linux kernel
moved
moving
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN202010950426.9A
Other languages
English (en)
Other versions
CN111813710B (zh
Inventor
厉雷刚
许雪松
郭磊
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Peng Cheng Laboratory
Original Assignee
Peng Cheng Laboratory
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Peng Cheng Laboratory filed Critical Peng Cheng Laboratory
Priority to CN202010950426.9A priority Critical patent/CN111813710B/zh
Publication of CN111813710A publication Critical patent/CN111813710A/zh
Application granted granted Critical
Publication of CN111813710B publication Critical patent/CN111813710B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/0223User address space allocation, e.g. contiguous or non contiguous base addressing
    • G06F12/023Free address space management
    • G06F12/0253Garbage collection, i.e. reclamation of unreferenced memory

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Memory System Of A Hierarchy Structure (AREA)

Abstract

本发明公开了一种避免Linux内核内存碎片方法,该方法包括:移除Linux内核内存中虚拟地址与物理地址的线性映射规则;当接收到针对Linux内核内存的分配请求时,查找所述Linux内核内存中的可用物理页帧,并将所述可用物理页帧依次分配给连续的逻辑页;其中,所述分配给连续的逻辑页的可用物理页帧连续或不连续;维护所述逻辑页与可用物理页帧之间的映射关系。彻底解决Linux内核内存碎片化的问题。达到提高Linux内核内存利用率的技术效果。

Description

避免Linux内核内存碎片方法、设备及计算机存储介质
技术领域
本发明涉及计算机内存管理技术领域,尤其涉及一种避免Linux内核内存碎片方法。
背景技术
目前,Linux系统为了降低内存碎片问题,提出了一系列方案,包括伙伴系统、依据可移动性组织页避免内存碎片以及单独设置虚拟可移动内存域避免内存碎片。但是伙伴系统只能缓解内存碎片的问题,当出现大量不连续的单页时,依然会出现内存碎片问题;依据可移动性组织页的方法,把内存页分为不可移动页、可移动页和可回收页,其中依然存在不可移动页,会导致内存碎片的问题;单独设置虚拟可移动内存域的方法,是单独划分一个区域用来做不可移动页的分配,以避免不可移动页加剧可移动页内部碎片化的问题。但是该方法依然存在非可移动域,并且非可移动域内部的页面也会出现碎片化。
发明内容
有鉴于此,提供一种避免Linux内核内存碎片方法,解决Linux内核内存碎片化的问题,提高Linux内核内存的利用率。
本申请实施例提供了一种避免Linux内核内存碎片方法,其特征在于,所述方法包括:
移除Linux内核内存中虚拟地址与物理地址的线性映射规则;
当接收到针对Linux内核内存的分配请求时,查找所述Linux内核内存中的可用物理页帧,并将所述可用物理页帧依次分配给连续的逻辑页;其中,所述分配给连续的逻辑页的可用物理页帧连续或不连续;
维护所述逻辑页与可用物理页帧之间的映射关系。
在一实施例中,所述查找所述Linux内核内存中的可用物理页帧,并将所述可用物理页帧依次分配给连续的逻辑页采用以下步骤:
将Linux的内存分配函数vmalloc函数的分配区域扩展至包含原线性映射规则内存区域;
调用所述vmalloc函数对所述原线性映射规则内存区域进行分配。
在一实施例中,所述维护所述逻辑页与可用物理页帧之间的映射关系采用以下步骤:
采用页表维护所述映射关系;
当需要进行虚拟地址和物理地址的相互转换时,查找所述页表完成虚拟地址和物理地址的相互转换。
在一实施例中,所述方法进一步包括:
当满足预设碎片整理条件时,获取符合内存碎片定义的内存区域的集合;
获取适合进行搬移的待搬移的页面的集合;
将所述待搬移的页面搬移至新的内存区域中,使得内存碎片被整合成地址连续的内存区域;
更新所述页表;其中,将待搬移的页面搬移到新的内存区域和更新所述页表的步骤由第一自旋锁保护。
在一实施例中,所述预设碎片整理条件包括以下至少之一:
监测到Linux内核内存碎片达到预设阈值;
现有空闲连续地址内存区域无法满足单一连续地址的内存分配请求。
在一实施例中,所述将待搬移页面搬移至新的内存区域中,包括对所述待搬移的页面的集合中的每一个待搬移页面重复执行以下步骤:
获取一个待搬移页面,关闭中断;
搬移所述待搬移页面至目标页面;
更新所述页表;
清空所述待搬移页面和目标页面的缓存以及转译后备缓冲器,开启中断。
在一实施例中,所述搬移所述待搬移页面至目标页面后,若搬移过程中所述待搬移页面中的数据存在修改,则将修改后的数据更新到目标页面。
在一实施例中,所述搬移所述待搬移页面至目标页面,包括:
当识别到多个处理器时,指定其中一个处理器为管理者处理器,并为所述多个处理器分配一个页面的搬移任务;
所述管理者处理器执行分配给自身的部分页面搬移任务,并通过核间中断通知其他处理器执行对应的部分页面搬移任务;
当其他处理器完成属于自身的部分页面搬移任务时,完成页面搬移。
在一实施例中,还包括:
当识别到多个处理器时,获取所述第一自旋锁;
当所述管理者处理器或其他处理器完成自身的部分页面搬移时,获取第二自旋锁,并将已完成核数量加一后释放所述第二自旋锁;
当所述管理者处理器检测到所述已完成核数量等于系统处理器总数后,在开启中断之前,释放所述第一自旋锁;
所述其他处理器持续检测是否能够获取所述第一自旋锁,当获取到所述第一自旋锁后,立即释放所述第一自旋锁并结束页面搬移进程。
为实现上述目的,还提供一种计算机可读存储介质,其特征在于,其上存储有避免Linux内核内存碎片方法程序,其特征在于,该避免Linux内核内存碎片方法程序被处理器执行时实现上述任一所述的方法。
为实现上述目的,还提供一种设备,其特征在于,包括存储器、处理器及存储在存储器上并可在处理器上运行的避免Linux内核内存碎片方法程序,所述处理器执行所述避免Linux内核内存碎片方法程序时实现上述任一所述的方法。
本申请实施例中提供的一个或多个技术方案,至少具有如下技术效果或优点:移除Linux内核内存中虚拟地址与物理地址的线性映射规则;线性映射规则对应的内存区域中的页面是不可移动的,所以无法进行Linux内核内存碎片的整理。该步骤移除线性映射规则,让对应的内存区域的页面变换为可移动的,则为执行Linux内核内存碎片整理提供可能。当接收到针对Linux内核内存的分配请求时,查找所述Linux内核内存中的可用物理页帧,并将所述可用物理页帧依次分配给连续的逻辑页;移除线性映射规则,影响到Linux内核内存管理框架,该步骤的目的是重新建立映射规则,将所述可用物理帧依次分配给连续的逻辑页,则不会出现内存碎片的问题,彻底解决Linux内核内存碎片化的问题。维护所述逻辑页与可用物理页帧之间的映射关系;其中,所述分配给连续的逻辑页的可用物理页帧连续或不连续。维护映射关系是为了更好的维持Linux内核内存的管理框架,更稳定的提高Linux内核内存的利用率。
附图说明
图1为本申请避免Linux内核内存碎片方法的第一实施例的流程示意图;
图2为本申请避免Linux内核内存碎片方法中更新后映射关系示意图;
图3为本申请避免Linux内核内存碎片方法对第一实施例中步骤S120细化的流程示意图;
图4为本申请避免Linux内核内存碎片方法对第一实施例中步骤S130细化的流程示意图;
图5为本申请避免Linux内核内存碎片方法的第二实施例的流程示意图;
图6为本申请避免Linux内核内存碎片方法中内存碎片整理示意图;
图7为本申请避免Linux内核内存碎片方法对第二实施例中步骤S260细化的流程示意图;
图8为本申请避免Linux内核内存碎片方法对第二实施例中步骤S262细化的流程示意图;
图9为本申请避免Linux内核内存碎片方法对第二实施例中步骤S262进一步细化的流程示意图;
图10A为本申请避免Linux内核内存碎片方法中管理者核页面搬移流程图;
图10B为本申请避免Linux内核内存碎片方法中其他核页面搬移流程图;
图11为本申请避免Linux内核内存碎片方法的硬件结构示意图。
具体实施方式
应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本发明实施例的主要解决方案是:移除Linux内核内存中虚拟地址与物理地址的线性映射规则;当接收到针对Linux内核内存的分配请求时,查找所述Linux内核内存中的可用物理页帧,并将所述可用物理页帧依次分配给连续的逻辑页;维护所述逻辑页与可用物理页帧之间的映射关系;其中,所述分配给连续的逻辑页的可用物理页帧连续或不连续。彻底解决了Linux内核内存碎片化的问题。达到提高Linux内核内存利用率的技术效果。
为了更好的理解上述技术方案,下面将结合说明书附图以及具体的实施方式对上述技术方案进行详细的说明。
本申请涉及一种设备010,该设备010包括如图11所示:至少一个处理器012、内部存储器011。
处理器012可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器012中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器012可以是通用处理器、数字信号处理器(DSP)、专用集成电路(ASIC)、现场可编程门阵列(FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本发明实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于内部存储器011,处理器012读取内部存储器011中的信息,结合其硬件完成上述方法的步骤。
可以理解,本发明实施例中的内部存储器011可以是易失性存储器或非易失性存储器,或可包括易失性和非易失性存储器两者。其中,非易失性存储器可以是只读存储器(Read Only Memory,ROM)、可编程只读存储器(Programmable ROM,PROM)、可擦除可编程只读存储器(Erasable PROM,EPROM)、电可擦除可编程只读存储器(Electrically EPROM,EEPROM)或闪存。易失性存储器可以是随机存取存储器(Random Access Memory,RAM),其用作外部高速缓存。通过示例性但不是限制性说明,许多形式的 RAM可用,例如静态随机存取存储器(Static RAM,SRAM)、动态随机存取存储器(Dynamic RAM,DRAM)、同步动态随机存取存储器(Synchronous DRAM,SDRAM)、双倍数据速率同步动态随机存取存储器(DoubleDataRate SDRAM,DDRSDRAM)、增强型同步动态随机存取存储器(Enhanced SDRAM,ESDRAM)、同步连接动态随机存取存储器 (Synch link DRAM,SLDRAM) 和直接内存总线随机存取存储器(Direct Rambus RAM,DRRAM)。本发明实施例描述的系统和方法的内部存储器011旨在包括但不限于这些和任意其它适合类型的存储器。
参照图1,图1为本申请避免Linux内核内存碎片方法的第一实施例,所述避免Linux内核内存碎片方法,包括以下步骤:
步骤S110:移除Linux内核内存中虚拟地址与物理地址的线性映射规则。
操作系统是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件。一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割。计算机的硬件,含有外围设备、处理器、内存、硬盘和其他的电子设备组成计算机的发动机。但是没有软件来操作和控制它,自身是不能工作的。完成这个控制工作的软件就称为操作系统。Linux内核的主要模块(或组件)分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。
Linux操作系统采用虚拟内存管理技术,使得每个进程都有各自互不干涉的进程地址空间。该空间是块大小为4G的线性虚拟空间,用户所看到和接触到的都是该虚拟地址,无法看到实际的物理内存地址。利用这种虚拟地址不但能起到保护操作系统的效果(用户不能直接访问物理内存),而且更重要的是,用户程序可使用比实际物理内存更大的地址空间。
虚拟地址是Linux内核虚拟生成的地址,经由MMU(Memory Management Unit,内存管理单元)映射到实际的物理地址。MMU是实际的管理内存的硬件。它是一种负责处理中央处理器(CPU)的内存访问请求的计算机硬件。它的功能包括虚拟地址到物理地址的转换(即虚拟内存管理)、内存保护、中央处理器高速缓存的控制,在较为简单的计算机体系结构中,负责总线的仲裁以及存储体切换(bank switching,尤其是在8位的系统上)。
物理地址实际上是硬件设备上实际的存储设备,是内存管理单元所看到的地址。
Linux物理内存空间分为DMA内存区、低端内存区与高端内存区三部分。DMA内存区通常比较小,只有几十兆。低端内存区和高端内存区的划分源于Linux内核空间大小的限制。
线性映射规则可以是Linux内核内存中虚拟地址和物理地址一一映射和固定偏移的关系,可以是物理地址等于虚拟地址加上固定偏移量,这种关系是线性的,是一种线性映射规则。
移除Linux内核内存中虚拟地址与物理地址的线性映射规则后,Linux内核的低端内存虚拟地址不必再保持与物理地址一一映射和固定偏移值的关系,所以可以把任意一个页面映射到虚拟地址连续的页面,也就不存在了内存碎片的问题。即使有需要物理地址连续的内存时,也可以通过把导致空闲内存不连续的已分配页面,移动到合适的位置,更新一下页表,使得剩余的内存都是连续的,就可以达到避免内存碎片的目的。通过页表的虚拟地址和物理地址映射如图2所示:虚拟地址可以是连续的,物理地址不必是连续的。
步骤S120:当接收到针对Linux内核内存的分配请求时,查找所述Linux内核内存中的可用物理页帧,并将所述可用物理页帧依次分配给连续的逻辑页;其中,所述分配给连续的逻辑页的可用物理页帧连续或不连续。
Linux内核内存的分配请求可以是调用程序时分配给进程的内存请求。可用物理页帧是内存中空闲的、可以被占用的物理页帧。逻辑页是以虚拟地址索引的页,对应一个物理页帧,只是从虚拟地址的角度去访问。
将可用的物理页帧依次分配给连续的逻辑页,保证了逻辑页的连续性,而且依次分配的可用物理页帧可以是连续的或者是不连续的。
步骤S130:维护所述逻辑页与可用物理页帧之间的映射关系。
操作系统执行过程中,需要用到虚拟地址和物理地址的互相转换,所以需要维护虚拟地址和物理地址之间的转换关系。移除线性映射规则后,虚拟地址和物理地址之间不再具有固定的偏移值关系,维护的方式可以选用页表的数据结构。
上述实施例中存在的有益效果为移除Linux内核内存中虚拟地址与物理地址的线性映射规则:线性映射规则对应的内存区域中的页面是不可移动的,所以无法进行Linux内核内存碎片的整理。该步骤移除线性映射规则,让对应的内存区域的页面变换为可移动的,则为执行Linux内核内存碎片整理提供可能。当接收到针对Linux内核内存的分配请求时,查找所述Linux内核内存中的可用物理页帧,并将所述可用物理页帧依次分配给连续的逻辑页;其中,所述分配给连续的逻辑页的可用物理页帧连续或不连续:移除线性映射规则,影响到Linux内核内存管理框架,该步骤的目的是重新建立映射规则,将所述可用物理帧依次分配给连续的逻辑页,则不会出现内存碎片的问题,彻底解决Linux内核内存碎片化的问题。维护所述逻辑页与可用物理页帧之间的映射关系:维护映射关系是为了更好的维持Linux内核内存的管理框架,更稳定的提高Linux内核内存的利用率。
参照图3,图3为本申请避免Linux内核内存碎片方法的第一实施例中S120的细化步骤,所述查找所述Linux内核内存中的可用物理页帧,并将所述可用物理页帧依次分配给连续的逻辑页采用以下步骤:
步骤S121:将Linux的内存分配函数vmalloc函数的分配区域扩展至包含原线性映射规则内存区域。
移除Linux内核内存中虚拟地址与物理地址的线性映射规则后,对Linux的内存管理框架影响比较大,可以调整vmalloc函数的分配区域大小,使其占据原来线性映射区域,可以扩展至原来采用线性映射规则的低端内存区。
步骤S122:调用所述vmalloc函数对所述原线性映射规则内存区域进行分配。
Vmalloc函数是一个接口函数,内核代码用vmalloc来分配虚拟内存中连续但物理内存中不一定连续的内存。该函数只需要一个参数,用于指定所需内存的长度,单位为字节。需要注意的是,vmalloc是以页大小为单位分配内存的。内核在管理虚拟内存中的vmalloc区域时,由于内存是分散的,必须跟踪占用和空闲的子区域,为此定义一个数据结构struct vm_struct,将所有使用的部分保存在一个链表中。
vmalloc函数在使用时,可直接调用_vmalloc_node()函数。
_vmalloc_node函数的实现分两个步骤:
第一、构造一个vm_struct实例,用于记录虚拟地址空间的地址范围,这个地址范围是连续的。
第二、根据vm_struct实例申请实际的页帧,并将虚拟地址的逻辑页一一映射到实际的物理页帧上。
在上述实施例中,通过Vmalloc函数重新对原线性映射规则内存区域进行分配,达到逻辑页连续,物理页帧连续或不连续的内存状态,生成新的映射关系,任意一个物理页帧映射到连续的逻辑页,则系统将不存在内存碎片化的问题,彻底解决Linux内存碎片化的问题。且该映射关系可以保证物理页帧的移动性,以保证物理页帧可以重新整理组合成大块的物理内存,以满足用户需求,提高Linux内核内存利用率。
参照图4,图4为本申请避免Linux内核内存碎片方法的第一实施例中S130的细化步骤,所述维护所述逻辑页与可用物理页帧之间的映射关系采用以下步骤:
步骤S131:采用页表维护所述映射关系。
页表是一种特殊的数据结构,放在系统空间的页表区,存放逻辑页与物理页帧的对应关系。每一个进程都拥有一个自己的页表,PCB(Process Control Block)表中有指针指向页表。
页表的作用是实现从逻辑页到物理页帧的地址映射。
逻辑地址转换成物理地址的过程是:用页号p去检索页表,从页表中得到该页的物理块号,把它装入物理地址寄存器中。同时,将页内地址d直接送入物理地址寄存器的块内地址字段中。这样,物理地址寄存器中的内容就是由二者拼接成的实际访问内存的地址,从而完成了从逻辑地址到物理地址的转换。
步骤S132:当需要进行虚拟地址和物理地址的相互转换时,查找所述页表完成虚拟地址和物理地址的相互转换。
虚拟地址到物理地址的转换可以沿用页表的数据结构,并且虚拟地址到物理地址的转换有规律可循,查找速度不是很慢。但是物理地址到虚拟地址的转换没有易用的规律,需要逆向查找页表结构。然后需要再修改内核的两个转换虚拟地址和物理地址的函数,通过查找页表的方式获取对应的物理地址或者虚拟地址。如果内存空间比较大,可以建立一个物理页地址到虚拟页地址映射的逆向映射表,4G内存,页面大小为4K的话,需要1M*8=8M的空间(对于32位系统,每个映射条目2个32位地址,一个物理地址一个虚拟的地址),逆向映射表按物理地址顺序排列,可以加快查找速度。最好限定一下物理地址到虚拟地址的转换一般只有在内核中才会用到,用户态程序看不到物理地址,所以虽然一个物理地址实际上可能映射多个虚拟地址,但在内核中一个物理地址只可能被一个虚拟地址所映射。所以逆向映射表只需设置一份,不会占用太多空间。
在上述实施例中,通过页表完成虚拟地址到物理地址的相互转换,保证在移除Linux内核内存中虚拟地址与物理地址的线性映射规则后,仍能完成虚拟地址到物理地址的相互转换,保证Linux系统在更新后的映射规则下也可以正常运行。
参照图5,图5为本申请避免Linux内核内存碎片方法的第二实施例,所述避免Linux内核内存碎片方法,进一步包括以下步骤:
步骤S210:移除Linux内核内存中虚拟地址与物理地址的线性映射规则。
步骤S220:当接收到针对Linux内核内存的分配请求时,查找所述Linux内核内存中的可用物理页帧,并将所述可用物理页帧依次分配给连续的逻辑页;其中,所述分配给连续的逻辑页的可用物理页帧连续或不连续。
步骤S230:维护所述逻辑页与可用物理页帧之间的映射关系。
步骤S240:当满足预设碎片整理条件时,获取符合内存碎片定义的内存区域的集合;
预设碎片整理条件可以是预设的进行内存碎片整理的触发条件,当内存状态满足触发条件时,开始进行内存碎片的整理操作。
内存碎片即“碎片的内存”描述一个系统中所有不可用的空闲内存,这些碎片之所以不能被使用,在于这些空闲内存以小且不连续方式出现在不同的位置,且负责动态分配内存的分配算法使得这些空闲的内存无法被使用。
集合是指具有某种特定性质的具体的或抽象的对象汇总而成的集体,符合内存碎片定义的内存区域的集合可以是具有符合内存碎片定义的内存区域中的内存碎片的集体。
步骤S250:获取适合进行搬移的待搬移的页面的集合;
待搬移的页面可以是内存中被占用或者使用的页面,且被内存碎片包围。适合进行搬移可以是在内存状态中搬移该页面花费时间少且能源消耗低。
步骤S260:将所述待搬移的页面搬移至新的内存区域中,使得内存碎片被整合成地址连续的内存区域;
通过搬移可以将散落于内存中的内存碎片重新整理成大块的连续的物理内存区域。可以形成一部分连续的待搬移的页面和一部分连续的空闲物理内存。
步骤S270:更新所述页表;其中,将待搬移的页面搬移到新的内存区域和更新所述页表的步骤由第一自旋锁保护。
页表的作用是实现从逻辑页到物理页帧的地址映射,更新页表是将搬移过程中逻辑页与物理页帧对应的地址映射关系进行更新,若不更新搬移后的页表,则页表中存储的地址映射关系不正确,导致无法进行地址映射转换。
自旋锁是为实现保护共享资源而提出一种锁机制。其实,自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。但是两者在调度机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。
将待搬移的页面搬移到新的内存区域和更新维护所述映射关系的页表的步骤由第一自旋锁保护由第一自旋锁进行保护,保护共享资源的正确使用,且保证搬移过程中和更新维护页表过程中数据的正确性与一致性。
与第一实施例相比,第二实施例包括步骤S240、步骤S250、步骤S260、步骤S270。其他步骤和第一实施例相同,不再赘述。
在本实施例中,移除Linux内核内存中虚拟地址与物理地址的线性映射规则后,不会有虚拟地址的碎片,但是物理地址还是会有碎片的,如果需要连续的物理地址空间,可以通过移动页面数据后更改页表映射的方式来实现。具体可如图6所述内存碎片整理过程,本实施例提供了一种在移除Linux内核内存中虚拟地址与物理地址的线性映射规则后,消除内存碎片的方案,进一步解决Linux内核内存碎片化的问题。
在上述实施例中,所述预设碎片整理条件包括以下至少之一:
监测到Linux内核内存碎片达到预设阈值;
现有空闲连续地址内存区域无法满足单一连续地址的内存分配请求。
新增加的内核进程(碎片管理进程)可以在后台监测内存碎片程度,当内存碎片达到预设阈值时,启动物理内存碎片整理。预设阈值可以是80%,也可以是其他值,不限定于此。
当用户空间需要申请大块物理地址连续的内存时,可以先通过系统调用申请整理物理内存碎片,整理物理内存碎片所得连续地址的内存满足用户大块地址连续的内存需求时,再执行内存分配操作。
也可以通过预设周期来触发物理内存碎片整理操作,例如每四十分钟或者每一个小时,当距上次物理内存碎片整理操作累计满预设周期时,触发本次的物理内存碎片整理操作。该预设周期可以根据用户习惯进行动态调整,并不限定于上述预设周期。
参照图7,图7为本申请避免Linux内核内存碎片方法的第二实施例中S260的细化步骤,所述将待搬移页面搬移至新的内存区域中,包括对所述待搬移的页面的集合中的每一个待搬移页面重复执行以下步骤:
步骤S261:获取一个待搬移页面,关闭中断;
中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。其中关闭中断可以防止待搬移页面的数据被再次更新或者出现错误数据。
步骤S262:搬移所述待搬移页面至目标页面;
目标页面可以是待搬移页面将要搬移的目标地址页面,其目标页面的大小和待搬移页面的大小可以相同。
步骤S263:更新所述页表;
页表的作用是实现从逻辑页到物理页帧的地址映射,更新页表是将搬移过程中逻辑页与物理页帧对应的地址映射关系进行更新,若不更新搬移后的页表,则页表中存储的地址映射关系不正确,导致无法进行地址映射转换。
步骤S264:清空所述待搬移页面和目标页面的缓存以及转译后备缓冲器,开启中断。
缓存(Cache)是指可以进行高速数据交换的存储器,它先于内存与CPU交换数据,因此速率很快。缓存的设置是所有现代计算机系统发挥高性能的重要因素之一。
转译后备缓冲器(Translation Lookaside Buffer)为CPU的一种缓存,由存储器管理单元用于改进虚拟地址到物理地址的转译速度。
在上述实施例中,首先获取一个待搬移页面,把待搬移页面搬移到新地址,然后更新页表,最后清空缓存以及转译后备缓冲器。整理待搬移页面的过程当中是关闭中断的,所以不必担心中断导致待搬移的数据会被再次更新的情况,而又没有把整个搬移过程全部关闭中断,也就不会导致中断响应时间过长,而且中断保证数据的一致性。
在上述实施例中,所述搬移所述待搬移页面至目标页面后,若搬移过程中所述待搬移页面中的数据存在修改,则将修改后的数据更新到目标页面。
搬移过程中所述待搬移页面中的数据存在修改,修改可以是删除数据、添加数据、更新数据等,则用修改后的数据替换原数据,将修改后的数据更新到目标页面中。
参照图8,图8为上述实施例中S262步骤的细化,所述搬移所述待搬移页面至目标页面,包括:
步骤S2621:当识别到多个处理器时,指定其中一个处理器为管理者处理器,并为所述多个处理器分配一个页面的搬移任务;
多核处理器是指一枚处理器中集成两个或多个完整的计算引擎(内核),此时处理器能支持系统总线上的多个处理器,由总线控制器提供所有总线控制信号和命令信号。通过划分任务的方式,线程应用能够充分利用多个执行内核,并可在特定的时间内执行更多任务。
其中识别到多个处理器时,多个处理器共同完成一个待搬移页面的搬移,每个处理器都有各自对应的搬移任务。
步骤S2622:所述管理者处理器执行分配给自身的部分页面搬移任务,并通过核间中断通知其他处理器执行对应的部分页面搬移任务;
核间中断可以是处理器间中断,在多处理器系统中,操作系统需要在多个处理器间协调操作,通常是通过处理器间中断(Inter-Processor Interrupt,IPI)实现的。IPI是一种特殊的硬件中断,由处理器发出,被其他处理器接收,以便于处理器间通信或同步。
通常不明确区分IPI与设备中断,当一个处理器接收到一个中断时,如果发现另一个处理器处理该中断更加合理,则可以通过IPI机制将该中断传递到其他的处理器,实现处理器的负载平衡。
步骤S2623:当其他处理器完成属于自身的部分页面搬移任务时,完成页面搬移。
在上述实施例中,给出操作系统为多核系统时搬移所述待搬移页面至目标页面的技术方案,其中多个处理器共同完成一个页面的搬移任务,通过核间中断通知实现多个处理器间通信和数据同步,提高搬移效率,也进一步扩大物理内存碎片整理的应用范围,无论是单核系统,还是多核系统都可以进行物理内存碎片整理操作,彻底解决Linux内存碎片化的问题。
参照图9,所述S262步骤,还可以包括以下步骤:
步骤S2621’:当识别到多个处理器时,获取所述第一自旋锁;
步骤S2622’:当所述管理者处理器或其他处理器完成自身的部分页面搬移时,获取第二自旋锁,并将已完成核数量加一后释放所述第二自旋锁;
步骤S2623’:当所述管理者处理器检测到所述已完成核数量等于系统处理器总数后,在开启中断之前,释放所述第一自旋锁;
步骤S2624’:所述其他处理器持续检测是否能够获取所述第一自旋锁,当获取到所述第一自旋锁后,立即释放所述第一自旋锁并结束页面搬移进程。
在上述实施例中,第一自旋锁可以保证整个页面搬移过程的数据正确且一致;第二自旋锁可以保证搬移过程中已完成核数量更新步骤的正确性。两个自旋锁的应用共同保证待搬移页面搬移过程的顺利进行。
其中,步骤S262的具体细化流程,可以参照图10A为管理者核页面搬移流程图,图10B为其他核页面搬移流程图,图10A同时也包含了单核系统搬移页面的流程图。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
应当注意的是,在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的部件或步骤。位于部件之前的单词“一”或“一个”不排除存在多个这样的部件。本发明可以借助于包括有若干不同部件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发
明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

Claims (11)

1.一种避免Linux内核内存碎片方法,其特征在于,所述方法包括:
移除Linux内核内存中虚拟地址与物理地址的线性映射规则;
当接收到针对Linux内核内存的分配请求时,查找所述Linux内核内存中的可用物理页帧,并将所述可用物理页帧依次分配给连续的逻辑页;其中,所述分配给连续的逻辑页的可用物理页帧连续或不连续;
维护所述逻辑页与可用物理页帧之间的映射关系。
2.如权利要求1所述的避免Linux内核内存碎片方法,其特征在于,所述查找所述Linux内核内存中的可用物理页帧,并将所述可用物理页帧依次分配给连续的逻辑页采用以下步骤:
将Linux的内存分配函数vmalloc函数的分配区域扩展至包含原线性映射规则内存区域;
调用所述vmalloc函数对所述原线性映射规则内存区域进行分配。
3.如权利要求1所述的避免Linux内核内存碎片方法,其特征在于,所述维护所述逻辑页与可用物理页帧之间的映射关系采用以下步骤:
采用页表维护所述映射关系;
当需要进行虚拟地址和物理地址的相互转换时,查找所述页表完成虚拟地址和物理地址的相互转换。
4.如权利要求3所述的避免Linux内核内存碎片方法,其特征在于,所述方法进一步包括:
当满足预设碎片整理条件时,获取符合内存碎片定义的内存区域的集合;
获取适合进行搬移的待搬移的页面的集合;
将所述待搬移的页面搬移至新的内存区域中,使得内存碎片被整合成地址连续的内存区域;
更新所述页表;其中,将待搬移的页面搬移到新的内存区域和更新所述页表的步骤由第一自旋锁保护。
5.如权利要求4所述的避免Linux内核内存碎片方法,其特征在于,所述预设碎片整理条件包括以下至少之一:
监测到Linux内核内存碎片达到预设阈值;
现有空闲连续地址内存区域无法满足单一连续地址的内存分配请求。
6.如权利要求4所述的避免Linux内核内存碎片方法,其特征在于,所述将待搬移页面搬移至新的内存区域中,包括对所述待搬移的页面的集合中的每一个待搬移页面重复执行以下步骤:
获取一个待搬移页面,关闭中断;
搬移所述待搬移页面至目标页面;
更新所述页表;
清空所述待搬移页面和目标页面的缓存以及转译后备缓冲器,开启中断。
7.如权利要求6所述的避免Linux内核内存碎片方法,其特征在于,所述搬移所述待搬移页面至目标页面后,若搬移过程中所述待搬移页面中的数据存在修改,则将修改后的数据更新到目标页面。
8.如权利要求6所述的避免Linux内核内存碎片方法,其特征在于,所述搬移所述待搬移页面至目标页面,包括:
当识别到多个处理器时,指定其中一个处理器为管理者处理器,并为所述多个处理器分配一个页面的搬移任务;
所述管理者处理器执行分配给自身的部分页面搬移任务,并通过核间中断通知其他处理器执行对应的部分页面搬移任务;
当其他处理器完成属于自身的部分页面搬移任务时,完成页面搬移。
9.如权利要求8所述的避免Linux内核内存碎片方法,其特征在于,还包括:
当识别到多个处理器时,获取所述第一自旋锁;
当所述管理者处理器或其他处理器完成自身的部分页面搬移时,获取第二自旋锁,并将已完成核数量加一后释放所述第二自旋锁;
当所述管理者处理器检测到所述已完成核数量等于系统处理器总数后,在开启中断之前,释放所述第一自旋锁;
所述其他处理器持续检测是否能够获取所述第一自旋锁,当获取到所述第一自旋锁后,立即释放所述第一自旋锁并结束页面搬移进程。
10.一种计算机可读存储介质,其特征在于,其上存储有避免Linux内核内存碎片方法程序,其特征在于,该避免Linux内核内存碎片方法程序被处理器执行时实现权利要求1-9任一所述的方法。
11.一种设备,其特征在于,包括存储器、处理器及存储在存储器上并可在处理器上运行的避免Linux内核内存碎片方法程序,所述处理器执行所述避免Linux内核内存碎片方法程序时实现权利要求1-9任一所述的方法。
CN202010950426.9A 2020-09-11 2020-09-11 避免Linux内核内存碎片方法、设备及计算机存储介质 Active CN111813710B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010950426.9A CN111813710B (zh) 2020-09-11 2020-09-11 避免Linux内核内存碎片方法、设备及计算机存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010950426.9A CN111813710B (zh) 2020-09-11 2020-09-11 避免Linux内核内存碎片方法、设备及计算机存储介质

Publications (2)

Publication Number Publication Date
CN111813710A true CN111813710A (zh) 2020-10-23
CN111813710B CN111813710B (zh) 2021-02-05

Family

ID=72860068

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010950426.9A Active CN111813710B (zh) 2020-09-11 2020-09-11 避免Linux内核内存碎片方法、设备及计算机存储介质

Country Status (1)

Country Link
CN (1) CN111813710B (zh)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112256598A (zh) * 2020-10-27 2021-01-22 上海壁仞智能科技有限公司 一种内存分配的方法及装置、内存寻址的方法及装置
CN113094119A (zh) * 2021-04-28 2021-07-09 杭州国芯科技股份有限公司 一种嵌入式设备程序动态加载方法
CN114595162A (zh) * 2022-05-10 2022-06-07 紫光同芯微电子有限公司 用于java智能卡内存碎片整理的方法和装置
CN117743203A (zh) * 2023-12-28 2024-03-22 摩尔线程智能科技(成都)有限责任公司 存储空间管理方法、装置、电子设备和存储介质

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101231619A (zh) * 2008-02-22 2008-07-30 浙江大学 一种基于非连续页的动态内存管理方法
CN102156675A (zh) * 2010-02-12 2011-08-17 中兴通讯股份有限公司 一种内存分配方法及装置
CN103164278A (zh) * 2011-12-09 2013-06-19 沈阳高精数控技术有限公司 一种面向多核处理器的实时动态内存管理器实现方法
CN103970680A (zh) * 2014-04-28 2014-08-06 上海华为技术有限公司 内存管理方法、装置及嵌入式系统
CN110399310A (zh) * 2018-04-18 2019-11-01 杭州宏杉科技股份有限公司 一种存储空间的回收方法及装置
CN111414248A (zh) * 2019-01-04 2020-07-14 阿里巴巴集团控股有限公司 内存管理方法、装置及计算设备

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101231619A (zh) * 2008-02-22 2008-07-30 浙江大学 一种基于非连续页的动态内存管理方法
CN102156675A (zh) * 2010-02-12 2011-08-17 中兴通讯股份有限公司 一种内存分配方法及装置
CN103164278A (zh) * 2011-12-09 2013-06-19 沈阳高精数控技术有限公司 一种面向多核处理器的实时动态内存管理器实现方法
CN103970680A (zh) * 2014-04-28 2014-08-06 上海华为技术有限公司 内存管理方法、装置及嵌入式系统
CN110399310A (zh) * 2018-04-18 2019-11-01 杭州宏杉科技股份有限公司 一种存储空间的回收方法及装置
CN111414248A (zh) * 2019-01-04 2020-07-14 阿里巴巴集团控股有限公司 内存管理方法、装置及计算设备

Cited By (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112256598A (zh) * 2020-10-27 2021-01-22 上海壁仞智能科技有限公司 一种内存分配的方法及装置、内存寻址的方法及装置
CN113094119A (zh) * 2021-04-28 2021-07-09 杭州国芯科技股份有限公司 一种嵌入式设备程序动态加载方法
CN113094119B (zh) * 2021-04-28 2022-07-12 杭州国芯科技股份有限公司 一种嵌入式设备程序动态加载方法
CN114595162A (zh) * 2022-05-10 2022-06-07 紫光同芯微电子有限公司 用于java智能卡内存碎片整理的方法和装置
CN114595162B (zh) * 2022-05-10 2022-08-19 紫光同芯微电子有限公司 用于java智能卡内存碎片整理的方法和装置
CN117743203A (zh) * 2023-12-28 2024-03-22 摩尔线程智能科技(成都)有限责任公司 存储空间管理方法、装置、电子设备和存储介质
CN117743203B (zh) * 2023-12-28 2024-08-30 摩尔线程智能科技(成都)有限责任公司 存储空间管理方法、装置、电子设备和存储介质

Also Published As

Publication number Publication date
CN111813710B (zh) 2021-02-05

Similar Documents

Publication Publication Date Title
CN111813710B (zh) 避免Linux内核内存碎片方法、设备及计算机存储介质
US10552337B2 (en) Memory management and device
US9824011B2 (en) Method and apparatus for processing data and computer system
US10268588B2 (en) Methods of cache preloading on a partition or a context switch
US9250943B2 (en) Providing memory condition information to guest applications
US8453015B2 (en) Memory allocation for crash dump
US7721068B2 (en) Relocation of active DMA pages
US8719543B2 (en) Systems and methods implementing non-shared page tables for sharing memory resources managed by a main operating system with accelerator devices
US9229878B2 (en) Memory page offloading in multi-node computer systems
US7437517B2 (en) Methods and arrangements to manage on-chip memory to reduce memory latency
US8190839B2 (en) Using domains for physical address management in a multiprocessor system
US20100251260A1 (en) Pre-emptible context switching in a computing device
WO2007065061A2 (en) Cooperative mechanism for efficient application memory allocation
WO2011082165A1 (en) Systems and methods implementing shared or non-shared page tables for sharing memory resources managed by a main operating system with accelerator devices
US10452686B2 (en) System and method for memory synchronization of a multi-core system
US6457107B1 (en) Method and apparatus for reducing false sharing in a distributed computing environment
CN111708638A (zh) 内存分配方法、装置、设备及存储介质
US20130262790A1 (en) Method, computer program and device for managing memory access in a multiprocessor architecture of numa type
Xu et al. Caiti: I/O transit caching for persistent memory-based block device
Mejia Alvarez et al. Memory Management
Xu et al. I/O Transit Caching for PMem-based Block Device
Kim et al. Memory management scheme to improve utilization efficiency and provide fast contiguous allocation without a statically reserved area
CN118210622A (zh) 一种内存分配方法及计算设备
Tuček MEMORY MANAGEMENT IN LINUX

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant