CN115982060B - 一种内存回收方法及相关装置 - Google Patents

一种内存回收方法及相关装置 Download PDF

Info

Publication number
CN115982060B
CN115982060B CN202111198573.6A CN202111198573A CN115982060B CN 115982060 B CN115982060 B CN 115982060B CN 202111198573 A CN202111198573 A CN 202111198573A CN 115982060 B CN115982060 B CN 115982060B
Authority
CN
China
Prior art keywords
memory
call
objects
path
reclamation
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.)
Active
Application number
CN202111198573.6A
Other languages
English (en)
Other versions
CN115982060A (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.)
Huawei Technologies Co Ltd
Original Assignee
Huawei Technologies Co Ltd
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 Huawei Technologies Co Ltd filed Critical Huawei Technologies Co Ltd
Priority to CN202111198573.6A priority Critical patent/CN115982060B/zh
Publication of CN115982060A publication Critical patent/CN115982060A/zh
Application granted granted Critical
Publication of CN115982060B publication Critical patent/CN115982060B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Stored Programmes (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本申请公开了一种内存回收方法,应用于电子设备中。该方法包括:获取来自于第一对象的内存分配请求;确定内存分配请求对应的调用路径,调用路径包括多个对象之间的调用关系,第一对象为调用路径中的最后一个对象;根据调用路径确定用于执行内存回收的第二对象,第二对象为未触发执行内存回收的对象;调用第二对象,以触发第二对象执行内存回收操作。基于本方法,能够有效地选择执行回收内存的对象,保证内存回收的正常执行,避免出现内存回收失败的现象。

Description

一种内存回收方法及相关装置
技术领域
本申请涉及计算机技术领域,尤其涉及一种内存回收方法及相关装置。
背景技术
现代操作***(如Linux、Android、iOS、Fuchsia等),通常会基于性能方面的需求,将大量的应用程序的数据缓存在内存中。另一方面,由于硬盘中的数据和网络上的数据的访问速度较慢,操作***通常将硬盘以及网络上的数据缓存在内存中,以提升硬盘数据和网络数据的访问性能。为了满足以上应用程序与外部设备的缓存共存的场景需求,操作***需要实现内存动态分配与回收,以保证内存资源的高效使用与快速分配。
为了完成内存动态分配与回收,业界普遍采用如下方法:在应用程序需要申请内存的情况下,操作***检查***的空闲内存是否能够满足应用程序的内存分配请求;当空闲内存的空间不足时,操作***会先将硬盘和网络相关的缓存数据进行回收,并将回收后所得到的空闲内存分配给应用程序。
通常,现有的方法在大部分情况下能够完成内存的回收与分配。但是在一些特殊情况下,现有的方法容易出现内存回收失败的现象,导致无法及时给应用程序分配空闲内存,从而影响应用程序的正常运行。
发明内容
本申请提供了一种内存回收方法及相关装置,能够有效地选择执行回收内存的对象,保证内存回收的正常执行,避免出现内存回收失败的现象。
本申请第一方面提供一种内存回收方法,应用于具有内存的电子设备上。该方法包括:获取来自于第一对象的内存分配请求,该第一对象可以是运行于电子设备中的进程或函数,该内存分配请求用于请求分配空闲内存。
然后,确定所述内存分配请求对应的调用路径,所述调用路径包括多个对象之间的调用关系,所述第一对象为所述调用路径中的最后一个对象。该调用路径上的多个对象从前往后有序地进行调用,直至调用所述第一对象,且由所述第一对象生成所述内存分配请求。调用路径上的多个对象中任意两个相邻的对象之间具有调用关系。
其次,根据所述调用路径确定用于执行内存回收的第二对象,所述第二对象为未触发执行内存回收的对象。具体地,基于所述调用路径能够确定调用第一对象的其他对象,以及其他对象进一步的调用关系。基于调用路径中所指示的多个对象之间的调用关系,可以进一步确定调用路径上的各个对象是否已触发执行内存回收,从而确定未触发执行内存回收的第二对象。
最后,调用所述第二对象,以触发所述第二对象执行内存回收操作。
本方案中,通过在获取到内存分配请求之后,确定内存分配请求对应的调用路径,从而确定该内存分配请求是否来自于执行内存回收的对象以及来自于哪个执行内存回收的对象。在确定内存分配请求的来源之后,即可选择还没触发执行内存回收的对象来执行内存回收操作,从而避免内存回收陷入逻辑循环依赖,保证内存回收的正常进行。
在一种可能的实现方式中,电子设备根据调用路径所属的不同情况,确定用于执行内存回收的对象。
若所述调用路径中不包括内存管理对象,电子设备则在多个候选对象中确定所述第二对象。其中,所述内存管理对象用于触发其他对象执行内存回收,电子设备中的任意一个对象都是在被内存管理对象调用后才触发执行内存回收操作,即被内存管理对象调用是触发执行内存回收的必要条件。所述第二对象则为所述多个候选对象中的任意一个对象。
若所述调用路径中包括内存管理对象及所述内存管理对象所调用的第三对象,则在所述多个候选对象中确定与所述第三对象不相同的所述第二对象,所述第三对象为已触发执行内存回收的对象。
其中,所述第三对象可以是包括一个对象或者多个对象。在所述内存管理对象在所述调用路径中出现一次时,所述第三对象则包括一个对象。在所述内存管理对象在所述调用路径中出现多次时,所述第三对象则包括多个对象,即所述内存管理对象每次调用的对象都是不同的。
本方案中,通过确定调用路径上是否具有内存管理对象来判断是否存在已触发内存回收的对象,并且通过确定内存管理对象所调用的对象来确定已触发内存回收的对象,从而能够准确地选择还没触发执行内存回收的对象来执行内存回收操作,避免内存回收陷入逻辑循环依赖,保证内存回收的正常进行。
在一种可能的实现方式中,所述多个候选对象包括文件***对象、网络协议栈对象和驱动对象。
在一种可能的实现方式中,电子设备中的内存管理对象在获取到内存分配请求之后,可以获取所述内存分配请求中的调用信息,并根据所述调用信息确定内存分配请求对应的调用路径。
其中,所述调用信息用于记录对象间的调用关系,即记录调用路径上的进程之间的调用关系。所述调用信息携带于所述调用路径中的每个对象所生成的进程间调用消息中,且所述调用信息在所述调用路径中的对象生成新的进程间调用消息时更新。
即,调用路径上的任意一个对象在调用另一个对象时,都会生成携带有调用信息的进程间调用消息。并且,调用路径上的对象在被调用期间进行调用其他对象时,该对象会根据被调用时所接收到的进程间调用消息,生成新的进程间调用消息,且新的进程间调用消息中的调用信息是根据被调用时所接收到的进程间调用消息中的调用信息更新得到的。
本方案中,通过在进程间调用消息中增加调用信息,以记录进程间的调用关系,从而保证获取到内存分配请求的内存管理对象能够快速确定调用路径上的对象。
在一种可能的实现方式中,当所述调用路径中的任意一个对象在执行来自于另一个对象的进程间调用消息的期间生成新的进程间调用消息时,所述新的进程间调用消息中的调用信息发生更新,以使得更新后的调用信息中记录生成所述新的进程调用消息的对象。
简单来说,当一个进程需要调用另一个进程时,作为调用者的进程会向作为被调用者的进程发送进程间调用消息,以实现对进程的调用。当一个进程在被调用期间需要调用下一个进程时,该进程则根据被调用时的进程间调用消息生成新的进程间调用消息,新的进程间调用消息中的调用信息同时发生了更新。更新后的调用信息记录了当前进程与下一个进程之间的调用关系,同时还保留了当前进程与当前进程之前的其他进程的调用关系。
在一种可能的实现方式中,所述调用信息包括多个比特位,所述多个比特位中的每个比特位分别用于表示不同的对象,所述每个比特位的置位情况分别用于表示所述每个比特位对应的对象是否位于所述调用路径上。例如,可以是以调用信息中的比特位置位来表示该比特位对应的对象位于调用路径上,也可以是以调用信息中的比特位不置位来表示该比特位对应的对象位于调用路径上。
本方案中,通过不同的比特位来表示不同的对象,并通过比特位的置位情况来表示对象是否被调用,能够基于少量的数据位有效地记录调用路径上的对象,节省调用信息的开销。
在一种可能的实现方式中,在所述多个比特位中的第一比特位被置位之前,所述多个比特位中的其他比特位无法被置位,其中所述第一比特位用于表示内存管理对象,所述内存管理对象用于触发其他对象执行内存回收。也就是说,在没有调用内存管理对象之前,调用信息中的所有比特位均无法被置位。
这样,在调用信息中的所有比特位均没有被置位的情况下,电子设备可以通过确定调用路径上不存在已经触发执行内存回收的对象;在调用信息中的比特位被置位的情况下,电子设备可以确定被置位的比特位对应的对象即为内存管理对象和已经触发执行内存回收的对象。
本方案中,通过设置在内存管理对象对应的比特位被置位后,其他的比特位才能够被置位,使得调用信息能够有效地表示调用路径中是否包括已触发执行内存回收的对象,以及调用路径中所包括的已触发执行内存回收的对象。通过少量的数据位即可实现记录对象是否已触发内存回收操作,便于后续选择用于执行内存回收的对象,且节省调用信息的开销。
在一种可能的实现方式中,所述调用信息包括多个对象的标识,所述多个对象的标识分别用于表示位于所述调用路径上的对象。具体地,每一个对象可以用不同的标识来进行表示。在对象的调用过程中,每调用一个新的对象,则在调用信息中增加调用者的标识或者被调用者的标识,从而实现记录调用路径上的对象。
在一种可能的实现方式中,所述调用信息还包括所述调用路径中的对象的运行状态和/或所述调用路径中的对象的调用顺序。
本方案中,通过记录对象的运行状态,通常能够方便地确认对象是否能够完成内存回收操作以及无法完成内存回收操作的原因;通过记录调用路径中的对象的调用顺序,能够明确调用路径中各个对象相互之间的调用关系,从而便于选择用于执行内存回收操作的对象。
在一种可能的实现方式中,电子设备中的内存管理对象在获取到内存分配请求之后,可以确定所述内存分配请求对应的函数调用栈,并根据所述函数调用栈确定所述调用路径。
一般来说,在函数调用的过程中,电子设备会建立一个函数调用栈,将同一条调用路径上的所有函数均记录至函数栈中。具体地,每发生一次函数调用,电子设备则将当前发生的函数调用中的调用者函数以及被调用者函数压入至函数栈中,从而实现调用路径上的函数的记录。
本申请第二方面提供一种内存回收装置,包括获取单元和处理单元;所述获取单元,用于获取来自于第一对象的内存分配请求;所述处理单元,用于确定所述内存分配请求对应的调用路径,所述调用路径包括多个对象之间的调用关系,所述第一对象为所述调用路径中的最后一个对象;所述处理单元,还用于根据所述调用路径确定用于执行内存回收的第二对象,所述第二对象为未触发执行内存回收的对象;所述处理单元,还用于调用所述第二对象,以触发所述第二对象执行内存回收操作。
在一种可能的实现方式中,所述处理单元,还用于:若所述调用路径中不包括内存管理对象,则在多个候选对象中确定所述第二对象,所述内存管理对象用于触发其他对象执行内存回收,所述第二对象为所述多个候选对象中的任意一个对象;若所述调用路径中包括内存管理对象及所述内存管理对象所调用的第三对象,则在所述多个候选对象中确定与所述第三对象不相同的所述第二对象,所述第三对象为已触发执行内存回收的对象。
在一种可能的实现方式中,所述多个候选对象包括文件***对象、网络协议栈对象和驱动对象。
在一种可能的实现方式中,所述获取单元,还用于获取所述内存分配请求中的调用信息,其中,所述内存分配请求为进程间调用消息,所述调用信息用于记录对象间的调用关系,所述调用信息携带于所述调用路径中的每个对象所生成的进程间调用消息中,且所述调用信息在所述调用路径中的对象生成新的进程间调用消息时更新;所述处理单元,还用于根据所述调用信息确定所述调用路径。
在一种可能的实现方式中,当所述调用路径中的任意一个对象在执行来自于另一个对象的进程间调用消息的期间生成新的进程间调用消息时,所述新的进程间调用消息中的调用信息发生更新,以使得更新后的调用信息中记录生成所述新的进程调用消息的对象。
在一种可能的实现方式中,所述调用信息包括多个比特位,所述多个比特位中的每个比特位分别用于表示不同的对象,所述每个比特位的置位情况分别用于表示所述每个比特位对应的对象是否位于所述调用路径上。
在一种可能的实现方式中,在所述多个比特位中的第一比特位被置位之前,所述多个比特位中的其他比特位无法被置位,其中所述第一比特位用于表示内存管理对象,所述内存管理对象用于触发其他对象执行内存回收。
在一种可能的实现方式中,所述调用信息包括多个对象的标识,所述多个对象的标识分别用于表示位于所述调用路径上的对象。
在一种可能的实现方式中,所述调用信息还包括所述调用路径中的对象的运行状态和/或所述调用路径中的对象的调用顺序。
在一种可能的实现方式中,所述处理单元,还用于:确定所述内存分配请求对应的函数调用栈;根据所述函数调用栈,确定所述调用路径。
在一种可能的实现方式中,所述第一对象包括进程或函数,所述第二对象包括进程或函数。
本申请第三方面提供一种电子设备,该电子设备包括:存储器和处理器;所述存储器存储有代码,所述处理器被配置为执行所述代码,当所述代码被执行时,所述电子设备执行如第一方面中的任意一种实现方式的方法。
本申请第四方面提供一种计算机可读存储介质,计算机可读存储介质中存储有计算机程序,当其在计算机上运行时,使得计算机执行如第一方面中的任意一种实现方式的方法。
本申请第五方面提供一种计算机程序产品,当其在计算机上运行时,使得计算机执行如第一方面中的任意一种实现方式的方法。
本申请第六方面提供一种芯片,包括一个或多个处理器。处理器中的部分或全部用于读取并执行存储器中存储的计算机程序,以执行上述任一方面任意可能的实现方式中的方法。
可选地,该芯片该包括存储器,该存储器与该处理器通过电路或电线与存储器连接。可选地,该芯片还包括通信接口,处理器与该通信接口连接。通信接口用于接收需要处理的数据和/或信息,处理器从该通信接口获取该数据和/或信息,并对该数据和/或信息进行处理,并通过该通信接口输出处理结果。该通信接口可以是输入输出接口。本申请提供的方法可以由一个芯片实现,也可以由多个芯片协同实现。
附图说明
图1为本申请实施例提供的一种内存回收方法的应用场景架构示意图;
图2为本申请实施例提供的一种电子设备101的结构示意图;
图3为本申请实施例提供的一种内存回收方法300的流程示意图;
图4为本申请实施例提供的一种调用信息的结构示意图;
图5为本申请实施例提供的一种调用信息的另一结构示意图;
图6为本申请实施例提供的一种函数栈的结构示意图;
图7为本申请实施例提供的一种***架构示意图;
图8为本申请实施例提供的一种内存回收的流程示意图;
图9为本申请实施例提供的一种进程调用的流程示意图;
图10为本申请实施例提供的一种进程通过通信管理模块实现进程调用的流程示意图;
图11为本申请实施例提供的一种在IPC消息中记录调用路径上的进程的示意图;
图12为本申请实施例提供的一种分配回收器分配和回收内存的流程示意图;
图13为本申请实施例提供的一种内存回收装置1300的结构示意图;
图14为本申请实施例提供的一种计算机可读存储介质1400的结构示意图。
具体实施方式
下面结合附图,对本申请的实施例进行描述。本领域普通技术人员可知,随着技术的发展和新场景的出现,本申请实施例提供的技术方案对于类似的技术问题,同样适用。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的术语在适当情况下可以互换,这仅仅是描述本申请的实施例中对相同属性的对象在描述时所采用的区分方式。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,以便包含一系列单元的过程、方法、***、产品或设备不必限于那些单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它单元。
为了便于理解,以下先介绍本申请实施例所涉及的技术术语。
内存管理:软件运行时操作***对计算机内存资源进行分配和使用的技术。
远程过程调用(Remote Procedure Call,RPC):一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。例如,对于服务器A和服务器B,一个应用程序部署在服务器A上,该应用程序想要调用服务器B上的应用程序所提供的函数/方法。由于服务器A和服务器B上的应用程序不在同一个内存空间,无法实现直接调用,此时就需要通过网络来表达调用的语义和传达调用的数据。这种通过网络来实现服务调用的方式就是RPC。
进程间通信(Inter-Process Communication,IPC):IPC是计算机***中进程间或软件组件间的通信方法的统称。IPC将待通信的数据抽象并封装为消息,参与通信的双方或多方通过调用消息发送、消息接收等原语来实现消息在进程或组件之间的传递,从而完成数据通信。
在本申请实施例中,进程间的调用可以是指RPC和IPC两种调用方式中的任意一种。
内存耗尽(Out Of Memory,OOM)处理:一种对***内存耗尽情况的处理。通常,OOM处理是指通过杀应用程序来释放内存或者***直接重启。
误触发OOM处理:是指在***仍有一定数量的可回收内存的情况下,内存管理模块放弃回收这些可回收内存而选择直接触发OOM处理。
现代操作***(如Linux、Android、iOS、Fuchsia等),通常会基于性能方面的需求,将大量的应用程序的数据缓存在内存中。另一方面,由于硬盘中的数据和网络上的数据的访问速度较慢,操作***通常将硬盘以及网络上的数据缓存在内存中,以提升硬盘数据和网络数据的访问性能。为了满足以上应用程序与外部设备的缓存共存的场景需求,操作***中的内存管理模块需要实现内存动态分配与回收,以保证内存资源的高效使用与快速分配。
为了完成内存动态分配与回收,业界普遍采用如下方法:在应用程序需要申请内存的情况下,操作***检查***的空闲内存是否能够满足应用程序的内存分配请求;当空闲内存的空间不足时,操作***会先将硬盘和网络相关的缓存数据进行回收,并将回收后所得到的空闲内存分配给应用程序。
基于现有的方法来实现内存的回收和分配,能够提升硬盘以及网络等慢速设备的数据读写性能。另外,通过在适当时候释放和回收内存资源,还能够保证***内存高效和快速的分配利用。但是在一些特殊情况下,现有的方法容易出现内存回收失败的现象,导致无法及时给应用程序分配空闲内存,从而影响应用程序的正常运行。在长时间出现内存回收失败的现象时,操作***可能会误触发OOM处理,影响应用程序的运行稳定性。
经申请人研究发现,相关技术在内存回收过程中出现内存回收失败是因为内存分配与内存回收存在逻辑循环依赖。具体地,当***处于低内存状态时,内存管理模块在处理内存分配请求时,需要先通过各种回收路径进行内存回收,然后再将回收到的空闲内存分配给发起内存分配请求的各个对象。然而,用于进行内存回收的内存回收路径上往往又需要分配新的内存来完成其必要的回收操作,才能够实现内存的回收。因此,内存分配与回收产生了逻辑上的循环依赖。即,内存管理模块在接收到内存分配请求之后,调用某一内存回收路径上的对象来执行内存回收,而该对象又需要向内存管理模块申请一部分内存才能够完成内存回收操作;当内存管理模块在收到该对象的新的内存分配请求时,内存管理模块继续调用该对象来执行内存回收,从而导致内存回收陷入逻辑循环依赖。
例如,在操作***正常运行的过程中,操作***会预先给负责读写硬盘数据的文件***进程分配部分内存,以及给负责读取网络数据的网络进程分配另一部分内存。在应用程序发起内存分配请求,且***中的空闲内存不足时,操作***中的内存管理模块则可以通过调用文件***进程来回收部分预先分配给文件***进程的内存。文件***进程在执行内存回收的过程中。需要将内存中的数据写入回到硬盘中,而文件***进程在执行数据回写的过程同样需要部分内存才能够实现数据回写操作。然而,当预先给文件***进程分配的内存中的空闲内存不足以用于实现数据回写操作时,文件***进程则向内存管理模块发起新的内存分配请求。这样一来,内存管理模块在接收到新的内存分配请求时,继续调用文件***进程来执行内存回收操作,从而导致内存回收陷入逻辑循环依赖,即无法推动内存回收操作的正常进行。
有鉴于此,本申请实施例提供了一种内存回收方法,在获取到内存分配请求之后,确定内存分配请求对应的调用路径,从而确定该内存分配请求是否来自于执行内存回收的对象以及来自于哪个执行内存回收的对象。在确定内存分配请求的来源之后,即可选择还没触发执行内存回收的对象来执行内存回收操作,从而避免内存回收陷入逻辑循环依赖,保证内存回收的正常进行。
可以参阅图1,图1为本申请实施例提供的一种内存回收方法的应用场景架构示意图。如图1所示,该应用场景架构下包括用户态进程、微内核和硬件平台。其中,用户态进程包括网络协议栈进程、文件***进程、驱动进程、内存管理进程以及一个或多个应用程序。微内核中包括通信管理模块,该通信管理模块用于实现用户态进程之间的通信。硬件平台则包括处理器、内存、网卡以及硬盘等硬件设备。
在操作***的正常运行期间,用户态进程中的各种进程运行于内存中。并且,文件***进程用于实现硬盘中的数据的读写操作。网络协议栈进程则通过网卡实现请求和读取网络上的数据。驱动进程用于运行计算机***中的各种驱动,以保证应用程序以及进程的可靠运行。
在用户态进程需要实现进程间的相互通信时,用户态进程通过调用通信管理模块来实现进程间的通信。通信管理模块在用户态进程进行相互调用时,通信管理模块记录用户态进程之间的调用关系。在内存管理进程获取到来自于任意一个进程的内存分配请求时,通过通信管理模块所记录的内容来确定该内存分配请求对应的调用路径,即进程间的调用关系。这样一来,内存管理进程可以根据该内存分配请求对应的调用路径,选择当前执行内存回收的进程,该进程是未触发执行内存回收的进程。
以上介绍了本申请实施例提供的方法所应用的场景,以下将介绍本申请实施例提供的方法所应用的设备。
具体地,本申请实施例所提供的内存回收方法可以应用于电子设备上。示例性地,该电子设备例如可以是服务器、智能手机(mobile phone)、个人电脑(personal computer,PC)、笔记本电脑、平板电脑、智慧电视、移动互联网设备(mobile internet device,MID)、可穿戴设备,虚拟现实(virtual reality,VR)设备、增强现实(augmented reality,AR)设备、工业控制(industrial control)中的无线电子设备、远程手术(remote medicalsurgery)中的无线电子设备、智能驾驶中的无线电子设备、智能电网(smart grid)中的无线电子设备、运输安全(transportation safety)中的无线电子设备、智慧城市(smartcity)中的无线电子设备、智慧家庭(smart home)中的无线电子设备等。
为了便于叙述,以下将以本申请实施例提供的方法应用于服务器上为例,对本申请实施例所提供的方法进行介绍。
为了便于理解本方案,本申请实施例中首先结合图2对本申请提供的电子设备的结构进行介绍。
可以参阅图2,图2为本申请实施例提供的一种电子设备101的结构示意图。如图2所示,电子设备101包括处理器103,处理器103和***总线105耦合。处理器103可以是一个或者多个处理器,其中每个处理器都可以包括一个或多个处理器核。显示适配器(videoadapter)107,显示适配器可以驱动显示器109,显示器109和***总线105耦合。***总线105通过总线桥111和输入输出(I/O)总线耦合。I/O接口115和I/O总线耦合。I/O接口115和多种I/O设备进行通信,比如输入设备117(如:触摸屏等),外存储器121,(例如,硬盘、软盘、光盘或优盘),多媒体接口等)。收发器123(可以发送和/或接收无线电通信信号),摄像头155(可以捕捉静态和动态数字视频图像)和外部USB端口125。其中,可选地,和I/O接口115相连接的接口可以是USB接口。
其中,处理器103可以是任何传统处理器,包括精简指令集计算(reducedinstruction set Computing,RISC)处理器、复杂指令集计算(complex instruction setcomputing,CISC)处理器或上述的组合。可选地,处理器可以是诸如ASIC的专用装置。
电子设备101可以通过网络接口129和软件部署服务器149通信。示例性的,网络接口129是硬件网络接口,比如,网卡。网络127可以是外部网络,比如因特网,也可以是内部网络,比如以太网或者虚拟私人网络(virtual private network,VPN)。可选地,网络127还可以是无线网络,比如WiFi网络,蜂窝网络等。
硬盘驱动器接口131和***总线105耦合。硬件驱动接口和硬盘驱动器133相连接。内存储器135和***总线105耦合。运行在内存储器135的数据可以包括电子设备101的操作***(OS)137、应用程序143和调度表。
处理器103可以通过***总线105与内存储器135通信,从内存储器135中取出应用程序143中的指令和数据,从而实现程序的执行。
操作***包括Shell 139和内核(kernel)141。Shell 139是介于使用者和操作***的内核间的一个接口。shell是操作***最外面的一层。shell管理使用者与操作***之间的交互:等待使用者的输入,向操作***解释使用者的输入,并且处理各种各样的操作***的输出结果。
内核141由操作***中用于管理存储器、文件、外设和***资源的那些部分组成。内核141直接与硬件交互,操作***内核通常运行进程,并提供进程间的通信,提供CPU时间片管理、中断、内存管理和IO管理等等。
示例性地,在电子设备101为智能手机的情况下,应用程序143包括即时通讯相关的程序。在一个实施例中,在需要执行应用程序143时,电子设备101可以从软件部署服务器149下载应用程序143。
以上介绍了本申请实施例所应用的场景和设备,以下将详细介绍本申请实施例所提供的内存回收方法。
可以参阅图3,图3为本申请实施例提供的一种内存回收方法300的流程示意图。如图3所示,该内存回收方法300包括以下的步骤301-步骤304。
步骤301,获取来自于第一对象的内存分配请求。
其中,第一对象可以是运行于电子设备中的进程或函数。例如,第一对象可以是电子设备中的任意一个应用程序的进程、文件***进程、网络协议栈进程或者驱动进程等进程。又例如,第一对象可以是电子设备中的排序(rank)函数、统计(COUNTIF)函数或者平均值求取(AVERAGE)函数等函数。当第一对象在电子设备中运行的期间,第一对象可能需要申请部分内存资源,以保证第一对象的正常运行。
在第一对象需要申请内存资源时,第一对象则向电子设备中的内存管理对象发送内存分配请求,以请求分配空闲内存。在电子设备中的内存管理对象所获取到的内存分配请求中,可以包括需要申请的内存大小,即第一对象请求分配的空闲内存的容量大小。
可选的,内存分配请求例如可以是进程间调用消息,第一对象通过向内存管理对象发送进程间调用消息来请求分配内存。即,内存管理对象是第一对象的调用对象,第一对象通过调用内存管理对象来请求分配内存。
步骤302,确定所述内存分配请求对应的调用路径,所述调用路径包括多个对象之间的调用关系,所述第一对象为所述调用路径中的最后一个对象。
在电子设备中的内存管理对象获取到来自于第一对象的内存分配请求之后,内存管理进程则确定所述内存分配请求对应的调用路径。其中,所述内存分配请求是所述第一对象在被其他对象调用之后生成的。该调用路径则指示了多个对象之间的调用关系,所述第一对象为所述多个对象中最后一个被调用的对象。该调用路径上的多个对象从前往后有序地进行调用,直至调用所述第一对象,且由所述第一对象生成所述内存分配请求。调用路径上的多个对象中任意两个相邻的对象之间具有调用关系。简单来说,调用路径上的第一个对象调用第二个对象,第二个对象则继续调用之后的第三个对象,以此类推,从而得到多个对象依次调用的关系。
例如,假设电子设备中包括进程A、进程B和进程C,上述的第一对象为进程C,进程A在运行期间通过向进程B发送进程间调用消息1调用了进程B,进程B在运行期间通过向进程C发送进程间调用消息2调用了进程C,进程C在基于该进程间调用消息2进行工作的期间,生成所述内存分配请求,以请求分配空闲内存。那么,进程C所生成的内存分配请求对应的调用路径则包括了进程A、进程B和进程C之间的调用关系,即进程A调用进程B且进程B调用进程C(进程A》》进程B》》进程C)。
步骤303,根据所述调用路径确定用于执行内存回收的第二对象,所述第二对象为未触发执行内存回收的对象。
在确定所述内存分配请求对应的调用路径之后,即可确定调用第一对象的其他对象,以及其他对象进一步的调用关系。基于调用路径中所指示的多个对象之间的调用关系,可以确定所述内存分配请求是否位于内存回收路径上,即确定第一对象是否为内存回收路径上的对象。其中,内存回收路径上的对象是指已经触发执行内存回收的对象。
当第一对象为内存回收路径上的对象时,表明第一对象已经触发执行内存回收,且调用路径上的其他对象可能也已经触发执行内存回收。因此,电子设备需要进一步确定调用路径上已经触发执行内存回收的对象,从而选择未触发执行内存回收的对象来执行后续的内存回收操作。
当第一对象不是内存回收路径上的对象时,表明第一对象没有触发执行内存回收。并且,由于第一对象是调用路径上的最后一个对象,因此调用路径上的其他对象也没有触发执行内存回收。因此,电子设备可以任意选择后续执行内存回收的对象。
具体地,以下将详细介绍电子设备根据调用路径所属的不同情况,确定用于执行内存回收的对象的过程。
情况1,调用路径中不包括内存管理对象。
在本实施例中,内存管理对象用于触发其他对象执行内存回收。电子设备中的任意一个对象都是在被内存管理对象调用后才触发执行内存回收操作,即被内存管理对象调用是触发执行内存回收的必要条件。
示例性地,所述内存管理对象可以为电子设备中的内存管理进程。该内存管理进程能够在空闲内存足够时根据内存分配请求给进程分配相应的空闲内存;并且,该内存管理进程还能够在空闲内存不足时,通过调用其他进程来触发其他的进程执行内存回收操作,以回收得到空闲内存。
在调用路径中不包括内存管理对象的情况下,表明调用路径中的所有对象都没有触发执行内存回收操作。因此,电子设备可以在多个候选对象中确定所述第二对象,所述第二对象可以为所述多个候选对象中的任意一个对象。
示例性地,所述多个候选对象可以包括文件***对象、网络协议栈对象和驱动对象。在微内核架构下,文件***对象可以是指文件***进程,网络协议栈对象可以是指网络协议栈进程,驱动对象可以是指驱动进程。在宏内核架构下,文件***对象可以是指文件***函数,网络协议栈对象可以是指网络协议栈函数,驱动对象可以是指驱动函数。其中,文件***进程用于实现硬盘中的数据的读写操作。网络协议栈进程则通过网卡实现请求和读取网络上的数据。驱动进程用于运行计算机***中的各种驱动,以保证应用程序以及进程的可靠运行。
在电子设备正常运行操作***的过程中,为了提高读取硬盘数据以及网络数据等数据的速度,操作***通常会预先给文件***进程、网络协议栈进程分配一定的内存,以在内存中缓存硬盘数据以及网络数据。此外,为了提高电子设备中的进程与电子设备中各种硬件之间的通信效率,操作***也会预先给驱动进程分配一定的内存,以在内存中缓存相应的驱动数据。由于分配给文件***进程、网络协议栈进程和驱动进程的大部分内存均是用于缓存未来可能会用到的数据,因此选择回收预先分配给文件***进程、网络协议栈进程或驱动进程的内存并不会影响电子设备中的其他进程或应用程序的正常运行。基于此,电子设备可以确定文件***进程、网络协议栈进程和驱动进程为候选对象。在需要执行内存回收时,电子设备则从该多个候选对象中选择任意一个来执行内存回收操作。
情况2,调用路径中包括内存管理对象。
由于内存管理对象不会发起内存分配请求,因此发起内存分配请求的第一对象(即调用路径中的最后一个对象)并不是内存管理对象。调用路径中包括内存管理对象及所述内存管理对象所调用的第三对象,所述第三对象为已触发执行内存回收的对象。
其中,所述第三对象可以是包括一个对象或者多个对象。在所述内存管理对象在所述调用路径中出现一次时,所述第三对象可能是包括一个对象。例如,在所述调用路径指示了依次调用的进程A、进程B和进程C的情况下,进程A调用进程B且进程B调用进程C,进程B为内存管理对象,进程C为上述的第一对象。那么,在这种情况下,所述第三对象为进程C,所述第三对象与上述的第一对象相同,调用所述第一对象的对象则为内存管理对象(即进程B)。
此外,在所述内存管理对象在所述调用路径中出现一次时,所述第三对象也可能是包括多个对象。例如,在所述调用路径所指示的调用关系为:进程1调用进程2,进程2调用进程3,进程3调用进程4,且进程2为内存管理对象时,则进程3和进程4均属于上述的第三对象。举例来说,上述的进程2为内存管理对象,进程3为文件***进程,进程4为驱动进程,当内存管理对象调用文件***进程,以触发文件***进程执行内存回收时,文件***进程在执行内存回收的过程中,可能需要通过调用驱动进程来实现数据回写。在这种情况下,内存管理对象之后的文件***进程和驱动进程均属于第三对象,即文件***进程和驱动进程均属于已触发执行内存回收的对象。
也就是说,在一些情况下,当调用路径中首次出现内存管理对象之后,位于该内存管理对象之后的除内存管理对象之外的所有对象均属于第三对象。即,对于调用路径中的任意一个对象来说,只要该对象位于内存管理对象之后,且该对象不是内存管理对象,则可以认为该对象为第三对象。
在所述内存管理对象在所述调用路径中出现多次时,所述第三对象则包括多个对象,即所述内存管理对象每次调用的对象都是不同的。例如,在所述调用路径所指示的调用关系为进程a调用进程b,进程b调用进程c,进程c调用进程b,进程b调用进程d(即进程a》》进程b》》进程c》》进程b》》进程d),且进程b为内存管理对象时,所述第三对象则可以是包括进程c和进程d。
在电子设备确定调用路径中的第三对象之后,电子设备则在所述多个候选对象中确定与所述第三对象不相同的所述第二对象。例如,在第三对象仅包括文件***进程时,电子设备可以选择网络协议栈进程或驱动进程来执行内存回收操作;在第三对象包括文件***进程和网络协议栈进程时,电子设备可以选择驱动进程来执行内存回收操作;在第三对象包括文件***进程和驱动进程时,电子设备可以选择网络协议栈来执行内存回收操作。
为了便于理解,以下将通过表1来展示在调用路径具有不同的对象组合时,电子设备所选择的用于执行内存回收的对象。
表1
调用路径上的对象 用于执行内存回收的对象
文件***进程 文件***进程/网络协议栈进程/驱动进程
网络协议栈进程 文件***进程/网络协议栈进程/驱动进程
驱动进程 文件***进程/网络协议栈进程/驱动进程
内存管理进程+文件***进程 网络协议栈进程/驱动进程
内存管理进程+网络协议栈进程 文件***进程/驱动进程
内存管理进程+驱动进程 文件***进程/网络协议栈进程
内存管理进程+文件***进程+网络协议栈进程 驱动进程
内存管理进程+文件***进程+驱动进程 网络协议栈进程
内存管理进程+网络协议栈进程+驱动进程 文件***进程
如表1所示,在调用路径上的对象不包括内存管理进程的情况下,调用路径上没有触发执行内存回收的对象,因此可以从文件***进程、网络协议栈进程以及驱动进程这三个候选对象中任意选择一个来执行内存回收操作。
在调用路径上的对象包括内存管理进程的情况下,调用路径上的对象已被触发执行内存回收,因此可以从候选对象中选择没被触发执行内存回收的对象来执行内存回收操作。
此外,在可供选择的候选对象具有多个时,电子设备也可以是按照一定的顺序来优先选择候选对象中用于执行内存回收的对象。
示例性地,由于文件***进程和网络协议栈进程往往需要读取大量的数据,因此电子设备的操作***通常会预先给文件***进程和网络协议栈进程分配较多的内存,而给驱动进程分配较少的内存。基于此,在可供选择的候选对象包括文件***进程、网络协议栈进程以及驱动进程时,电子设备可以优先选择文件***进程或网络协议栈进程来执行内存回收操作。
步骤304,调用所述第二对象,以触发所述第二对象执行内存回收操作。
在确定用于执行内存回收的第二对象之后,电子设备中的内存管理对象则可以调用所述第二对象,以使得所述第二对象执行内存回收操作。
示例性地,假设所述第二对象为文件***进程,当文件***进程被内存管理对象调用以执行内存回收操作时,文件***进程则将缓存在内存中的部分数据写回到硬盘中,从而实现内存的回收,得到部分空闲内存。
假设所述第二对象为网络协议栈进程,当网络协议栈进程被内存管理对象调用以执行内存回收操作时,网络协议栈进程则选择部分缓存在内存中的数据并处理这部分数据,从而实现内存的回收,得到部分空闲内存。
本实施例中,通过在获取到内存分配请求之后,确定内存分配请求对应的调用路径,从而确定该内存分配请求是否来自于执行内存回收的对象以及来自于哪个执行内存回收的对象。在确定内存分配请求的来源之后,即可选择还没触发执行内存回收的对象来执行内存回收操作,从而避免内存回收陷入逻辑循环依赖,保证内存回收的正常进行。
以上介绍了基于内存分配请求对应的调用路径选择用于执行内存回收的对象的过程,为便于理解,以下将详细介绍确定内存分配请求对应的调用路径的方式。
本实施例中,为了能够在获取到内存分配请求的情况下,确定内存分配请求对应的调用路径,可以在发生对象调用的过程中,对对象之间的调用关系进行持续记录,从而能够通过记录的调用信息回溯得到调用路径。
在一个可能的实施例中,发起内存分配请求的第一对象为进程,第一对象所发送的内存分配请求为进程间调用消息,例如内存分配请求为上述的IPC消息或RPC消息。
电子设备中的内存管理对象在获取到内存分配请求之后,可以获取所述内存分配请求中的调用信息,并根据所述调用信息确定内存分配请求对应的调用路径。
其中,所述调用信息用于记录对象间的调用关系,即记录调用路径上的进程之间的调用关系。所述调用信息携带于所述调用路径中的每个对象所生成的进程间调用消息中,且所述调用信息在所述调用路径中的对象生成新的进程间调用消息时更新。即,调用路径上的任意一个对象在调用另一个对象时,都会生成携带有调用信息的进程间调用消息。并且,调用路径上的对象在被调用期间进行调用其他对象时,该对象会根据被调用时所接收到的进程间调用消息,生成新的进程间调用消息,且新的进程间调用消息中的调用信息是根据被调用时所接收到的进程间调用消息中的调用信息更新得到的。
具体地,当所述调用路径中的任意一个对象在执行来自于另一个对象的进程间调用消息的期间生成新的进程间调用消息时,所述新的进程间调用消息中的调用信息发生更新,以使得更新后的调用信息中记录生成所述新的进程调用消息的对象。并且,更新后的调用信息中仍会保留之前的进程间调用关系。
简单来说,当一个进程需要调用另一个进程时,作为调用者的进程会向作为被调用者的进程发送进程间调用消息,以实现对进程的调用。本实施例中,通过在进程间调用消息中增加调用信息,以记录进程间的调用关系。当一个进程在被调用期间需要调用下一个进程时,该进程则根据被调用时的进程间调用消息生成新的进程间调用消息,新的进程间调用消息中的调用信息同时发生了更新。更新后的调用信息记录了当前进程与下一个进程之间的调用关系,同时还保留了当前进程与当前进程之前的其他进程的调用关系。
示例性地,假设调用路径上包括进程A、进程B、进程C和进程D,且进程A、进程B、进程C和进程D之间具有依次调用的关系。
进程A在调用进程B的时候会生成进程间通信消息1,该进程间通信消息1中包括调用信息1,该调用信息1记录了进程A与进程B之间的调用关系(即进程A调用进程B)。
进程B在调用进程C的时候会根据进程间通信消息1生成进程间通信消息2,该进程间通信消息2中包括调用信息2。该调用信息2是根据调用信息1生成的,该调用信息2记录了进程A与进程B之间的调用关系以及进程B与进程C之间的调用关系(即进程A调用进程B,进程B调用进程C)。
进程C在调用进程D的时候会根据进程间通信消息2生成进程间通信消息3,该进程间通信消息3中包括调用信息3。该调用信息3是根据调用信息2生成的,该调用信息3记录了进程A与进程B之间的调用关系、进程B与进程C之间的调用关系以及进程C与进程D之间的调用关系(即进程A调用进程B,进程B调用进程C,进程C调用进程D)。
具体地,进程在调用过程中的所生成的调用信息的内容可以如表2所示。
表2
进程调用过程 调用信息内容
进程A调用进程B 进程A>>进程B
进程B调用进程C 进程A>>进程B>>进程C
进程C调用进程D 进程A>>进程B>>进程C>>进程D
由以上的叙述以及表2可知,调用路径上的对象在调用下一个对象时所生成的调用信息中不仅包括了当前的对象调用关系,还包括了该对象之前的其他对象之间的对象调用关系。也就是说,在每个对象接收到的进程间通信消息中的调用信息都记录了该对象之前的所有调用关系。因此,基于最后一个对象所发送的进程间通信消息(即第一对象所发送的内存分配请求),即可确定整条调用路径上的所有对象之间的调用关系。
可选的,调用信息可以通过多种方式来记录对象之间的调用关系。
方式一,调用信息通过不同的比特位来表示不同的对象,并通过比特位的置位情况来表示对象是否被调用。
具体地,所述调用信息中可以包括多个比特位,所述多个比特位中的每个比特位分别用于表示不同的对象,所述每个比特位的置位情况分别用于表示所述每个比特位对应的对象是否位于所述调用路径上。
也就是说,对于任意一个进程间通信消息中的调用信息,均是由多个比特位构成的。例如,可以参阅图4,图4为本申请实施例提供的一种调用信息的结构示意图。如图4所示,每个调用信息中均包括32个比特位,每个比特位表示一个特定的对象,32个比特位就可以表示32个特定的对象。比如,32个比特位中的第一个比特位表示内存管理对象,第二个比特位表示文件***进程,第三个比特位表示网络协议栈进程,第四个比特位表示驱动进程。在图4中,内存管理对象、文件***进程以及网络协议栈进程对应的比特位均被置位,代表内存管理对象、文件***进程以及网络协议栈进程均位于调用路径上。
此外,调用信息中的比特位的置位情况,能够表示该比特位对应的对象是否位于所述调用路径上。例如,可以是以调用信息中的比特位置位来表示该比特位对应的对象位于调用路径上,也可以是以调用信息中的比特位不置位来表示该比特位对应的对象位于调用路径上。
示例性地,当进程A调用进程B时,在进程A所生成的进程间调用消息的调用信息中,表示进程A的比特位被置位,以表示进程A位于调用路径上。当进程B调用内存管理对象时,在进程B所生成的内存分配请求的调用信息中,表示进程A和进程B的比特位均为置位,以表示进程A和进程B均位于调用路径上。
本方案中,通过不同的比特位来表示不同的对象,并通过比特位的置位情况来表示对象是否被调用,能够基于少量的数据位有效地记录调用路径上的对象,节省调用信息的开销。
此外,由于电子设备在确定调用路径之后,需要确定调用路径中是否包括已触发执行内存回收的对象,以及在调用路径中包括已触发执行内存回收的对象时,电子设备需要确定已触发执行内存回收的对象。
那么,在调用信息通过比特位的置位情况来表示对象是否位于调用路径上时,该调用信息实际上无法表示对象之间明确的调用关系,只能表示哪些对象被调用了。
基于此,在一个可能的实施例中,调用信息中的比特位可以是只记录被内存管理对象触发执行内存回收操作的对象,对于没有被内存管理对象触发执行内存回收操作的对象则不予记录。这样一来,电子设备则可以基于调用信息中的比特位的置位情况确定调用路径中是否包括已触发执行内存回收的对象以及已触发执行内存回收的对象。
示例性地,在以调用信息中的比特位置位来表示该比特位对应的对象位于调用路径上的情况下,在所述多个比特位中的第一比特位被置位之前,所述多个比特位中的其他比特位无法被置位,其中所述第一比特位用于表示内存管理对象,所述内存管理对象用于触发其他对象执行内存回收。也就是说,在没有调用内存管理对象之前,调用信息中的所有比特位均无法被置位。
由于触发某一个对象执行内存回收操作的方式是通过内存管理对象调用该对象,因此在调用信息中的比特位均没有被置位,则表示该调用路径上不存在被触发执行内存回收的对象。在内存管理对象对应的比特位置位后,被内存管理对象调用而触发执行内存回收的对象所对应的比特位则同样可以被置位。
这样,在调用信息中的所有比特位均没有被置位的情况下,电子设备可以通过确定调用路径上不存在已经触发执行内存回收的对象;在调用信息中的比特位被置位的情况下,电子设备可以确定被置位的比特位对应的对象即为内存管理对象和已经触发执行内存回收的对象。
本方案中,通过设置在内存管理对象对应的比特位被置位后,其他的比特位才能够被置位,使得调用信息能够有效地表示调用路径中是否包括已触发执行内存回收的对象,以及调用路径中所包括的已触发执行内存回收的对象。通过少量的数据位即可实现记录对象是否已触发内存回收操作,便于后续选择用于执行内存回收的对象,且节省调用信息的开销。
方式二,所述调用信息包括多个对象的标识,所述多个对象的标识分别用于表示位于所述调用路径上的对象。
具体地,每一个对象可以用不同的标识来进行表示。在对象的调用过程中,每调用一个新的对象,则在调用信息中增加调用者的标识或者被调用者的标识,从而实现记录调用路径上的对象。
示例性地,标识0001可以用于表示内存管理对象,标识0010用于表示文件***进程、标识0011用于表示网络协议栈进程、标识0100用于表示驱动进程。
可以参阅图5,图5为本申请实施例提供的一种调用信息的另一结构示意图。如图5所示,该调用信息中包括标识0010、标识0001以及标识0011,表示调用路径上的对象分别为文件***进程、内存管理对象以及网络协议栈进程。
可选的,在上述的方式一和方式二的基础上,所述调用信息还可以包括所述调用路径中的对象的运行状态和/或所述调用路径中的对象的调用顺序。
其中,对象的运行状态可以是指对象当前运行过程中的状态。例如,对于文件***进程而言,该文件***进程的运行状态可以为回写数据,即文件***进程正在将内存中的数据回写到硬盘中;文件***进程的运行状态还可以为读取数据,即文件***进程正在读取硬盘中的数据并写入至内存中。对于网络协议栈进程,该网络协议栈进程的运行状态可以为读取数据,即网络协议栈进程将网络上的数据读取至内存中。
通过记录对象的运行状态,通常能够方便地确认对象是否能够完成内存回收操作以及无法完成内存回收操作的原因。例如,假设在选择文件***进程执行内存回收操作之后,文件***进程基于剩余的空闲内存无法完成内存回收操作,并继续发起内存分配请求;如果此时文件***进程的状态为回写数据,则可以认为文件***进程在完成回写数据操作之后,则可能会腾出空闲内存,从而能够完成内存回收操作。因此,在获取到文件***进程继续发起的内存分配请求之后,可以隔一段时间后继续触发文件***进程执行内存回收操作。
通过记录调用路径中的对象的调用顺序,能够明确调用路径中各个对象相互之间的调用关系,从而便于选择用于执行内存回收操作的对象。
可选的,在通过对象的标识来记录调用路径上的对象的方式二中,可以是通过根据调用的顺序有序地记录对象的标识来实现在调用信息中记录调用路径中的对象的调用顺序,而不需要额外记录对象的调用顺序。例如,如图5所示的调用信息,调用路径上的对象的调用顺序即为文件***进程调用内存管理对象,内存管理对象调用网络协议栈进程。
在另一个可能的实施例中,发起内存分配请求的第一对象可以为函数,且调用路径上的其他对象也为函数。
这样,电子设备中的内存管理对象在获取到内存分配请求之后,可以确定所述内存分配请求对应的函数调用栈,并根据所述函数调用栈确定所述调用路径。
一般来说,在函数调用的过程中,电子设备会建立一个函数调用栈,将同一条调用路径上的所有函数均记录至函数栈中。具体地,每发生一次函数调用,电子设备则将当前发生的函数调用中的调用者函数以及被调用者函数压入至函数栈中,从而实现调用路径上的函数的记录。
示例性地,可以参阅图6,图6为本申请实施例提供的一种函数栈的结构示意图。如图6所示,函数栈的栈底是首次压入的函数调用情况,即函数A调用函数B,从栈底往栈顶的方向,依次是函数A调用函数B,函数B调用函数C,函数C调用函数D,函数D调用函数C。假设,内存分配请求是函数D调用函数C后,由函数C发起的,那么通过从栈顶至栈顶的顺序来回溯内存分配请求对应的函数栈,可以确定调用路径上各个函数的调用关系。也就是说,函数C相当于前述的第一对象,函数D相当于内存管理对象。基于函数C所发起的内存分配请求可以确定上述的函数栈,从而通过回溯函数栈的方式来确定函数之间的调用关系。
此外,在调用路径上的对象为进程的情况下,电子设备也可以通过压栈的方式来记录调用路径上的进程。即,在进程发生调用时,电子设备将作为调用者的进程以及作为被调用者的进程压入调用栈中,从而实现记录调用路径上的对象。
总的来说,在微内核架构下,各类服务的实现大都是通过IPC通信来完成的,因此电子设备可以通过在进程间通信消息中携带记录对象间的调用关系的调用信息来实现确定调用路径,或者电子设备可以通过回溯函数调用栈来确定调用路径。在宏内核架构下,各类服务的实现主要是通过函数调用来完成的,因此电子设备可以通过回溯函数调用栈来确定调用路径。
为了便于理解,以下将结合具体例子详细介绍本申请实施例所提供的内存回收方法。
可以参阅图7,图7为本申请实施例提供的一种***架构示意图。如图7所示,包括用户态进程、微内核和硬件平台。其中,用户态进程包括网络协议栈进程、文件***进程、驱动进程、内存管理进程以及一个或多个应用程序。微内核中包括通信管理模块,该通信管理模块用于实现用户态进程之间的通信。硬件平台则包括处理器、内存、网卡以及硬盘等硬件设备。
具体地,在用户态进程需要实现进程间的相互通信时,用户态进程通过调用通信管理模块来实现进程间的通信。通信管理模块中新增染色机制,基于染色机制能够在用户态进程进行相互调用时,记录用户态进程之间的调用关系,即记录调用路径上的进程。
内存管理进程中包括策略控制器和分配回收器。其中,策略控制器能够根据染色信息识别调用路径上的进程。并且,根据调用路径上的进程识别当前调用路径中的对象是否已经触发执行内存回收,以及具体哪些对象已经触发执行内存回收,进而选择相应的用于执行内存回收的对象。
具体地,可以参阅图8,图8为本申请实施例提供的一种内存回收的流程示意图。如图8所示,在进程通过通信管理模块向其他进程发送IPC消息,以实现进程调用的期间,通信管理模块对发生进程调用的进程信息进行记录,得到调用信息,即记录调用路径上的各个进程。
然后,内存管理进程在获取到调用路径上最后一个进程所发送的内存分配请求后,内存管理进程获取该内存分配请求对应的调用信息,并将该调用信息发送给策略控制器。
策略控制器根据获取到的调用信息确定调用路径上的各个对象,从而生成内存回收策略,并将该内存回收策略发送给分配回收器。
分配回收器根据该内存回收策略,调用相应的进程来执行内存回收操作。
可以参阅图9,图9为本申请实施例提供的一种进程调用的流程示意图。如图9所示,进程A通过向进程B发送IPC消息1来调用进程B,该IPC消息1中的调用信息记录了进程A。进程B通过向进程C发送IPC消息2来调用进程C,该IPC消息2中的调用信息记录了进程A和进程B。进程C通过向进程D发送IPC消息3来调用进程D,该IPC消息3中的调用信息记录了进程A、进程B和进程C。
基于图9可知,进程D在获取到来自于进程C的IPC消息3之后,可以通过IPC消息3中的调用信息确定调用路径上的对象为进程A、进程B和进程C。
可以参阅图10,图10为本申请实施例提供的一种进程通过通信管理模块实现进程调用的流程示意图。如图10所示,进程A在需要调用进程B时,进程A向通信管理模块发送调用请求,以请求调用进程B。通信管理模块根据来自于进程A的调用请求,向进程B发送IPC消息1,并在IPC消息1的调用信息中记录进程A。
类似地,当进程B执行该IPC消息1的期间需要调用进程C时,进程B向通信管理模块发送调用请求,且调用请求携带有IPC消息1中的调用信息。这样,通信管理模块根据IPC消息1中的调用信息以及进程B的调用请求,向进程C发送IPC消息2,该IPC消息2的调用信息中记录了进程A和进程B。
可以参阅图11,图11为本申请实施例提供的一种在IPC消息中记录调用路径上的进程的示意图。如图11所示,通信管理模块基于IPC消息机制设计实现IPC染色机制。具体地,通信管理模块在IPC消息中增加一个32位的位图(bitmap),该bitmap用于记录调用路径上的进程。该bitmap中包括32个比特位,每个比特位代表一个进程,比特位被置位后则表示经过了该比特位对应的进程。因此,每个IPC消息中的bitmap可以记录在该IPC消息之前所经过的所有进程。
示例性地,当进程B执行IPC消息1期间需要发起新的IPC消息来调用进程C时,通信管理模块首先自动将IPC消息1中的bitmap的值拷贝赋值给IPC消息2中的bitmap,并且在IPC消息2中的bitmap将进程B对应比特位置位,从而实现在保留调用路径上原有的进程的同时记录执行新的调用的进程。
内存管理进程在获取到调用路径上最后一个进程所发送的内存分配请求后,由于该内存分配请求实际上也是一个IPC消息,因此内存管理进程可以获取该内存分配请求对应的调用信息,即该内存分配请求中的bitmap。然后,内存管理进程将该内存分配请求中的bitmap的值发送给策略控制器,由策略控制器来选择执行内存回收操作的进程。
策略控制器根据获取到的bitmap的值确定调用路径上的各个对象,从而生成内存回收策略,并将该内存回收策略发送给分配回收器。具体地,策略控制器在确定调用路径上的各个对象之后,即可得到调用路径上的对象组合,然后策略控制器可以根据预先设置的状态机,确定用于执行内存回收操作的对象。具体地,策略控制器根据状态机来确定用于执行内存回收操作的对象的方式可以参考上述的表1,在此不再赘述。
如图12所示,图12为本申请实施例提供的一种分配回收器分配和回收内存的流程示意图。策略控制器将内存回收策略发送给分配回收器之后,分配回收器判断当前内存是否不足。如果当前内存足够,分配回收器则为发送内存分配请求的进程分配空闲内存,并将空闲内存的地址返回给该进程。如果当前内存不足,分配回收器则根据内存回收策略选择用于执行内存回收操作的进程,并调用该进程来执行内存回收操作。
本方案中,通信管理模块通过在进程间调用消息中增加一个bitmap结构自动记录调用路径上的对象信息。其中,bitmap结构实现了极低的动态内存消耗,也支持了调用信息的快速读取,将性能影响降到最低。内存管理模块可以从进程间调用消息中快速读取bitmap,得到该内存分配请求所经过的进程信息,并根据所经过的进程组合得出该内存分配请求是否来自于回收路径以及哪一条回收路径,进而可以选择不同的内存回收路径,从根本上解决了内存分配与回收循环依赖的问题。同时,基于细粒度的分配回收路径选择,实现了确定性的内存分配和回收策略,提升了内存分配效率与内存的利用率,降低了OOM率。
在图1至图12所对应的实施例的基础上,为了更好的实施本申请实施例的上述方案,下面还提供用于实施上述方案的相关设备。
具体可以参阅图13,图13为本申请实施例提供的一种内存回收装置1300的结构示意图,该内存回收装置1300包括:获取单元1301和处理单元1302;所述获取单元1301,用于获取来自于第一对象的内存分配请求;所述处理单元1302,用于确定所述内存分配请求对应的调用路径,所述调用路径包括多个对象之间的调用关系,所述第一对象为所述调用路径中的最后一个对象;所述处理单元1302,还用于根据所述调用路径确定用于执行内存回收的第二对象,所述第二对象为未触发执行内存回收的对象;所述处理单元1302,还用于调用所述第二对象,以触发所述第二对象执行内存回收操作。
在一种可能的实现方式中,所述处理单元1302,还用于:若所述调用路径中不包括内存管理对象,则在多个候选对象中确定所述第二对象,所述内存管理对象用于触发其他对象执行内存回收,所述第二对象为所述多个候选对象中的任意一个对象;若所述调用路径中包括内存管理对象及所述内存管理对象所调用的第三对象,则在所述多个候选对象中确定与所述第三对象不相同的所述第二对象,所述第三对象为已触发执行内存回收的对象。
在一种可能的实现方式中,所述多个候选对象包括文件***对象、网络协议栈对象和驱动对象。
在一种可能的实现方式中,所述获取单元1301,还用于获取所述内存分配请求中的调用信息,其中,所述内存分配请求为进程间调用消息,所述调用信息用于记录对象间的调用关系,所述调用信息携带于所述调用路径中的每个对象所生成的进程间调用消息中,且所述调用信息在所述调用路径中的对象生成新的进程间调用消息时更新;所述处理单元1302,还用于根据所述调用信息确定所述调用路径。
在一种可能的实现方式中,当所述调用路径中的任意一个对象在执行来自于另一个对象的进程间调用消息的期间生成新的进程间调用消息时,所述新的进程间调用消息中的调用信息发生更新,以使得更新后的调用信息中记录生成所述新的进程调用消息的对象。
在一种可能的实现方式中,所述调用信息包括多个比特位,所述多个比特位中的每个比特位分别用于表示不同的对象,所述每个比特位的置位情况分别用于表示所述每个比特位对应的对象是否位于所述调用路径上。
在一种可能的实现方式中,在所述多个比特位中的第一比特位被置位之前,所述多个比特位中的其他比特位无法被置位,其中所述第一比特位用于表示内存管理对象,所述内存管理对象用于触发其他对象执行内存回收。
在一种可能的实现方式中,所述调用信息包括多个对象的标识,所述多个对象的标识分别用于表示位于所述调用路径上的对象。
在一种可能的实现方式中,所述调用信息还包括所述调用路径中的对象的运行状态和/或所述调用路径中的对象的调用顺序。
在一种可能的实现方式中,所述处理单元1302,还用于:确定所述内存分配请求对应的函数调用栈;根据所述函数调用栈,确定所述调用路径。
在一种可能的实现方式中,所述第一对象包括进程或函数,所述第二对象包括进程或函数。
本申请实施例提供的内存回收方法具体可以由电子设备中的芯片来执行,该芯片包括:处理单元和通信单元,处理单元例如可以是处理器,通信单元例如可以是输入/输出接口、管脚或电路等。该处理单元可执行存储单元存储的计算机执行指令,以使电子设备内的芯片执行上述图1至图12所示实施例描述的内存回收方法。可选的,存储单元为芯片内的存储单元,如寄存器、缓存等,存储单元还可以是无线接入设备端内的位于芯片外部的存储单元,如只读存储器(read-only memory,ROM)或可存储静态信息和指令的其他类型的静态存储设备,随机存取存储器(random access memory,RAM)等。
可以参阅图14,本申请还提供了一种计算机可读存储介质,在一些实施例中,上述图3所公开的方法可以实施为以机器可读格式被编码在计算机可读存储介质上或者被编码在其它非瞬时性介质或者制品上的计算机程序指令。
图14示意性地示出根据这里展示的至少一些实施例而布置的示例计算机可读存储介质的概念性局部视图,示例计算机可读存储介质包括用于在计算设备上执行计算机进程的计算机程序。
在一个实施例中,计算机可读存储介质1400是使用信号承载介质1401来提供的。信号承载介质1401可以包括一个或多个程序指令1402,其当被一个或多个处理器运行时可以提供以上针对图5描述的功能或者部分功能。因此,例如,参考图5中所示的实施例,步骤501-502的一个或多个特征可以由与信号承载介质1401相关联的一个或多个指令来承担。此外,图14中的程序指令1402也描述示例指令。
在一些示例中,信号承载介质1401可以包含计算机可读介质1403,诸如但不限于,硬盘驱动器、紧密盘(CD)、数字视频光盘(DVD)、数字磁带、存储器、ROM或RAM等等。
在一些实施方式中,信号承载介质1401可以包含计算机可记录介质1404,诸如但不限于,存储器、读/写(R/W)CD、R/W DVD、等等。在一些实施方式中,信号承载介质1401可以包含通信介质1405,诸如但不限于,数字和/或模拟通信介质(例如,光纤电缆、波导、有线通信链路、无线通信链路、等等)。因此,例如,信号承载介质1401可以由无线形式的通信介质1405(例如,遵守IEEE 802.14标准或者其它传输协议的无线通信介质)来传达。
一个或多个程序指令1402可以是,例如,计算机可执行指令或者逻辑实施指令。在一些示例中,计算设备的计算设备可以被配置为,响应于通过计算机可读介质1403、计算机可记录介质1404、和/或通信介质1405中的一个或多个传达到计算设备的程序指令1402,提供各种操作、功能、或者动作。
应该理解,这里描述的布置仅仅是用于示例的目的。因而,本领域技术人员将理解,其它布置和其它元素(例如,机器、接口、功能、顺序、和功能组等等)能够被取而代之地使用,并且一些元素可以根据所期望的结果而一并省略。另外,所描述的元素中的许多是可以被实现为离散的或者分布式的组件的、或者以任何适当的组合和位置来结合其它组件实施的功能实体。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的***,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的***,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个***,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器、随机存取存储器、磁碟或者光盘等各种可以存储程序代码的介质。

Claims (14)

1.一种内存回收方法,其特征在于,包括:
获取来自于第一对象的内存分配请求;
确定所述内存分配请求对应的调用路径,所述调用路径包括多个对象之间的调用关系,所述第一对象为所述调用路径中的最后一个对象;
根据所述调用路径确定用于执行内存回收的第二对象,所述第二对象为未触发执行内存回收的对象;
调用所述第二对象,以触发所述第二对象执行内存回收操作。
2.根据权利要求1所述的方法,其特征在于,所述根据所述调用路径确定用于执行内存回收的第二对象,包括:
若所述调用路径中不包括内存管理对象,则在多个候选对象中确定所述第二对象,所述内存管理对象用于触发其他对象执行内存回收,所述第二对象为所述多个候选对象中的任意一个对象;
若所述调用路径中包括内存管理对象及所述内存管理对象所调用的第三对象,则在所述多个候选对象中确定与所述第三对象不相同的所述第二对象,所述第三对象为已触发执行内存回收的对象。
3.根据权利要求2所述的方法,其特征在于,所述多个候选对象包括文件***对象、网络协议栈对象和驱动对象。
4.根据权利要求1-3任意一项所述的方法,其特征在于,所述确定所述内存分配请求对应的调用路径,包括:
获取所述内存分配请求中的调用信息,其中,所述内存分配请求为进程间调用消息,所述调用信息用于记录对象间的调用关系,所述调用信息携带于所述调用路径中的每个对象所生成的进程间调用消息中,且所述调用信息在所述调用路径中的对象生成新的进程间调用消息时更新;
根据所述调用信息确定所述调用路径。
5.根据权利要求4所述的方法,其特征在于,当所述调用路径中的任意一个对象在执行来自于另一个对象的进程间调用消息的期间生成新的进程间调用消息时,所述新的进程间调用消息中的调用信息发生更新,以使得更新后的调用信息中记录生成所述新的进程间调用消息的对象。
6.根据权利要求4所述的方法,其特征在于,所述调用信息包括多个比特位,所述多个比特位中的每个比特位分别用于表示不同的对象,所述每个比特位的置位情况分别用于表示所述每个比特位对应的对象是否位于所述调用路径上。
7.根据权利要求6所述的方法,其特征在于,在所述多个比特位中的第一比特位被置位之前,所述多个比特位中的其他比特位无法被置位,其中所述第一比特位用于表示内存管理对象,所述内存管理对象用于触发其他对象执行内存回收。
8.根据权利要求4所述的方法,其特征在于,所述调用信息包括多个对象的标识,所述多个对象的标识分别用于表示位于所述调用路径上的对象。
9.根据权利要求4所述的方法,其特征在于,所述调用信息还包括所述调用路径中的对象的运行状态和/或所述调用路径中的对象的调用顺序。
10.根据权利要求1-3任意一项所述的方法,其特征在于,所述确定所述内存分配请求对应的调用路径,包括:
确定所述内存分配请求对应的函数调用栈;
根据所述函数调用栈,确定所述调用路径。
11.根据权利要求1-3任意一项所述的方法,其特征在于,所述第一对象包括进程或函数,所述第二对象包括进程或函数。
12.一种电子设备,其特征在于,包括存储器和处理器;所述存储器存储有代码,所述处理器被配置为执行所述代码,当所述代码被执行时,所述电子设备执行如权利要求1至11任一项所述的方法。
13.一种计算机可读存储介质,其特征在于,包括计算机可读指令,当所述计算机可读指令在计算机上运行时,使得所述计算机执行如权利要求1至11中任一项所述的方法。
14.一种计算机程序产品,其特征在于,包括计算机可读指令,当所述计算机可读指令在计算机上运行时,使得所述计算机执行如权利要求1至11任一项所述的方法。
CN202111198573.6A 2021-10-14 2021-10-14 一种内存回收方法及相关装置 Active CN115982060B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202111198573.6A CN115982060B (zh) 2021-10-14 2021-10-14 一种内存回收方法及相关装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202111198573.6A CN115982060B (zh) 2021-10-14 2021-10-14 一种内存回收方法及相关装置

Publications (2)

Publication Number Publication Date
CN115982060A CN115982060A (zh) 2023-04-18
CN115982060B true CN115982060B (zh) 2024-07-05

Family

ID=85964742

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202111198573.6A Active CN115982060B (zh) 2021-10-14 2021-10-14 一种内存回收方法及相关装置

Country Status (1)

Country Link
CN (1) CN115982060B (zh)

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107544846A (zh) * 2017-08-08 2018-01-05 武汉斗鱼网络科技有限公司 一种内存管理方法、装置及电子设备
CN109669877A (zh) * 2018-12-11 2019-04-23 腾讯科技(深圳)有限公司 内存管理方法、装置、终端及存储介质

Family Cites Families (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103226476B (zh) * 2013-05-20 2016-06-08 张永强 垃圾对象检测方法和装置
CN106909457A (zh) * 2015-12-23 2017-06-30 北京奇虎科技有限公司 内存管理方法及装置
CN108804337A (zh) * 2017-05-04 2018-11-13 华为技术有限公司 内存垃圾回收的方法、装置及计算机存储介质
CN110377527B (zh) * 2018-04-13 2023-09-22 华为技术有限公司 一种内存管理的方法以及相关设备
US11188460B2 (en) * 2018-06-18 2021-11-30 Microsoft Technology Licensing, Llc Arena-based memory management
CN109871276B (zh) * 2019-01-14 2021-02-02 珠海金山网络游戏科技有限公司 一种基于Lua获取手机应用内存的方法及装置
CN111736980B (zh) * 2019-03-25 2024-01-16 华为技术有限公司 一种内存管理方法及装置
CN110727605B (zh) * 2019-09-27 2022-06-21 Oppo(重庆)智能科技有限公司 内存回收方法、装置以及电子设备
CN110727607B (zh) * 2019-09-27 2022-08-12 Oppo广东移动通信有限公司 内存回收方法、装置以及电子设备
CN111258926B (zh) * 2020-02-26 2022-06-10 腾讯科技(深圳)有限公司 内存回收方法、装置、存储介质和计算机设备
CN113392037B (zh) * 2020-03-12 2024-06-18 深圳市万普拉斯科技有限公司 内存回收方法、装置、计算机设备和存储介质
CN111679914B (zh) * 2020-06-12 2023-06-27 北京字节跳动网络技术有限公司 一种内存管理方法、***、计算机设备及存储介质

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107544846A (zh) * 2017-08-08 2018-01-05 武汉斗鱼网络科技有限公司 一种内存管理方法、装置及电子设备
CN109669877A (zh) * 2018-12-11 2019-04-23 腾讯科技(深圳)有限公司 内存管理方法、装置、终端及存储介质

Also Published As

Publication number Publication date
CN115982060A (zh) 2023-04-18

Similar Documents

Publication Publication Date Title
US10990540B2 (en) Memory management method and apparatus
JP5510556B2 (ja) 仮想マシンのストレージスペースおよび物理ホストを管理するための方法およびシステム
CN111367659B (zh) 一种Kubernetes中节点的资源管理方法、设备以及介质
CN102667714B (zh) 支持访问由操作***环境外的资源提供的功能的方法和***
US20230168953A1 (en) Inter-process communication method and apparatus
CN111897666A (zh) 用于多进程之间通信的方法、设备及***
CN112749022A (zh) 相机资源访问方法、操作***、终端和虚拟相机
CN115525417A (zh) 数据通信方法、通信***及计算机可读存储介质
CN115421787A (zh) 指令执行方法、装置、设备、***、程序产品及介质
CN115827506A (zh) 数据写入方法、数据读取方法、装置、处理核和处理器
CN116860391A (zh) Gpu算力资源调度方法、装置、设备和介质
CN105677481B (zh) 一种数据处理方法、***及电子设备
WO2024098888A1 (zh) 模型存储优化方法及电子设备
CN115982060B (zh) 一种内存回收方法及相关装置
CN112596669A (zh) 一种基于分布式存储的数据处理方法及装置
CN111666036B (zh) 一种迁移数据的方法、装置及***
CN113934691B (zh) 访问文件的方法、电子设备及可读存储介质
CN115576689A (zh) 云渲染处理方法、设备和存储介质
CN113268356B (zh) 基于LINUX***的多GPU板卡bounding的***、方法及介质
CN114489826B (zh) 芯片运行方法、装置、存储介质及电子设备
CN115658295A (zh) 资源调度方法、装置、电子设备和存储介质
CN112015515B (zh) 一种虚拟网络功能的实例化方法及装置
CN110543351B (zh) 数据处理方法以及计算机设备
CN116737404B (zh) 用于应用接续的方法及终端设备
WO2024108907A1 (zh) 一种数据处理方法、装置、ai芯片、电子设备及存储介质

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