CN116541180A - 内存分配方法、电子设备及存储介质 - Google Patents

内存分配方法、电子设备及存储介质 Download PDF

Info

Publication number
CN116541180A
CN116541180A CN202310830925.8A CN202310830925A CN116541180A CN 116541180 A CN116541180 A CN 116541180A CN 202310830925 A CN202310830925 A CN 202310830925A CN 116541180 A CN116541180 A CN 116541180A
Authority
CN
China
Prior art keywords
memory
type
application
target
delay
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
CN202310830925.8A
Other languages
English (en)
Other versions
CN116541180B (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.)
Honor Device Co Ltd
Original Assignee
Honor Device 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 Honor Device Co Ltd filed Critical Honor Device Co Ltd
Priority to CN202310830925.8A priority Critical patent/CN116541180B/zh
Publication of CN116541180A publication Critical patent/CN116541180A/zh
Application granted granted Critical
Publication of CN116541180B publication Critical patent/CN116541180B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5011Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
    • G06F9/5016Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
    • 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
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5011Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
    • G06F9/5022Mechanisms to release resources
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

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

Abstract

本申请涉及终端领域,具体涉及一种内存分配方法、电子设备及存储介质。可以为当前进程分配内存申请时延与该进程的时延需求相匹配的内存类型,从而使得要求低时延的进程能够分配到内存申请时延也低的内存类型,减少电子设备上出现的要求低时延的进程因内存分配时延高而导致的应用响应延迟、应用卡顿等现象,可以提升用户的使用体验。在该方法中,电子设备接收进程的内存申请请求。之后,电子设备基于进程的内存申请请求得到内存类型。接下来,电子设备可以基于目标内存类型为目标进程分配内存。

Description

内存分配方法、电子设备及存储介质
技术领域
本申请涉及终端领域,具体涉及一种内存分配方法、电子设备及存储介质。
背景技术
随着应用程序功能越来越强大,用户在电子设备上使用的应用程序越来越多。应用程序的进程在执行一些功能时,需要使用内存,此时应用程序的进程会向电子设备上的内存管理工具发送内存申请请求。电子设备上的内存管理工具会为进程分配内存。
当前,电子设备在进行内存分配时,电子设备上的内存管理工具会按照进程发起内存申请请求的时间先后顺序给进程分配内存,以防止进程得不到内存而导致该进程无法运行。
然而,这种分配方式会导致与用户交互相关程度高的进程获得了申请时延高的内存;这会在电子设备上,出现应用响应延迟、应用卡顿等现象,从而会影响用户的使用体验。
发明内容
本申请实施例提供一种内存分配方法、电子设备及存储介质,可以为当前进程分配内存申请时延与该进程的时延需求相匹配的内存类型,从而使得要求低时延的进程能够分配到内存申请时延也低的内存类型,减少电子设备上出现的要求低时延的进程因内存分配时延高而导致的应用响应延迟、应用卡顿等现象,可以提升用户的使用体验。为达到上述目的,本申请的实施例采用如下技术方案:
第一方面,提供了一种内存分配方法,该方法可以应用于电子设备。该电子设备可以是,如,手机、平板电脑、笔记本等等可以使用应用程序的电子设备。该电子设备可以包括多种内存类型的内存和多个进程;其中,多种内存类型对应的内存申请时延不同。在该方法中,电子设备接收目标进程的内存申请请求,目标进程是多个进程中的任一进程。之后,电子设备基于目标进程的内存申请请求得到目标内存类型。接下来,电子设备可以基于目标内存类型为目标进程分配内存。其中,该目标内存类型是上述多种内存类型中,对应的内存申请时延与目标进程匹配的内存类型。对于一些允许使用高申请时延的进程匹配内存时延高的内存,对于一些要求低时延的进程匹配内存申请时延低的内存类型。
在第一方面中,电子设备通过为进程分配该进程匹配的内存类型的内存。可以为该进程分配内存申请时延与该进程的时延需求相匹配的内存类型的内存,从而使得要求低时延的进程能够分配到内存申请时延也低的内存类型,可以减少电子设备上出现的短时延要求的进程因内存分配时延高而导致的应用响应延迟、应用卡顿等现象,可以提升用户的使用体验。
在第一方面的一种可能的设计中,上述电子设备基于目标进程的内存申请请求得到目标内存类型,可以包括:电子设备基于目标进程的内存申请请求得到目标进程的目标优先级,并基于目标优先级得到目标内存类型;其中,进程对电子设备的重要程度和进程的优先级正相关;和/或,进程与用户交互的相关性和进程的优先级正相关;或者,电子设备基于目标进程的内存申请请求得到目标进程的进程标识,并基于进程标识得到目标内存类型;目标内存类型对应的内存申请时延与进程标识相匹配;或者,电子设备基于目标进程的内存申请请求得到目标进程的进程类型,并基于目标进程的进程类型得到目标内存类型;目标内存类型对应的内存申请时延与目标进程的进程类型相匹配。这样,电子设备就可以通过进程标识、进程的优先级或者进程内存申请请求,得到该进程匹配的目标内存类型
在第一方面的一种可能的设计中,上述电子设备基于目标进程的内存申请请求得到目标进程的目标优先级,可以包括:电子设备基于内存申请请求得到目标进程的进程标识,并基于进程标识调用函数库获取目标优先级;或者,电子设备解析内存申请请求中的预设字段得到目标优先级;或者,电子设备基于内存申请请求得到目标进程的进程类型,并基于目标进程的进程类型获取目标优先级。
在第一方面的一种可能的设计中,上述优先级可以包括进程调整adj等级。上述电子设备基于目标进程的进程类型获取目标优先级,可以包括:电子设备基于进程类型与adj等级的对应关系,确定目标进程的进程类型对应的目标adj等级。其中,进程类型与用户交互的相关性和进程类型的adj等级的数值负相关,和/或,进程类型对电子设备运行的重要程度和进程类型的adj等级的数值负相关。
在第一方面的一种可能的设计中,上述电子设备基于目标优先级得到目标内存类型,可以包括:电子设备根据优先级与内存类型的对应关系,确定目标优先级匹配的目标内存类型;其中,内存类型对应的优先级与内存类型对应的申请时延正相关。或者,电子设备基于目标优先级得到目标优先级对应的历史分配内存类型,并根据历史分配内存类型确定目标内存类型。
在第一方面的一种可能的设计中,该方法还可以包括:电子设备确定多种内存类型的内存申请时延,基于多种内存类型的内存申请时延调整优先级与内存类型的对应关系。在这种设计中,电子设备可以获取电子设备上不同类型内存的内存申请时延的变动,之后并基于内存申请时延的变动调整,优先级与内存类型的对应关系。这样,即使电子设备上的内存的申请时延发生了变化,电子设备也可以给进程分配内存申请时延与该进程匹配的内存。这样,可以进一步地减少电子设备上出现的短时延要求的进程因内存分配时延高而导致的应用响应延迟、应用卡顿等现象,可以提升用户的使用体验。
在第一方面的一种可能的设计中,上述电子设备基于进程标识得到目标内存类型,可以包括:电子设备基于进程标识得到进程标识对应的内存申请时延;电子设备确定多种内存类型中,对应的内存申请时延与进程标识对应的内存申请时延差值最小的内存类型为目标内存类型。
在第一方面的一种可能的设计中,上述电子设备基于目标进程的进程类型得到目标内存类型,可以包括:电子设备基于目标进程的进程类型得到目标进程的进程类型对应的内存申请时延。接下来,电子设备确定多种内存类型中,对应的申请时延与目标进程的进程类型对应的内存申请时延差值最小的内存类型为目标内存类型。
在第一方面的一种可能的设计中,本方法还可以包括:电子设备获取多种内存类型对应的内存申请时延范围。以及,上述电子设备基于进程标识得到目标内存类型,可以包括:电子设备基于进程标识得到进程标识对应的内存申请时延。之后,电子设备确定进程标识对应的内存申请时延在内存申请时延范围中的内存类型为目标内存类型;或者,上述电子设备基于目标进程的进程类型得到目标内存类型,可以包括:基于目标进程的进程类型得到目标进程对应的内存申请时延;接下来,电子设备确定目标进程对应的内存申请时延在内存申请时延范围中的内存类型为目标内存类型。
在第一方面的一种可能的设计中,按照对应的内存申请时延从低到高的顺序,上述多种内存类型可以包括:处理器核空闲内存、全局空闲内存、文件页释放内存、匿名页压缩释放内存、匿名页转移释放内存、分配器释放内存和进程销毁释放内存中的一种或多种。
在第一方面的一种可能的设计中,上述文件页释放内存,可以包括:可扩展只读文件系统文件页释放内存,内存友好文件系统文件页释放内存,第四代扩展文件系统文件页释放内存,可扩展文件分配表文件页释放内存。上述匿名页压缩释放内存,可以包括:第一匿名页压缩释放内存和第二匿名页压缩释放内存。其中,第一匿名页压缩释放内存的活跃度高于第二匿名页压缩释放内存的活跃度;活跃度可以理解为使用该匿名页的进程的活跃程度。上述分配器释放内存,可以包括:第一分配器释放内存和第二分配器释放内存。第一分配器释放内存对电子设备资源的占用程度低于第二分配器释放内存对电子设备资源的占用程度;其中,上述对电子设备资源的占用程度可以包括对电子设备上的输入输出接口的占用程度。
在第一方面的一种可能的设计中,本申请实施例提供的方法还可以包括:电子设备基于内存申请请求得到目标进程的内存申请量。以及,电子设备基于目标内存类型为目标进程分配内存,可以包括:电子设备基于目标内存类型,执行第一循环搜索,以得到满足分配条件的内存。之后,电子设备为目标进程分配满足分配条件的内存。其中,第一循环搜索可以包括:电子设备按照内存申请时延从低到高的顺序,从目标内存类型和内存申请时延比目标内存类型高的内存中循环搜索,直至搜索得到满足分配条件的内存;满足分配条件的内存的可分配内存量大于或等于内存申请量;可分配内存量是通过内存查询工具查询得到的。这样,即使目标内存类型的可分配内存量不能满足目标进程的内存申请量,电子设备也可以为进程分配内存,可以防止进程饥饿的发生。同时,为该进程分配的内存也不会影响到对电子设备上其他进程的内存分配。
在第一方面的一种可能的设计中,本申请实施例提供的方法还可以包括:若第一循环搜索满足循环切换条件,则电子设备执行第二循环搜索。其中,上述循环切换条件包括:第一循环搜索的搜索次数大于或等于预设次数,和/或第一循环搜索的搜索时间大于或等于预设时间。以及。第二循环搜索包括:按照内存申请时延从低到高的顺序,从多种内存类型的内存中循环搜索,直至搜索得到满足分配条件的内存。这样,即使目标内存类型的可分配内存量不能满足目标进程的内存申请量,电子设备也可以为进程分配内存,可以减少进程饥饿的发生。
在第一方面的一种可能的设计中,上述电子设备基于目标内存类型,执行第一循环搜索,以得到满足分配条件的内存可以包括:若目标内存类型是匿名页压缩释放内存,或者是分配器释放内存,或者是匿名页转移释放内存,则电子设备基于目标内存类型执行第一循环搜索,以得到满足分配条件的内存。若目标内存类型是文件页释放内存,或者是全局空闲内存,则电子设备基于目标内存类型执行第三循环搜索,以得到满足分配条件的内存。其中,第三循环搜索可以包括:电子设备按照内存申请时延从高到低的顺序,从目标内存类型和内存申请时延比目标内存类型低的内存中循环搜索,直至搜索得到满足分配条件的内存。在这种设计中,电子设备可以根据目标内存类型的申请时延采用不同的分配方式。这样,对于一些高时延需要的进程,在满足这些进程时延需要的情况下,可以减少这些进程发送进程饥饿的情况。以及,对于一些时延要求低的进程,在不影响其他进程的内存申请的情况下,可以减少这些进程发生进程饥饿的情况。
第二方面,提供了一种电子设备,该电子设备具有实现上述第一方面及第一方面任一种可能的设计所述的方法的功能。该功能可以通过硬件实现,也可以通过硬件执行相应的软件实现。该硬件或软件包括一个或多个与上述功能相对应的模块。例如,内存分配模块等等。
第三方面,提供了一种电子设备,该电子设备包括存储器、一个或多个处理器,存储器与处理器耦合;其中,存储器中存储有计算机程序代码,计算机程序代码包括计算机指令;当计算机指令被处理器执行时,使得电子设备执行上述第一方面及第一方面的任一种可能的设计所述的方法。
第四方面,提供一种计算机可读存储介质,该计算机可读存储介质中存储有指令,当其在电子设备上运行时,使得电子设备可以执行上述第一方面以及第一方面任一种可能的设计所述的方法。
第五方面,提供一种包括指令的计算机程序产品,当其在电子设备上运行时,使得电子设备可以执行上述第一方面以及第一方面的任一种可能的设计所述的方法。
其中,第二方面至第五方面中任一种设计方式所带来的技术效果可以参见上述第一方面不同设计所带来的技术效果,此处不再赘述。
附图说明
图1为本申请实施例提供的一例使用场景示意图;
图2为本申请实施例提供的一例电子设备的结构示意图;
图3为本申请实施例提供的一例电子设备的软件结构示意图;
图4为本申请实施例提供的一例内存分配方法的流程示意图;
图5为本申请实施例提供的又一例内存分配方法的流程示意图;
图6为本申请实施例提供的又一例内存分配方法的流程示意图;
图7为本申请实施例提供的又一例内存分配方法的流程示意图;
图8为本申请实施例提供的又一例内存分配方法的流程示意图;
图9为本申请实施例提供的又一例内存分配方法的流程示意图;
图10为本申请实施例提供的又一例内存分配方法的流程示意图;
图11为本申请实施例提供的又一例内存分配方法的流程示意图;
图12为本申请实施例提供的又一例内存分配方法的流程示意图;
图13为本申请实施例提供的又一例内存分配方法的流程示意图;
图14为本申请实施例提供的又一例内存分配方法的流程示意图;
图15为本申请实施例提供的又一例内存分配方法的流程示意图;
图16为本申请实施例提供的又一例内存分配方法的流程示意图;
图17为本申请实施例提供的又一种电子设备的结构示意图。
具体实施方式
下面,在介绍本申请实施例之前,先对本申请实施例涉及到的相关术语进行介绍。
关于内存:
内存(memory)也可以被称为内存空间、内部存储空间或内部存储器等,它可以用于暂时存放处理器中的数据,以及与硬盘等外部存储器交换的数据。它也是外存(外部存储器)与处理器进行沟通的桥梁,电子设备中应用程序的运行在内存中进行,内存性能的强弱影响电子设备整体发挥的水平。若电子设备开始运行,则操作系统(operation system,OS)会把需要运算的数据从内存调到处理器中进行运算,当运算完成,处理器将结果传送出来。内存可以被分成若干个大小相等的内存页面(文件页,file page),每个文件页可以是4千字节(kilo byte,kB)或者8kB以及其他大小。
内存空间从属性上可以分为,物理内存空间和虚拟内存空间。物理内存空间可以理解为电子设备的硬件中实际存在的内存空间,也就是内部存储器上的内存空间。程序或进程在运行时需要使用内存空间来存储数据和代码,这些数据和代码就会被加载到物理内存中,程序通过直接访问物理内存来进行读写操作。虚拟内存空间可以理解为电子设备通过操作系统将物理内存和硬盘空间进行映射,创造出来的虚拟的内部存储器的空间,其大小可以大于内部存储器的内存容量大小。程序在运行时使用的内存空间有时会超出物理内存的空间大小,这时操作系统会使用虚拟内存空间来辅助存储,将不经常使用的数据从物理内存中“换出”到硬盘上,腾出物理内存空间来供其他程序使用。当需要访问“换出”的数据时,操作系统会将其从硬盘中“调入”,并将占用空间较久的页面从物理内存空间转移到虚拟内存空间中。
关于内存申请:
内存申请可以理解为,应用(或进程)在需要访问一定空间的内存时,向计算机系统发送的指令,该指令请求了内存空间,以便存储进程的变量、对象、数据结构和代码等。进程在执行一些预设的功能时,该进程会进行内存申请。可以理解的,进程的内存申请是一个频繁的过程,进程处于运行状态,进程会进行内存申请。
例如,应用(或进程)会向内存管理工具,发起内存申请请求,申请一定的内存空间大小(下文可简称为内存大小)。这样,内存管理工具,就可以响应于该请求,查找可用的内存块;并分配给该进程。这样,该进程就可以将变量、对象等信息存储入内存管理工具分配的内存中,并在执行过程中对内存空间进行读写操作等等。其中,进程的内存空间大小可以是内存的物理空间大小,也可以是虚拟空间大小。
关于内存释放:
内存释放也可以被称为,内存回收;可以理解为,将进程未使用的内存空间回收。这样可以增加电子设备上可以被其他进程使用的内存空间。在进程运行时,电子设备给进程分配了一定的内存,但随着进程的运行,有些内存可能已经不再被该进程需要了,这时就需要释放这些内存资源。否则如果进程一直占用内存,就会导致内存资源紧张,影响电子设备的稳定性和运行效率。电子设备可以通过,删除内存中存储的数据、压缩内存中存储的数据和转移内存中存储的数据等等方式来实现内存释放。
示例性的,电子设备还可以通过将内存中的文件页丢弃的方式来释放内存。将文件页丢弃(discard file page)是一种释放内存的方式,它通过将内存中暂未被修改过的文件页删除来实现。在操作系统中,文件常常被读入内存中,以便软件可以更快地访问它们,但是内存是有限的资源,如果软件访问的文件太多、过于庞大,内存就会不够用。此时,可以选择将一些文件页从内存中删除,以释放更多内存,并且还能保证空闲内存不会损失文件的数据内容。以及,如果丢弃的内存页是脏页,则可以先将脏页中的数据转移到外部存储系统(如,Unix 文件系统(Unix file system,UFS))后,再丢弃该文件页。例如,假设进程“AA”被分配了128千字节(kilo byte,kB),然而实际使用时进程“AA”只使用了64kB的内存空间。此时,内存空间中就会存在64kB的文件页,没有被使用,是空白的。因此,电子设备可以通过删除这一部分文件页,来释放没有被使用的64kB的内存。
示例性的,电子设备还可以通将内存中的匿名页压缩的方式来释放内存。匿名页是指没有磁盘文件对应的内存页,一般用于程序的动态数据存储,比如运行时的堆、栈等。由于经过压缩,匿名页所占用的内存空间的大小就会缩小,因此可以实现内存释放。例如,假设某匿名页大小为32kB,经过压缩后,该匿名页大小被压缩为16kB。因此,电子设备可以通过将匿名页压缩,来释放16kB的内存。以及,电子设备还可以将压缩后的匿名页从电子设备的内部存储器转移到电子设备的外部存储器(外存)中,这样还可以进一步地释放另外的16kB空间。
示例性的,电子设备还可以通过收缩机(shrinker)机制从内核模块的内存池(memory pool)中,释放内存。shrinker机制是操作系统内核中的一种内存回收机制,它可以通过释放不需要的内存,从而减轻系统内存压力,提高系统的性能,避免内存溢出等问题。例如,shrinker 机制可以由内核中的一个特定的模块来实现的,该模块可以定期扫描各内核模块的内存池的使用情况,寻找内存池中可以被回收的内存块。当需要该机制进行回收操作(例如,电子设备出现低内存情况)时,shrinker 机制回收内存池中不再使用的内存块。回收完成之后,电子设备的内存会得到一定程度的释放。
其中,内核模块可以理解为在操作系统运行期间动态加载和卸载的内核代码。在操作系统中,内核模块通常是一段操作系统功能的代码,例如驱动程序、文件系统、网络协议栈等。它们可以被加载到内核空间,以扩展系统功能或支持特定的硬件设备。以及,内存池(Memory Pool)是一种内存管理技术,它可以在应用程序(application,APP)启动时一次性申请一定量的内存空间,然后将这些内存划分为多个大小相等的块,也就是内存块;最后,这些内存块组合形成一个内存池。当内核模块需要内存时,直接从内存池中获取内存块,这样可以减少动态内存申请与释放的频率,提高应用程序的性能。
示例性的,电子设备还可以通过将一些进程销毁(kill)的方式来释放内存。电子设备在运行时,电子设备上会存在一些不重要的进程(如,后台下载进程、后台压缩进程等等)。这些进程会占用很多内存空间,且这些进程不会影响到使用该电子设备的用户的使用体验。因此可以销毁这些进程,来释放这些进程占用的内存空间。
关于申请时延:
申请时延,也可以被称为内存申请时延,内存申请延时,申请延时,内存申请延迟,申请延迟等等。可以理解为,从进程提出内存需要(进行内存申请),到该内存需要被满足(获得内存空间)的时间段。示例性的,可以为从某进程发起内存申请请求起,到该进程获取到了内存申请请求所请求大小的内存空间止的时间段。可以理解的,由于进程内存申请请求的传输,以及内存管理模块内部的分配等等均需要耗时,种种这些均会导致申请延时的产生。示例性的,申请延时的单位可以为微秒(microsecond,μs)每4kB,记为μs/4kB。
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行描述。其中,在本申请的描述中,除非另有说明,“/”表示前后关联的对象是一种“或”的关系,例如,A/B可以表示A或B;本申请中的“和/或”仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况,其中A,B可以是单数或者复数。并且,在本申请实施例的描述中,除非另有说明,“多个”是指两个或多于两个。“以下至少一项(个)”或其类似表达,是指的这些项中的任意组合,包括单项(个)或复数项(个)的任意组合。例如,a,b,或c中的至少一项(个),可以表示:a,b,c,a-b,a-c,b-c,或a-b-c,其中a,b,c可以是单个,也可以是多个。另外,为了便于清楚描述本申请实施例的技术方案,在本申请的实施例中,采用了“第一”、“第二”等字样对功能和作用基本相同的相同项或相似项进行区分。本领域技术人员可以理解“第一”、“第二”等字样并不对数量和执行次序进行限定,并且“第一”、“第二”等字样也并不限定一定不同。
同时,在本申请实施例中,“示例性的”或者“例如”等词用于表示作例子、例证或说明。本申请实施例中被描述为“示例性的”或者“例如”的任何实施例或设计方案不应被解释为比其它实施例或设计方案更优选或更具优势。确切而言,使用“示例性的”或者“例如”等词旨在以具体方式呈现相关概念,便于理解。
目前,电子设备在进行内存分配时,电子设备上的内存管理工具会按照进程发起内存申请请求的时间先后顺序给进程分配内存,以防止进程得不到内存而导致该进程无法运行。例如,在接收到内存申请时,电子设备上的内存管理模块会先从空闲的内存中分配内存。若该进程内存申请没有被满足(如,空闲内存大小不满足内存申请的申请内存大小),则电子设备通过内存释放(回收)的方式增加内存,之后电子设备再从释放得到的内存中进行内存分配,以满足该进程的内存申请。然而,这种分配方式是按照内存申请的时间顺序给进程分配内存,会将空闲内存(申请延时低的内存)分配给发起内存申请发起时间早的进程;会将内存释放得到的释放内存(申请延时高的内存)分配给内存申请发起时间晚的进程。这种分配方式存在将申请延时比较低的内存分配给了允许使用高申请时延的进程的现象。这可能会导致要求低时延的进程(例如,与用户交互相关程度高的进程)获得了申请延时高的内存;这会在电子设备上,出现应用响应延迟、卡顿、丢帧等现象,从而会影响用户的使用体验。
示例性的,进程A为与用户交互不相关的应用后台缓存进程;进程B为与用户交互相关的应用前台显示进程。进程A先发起了内存申请,则内存管理工具会先从空闲内存中分配。空闲内存可以满足内存申请,则内存管理工具将空闲内存分配给了进程A。之后,进程B发起了进程内存申请,则内存管理工具依旧会先从空闲内存中分配,空闲内存不能满足进程内存申请;内存管理工具会通过内存释放的方式,增加内存,之后再从释放得到的内存中为进程B分配内存;则内存管理工具将内存释放得到的内存分配给了进程B。可以理解的,由于空闲内存可以直接分配,因此申请延时比较低;由于内存释放得到的内存,需要先通过内存释放的步骤才能够分配给进程B,因此内存释放得到的内存的申请时延会比较高。可见,目前的内存分配方式中;会将空闲内存分配给进程A,会将内存释放得到的内存分配给进程B。从而导致与用户交互相关的进程B被分配了申请时延比较高的进程,这会在电子设备上出现应用显示卡顿、丢帧等现象,会影响用户对电子设备的使用体验。
有鉴于此,本申请实施例提供一种内存分配方法,在该方法中电子设备可以基于进程的内存申请请求得到目标内存类型;目标内存类型是电子设备上多个内存类型中内存申请时延与发起内存申请请求的进程匹配的内存类型。之后,电子设备可以基于目标内存类型给进程分配内存。这样,可以为当前进程分配内存申请时延与该进程的时延需求相匹配的内存类型的内存,从而使得要求低时延的进程能够分配到内存申请时延也低的内存类型,可以减少电子设备上出现的短时延要求的进程因内存分配时延高而导致的应用响应延迟、应用卡顿等现象,可以提升用户的使用体验。
本申请实施例提供的内存分配方法,可以应用于用户对电子设备的日常使用之中。用户在电子设备上使用三方应用(application,APP),或者系统APP时。相关APP的进程会发起内存申请请求,此时电子设备可以使用本申请提供的内存分配方法,为进程分配内存。
示例性的,参见图1,用户在使用电子设备100的过程中,电子设备100上的多个进程(比如,进程A和进程B)根据进程所执行的功能的需要发起了内存申请。进程A早于进程B发起了内存申请,进程A是某应用的后台预下载文件进程,进程B是某应用的前台界面显示进程。此时,电子设备100可以通过本申请实施例提供的内存分配方法,为进程A和进程B分配内存。将申请时延较高的内存分配给进程A,将申请时延比较低的内存分配给进程B。这样,由于进程B被分配到了申请时延比较低的内存,就不会影响到进程B的前台界面显示功能,可以减少进程B因内存分配时延高而导致的,应用响应延迟、应用卡顿等现象,可以提升用户的使用体验。
示例性的,本申请实施例中的电子设备可以是便携式计算机(如手机)、平板电脑、智慧屏、笔记本电脑、个人计算机(personal computer,PC)、可穿戴电子设备(如智能手表)、增强现实(augmented reality,AR)/虚拟现实(virtual reality,VR)设备、车载电脑等等,能够使用应用程序的电子设备。
图2示出了电子设备100的结构示意图。
电子设备100可以包括处理器110,外部存储器接口120,内部存储器121,通用串行总线(universal serial bus,USB)接口130,充电管理模块140,电源管理模块141,电池142,天线1,天线2,移动通信模块150,无线通信模块160,音频模块170,扬声器170A,受话器170B,麦克风170C,耳机接口170D,传感器模块180,按键190,马达191,指示器192,摄像头193,显示屏194,以及用户标识模块(subscriber identification module,SIM)卡接口195等。其中传感器模块180可以包括压力传感器180A,陀螺仪传感器180B,气压传感器180C,磁传感器180D,加速度传感器180E,距离传感器180F,接近光传感器180G,指纹传感器180H,温度传感器180J,触摸传感器180K,环境光传感器180L,骨传导传感器180M等。
可以理解的是,本申请实施例示意的结构并不构成对电子设备100的具体限定。在本申请另一些实施例中,电子设备100可以包括比图示更多或更少的部件,或者组合某些部件,或者拆分某些部件,或者不同的部件布置。图示的部件可以以硬件,软件或软件和硬件的组合实现。
处理器110可以包括一个或多个处理单元,例如:处理器110可以包括应用处理器(application processor,AP),调制解调处理器,图形处理器(graphics processingunit,GPU),图像信号处理器(image signal processor,ISP),中央处理器(centralprocessing unit,CPU),控制器,存储器,视频编解码器,数字信号处理器(digital signalprocessor,DSP),基带处理器,和/或神经网络处理器(neural-network processing unit,NPU)等。其中,不同的处理单元可以是独立的器件,也可以集成在一个或多个处理器中。
其中,控制器可以是电子设备100的神经中枢和指挥中心。控制器可以根据指令操作码和时序信号,产生操作控制信号,完成取指令和执行指令的控制。
处理器110中还可以设置存储器,用于存储指令和数据。在一些实施例中,处理器110中的存储器为高速缓冲存储器。该存储器可以保存处理器110刚用过或循环使用的指令或数据。如果处理器110需要再次使用该指令或数据,可从所述存储器中直接调用。避免了重复存取,减少了处理器110的等待时间,因而提高了系统的效率。
在一些实施例中,处理器110可以包括一个或多个接口。接口可以包括集成电路(inter-integrated circuit,I2C)接口,集成电路内置音频(inter-integrated circuitsound,I2S)接口,脉冲编码调制(pulse code modulation,PCM)接口,通用异步收发传输器(universal asynchronous receiver/transmitter,UART)接口,移动产业处理器接口(mobile industry processor interface,MIPI),通用输入输出(general-purposeinput/output,GPIO)接口,用户标识模块(subscriber identity module,SIM)接口,和/或通用串行总线(universal serial bus,USB)接口等。
外部存储器接口120可以用于连接外部存储卡,例如Micro SD卡,实现扩展电子设备100的存储能力。外部存储卡通过外部存储器接口120与处理器110通信,实现数据存储功能。例如将音乐,视频等文件保存在外部存储卡中。
内部存储器121可以用于存储计算机可执行程序代码,所述可执行程序代码包括指令。处理器110通过运行存储在内部存储器121的指令,从而执行电子设备100的各种功能应用以及数据处理。内部存储器121可以包括存储程序区和存储数据区。其中,存储程序区可存储操作系统,至少一个功能所需的应用程序(比如声音播放功能,图像播放功能等)等。存储数据区可存储电子设备100使用过程中所创建的数据(比如音频数据,电话本等)等。此外,内部存储器121可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件,闪存器件,通用闪存存储器(universal flash storage,UFS)等。
示例性的,处理器110可以获取到电子设备100上运行的进程的优先级,并基于该优先级将内部存储器121中的存储数据区分配给电子设备100上运行的进程,以使得进程可以使用内部存储器121中的存储数据区。
电子设备100的软件系统可以采用分层架构,事件驱动架构,微核架构,微服务架构,或云架构。本申请实施例以分层架构的Android®系统为例,示例性说明电子设备100的软件结构。
图3是本申请实施例的电子设备100的软件结构框图。
分层架构将软件分成若干个层,每一层都有清晰的角色和分工。层与层之间通过软件接口通信。在一些实施例中,将Android®系统分为四层,从上至下分别为应用程序层,应用程序框架层,安卓™运行时(Android®Runtime)和系统库,以及内核层。
可以理解的,对于不同类型的电子设备其软件架构可以有不同的划分方式;以及对于不同的操作系统的软件结构也可以有不同的划分方式,如将应用程序层,应用程序框架层,安卓™运行时(Android®Runtime)和系统库划分为用户态;将内核层划分为内核态等等。相关技术人员可以根据实际的使用进行设计,本申请实施例对此不做任何限制。
应用程序层可以包括一系列应用程序包。
如图3所示,应用程序包可以包括相机,图库,日历,通话,地图,导航,WLAN,蓝牙,音乐,视频,短信息等应用程序。
应用程序框架层为应用程序层的应用程序提供应用编程接口(applicationprogramming interface,API)和编程框架。应用程序框架层包括一些预先定义的函数。
如图3所示,应用程序框架层可以包括窗口管理器,内容提供器,视图系统,电话管理器,资源管理器,通知管理器等。
窗口管理器用于管理窗口程序。窗口管理器可以获取显示屏大小,判断是否有状态栏,锁定屏幕,截取屏幕等。
内容提供器用来存放和获取数据,并使这些数据可以被应用程序访问。所述数据可以包括视频,图像,音频,拨打和接听的电话,浏览历史和书签,电话簿等。
视图系统包括可视控件,例如显示文字的控件,显示图片的控件等。视图系统可用于构建应用程序。显示界面可以由一个或多个视图组成的。例如,包括短信通知图标的显示界面,可以包括显示文字的视图以及显示图片的视图。
电话管理器用于提供电子设备100的通信功能。例如通话状态的管理(包括接通,挂断等)。
资源管理器为应用程序提供各种资源,比如本地化字符串,图标,图片,布局文件,视频文件等等。
通知管理器使应用程序可以在状态栏中显示通知信息,可以用于传达告知类型的消息,可以短暂停留后自动消失,无需用户交互。比如通知管理器被用于告知下载完成,消息提醒等。通知管理器还可以是以图表或者滚动条文本形式出现在系统顶部状态栏的通知,例如后台运行的应用程序的通知,还可以是以对话窗口形式出现在屏幕上的通知。例如在状态栏提示文本信息,发出提示音,电子设备振动,指示灯闪烁等。
Android®Runtime包括核心库和虚拟机。Android®Runtime负责安卓系统的调度和管理。
核心库包含两部分:一部分是java语言需要调用的功能函数,另一部分是安卓的核心库。
应用程序层和应用程序框架层运行在虚拟机中。虚拟机将应用程序层和应用程序框架层的java文件执行为二进制文件。虚拟机用于执行对象生命周期的管理,堆栈管理,线程管理,安全和异常的管理,以及垃圾回收等功能。
系统库可以包括多个功能模块。例如:表面管理器(surface manager),媒体库(Media Libraries),三维图形处理库(例如:OpenGL ES),二维(2D)图形引擎(例如:SGL)等。
表面管理器用于对显示子系统进行管理,并且为多个应用程序提供了2D和3D图层的融合。
媒体库支持多种常用的音频,视频格式回放和录制,以及静态图像文件等。媒体库可以支持多种音视频编码格式,例如: MPEG4,H.264,MP3,AAC,AMR,JPG,PNG等。
三维图形处理库用于实现三维图形绘图,图像渲染,合成,和图层处理等。
2D图形引擎是2D绘图的绘图引擎。
内核层是硬件和软件之间的层。内核层至少包含显示驱动,摄像头驱动,音频驱动,传感器驱动。内核层还可以包括:内存分配模块。
内存分配模块可以接收进程的内存申请,例如,音乐应用进程的内存申请,导航应用进程的内存申请等等;并为进程分配内存。
下面将以图1所示的内存分配场景中,电子设备是手机为例,对本申实施例请提供的内存分配方法进行详细介绍。
参见图4,本申请实施例提供的内存分配方法还可以包括步骤S101-S102。
在一些实施例中,参见图4,在步骤S101之前,本申请实施例提供的内存分配方法还可以包括步骤S100。
S100.进程向内存分配模块发送内存申请请求。
其中,进程可以是手机上安装的应用程序对应的进程,例如可以是“AA”音乐播放应用对应的前台播放进程、后台播放进程、前台显示进程、后台缓存进程等等。进程还可以是系统应用所对应的进程,比如,相机应用对应的前台拍摄进程;蓝牙应用对应的后台蓝牙数据传输进程等等。进程还可以是系统服务(system server)进程,比如,安卓™系统进程。进程还可以是,一些中间件进程,比如一些使用了C或C++代码的进程;例如,文件加/解密进程,编/解码进程。进程还可以是,操作系统在执行进程管理功能时,所运行的空进程等等。本申请实施例对进程的类型不做任何限制。
在一些实施例中,参见图5,上述步骤S100可以包括:步骤S100a-S100b。
S100a.进程从用户态切换为内核态。
用户态和内核态均是操作系统中的概念,均可以用来描述进程运行时所处的不同权限级别。在用户态下,进程可以访问属于该进程的代码、数据和堆栈段。以及一些不涉及系统资源的部分。在内核态下,进程可以访问操作系统的资源和设备,并能执行一些权限级别比较高的指令(比如,申请内存等等)。用户态是指进程所处的一种低权限级别的状态,在这种状态下,进程只能访问该进程的代码、数据和堆栈段;并且访问的代码、数据和堆栈段均需要经过操作系统的控制和验证,不能直接访问硬件资源。在用户态下,进程的操作是受到限制的,不可以随意地访问计算机的系统资源和其他进程的内存空间。内核态是指进程所处的一种高权限级别的状态,在这种状态下,进程可以访问整个操作系统的资源,并能执行一些权限比较高的指令。在内核态下,进程可以直接操纵硬件资源和其他进程的内存空间,而且不需要经过操作系统的控制和验证。因此,内核态下的进程拥有比较高的执行权限和比较高的资源访问权限。进程可以通过系统调用的方式实现从用户态到内核态的切换,或者从内核态到用户态的切换。进程也可以通过中断的方式实现从用户态到内核态的切换,或者从内核态到用户态的切换。
基于此,进程可以从用户态切换为内核态,以获取比较高的权限级别。这样,进程就可以在后续通过寻址确定并使用内存分配模块分配的内存,在内存分配模块分配的内存上进行读写数据、修改数据等等,以执行该进程预设的功能。
S100b.处于内核态的进程,向内存分配模块发送内存申请请求。
在切换成内核态之后,进程可以基于该进程的需要,通过预设的调用接口向内存分配模块发送内存申请请求,以请求该进程需要的内存。如12kB大小的虚拟内存,16kB大小的物理内存等等。
其中,预设的调用接口可以理解为,内存分配模块为了接收进程的内存申请请求,而预设的一个接收通道。该通道主要用于接收来自各个进程的内存申请请求。内存申请请求,可以具有一定的格式,并可以通过一些字段(字符串)来表示进程所请求的内存大小。例如,可以通过字段“memory=16kb”字段来表示,发起内存申请请求的进程所请求的内存大小是16kB;又例如,可以通过字段“cache=32kb”字段来表示,发起内存申请请求的进程所请求的内存是32kB大小的内存等等。可以理解的,相关技术人员可以根据实际的使用情况对进程向内存分配模块发送的内存申请请求的字段进行设计,本申请实施例对此不做任何限制。
可以理解的,在手机上有一些进程会始终处于内核态运行。如,与摄像头驱动相关的cameraserver进程、手机上显示屏触控相关的aptouch_daemon进程等等。对于这些始终处于内核态运行的进程来讲,这些进程可以直接向内存分配模块,发送内存申请请求。
举例来说,“AA”音乐播放应用的后台音乐播放进程,需要使用32kB的内存;“AA”音乐播放应用的后台音乐播放进程,会从用户态切换为内核态;之后,处于内核态的“AA”音乐播放应用的后台音乐播放进程向内存分配模块发送内存申请请求,以使得内存分配模块给该进程分配32kB的内存。再次举例来说,cameraserver进程,需要使用16kB的内存;cameraserver进程会向内存分配模块发送内存申请请求,以使得内存分配模块给该进程分配16kB的内存。
S101.内存分配模块基于接收到的内存申请请求,得到目标内存类型。
其中,目标内存类型的内存申请时延和进程的内存时延需要相匹配。进程会因为对内存申请时延的灵敏度不同,导致进程的内存时延需要不同。对于一些内存时延需要低的进程(比如,可以使用高内存申请时延的进程)匹配内存申请时延高的内存,对于一些内存时延需要高(比如,要求使用低内存申请时延的进程)匹配内存申请时延低的内存类型。
这样,可以为当前进程分配内存申请时延与该进程的时延需求相匹配的内存类型,从而使得要求低时延的进程能够分配到内存申请时延也低的内存类型,减少电子设备上出现的短时延要求的进程因内存分配时延高而导致的应用响应延迟、应用卡顿等现象,可以提升用户的使用体验。
可以理解的,不同的进程对于内存申请时延的灵敏度是不同的,也就是说申请时延对进程的影响会是不同的。对于一些与用户交互相关性比较高的进程,这些进程对申请时延的灵敏度比较高,申请时延对这些进程的影响会比较明显;对于一些与手机运行重要程度比较高的进程,这些进程对申请时延的灵敏度也会比较高,申请时延对这些进程的影响也会比较明显。例如,对于一些前台进程来说,如果这些进程被分配的内存的申请时延比较高,就会立即在手机上产生应用卡顿、应用延时、显示丢帧等现象。对于一些系统进程来讲,这些进程是其他进程(如,显示进程、传输进程等等)所依赖的进程,如果这些进程被分配到的内存的申请时延比较高,也会立即在手机上产生应用卡顿、应用延时、显示丢帧等现象。
以及,对于一些与用户交互相关性比较低的进程,这些进程对申请时延的灵敏度比较低,申请时延对这些进程的影响不会很大。例如,对于一些后台进程来说,如果这些进程被分配的内存的申请时延比较高,也不会在手机上产生应用卡顿、应用延时、显示丢帧等现象。对于一些空进程来说,如果这些进程被分配的内存的申请时延比较高,也不会在手机上产生应用卡顿、应用延时、显示丢帧等现象。
比如,内存类型可以包括:空闲内存和释放内存。不同类型的内存的申请时延不同。可以理解的,由于释放内存需要完成内存释放的过程后才能被进程使用;因此,释放内存时的申请延时会高于空闲内存。
其中空闲内存可以理解为,手机的存储器中没有存入数据的部分。释放内存可以理解为,手机的存储器中通过内存释放将已存入的数据释放的部分。
由此,本申请实施例提供的技术方案,可以给进程分配内存申请时延匹配的内存。这样可以减少将高申请时延的内存分配给与用户交互相关的进程的情况,从而可以减少手机上出现应用卡顿、应用延时、显示丢帧等现象。
在一些实施例中,内存申请请求中可以携带目标内存类型。这样,内存分配模块就可以从内存申请请求中得到目标内存类型。
示例性的,内存申请请求中可以通过预设的字段携带目标内存类型。例如,通过“memory_type”字段、或者“cache_type”字段,携带目标内存类型。这样,内存分配模块就可以通过在内存申请请求中搜索上述预设的字段得到目标内存类型。并在后续,基于目标内存类型为该进程分配内存。
在一些实施例中,上述释放内存可以包括:文件页释放内存、匿名页释放内存、分配器释放内存和进程销毁释放内存。
其中,文件页释放内存,可以理解为手机通过文件页丢弃的方式释放得到的内存。在一些实施例中,文件页释放内存可以被简写为:file cache。可以理解的,手机可以将内部存储器中的内存页中存储的数据删除,来清空这个内存页。这样,这个内存页所使用的内存空间就会被释放;基于此方式释放得到的内存空间就可以被称为文件页释放内存。
匿名页释放内存,可以理解为,手机通过释放内部存储器中的匿名页的方式得到的内存。可以理解的,手机的内部存储器会存在一些匿名页,这些匿名页会占据手机的内存存储器中一定的内部空间。
分配器释放内存,可以理解为使用内存分配器(如slab分配器)通过收缩机机制从内存池中回收(reclaim)得到的内存。在一些实施例中,分配器释放内存可以被简称为:slab reclaim。可以理解的,在手机上的一些应用程序在启动时,会初始化内存池,以在后续这些应用程序运行时使用。然而这些应用程序初始化的内存池,在使用时可能会存在冗余。假设。某应用程序启动时初始化了16kB大小的内存池,在后续该应用程序的使用中,该应用程序可能只使用了,8kB大小的内存池。由此,手机上的slab分配器,就可以回收该应用程序的内存池中未被使用的8kB大小部分。通过这种方式回收得到的内存空间就可以被称为分配器释放内存。
进程销毁释放内存,可以理解为通过指示进程销毁(kill)的方式释放得到的内存。在一些实施例中,进程销毁释放内存可以被简称为:kill memory。可以理解的,手机上一些进程可能不会一直处于运行(running)状态,比如处于就绪(ready)状态或等待(wait)状态。处于就绪状态或等待状态的进程也会占用一定大小的内存。由此,手机就可以通过销毁一部分长时间处于就绪状态或等待状态的进程,以释放这些处于就绪状态或等待状态的进程所使用的内存空间。以及,对于一些处于运行状态的进程,手机也可以根据该进程对电子设备的重要程度,或该进程与用户交互的相关程度,销毁一些重要程度低、与用户体验相关程度低的进程,以释放这些进程所使用的内存空间。基于此方式释放得到的内存可以被称为进程销毁释放内存。
可以理解的,不同内存类型对应的内存申请时延不同。当进程使用内存时,由于内存类型的不同,进程会产生不同的申请时延。由于释放内存需要完成内存释放的过程后才能被进程使用;因此,进程在使用释放内存时的申请时延会高于空闲内存。同时,对于不同类型的释放内存,由于内存释放的方式不同,会导致内存释放过程的耗时不同;因此,进程在使用不同类型的释放内存时申请时延也会不同。
基于此,在一些实施例中,进程可以通过内存申请请求,去指定目标内存类型。这样,内存分配模块就可以将目标内存类型分配给该进程,以使得该进程可以得到该进程要求的内存申请时延。可以理解,不同类型的内存的申请时延不同,进程或者该进程的开发者可以根据该进程的需要,指定一个申请时延与该进程匹配的类型的内存,并将其通过内存申请请求发送给内存分配模块。
示例性的,进程C可以在内存申请请求中,通过预设字段(如为“memory_type=file cache”字段),去指定文件页释放内存。这样,内存分配模块在接收到该进程发出的内存申请请求后,就可以通过内存申请请求中的预设字段,得到目标内存类型为匿名页释放内存。之后,内存分配模块就可以基于匿名页释放内存为该进程分配内存。这样,该进程C就可以得到,内存申请时延与该进程匹配的内存。从而使得进程C可以及时地获得内存,执行进程C预设的功能。这样,可以减少手机上,出现应用响应延迟、应用卡顿的现象,可以提升用户的使用体验。
在一些实施例中,上述空闲内存可以包括:处理器核空闲内存和全局空闲内存。上述匿名页释放内存,可以包括:匿名页压缩释放内存,可以匿名页转移释放内存。
处理器核空闲内存,可以理解为中央处理器(central processing unit,CPU)的每个处理器核的内存页(per-CPU page,pcp)中的空闲内存(free memory),在一些实施例中处理器核空闲内存可以被简写为:pcp free。CPU的每个处理器核均可以维护一定数量的内存页,运行在CPU处理器核上的进程可以使用这些内存页。
全局空闲内存,可以理解为未被使用的物理内存。在一些实施例中,全局空闲内存(global free memory,mem free)。可以理解的,全局空闲内存可以指,手机上的内存管理系统(如,伙伴系统)或内存存储器中未被使用的没有存入数据的内存。
匿名页压缩释放内存,可以理解为通过将内部存储器中的匿名页压缩的方式释放得到的内存。在一些实施例中,匿名页(anonymous page)压缩释放内存(memory)可以被简写为:anon memory。可以理解的,手机可以将内存中的匿名页中的数据进行压缩;压缩后,匿名页中的数据就会变小,这样就可以释放得到一部分内存空间;基于此方式释放得到的内存空间就可以被称为匿名页压缩释放内存。示例性,将内存页压缩可以使用zram压缩技术。
匿名页转移释放内存,可以理解为通过将压缩后的匿名页从电子设备的内部存储器转移到电子设备的外部存储器中从而释放得到的内存。在一些实施例中,匿名页转移(swap)释放内存(memory)可以被简写为:swap memory。可以理解的,手机可以将内存中的匿名页中的数据进行压缩;压缩后,匿名页中的数据就会变小,这样就可以释放得到一部分内存空间。进一步的,手机还可以将压缩后的匿名页,从手机的内存存储器转移到外部存储器中。这样可以进一步地释放压缩后的匿名页所占据的内存空间。基于此方式释放得到的内存空间就可以被称为匿名页转移释放内存。示例性,将内存页压缩可以使用zram压缩技术。对于系统中的一些具有大量重复数据的进程,使用zram可以显著减少内存使用量,从而提高系统的稳定性和性能。在一些资源受限的环境中,如嵌入式设备和移动设备,zram技术可以帮助节约物理内存空间,从而提高设备的效率和性能。
示例性的,进程D可以在内存申请请求中,通过预设字段(如为“cache_type = memfree”字段),去指定全局空闲内存。这样,内存分配模块在接收到该进程发出的内存申请请求后,就可以通过内存申请请求中的预设字段,得到目标内存类型为全局空闲内存。之后,内存分配模块就可以基于全局空闲内存为该进程分配内存。这样,该进程D就可以得到,内存申请时延与该进程匹配的内存。从而使得进程D可以及时地获得内存,执行进程D预设的功能。这样,可以减少手机上,出现应用响应延迟、应用卡顿的现象,可以提升用户的使用体验。
进一步地,在一些实施例中,也可以将文件页释放内存按照文件页的类型划分为不同的子类型。这样,可以提升为进程匹配进程类型的精细程度。
示例性的,内存分配模块可以将文件页释放内存按照被释放的文件页类型划分为如下:
可扩展只读文件系统(extendable read-only file system,EROFS)文件页释放内存,可以理解为将EROFS中的文件页释放得到的内存。
闪存友好文件系统(flash friendly file system,f2fs)文件页释放内存,可以理解为将f2fs中的文件页释放得到的内存。
第四代扩展文件系统(fourth extended file system,ext4)文件页释放内存,可以理解为将ext4中的文件页释放得到的内存。
可扩展文件分配表(extensible file allocation table,exfat)文件页释放内存,可以理解为将exfat中的文件页释放得到的内存。
可以理解的,由于EROFS是一个只读文件系统,进程不需要对该文件系统中的文件进行写回,因此该文件系统上的文件分配效率比较快,也就是说EROFS文件页释放内存的申请时延会比较低。以及,f2fs文件页的读写速度比较快;会快于ext4文件页。并且,ext4文件页的读写速度会快于exfat文件页。
由此可见,EROFS文件页释放内存的申请时延会低于f2fs文件页释放内存,f2fs文件页释放内存的申请时延会低于ext4文件页释放内存,ext4文件页释放内存的申请时延会低于exfat文件页释放内存。示例性的,EROFS文件页释放内存的申请时延可以为6μs/4kB;f2fs文件页释放内存的申请时延可以为7μs/4kB;ext4文件页释放内存的申请时延可以为9μs/4kB;exfat 文件页释放内存的申请时延可以为10μs/4kB。
进一步地,在一些实施例中,也可以将匿名页压缩释放内存根据使用匿名页的进程划分为多个子类型。
示例性的,匿名页压缩释放内存可以根据使用匿名页的进程的活跃程度划分为多个子类型。如划分为高活跃度匿名页压缩释放内存和低活跃度匿名页压缩释放内存。高活跃度匿名页压缩释放内存,可以理解为使用该匿名页的进程的活跃程度比较高(如,进程调整(adjustment,adj)等级小于200,或者进程处于运行状态,或者前台进程)。低活跃度匿名页压缩释放内存,可以理解为使用该匿名页的进程的活跃程度不高(如,进程adj等级大于等于200,或者进程处于就绪状态、等待状态,或者后台进程)。可以理解的,如果使用匿名页的进程的活跃度越低,则该匿名页释放的时间就会越短;也就是说,低活跃度匿名页压缩释放内存的申请时延会低于高活跃度匿名页压缩释放内存的申请时延。示例性的,高活跃度匿名页压缩释放内存的申请时延可以为18μs/4kB,低活跃度匿名页释放内存的申请时延可以为14μs/4kB。
进一步的,在一些实施例中,也可以根据分配器释放内存对手机资源的占用程度(如,对内存存储器输入输出接口的占用程度),将分配器释放内存划分出多个子类型。如划分为低占用分配器释放内存,高占用分配器释放内存。在一些实施例中,可以根据内存的seeks值来表征分配器释放内存对手机资源的占用程度(依赖程度)。示例性的,低占用分配器释放内存,可以理解为该内存对手机资源的占用程度比较低(如,seeks值低于1000)。高占用分配器释放内存,可以理解为该内存对手机资源的占用程度比较高(如,seeks值大于等于1000)。低占用分配器释放内存的申请时延会低于高占用分配器释放内存的申请时延。示例性的,高占用分配器释放内存的内存申请时延可以为28μs/4kB;低占用分配器释放内存的内存申请时延可以为24μs/4kB。
在一些实施例中,内存分配模块可以通过内存申请请求,得到进程标识。并根据进程标识,确定目标内存类型。
其中,进程标识可以是进程名称或进程编号(如,PID)等等。
示例性的,内存分配模块可以从内存申请请求中获取到发起内存申请请求的进程标识。之后,内存分配模块可以基于该进程标识,获取到该进程标识历史使用过的内存类型,并确定该进程历史使用过的内存类型为目标内存类型。
例如,内存分配模块可以通过内存申请请求,得到发起该内存申请请求的进程名称为“AAmusic_playback”。之后,内存分配模块可以通过该进程名称,也就是“AAmusic_playback”检索得到,该进程历史使用内存的内存类型;如为mem free使用了20次,pcpfree 使用了一次,file cache 使用了3次。内存分配模块就可以将进程历史使用的内存类型中次数最多的mem free 确定为目标内存类型。
又示例性的,内存分配模块可以从内存申请请求中获取到发起内存申请请求的进程名称。之后,内存分配模块可以基于该进程名称,获取到该进程匹配的内存申请时延。再之后,内存分配模块可以基于该进程匹配的内存申请时延,确定目标内存类型。
其中,内存分配模块可以通过预设的进程名称和内存申请时延的对应关系得到该进程匹配的内存申请时延。例如,进程名称和内存申请时延的对应关系可以是,进程AAA对应25μs/4kB的内存申请时延等等。
在一些实施例中,进程名称和内存申请时延的对应关系也可以是与手机建立了通信连接的服务器发送给手机的。或者,内存分配模块还可以,获取该进程历史使用内存的内存申请时延,并通过历史使用内存的内存申请时延,得到该进程匹配的内存申请时延。
例如,内存分配模块获取到发起该内存申请请求的进程名称为“AAmusic_playback”。之后,内存分配模块可以通过该进程名称检索得到,该进程历史使用内存的内存申请时延;如为,16μs/4kB、18μs/4kB、19μs/4kB和22μs/4kB。之后,内存分配模块可以对该进程历史使用内存的内存申请时延取平均值,得到该进程匹配的内存申请时延为18.75μs/4kB。这样内存分配模块就可以得到该进程匹配的内存申请时延为18.75μs/4kB。
在一些实施例中,内存分配模块中可以预设有内存类型与内存申请时延的对应关系。这样,在得到了进程匹配的内存申请时延后,内存分配模块就可以通过内存类型与内存申请时延的对应关系得到目标内存类型。
在一些实施例中,内存类型与内存申请时延的对应关系也可以是与手机建立了通信连接的服务器发送给手机的。
示例性的,内存类型与内存申请时延的对应关系,可以如下述表1所示。表1中,申请时延的单位可以为μs/4kB,也就是微秒每4kB。
表1
可以理解的,内存类型对应的申请时延,可以是一个具体的数值,也可以是一个连续的范围,本申请实施例对此不做任何限制。
例如,内存分配模块在得到了进程名称为“AAmusic_playback”的进程匹配的内存申请时延为18.75μs/4kB后。内存分配模块就可以通过表1中示出的内存类型与内存申请时延的对应关系,确定18.75μs/4kB落入,anon memory对应的申请时延的区间。内存分配模块确定该进程的目标内存类型是anon memory。这样,在后续,内存分配模块就可以基于anonmemory 给该进程分配内存。
在一些实施例中,内存分配模块可以通过记录手机上历史的内存分配过程,来获取内存类型对应的申请时延。
示例性的,内存分配模块可以通过记录手机上历史的内存分配过程,来获取内存类型对应的申请时延。例如,假设某进程被内存分配模块分配了16kB大小的分配器释放内存类型的内存,则内存分配模块可以获取该进程发起内存申请请求的时间点,以及该进程获取到了16kB大小的内存的时间点。之后,内存分配模块就可以计算得到该进程的申请延时,以及可以得到类型是分配器释放内存类型的内存。也就是说,内存分配模块可以通过手机上历史的内存分配过程得到内存类型对应的申请时延。
又示例性的,内存分配模块可以通过手机上历史的内存分配过程,得到某内存类型的在多次历史内存分配过程中的内存申请时延,并将上述多次历史内存分配过程中的内存申请时延取平均值或中位值,得到该内存类型对应的内存申请时延。例如,内存分配模块得到,手机上file cache的最近三次的历史内存申请时延分别为:28μs/4kB、30μs/4kB、32μs/4kB;之后,内存分配模块可以对上述最近三次的历史内存申请时延取平均值得到,filecache 对应的内存申请时延为,30μs/4kB。又例如,内存分配模块得到,手机上anon memory的最近五次的历史内存申请时延分别为:25μs/4kB、25μs/4kB、50μs/4kB、22μs/4kB和24μs/4kB。之后,内存分配模块可以将上述五次历史内存分配申请时延中,出现次数最多的作为anon memory对应的内存申请时延。也就是,anon memory对应的内存申请时延为25μs/4kB。
示例性的,内存分配模块获取到,内存类型为pcp free对应的申请时延为2μs/4kB。以及,内存分配模块获取到,内存类型为mem free对应的申请时延为,4μs/4kB。以及,内存分配模块获取到,内存类型为file cache对应的申请时延为30μs/4kB。以及,内存分配模块获取到内存类型为anon memory对应的申请时延为25μs/4kB;以及,内存分配模块获取到内存类型为slab reclaim对应的申请时延为19μs/4kB。以及,内存分配模块获取到内存类型为swap memory对应的申请时延为45μs/4kB。以及,内存分配模块获取到内存类型为kill memory对应的申请时延为55μs/4kB。这样,内存分配模块就得到了内存类型对应的申请时延。示例性的,内存分配模块得到的内存类型对应的申请时延可以如下述表2所示。
表2
例如,内存分配模块在得到了进程名称为“AAmusic_playback”的进程匹配的内存申请时延为18.75μs/4kB后。内存分配模块就可以通过表2中示出的内存类型对应的内存申请时延,确定18.75μs/4kB与slab memory的申请时延最接近。内存分配模块确定该进程的目标内存类型是slab memory。这样,在后续,内存分配模块就可以基于slab memory给该进程分配内存。
可以理解的,内存的申请时延,会受到多种因素影响,而产生变化。尤其是对于file cache、anon memory和slab reclaim这三种类型的内存;这三种类型的内存会频繁地受到手机上运行的进程或应用程序的影响,从而导致申请时延的变化;也就是说,这三种类型的申请时延的变化会更频繁。可以理解的,内存存储器的频率降低,会导致mem free类型的内存,申请时延变高;处理器核的频率降低,会导致pcp free类型的内存,申请时延变高;以及,手机上的进程频繁的从文件页中读取数据,会导致file cache类型的内存,申请时延变高;以及,手机上的进程频繁的从匿名页中读取数据,会导致 anon memory类型的内存,申请时延变高;以及,手机上的应用程序,频繁的使用内存池,会导致slab reclaim 类型的内存,申时延变高。
基于此,内存分配模块可以获取多个内存类型的申请时延;之后,内存分配模块可以周期性地或实时地调整内存类型与申请时延的对应关系。这样,即使电子设备上的内存的申请时延发生了变化,电子设备也可以给进程分配内存申请时延与该进程匹配的内存。这样,可以进一步地减少电子设备上出现的短时延要求的进程因内存分配时延高而导致的应用响应延迟、应用卡顿等现象,可以提升用户的使用体验。
示例性的,内存分配模块可以基于采集到的内存类型的申请时延(如表2所示),调整预设的内存类型与申请时延的对应关系(如表1所示)。调整后的对应关系可以如表3所示。
表3
在一些实施例中,内存申请请求中,可以携带有与申请时延相关的字段。内存分配模块可以在接收到的内存申请请求中搜索与申请时延相关的字段,得到该进程发送的申请时延。之后,内存分配模块基于该申请时延,确定目标内存类型。
举例来说,进程C在内存申请请求中,通过预设字段(如为“memory_dely=7”字段),去指定进程C需要的内存申请时延为7μs/4kB。内存分配模块在得到了进程C需要的内存申请时延为7μs/4kB之后,就可以在上述表1示出的内存类型对应的申请时延中,搜索申请时延与7μs/4kB最接近的内存类型(如为,file cache),并将该内存类型作为进程C的目标内存类型。在后续,内存分配模块就可以基于该目标内存类型为进程C分配内存。
再次举例来说,进程C在内存申请请求中,通过预设字段(如为“memory_dely=7”字段),去指定进程C需要的内存申请时延为7μs/4kB。内存分配模块在得到了进程C需要的内存申请时延为7μs/4kB之后,就可以在上述表3示出的内存类型对应的申请时延中,搜索申请时延与7μs/4kB最接近的内存类型(如为,slab reclaim),并将该内存类型作为进程C的目标内存类型。在后续,内存分配模块就可以基于该目标内存类型为进程C分配内存。
在一些实施例中,内存分配模块可以通过内存申请请求,得到进程类型。并根据进程类型,确定目标内存类型。参见图6,上述步骤S101可以包括:步骤S101a1-S101a2。
S101a1.内存分配模块基于内存申请请求,得到进程类型。
其中,内存分配模块可以根据进程对于用户交互的相关性,和/或,根据进程对于手机运行的重要程度将进程划分为不同的类型。
示例性的,内存分配模块可以根据进程对于用户交互的相关性,将进程划分为:前台应用依赖进程、前台应用进程、用户可见后台应用进程、用户号可感知后台应用进程,用户不可感知后台应用进程;上述五种类型的进程与用户交互的相关性依次降低。
其中,前台应用依赖进程可以理解为,前台应用执行预设的功能时需要使用的进程。例如,前台执行显示功能时需要使用的图像引擎、前台执行音乐播放时需要使用的编解码进程等等。
前台应用进程,可以理解为当前手机上正在前台运行的进程;例如,音乐播放类应用的前台播放进程,音乐播放类应用的前台显示进程等等。
用户可见后台应用进程,可以理解为后台运行的且可以被用户在显示屏上观察到的进程;例如,正在输入时输入法的后台进程,后台运行的社交类应用的弹窗进程等等。
用户可感知后台应用进程,可以理解为后台运行的且可以被用户感知到的进程;例如,音乐播放类应用的后台播放进程,视频播放类应用的后台播放进程,导航类应用的后台导航进程,倒计时进程、日程提示进程等等。
用户不可感知后台应用进程,可以理解为,后台运行的且不会被用户感知到的进程。例如,后台缓存进程,后台下载进程等等。
示例性的,内存分配模块可以根据进程对于手机运行的重要程度,将进程划分为:中间件进程、系统服务进程、系统常驻应用进程、备份任务进程、不具恢复能力的进程、桌面进程、应用缓存进程和空进程。上述八种类型的进程重要程度依次降低。
其中,中间件进程,可以理解为一些本地的(native)C/C++应用程序所对应的进程;例如,与手机上显示屏触控相关的aptouch_daemon进程,与手机的显示屏显示的通知栏图标元素相关的surfaceflinger进程,与摄像头服务相关的cameraserver进程等等。在一些实施例中,上述cameraserver进程可以被称为,摄像头业务进程。上述,surfaceflinger进程可以被称为,通知栏显示进程。
系统服务进程可以理解为,手机所使用的操作系统的进程;例如,安卓™系统进程,Windows™系统进程等等。系统常驻应用进程,可以理解为在手机使用时会一直运行的进程;例如,与系统用户界面(user interface,UI)显示相关的systemui 进程,与手机上通话功能相关的 phone进程;与手机上蓝牙传输相关的bluetooth.share.service进程等等。
常驻应用依赖进程,可以理解为与上述系统常驻应用进程具有依赖关系的进程,也就是说,上述系统常驻应用进程需要常驻应用依赖进程才可以执行预设的功能;例如,手机显示用户图形界面所依赖的且与图形引擎相关的providers.media进程。
备份任务进程,可以理解为应用程序执行备份任务时的进程;例如音乐播放类应用的数据备份进程,导航类应用的数据备份进程等等。
不具恢复能力的进程,可以理解为不具备异常恢复能力的进程。其中,异常恢复能力可以理解为,当进程出现异常,被销毁后,可以自动重启。示例性,如果该进程发生了中断,产生了终止后,需要用户的重启指令才能再次运行的进程;例如,拍摄应用类的相机拍摄进程。
桌面进程,可以理解为与手机的桌面功能相关的进程;例如,与桌面上图标的排列显示相关的launcher进程,与桌面壁纸显示相关的wallpaper进程等等。
应用缓存进程,可以理解为应用程序在执行缓存时的进程;例如,“AA”音乐播放应用的音乐缓存进程,“BB”视频播放应用的视频缓存进程等等。
空进程,可以理解为进程中的内容被销毁了的进程。
在一些实施例中,由于用户对于应用使用的频繁程度,可以从一定维度上去表征该应用的重要程度。用户对应用使用的越频繁则该应用的进程越重要。基于此,内存分配模块根据进程对于手机运行的重要程度将进程划分为不同类型,包括:内存分配模块根据用户对应用使用的频繁程度,将进程划分为不同类型。例如,划分为常用服务进程、前一个应用程序进程、不常用服务进程。
其中,常用服务进程也可以被称为常用应用程序进程,可以理解为用户使用比较频繁的应用的进程;例如用户最近使用的进程中在时间上位于前1/3的进程,用户最近使用的进程中在次数上位于前1/3的进程等等。
前一个应用程序进程,也可以被称为前一个使用的应用程序进程,可以理解为当前用户正在使用的应用程序之前用户使用的应用程序的后台进程。例如,若用户在使用“AA”音乐播放应用之前使用了“BB”视频播放应用,则“BB”视频播放应用对应的进程的类型就可以是,前一个使用的应用程序的进程。
不常用服务进程也可以被称为不常用应用程序进程,可以理解为用户使用得不频繁的应用的进程;例如用户最近使用的进程中在时间上位于后2/3的进程,用户最近使用的进程中在次数上位于后2/3的进程等等。
在一些实施例中,内存分配模块可以通过获取操作系统中的最近使用的进程清单,来区分常用服务进程和不常用服务进程。可以理解的,操作系统会记录手机上进程的运行情况,并生成最近使用的进程清单。在最近使用的进程清单中,会记录着手机上进程的使用情况,并按照进程的使用顺序在该清单中对进程进行排列。这样,内存分配模块在获取到最近使用的进程清单后,内存分配模块就可以将该清单中位于前1/3的进程的进程类型作为常用服务进程,将最近该清单中位于后2/3的进程的进程类型作为不常用服务进程。以及,内存分配模块还可以根据进程与应用程序的对应关系,来得到前一个APP的进程。例如,内存分配模块还可以获取到手机上用户使用的应用程序的情况,获取到电子设备上用户当前正在使用的APP,以及,获取到电子设备上在当前正在使用的APP之前,用户使用的APP。并根据进程与应用程序的对应关系,来得到前一个APP的进程。
在一些实施例中,内存分配模块可以根据进程对于用户交互的相关性和进程对于手机运行的重要程度将进程划分为:中间件进程、系统服务进程、系统常驻应用进程、常驻应用依赖进程、前台应用进程、用户可见后台应用进程、用户可感知后台应用进程、备份任务进程、不具恢复能力的后台进程、常用服务进程、桌面进程、前一个应用程序的进程、不常用服务进程、后台应用缓存进程和空进程。其中,上述进程类型与用户交互的相关性和对于手机运行的重要程度依次降低。
示例性的,内存分配模块对进程类型的划分可以如下述表4所示。
表4
示例性的,本申请实施例可以通过下述表5来举例说明一些进程类型所对应的进程。
表5
S101a2.内存分配模块基于进程类型,确定目标内存类型。
示例性的,内存分配模块可以获取进程名称,并根据进程名称得到进程类型。或者,内存分配模块也可以根据,进程的编号得到进程类型。再或者,如果内存申请请求中携带了内存类型的相关字段;内存分配模块,也可以通过搜索预设的字段(如为,“process_type”)从内存申请请求中得到进程类型。
例如,内存分配模块在得到了进程名称为“AAmusic_playback”之后,就可以根据该进程的名称“AAmusic_playback”得到该进程的进程类型为前台应用进程。又例如,内存分配模块还可以在接收到的内存申请请求中搜索“process_type”字段,得到该进程的进程类型为前台应用进程。
在一些实施例中,内存分配模块,也可以通过内存申请请求获取到该进程的进程识别号(process identification,PID),之后根据进程的PID得到进程类型。
在一些实施例中,内存分配模块,可以从记录手机上历史的内存分配过程,并得到进程类型的历史分配内存类型。这样,在内存分配模块获取到进程类型之后,内存分配模块就可以得到该进程类型的历史分配内存类型,并基于历史分配内存类型确定目标内存类型。
示例性的,内存分配模块可以通过进程类型,得到该进程类型的历史分配内存类型。之后,内存分配模块将历史分配内存类型中次数最多的确定为目标内存类型。
例如,内存分配模块获取到进程类型为,前台应用进程。之后,内存分配模块获取到前台应用进程被分配了200次mem free,前台应用进程被分配了30次的file cache,以及前台应用进程被分配了5次的 anon memory。内存分配模块就可以将历史分配内存类型中次数最多的mem free确定为目标内存类型。
在一些实施例中,内存分配模块,可以记录手机上历史的内存分配过程,并得到进程类型历史分配的内存申请时延。这样,在内存分配模块获取到进程类型之后,内存分配模块就可以得到该进程类型历史分配的内存申请时延,并根据该进程类型历史分配的内存申请时延确定目标内存类型。
示例性的,内存分配模块可以通过进程类型,得到该进程类型历史分配的内存申请时延。之后,内存分配模块根据该进程类型历史分配的内存申请时延中出现频率最多的内存申请时延,确定目标内存类型。
例如,内存分配模块获取到进程类型为,用户可见后台应用进程。之后,内存分配模块获取到,用户可见后台应用进程,被分配了50次申请时延为16μs/4kB的进程,被分配了156次申请时延为19μs/4kB的进程。再之后,内存分配模块就可以根据出现频率最多的19μs/4kB的申请时延确定目标内存类型。如,通过上述表1或表2或表3,确定目标内存类型;具体的实现过程可参见上述实施例的描述,在此不再赘述。
在一些实施例中,内存分配模块中可以预设有进程类型和内存类型的对应关系,在内存分配模块获取到进程类型之后,内存分配模块就可以根据该对应关系确定目标内存类型。
在一些实施例中,进程类型和内存类型的对应关系也可以是与手机建立了通信连接的服务器发送给手机的。
示例性的,进程类型和内存类型的对应关系可以如下述表6所示。
表6
例如,内存分配模块获取到某进程的进程类型为,系统服务进程。之后,内存分配模块就可以根据表6示出的进程类型和内存类型的对应关系,得到系统服务进程对应的内存类型为pcp free。这样内存分配模块就可以确定目标内存类型为pcp free。并在后续基于pcp free 为该进程分配内存。
又例如,内存分配模块获取到某进程的进程类型为,后台备份任务进程。之后,内存分配模块就可以根据表6示出的进程类型和内存类型的对应关系,得到后台备份任务进程对应的内存类型为file cache。这样内存分配模块就可以确定目标内存类型为filecache。并在后续基于file cache为该进程分配内存。
在一些实施例中,内存分配模块中可以预设有进程类型和申请时延的对应关系。这样,内存分配模块在获取到了进程类型之后,就可以得到该进程类型对应的申请时延。之后,内存分配模块,就可以基于申请时延确定目标内存类型。
在一些实施例中,内存分配模块可以记录手机上历史的内存分配过程,并得到内存类型对应的申请时延,并根据记录得到的内存类型对应的申请时延,周期性(每5秒、每5分钟等等)地或实时地调整进程类型和内存类型的对应关系。示例性的,调整后的对应关系可以如下述表7所示。
表7
例如,内存分配模块获取到某进程的进程类型为,后台备份任务进程。之后,内存分配模块就可以根据表7示出的进程类型和内存类型的对应关系,得到后台备份任务进程对应的内存类型为slab reclaim。这样内存分配模块就可以确定目标内存类型为slabreclaim。并在后续基于slab reclaim为该进程分配内存。
在一些实施例中,内存分配模块可以基于接收到的内存申请请求,得到进程的优先程度。之后,内存分配模块可以基于进程的优先程度,确定目标内存类型。
在一些实施例中,文件页释放内存包括:EROFS文件页释放内存、f2fs文件页释放内存、ext4文件页释放内存和exfat文件页释放内存。在进程类型和内存类型的对应关系中,EROFS文件页释放内存可以对应后台备份任务进程。f2fs文件页释放内存、ext4文件页释放内存和exfat文件页释放内存均对应不具恢复能力的后台进程。
在一些实施例中,匿名页压缩释放内存包括:高活跃度匿名页压缩释放内存和低活跃度匿名页压缩释放内存。在进程类型和内存类型的对应关系中,低活跃度匿名页压缩释放内存可以对应常用服务进程;高活跃度匿名页压缩释放内存可以对应桌面进程。
参见图7,上述步骤S101还可以包括:步骤S101b1-S101b2。
S101b1.内存分配模块基于接收到的内存申请请求,得到进程的优先程度。
其中,进程的优先程度可以用来表征进程与用户交互的相关性,和/或,用来表征进程对于手机运行的重要程度。进程对电子设备的重要程度和进程的优先级正相关;和/或,进程与用户交互的相关性和进程的优先级正相关。也就是说,如果进程与用户交互的相关性越强,则该进程的优先程度就会越高;如果进程对于操作系统越重要,则进程的优先程度就会越高。示例性的,进程的优先程度可以通过优先指数(例如,进程调整(adjustment,adj)等级)来表征。在一些实施例中,进程优先程度也可以通过,一些自定义的指数来进行表征。本申请实施例对此不做任何限制。
在一些实施例中,优先程度也可以被称为,优先级,优先级程度等等。
其中,对于一些进程,如蓝牙传输进程、相机拍摄进程、移动通信进程、桌面显示进程、系统服务进程、传感器的驱动进程等等;这些进程的adj等级可以是操作系统预先配置好且会固定不变的。对于一些进程,比如“AA”音乐播放应用的音乐播放进程,该进程的adj等级是可以随着用户对“AA”音乐播放应用的使用(如前台使用、后台使用等等)而变化的。如,“AA”音乐播放应用的音乐播放进程在执行前台播放时的adj等级,“AA”音乐播放应用的音乐播放进程在执行后台播放时的adj等级,“AA”音乐播放应用的音乐播放进程在执行后台缓存时的adj等级均可以不同。
在一些实施例中,进程在向内存分配模块发送内存申请请求的时,会在内存申请请求中,通过预设的字段向内存分配模块发送该进程的优先程度。内存分配模块可以在内存申请请求中搜索预设的(如,“adj=”字段),这样就可以从内存申请请求中得到发送该内存申请请求的进程的优先程度。例如,“AA”音乐播放应用的开发者,如果觉得“AA”音乐播放进程比较重要,需要使用内存时延比较低的内存,则该开发者可以给“AA”音乐播放进程设置一个数值比较低的adj等级(例如,通过“adj=-700”字段,给“AA”音乐播放进程设置一个比较高的优先程度)。这样,内存分配模块在给“AA”音乐播放进程分配内存时就可以给“AA”音乐播放进程分配时延比较低的内存。可以减少用户在使用“AA”音乐播放进程时,出现“AA”音乐播放应用卡顿、响应延迟等现象,可以提升用户对“AA”音乐播放应用的使用体验。
在一些实施例中,内存分配模块也可以通过调用函数库来获取到,进程的优先程度。示例性的,内存分配模块可以从内存申请请求中获取到发起该内存申请请求的进程标识。之后向current函数库发送该进程标识。之后current库就可以返回该进程标识对应的adj等级。
在一些实施例中,内存分配模块也可以在接收到内存申请请求后,通过发送内存申请请求的进程的名称,获取到发送该内存申请请求的进程类型。之后,内存分配模块可以通过预先配置好的优先程度(如,adj等级)与进程类型的对应关系,通过匹配上述进程类型得到进程的优先程度,例如,adj等级。其中,进程对应adj等级可以用来表征进程与用户交互的相关性,和/或,用来表征进程对于手机运行的重要程度。其中,进程类型与用户交互的相关性和进程类型的adj等级的数值负相关,和/或,进程类型对电子设备运行的重要程度和进程类型的adj等级的数值负相关。也就是说,该进程类型与用户交互的相关性越强,该进程类型的adj等级的数值越小;该进程类型对电子设备运行的重要程度越重要,该进程类型的adj等级的数值越小。
在一些实施例中,adj等级与进程类型的对应关系也可以是与手机建立了通信连接的服务器发送给手机的。
示例性的,进程类型与adj等级的对应关系如下述表8所示。
表8
其中,一个进程的adj等级的数值越小,表明该进程的优先程度越高;一个进程的adj等级的数值越大,表明该进程的优先程度越低。
可以理解的,当某个进程属于多个进程类型时,该进程的adj等级可以是进程属于的多个进程类型中adj等级最小的。也就是说,当某个进程属于多个进程类型时,该进程的优先程度可以是该进程属于的多个进程类型中优先程度最高的(例如,adj等级的数值最小的)。
例如,“AA”音乐播放应用的后台音乐播放进程,可以因为其在后台也能够被用户感知到,属于用户可感知后台应用进程;以及,因为用户对“AA”音乐播放应用使用得比较频繁,“AA”音乐播放应用的后台音乐播放进程,又可以属于常用服务进程。同时,由于用户可感知后台应用进程的adj等级为200,小于常用服务进程的adj等级500。因此,“AA”音乐播放应用的后台音乐播放进程的adj等级可以为200。
在一些实施例中,内存分配模块可以在接收内存申请请求后,从内存申请请求中得到该进程所申请的内存大小,也就是内存请求大小。该内存请求大小可以是,该进程所申请的物理内存空间的大小,也可以是该进程所申请的虚拟内存空间的大小,本申请实施例对此不做限制。例如,内存分配模块可以在内存申请请求中搜索与内存大小相关的字段(如,“memory=”字段,“physics_memory=”字段等等)从而得到该进程所申请的内存大小。
在一些实施例中,参见图8,上述步骤S101b1可以包括:
S101b11.内存分配模块从内存申请请求中获取内存请求大小。
示例性的,内存分配模块可以通过预设的字段例如,上述“memory=”字段、“physics_memory=”等等,从内存请求中获取进程请求的内存大小。
S101b12.若内存申请请求中包括adj等级,则内存分配模块从内存申请请求中获取adj等级。
S101b13.若内存申请请求中不包括adj等级,则内存分配模模块通过操作系统的函数库获取该进程的adj等级。
可以理解的,内存分配模块也可以先获取内存请求大小,再获取adj等级;也可以先获取adj等级再获取内存请求大小;也可以同时获取内存请求大小和adj等级。本申请实施例对此不做任何限制。
举例来说,内存分配模块接收到了“CC”进程的内存申请请求,并从该内存申请请求携带的字段中,获取到该进程请求的内存大小为64kB;以及,内存分配模块从操作系统的函数库中,获取到该进程的adj等级为950。
之后,内存分配模块接收到了“DD”进程的内存申请请求,并从该内存申请请求携带的字段中,获取到该进程请求的内存大小为4kB,以及该进程的adj等级为800。
再之后,内存分配模块接收到了“BB”视频播放应用后台进程的内存申请请求,并从该内存申请请求携带的字段中,获取到该进程请求的内存大小为16kB;以及,内存分配模块通过“BB”视频播放应用后台进程的名称,得到该进程的类型是前一个使用的应用程序进程;内存分配模块预设的进程类型与adj等级的对应关系,得到该进程的adj等级为700。
然后,内存分配模块接收到了“EE”进程的内存申请请求,并从该内存申请请求携带的字段中,获取到该进程请求的内存大小为12kB和该进程的adj等级为500。
之后,内存分配模块接收到了“AA”音乐播放应用的数据备份进程的内存申请请求,并从该内存申请请求携带的字段中,获取到该进程请求的内存大小为128kB;以及内存分配模块通过调用current函数,得到该进程的adj等级为300。
而后,内存分配模块接收到了“AA”音乐播放应用的后台音乐播放进程的内存申请请求,并从该内存申请请求携带的字段中,获取到该进程请求的内存大小为512kB以及该进程的adj等级为200。
再之后,内存分配模块接收到了cameraserver进程的内存申请请求,并从该内存申请请求携带的字段中,获取到该进程请求的内存大小为16kB以及该进程的adj等级为-1000。
S101b2.内存分配模块基于进程的优先程度,确定目标内存类型。
在一些实施例中,内存分配模块,可以从记录手机上历史的内存分配过程,并得到该优先程度对应的历史分配内存类型。这样,在内存分配模块获取到进程的优先程度之后,内存分配模块就可以得到该优先程度对应的历史分配内存类型,并基于历史分配内存类型确定目标内存类型。
示例性的,内存分配模块可以通过进程的优先程度,得到该优先程度的进程的历史分配内存类型。之后,内存分配模块将历史分配内存类型中次数最多的确定为目标内存类型。
例如,内存分配模块获取到进程的优先程度(如,adj等级)为:300。之后,内存分配模块获取到adj等级为300的进程被分配了195次mem free,adj等级为300的进程被分配了27次的file cache,以及adj等级为300的进程被分配了18次的 anon memory。内存分配模块就可以将历史分配内存类型中次数最多的mem free确定为目标内存类型。
在一些实施例中,内存分配模块中可以与预设有进程的优先程度(如,adj等级)和内存类型的对应关系。内存分配模块得到了进程的优先程度之后,就可以根据进程的优先程度和内存类型的对应关系,确定目标内存类型。其中,进程的优先程度和内存类型的对应关系,用于表征,内存类型对应的内存申请时延与进程的优先程度的对应关系。低内存申请时延的内存类型对应高优先程度的进程,也就是说,低内存申请时延的内存类型对应adj等级数值小的进程。高内存申请时延的内存类型对应低优先程度的进程,也就是说,高内存申请时延的内存类型对应adj等级数值高的进程。可见,内存类型对应的优先程度与内存类型对应的申请时延负相关,内存类型对应的adj等级与内存类型对应的申请时延正相关。
在一些实施例中,上述adj等级与内存类型的对应关系也可以是与手机建立了通信连接的服务器发送给手机的。
可见,在本申请实施例中,通过对进程的重要程度进行分析,得到进程匹配的内存类型,可以使得与用户交互相关程度比较高或与手机运行重要程度比较高的,这些高优先程度的进程;获取到与其优先程度匹配的申请时延低的这种类型的内存。这样,就可以减少将申请时延比较低的内存分配给与用户交互不相关、对手机运行不重要的进程这种情况。可以减少电子设备上,出现应用响应延迟、应用卡顿的现象,可以提升用户的使用体验。
示例性的,进程的优先程度和内存类型的对应关系可以如下述表9所示。
表9
示例性的,假设某进程的adj等级为300,是某应用程序的后台备份任务进程;则内存分配模块接收到该进程的adj等级之后,可以根据表9示出的adj等级与内存类型的对应关系,得到该进程匹配内存类型是file cache,也就是文件页释放内存。这样,在后续内存分配模块就可以基于file cache类型的内存为该进程分配内存。
在一些实施例中,如果内存分配模块没有获取到进程的优先程度,内存分配模块可以给该进程指定一个进程优先程度,例如,指定adj等级为950。这样,即使是一些原因导致内存分配模块获取不到进程的adj等级,内存分配模块也可以给该进程分配内存,可以防止进程因为得不到内存而无法工作。
在一些实施例中,如果内存分配模块没有获取到进程的优先程度(如,adj等级),内存分配模块可以将该进程统一分配swap memory类型的内存。这样,即使是一些原因导致内存分配模块获取不到进程的adj等级,内存分配模块也可以给该进程分配内存,可以防止进程因为得不到内存而导致无法工作。
举例来说,内存分配模块接收到了“CC”进程的内存申请请求,内存分配模块获取到“CC”进程的内存申请请求的adj等级为950。内存分配模块根据adj等级与内存类型之间的对应关系得到“CC”进程匹配的内存类型为kill memory。之后,内存分配模块接收到了“DD”进程的内存申请请求,并获取到“DD”进程的内存申请请求的adj等级为800。内存分配模块根据adj等级与内存类型之间的对应关系得到“DD”进程匹配的内存类型为swapmemory。再之后,内存分配模块接收到了“BB”视频播放应用后台进程的内存申请请求,并获取到该进程的adj等级为700。内存分配模块根据adj等级与内存类型之间的对应关系得到“BB”视频播放应用后台进程匹配的内存类型为slab reclaim。然后,内存分配模块接收到了“EE”进程的内存申请请求,并获取到该进程的adj等级为500。内存分配模块根据adj等级与内存类型之间的对应关系得到“EE”进程匹配的内存类型为anon memory。再之后,内存分配模块接收到了“AA”音乐播放应用的数据备份进程的内存申请请求,并获取到该进程的adj等级为300。内存分配模块根据adj等级与内存类型之间的对应关系得到“AA”音乐播放应用的数据备份进程匹配的内存类型为file cache。而后,内存分配模块接收到了“AA”音乐播放应用的后台音乐播放进程的内存申请请求,并获取到该进程的adj等级为200。内存分配模块根据adj等级与内存类型之间的对应关系得到“AA”音乐播放应用的后台音乐播放进程匹配的内存类型的mem free。再之后,内存分配模块接收到了cameraserver进程的内存申请请求,并获取到该进程的adj等级为-1000。内存分配模块根据adj等级与内存类型之间的对应关系得到cameraserver进程匹配的内存类型为第一等级的pcp freee。而后,内存分配模块接收到了“ZZ”及时通讯进程的内存申请请求,没有获取到该进程的adj等级。内存分配模块,根据预设确定“ZZ”及时通讯进程的目标内存类型是swap memory。
在一些实施例中,内存分配模块可以记录手机上历史的内存分配过程,并得到内存类型对应的申请时延,并根据记录得到的内存类型对应的申请时延周期性或实时地调整优先程度和内存类型的对应关系。示例性的,调整后的对应关系可以如下述表10所示。
表10
示例性的,假设某进程的adj等级为300,是某应用程序的后台备份任务进程;则内存分配模块接收到该进程的adj等级之后,可以根据表10示出的adj等级与内存类型的对应关系,得到该进程匹配内存类型是slab reclaim。这样,在后续内存分配模块就可以基于slab reclaim为该进程分配内存。
在一些实施例中,在内存分配模块得到了每个内存类型的申请时延之后,内存分配模块就可以按照申请时延从低到高的顺序,对内存类型进行分级,得到内存类型的等级。内存类型的等级可以表征该内存类型的申请时延的高低。第一等级高于第二等级,第二等级高于第四等级。其中内存类型的等级越高,可以表征该内存类型的申请时延越低。
在一些实施例中,内存分配模块可以将按照上述表1示出的申请时延从低到高的顺序将内存类型分为7个等级。例如,第一等级为:处理器核空闲内存、第二等级为:全局空闲内存、第三等级为:文件页释放内存、第四等级为:匿名页压缩释放内存、第五等级为:分配器释放内存、第六等级为:匿名页转移释放内存、以及第七等级为:进程销毁释放内存。
需要指出的是,在实际使用中,也可以对内存类型进行不同的分级,例如,第一等级为:处理器核空闲内存和全局空闲内存;第二等级为:文件页释放内存;第三等级为:匿名页压缩释放内存;第四等级为:分配器释放内存。第五等级为:匿名页转移释放内存和进程销毁释放内存等等。相关技术人员可以根据实际的使用需要对,内存类型的分级方式进行设计,本申请实施例对内存类型的分级方式不做任何限制。
在一些实施例中,内存分配模块中可以预设有内存类型的等级与adj等级的对应关系。这样,内存分配模块在获取到adj等级之后,就可以通过内存类型的等级与adj等级的对应关系,确定目标内存类型。
示例性的,内存类型的等级与adj等级的对应关系可以如下述表11所示。
表11
示例性的,假设某进程的adj等级为300,是某应用程序的后台备份任务进程;则内存分配模块接收到该进程的adj等级之后,可以根据表11示出的adj等级与内存类型的等级的对应关系,得到该进程对应的内存类型的等级是第三等级,也就是文件页释放内存。这样,在后续内存分配模块就可以基于文件页释放内存为该进程分配内存。
在一些实施例中,内存分配模块也可以按照上述表2示出的申请时延,对内存类型的等级周期性或实时地进行调整。例如,调整后的第一等级到第七等级可以如下:
第一等级为:处理器核空闲内存、第二等级为:全局空闲内存、第三等级为:分配器释放内存、第四等级为:匿名页压缩释放内存、第五等级为:文件页释放内存、第六等级为:匿名页转移释放内存、以及第七等级为:进程销毁释放内存。
S102.内存分配模块基于目标内存类型为该进程分配内存。
在一些实施例中,内存分配模块可以为进程分配目标内存类型的内存。
可以理解的,进程申请内存是一个很频繁的过程。进程处于运行状态,进程会进行内存申请。例如,假设“ZZ”进程是后台数据下载进程,“ZZ”进程会在下载新的数据(例如,文件数据、音乐数据等等时)进行内存申请。surfaceflinger进程会在手机通知栏展示一些元素(例如,展示图标、展示图案、展示消息)时进行内存申请。
示例性的,参见图9,假设手机上,pcp free类型的空闲内存为16kB。“ZZ”进程向内存分配模块发送了内存申请请求,请求了12kB的内存空间。其中,“ZZ”进程是应用程序的后台进程。内存分配模块接收“ZZ”进程的内存申请请求,并得到目标内存类型为,slabreclaim;之后,内存分配模块可以通过shrinker机制释放内存,如释放得到20kB内存空间。并将释放得到的20kB内存空间中的12kB分配给该进程。然后,surfaceflinger进程(通知栏显示进程)向内存分配模块发送了内存申请请求,请求了8kB的内存空间。内存分配模块接收surfaceflinger进程的内存申请请求,并得到该进程匹配的内存类型为pcp free;再之后,内存分配模块将pcp free类型的空闲内存16kB中的8kB分配给surfaceflinger进程。这样,surfaceflinger进程就可以使用申请时延比较低pcp free类型的内存,可以减少电子设备上,出现应用响应延迟、应用卡顿的现象,可以提升用户的使用体验。
可见,本申请实施例中,通过给进程分配申请时延匹配的内存,可以减少将申请时延比较高的内存分配给用户交互相关,对手机运行重要的进程的情况。可以减少电子设备上,出现应用响应延迟、应用卡顿的现象,可以提升用户的使用体验。
可以理解的,如果按照进程发起内存申请请求的时间先后顺序给进程分配内存,会导致内存分配模块将16kB的pcp free类型的空闲内存中的12kB分配给“ZZ”进程;之后,内存分配模块接收到surfaceflinger进程发送的内存申请请求时,由于pcp free类型的内存仅剩余8kB不能满足surfaceflinger进程的8kB内存申请请求。内存分配模块会通过内存释放的方式释放内存,之后再将释放得到的内存分配给surfaceflinger进程。由于,内存释放会需要一定时间,在内存释放的过程中,由于surfaceflinger进程获取不到内存,无法工作,就会造成显示屏上显示的界面元素卡顿;甚至会出现显示界面崩溃的现象。
然而,在本申请实施例中,内存分配模块在接收到“ZZ”进程的内存申请请求后,并不会直接地将pcp free类型的内存分配给“ZZ”进程。而是会为“ZZ”进程分配该进程匹配的内存类型的内存。这样,“ZZ”进程就不会占用申请时延比较短的pcp free类型的内存,而是使用slab reclaim类型的内存。从而并不会影响到后续surfaceflinger进程的内存申请请求,可以使得surfaceflinger进程可以申请到申请时延比较低的,pcp free类型的内存。同时由于“ZZ”进程的是应用程序的后台进程,与用户交互的相关性不大,且与操作系统运行的重要程度也不高,该进程允许使用高申请时延的内存。因此,即使“ZZ”进程,被分配了申请时延比较高的内存,也不会对手机的运行产生明显影响。甚至,不会被用户察觉。
可以理解的,对于“ZZ”进程来说,由于其是应用程序的后台进程,对内存申请时延的灵敏程度比较低,也就是说,即使“ZZ”进程分配到了内存申请时延比较高的内存,手机在运行时,只会出现不明显的应用卡顿、应用延迟、显示丢帧等现象。甚至用户都不会察觉到手机上发生了了应用卡顿、应用延迟、显示丢帧。然而,对于surfaceflinger进程,由于其是与手机显示屏显示的通知栏图标元素相关的进程,对内存申请时延的灵敏度比较高。也就是说,如果surfaceflinger进程分配到了申请时延比较高的内存,手机的通知栏上的图标显示就会出现图标显示丢帧、显示卡顿、显示延迟。用户会在手机上明显地观察到图标显示丢帧、显示卡顿、显示延迟的现象,会影响用户对手机的使用体验。甚至,如果surfaceflinger进程被分配的内存的申请时延过高,则会造成手机通知栏显示崩溃,甚至无法在通知栏上显示图标。
在一些实施例中,用户使用手机进行后台音乐播放,同时在使用手机进行前台聊天。手机后台音乐播放进程会进行内存申请,以及手机在前台聊天时使用的输入法输入进程也会进行内存申请。在这种场景下,上述后台音乐播放先进行内存申请,输入法的输入进程后进行内存申请。后台音乐播放进程向内存分配模块发送内存申请请求,内存分配模块为该后台音乐播放进程分配与该进程的申请时延需求匹配的内存(如为,分配器释放内存),内存分配模块不会为该后台音乐播放进行分配与该进程的申请时延需求不匹配的内存(如为,全局空闲内存)。这样,可以减少将申请时延比较低的内存分配给允许使用高时延的进程的情况。接下来,输入法的输入进程向内存分配模块发送内存申请请求,内存分配模块为该输入进程分配与该进程申请时延需求匹配的内存(如为,全局空闲内存)。这样,可以减少将申请时延比较高的内存分配给用户交互相关,对手机运行重要的进程的情况。可以减少电子设备上,出现应用响应延迟、应用卡顿的现象,可以提升用户的使用体验。
举例来说,内存分配模块接收到了“CC”进程的内存申请请求,内存分配模块得到该进程请的内存大小为64kB,该进程匹配的内存类型为kill memory。之后,内存分配模块就可以通过销毁进程的方式释放内存,并在释放内存的内存大小大于等于64kB时,给“CC”进程分配64kB的通过销毁进程方式释放得到的内存。
这样,就可以避免“CC”进程占用手机上申请时延比较短的内存;以及,可以避免因为“CC”进程占用手机上申请时延比较短的内存,从而导致后续一些与用户体验相关程度高、对系统运行重要程度比较高的进程(如,cameraserver进程、“AA”音乐播放应用的后台音乐播放进程)因为获取到了申请时延比较高的进程。从而造成,应用响应延迟、应用卡顿(如,相机拍摄延迟,音乐播放卡顿)等现象。
再之后,内存分配模块接收到了“DD”进程的内存申请请求,内存分配模块得到该进程请的内存大小为4kB,该进程匹配的内存类型为swap memory。之后,内存分配模块就可以通过将压缩后的匿名页从手机的内部存储器转移到手机的外部存储器的方式释放内存,并在释放内存的内存大小大于等于4kB时,给“DD”进程分配4kB的通过将压缩后的匿名页从手机的内部存储器转移到手机的外部存储器的方式释放得到的内存。
这样,就可以避免“DD”进程占用手机上申请时延比较短的内存;以及,可以避免因为“DD”进程占用手机上申请时延比较短的内存,从而导致后续一些与用户体验相关程度高、对系统运行重要程度比较高的进程(如,cameraserver进程、“AA”音乐播放应用的后台音乐播放进程)因为获取到了申请时延比较高的进程。从而造成,应用响应延迟、应用卡顿(如,相机拍摄延迟,音乐播放卡顿)等现象。
而后,内存分配模块接收到了“BB”视频播放应用后台进程的内存申请请求,内存分配模块得到该进程请的内存大小为16kB,该进程匹配的内存类型为slab reclaim。之后,内存分配模块就可以使用slab分配器通过收缩机机制从内存池中释放得到内存,并在释放内存的内存大小大于等于16kB时,给“BB”视频播放应用后台进程分配16kB的使用slab分配器通过收缩机机制从内存池中释放得到的内存。
再之后,内存分配模块接收到了“EE”进程的内存申请请求,内存分配模块得到该进程请的内存大小为12kB,该进程匹配的内存类型为anon memory。之后,内存分配模块就可以通过将内部存储器中的匿名页压缩的方式释放得到内存,并在释放内存的内存大小大于等于12kB时,给“EE”进程分配12kB的通过将内部存储器中的匿名页压缩的方式释放得到的内存。
然后,内存分配模块接收到了“AA”音乐播放应用的数据备份进程的内存申请请求,内存分配模块得到该进程请的内存大小为128kB,该进程匹配的内存类型为filecache。之后,内存分配模块就可以通过文件页丢弃的方式释放得到内存,并在释放内存的内存大小大于等于128kB时,给“AA”音乐播放应用的数据备份进程分配128kB的通过文件页丢弃的方式释放得到的内存。
再之后,内存分配模块接收到了“AA”音乐播放应用的后台音乐播放进程的内存申请请求,内存分配模块得到该进程请的内存大小为512kB,该进程匹配的内存类型为memfree。之后,内存分配模块就可以查询手机的内部存储器中空闲内存的大小;并在内部存储器中空闲内存大于等于512kB时,给“AA”音乐播放应用的后台音乐播放进程分配512kB的内部存储器中的空闲内存。
这样,就可以给“AA”音乐播放应用的后台音乐播放进程分配申请时延比较短的内存。从而可以,避免手机上出现,音乐播放卡顿,不流畅等现象,可以提升用户在手机上使用“AA”音乐播放应用的使用体验。
再之后,内存分配模块接收到了cameraserver进程的内存申请请求,内存分配模块得到该进程请的内存大小为16kB,该进程匹配的内存类型为pcp cache。之后,内存分配模块就可以查询手机的处理器核的内存页中的空闲内存,并在空闲内存的内存大小大于等于16kB时,给“AA”音乐播放应用的数据备份进程分配16kB的处理器核的内存页中的空闲内存。
这样,就可以给cameraserver进程分配申请时延比较短的内存。从而可以避免手机上出现,摄像头拍照卡顿,摄像头使用异常等现象,可以提升用户在使用手机摄像头时的使用体验。
在一些实施例中,内存分配模块可以从目标类型的内存和申请时延比目标内存类型高(也就是,等级比目标内存类型等级低)的内存中为该进程分配内存。这样,即使目标内存类型的内存的可分配内存量不能满足进程请求的内存大小,进程也可以被分配到内存,可以避免进程获取不到内存,导致进程饥饿的现象发生。同时,为该进程分配的内存也不会影响到对电子设备上其他进程的内存分配。
示例性的,参见图10内存分配模块接收到了“YY”进程的内存申请请求,并得到该进程请求的内存大小为“yy”kB以及该进程匹配的内存类型为pcp free,也就是目标内存类型为处理器核空闲内存。之后,内存分配模块会获取处理器核空闲内存的内存大小;若处理器核空闲内存的内存大小大于等于“yy”kB(满足分配条件),则内存分配模块会为“YY”进程分配处理器核空闲内存。若处理器核空闲内存的内存大小小于“yy”kB(不满足分配条件),则内存分配模块会获取等级比pcp free低的内存类型的内存大小。若等级比pcp free类型低的内存类型的内存大小,大于等于“yy”kB则为“YY”进程分配该类型的内存。
例如,在处理器核空闲内存的内存大小小于“yy”kB的情况下,内存分配模块会获取全局空闲内存的内存大小,若全局空闲内存的内存大小大于等于“yy”kB(满足分配条件),则内存分配模块会为“YY”进程分配全局空闲内存。若全局空闲内存的内存大小小于“yy”kB(不满足分配条件),则内存分配模块会获取等级比全局空闲内存类型低的类型的内存大小。
例如,在全局空闲内存的内存大小小于“yy”kB的情况下,内存分配模块会获取文件页释放内存的内存大小,若文件页释放内存的内存大小大于等于“yy”kB(满足分配条件),则内存分配模块会为“YY”进程分配文件页释放内存。若文件页释放内存的内存大小小于“yy”kB(不满足分配条件),则内存分配模块会获取等级比文件页释放内存类型低的类型的内存大小。
例如,在文件页释放内存的内存大小小于“yy”kB的情况下,内存分配模块会获取匿名页压缩释放内存的内存大小;若匿名页压缩释放内存的内存大小大于等于“yy”kB(满足分配条件),则内存分配模块会为“YY”进程分配全匿名页压缩释放内存。若匿名页压缩释放内存的内存大小小于“yy”kB(不满足分配条件),则内存分配模块会获取等级比匿名页压缩释放内存类型低的类型的内存大小。
例如,在匿名页压缩释放内存的内存大小小于“yy”kB的情况下,内存分配模块会获取分配器释放内存的内存大小,若分配器释放内存的内存大小大于等于“yy”kB(满足分配条件),则内存分配模块会把分配器释放内存分配给“YY”进程。若分配器释放内存的内存大小小于“yy”kB(不满足分配条件),则内存分配模块会获取等级比分配器释放内存类型低的类型的内存大小。
例如,在分配器释放内存的大小小于“yy”kB的情况下,内存分配模块会获取匿名页转移释放内存的内存大小,若匿名页转移释放内存的内存大小大于等于“yy”kB(满足分配条件),则为“YY”进程分配匿名页转移释放内存。若匿名页转移释放内存的内存大小小于“yy”kB(不满足分配条件),则内存分配模块会获取等级比匿名页转移释放内存类型低的类型的内存大小。
例如,在匿名页转移释放内存的内存大小小于“yy”kB的情况下,内存分配模块会获取进程销毁释放内存的内存大小,若进程销毁释放内存的内存大小大于等于“yy”kB(满足分配条件),则为“YY”进程分配进程销毁释放内存。若进程销毁释放内存的内存大小小于“yy”kB(不满足分配条件),则内存分配模块再次获取目标内存类型的内存大小。这样,内存分配模块就可以减少“YY”进程获取不到内存,导致进程饥饿的现象发生的情况。同时,还可以减少“YY”进程占用延时比较高的内存,而导致手机出现应用卡顿的情况。
在一些实施例中,在进程销毁释放内存的内存大小小于“yy”kB的情况下,内存分配模块会再次获取目标内存类型的内存大小,循环地从目标内存类型以及等级比目标内存类型低的内存中为“YY”进程分配内存。这样,可以进一步地避免“YY”进程获取不到内存,导致进程饥饿的现象发生。
在一些实施例中,内存分配模块可以通过操作系统中的内存查询工具(例如,global_node_page_state_pages函数),来获取手机上每个类型的可分配内存大小(可分配内存量)。可以理解的,内存查询工具可以用于记录手机上内部存储器的使用情况;例如,内存查询工具会记录,内部存储器中具有aa大小的文件页,其中bb大小的文件页,正在被使用,cc大小的文件页长时间没有被使用;以及,内部存储器中具有dd大小的匿名页,其中,ee大小的匿名页正在被使用,ff大小的匿名页长时间没有被使用等等。这样,内存分配模块就可以使用内存查询工具获取到手机上每个类型的可分配内存大小。
内存分配模块也可以通过执行内存释放的步骤,来获取手机上释放内存的内存大小(可分配内存量)。如,内存分配模块可以通过将内存中的匿名页压缩的方式释放得到匿名页压缩释放内存,之后计算释放得到的匿名页压缩释放内存的内存大小。又如,内存分配模块可以通过内存查询工具去查询得到匿名页压缩释放内存的大小。又如,内存分配模块可以通过将内部存储器中文件页丢弃的方式释放得到文件页释放内存,并计算释放得到的文件页释放内存的内存大小;又如,内存分配模块可以通过内存查询工具去查询得到文件页释放内存的内存大小。可以理解的,对于释放内存来讲,释放内存需要经过内存释放的步骤才能被进程所使用;同时,在内存释放的过程中,会受到手机上其他进程的影响导致释放得到的内存大小不固定。例如,进程使用文件页,进程对文件页的读、写操作得到均会导致一部分文件页无法被释放,会导致手机上文件页释放内存的内存大小变小。
在一些实施例中,内存分配模块可以先通过内存查询工具去查询内存是否可以满足进程请求的内存大小,如果可以满足进程请求的内存大小,则进行内存释放,之后再将释放得到的内存分配给进程。这样,可以避免进行内存释放后,得到的内存不能满足进程请求的内存大小,从而会导致增加进程的内存申请时延。示例性的,进程请求的内存大小(进程的内存申请量)可以记为x,内存分配模块查询得到的内存大小(查询得到的可用内存量)记为y。如果y≥1.2x,则可以认为该内存可以满足进程请求的内存大小。或者,如果y≥1.05x,则可以认为该内存可以满足进程请求的内存大小。之后,内存分配模块再执行内存释放的步骤来得到内存。
在一些实施例中,内存分配模块可以从目标内存类型,以及等级比目标内存类型高的内存类型(也就是,申请时延比目标内存类型高的内存类型)中循环搜索满足分配条件的内存类型。并为该进程分配满足条件的内存类型。
其中,分配条件可以是,内存分配模块通过内存查询工具查询得到的可用内存量大于等于进程的内存申请量。例如,y≥1.05x,y≥1.2x,y≥x。可以理解的,内存分配模块查询得到的可用内存量,是一个预测的,可以被释放后再被分配的内存量;会被手机上进程对内存的使用所影响。因此可以给可用内存量设置一些余量。这样,就可以缓解在给进程分配释放内存时,由于手机上进程对内存的使用导致实际释放得到的内存小于内存申请量,而导致该进程的内存分配的时间过长的情况。分配条件还可以是,内存分配模块通过内存回收得到的内存量(下文可记为z),可以满足进程请求的内存大小。例如,z≥x,z≥1.05x等等。
举例来说,参见图11内存分配模块接收到了cameraserver进程(摄像头业务进程)的内存申请请求,并得到该进程请求的内存大小为16kB,以及该进程匹配的内存类型为pcpfree,也就是目标内存类型是pcp free。之后内存分配模块会获取手机上类型为pcp free的内存大小,为0kB,不能满足cameraserver进程的内存申请请求。之后,内存分配模块会获取手机上类型为mem free的内存大小,为4kB,不能满足cameraserver进程的内存申请请求。再之后,内存分配模块会获取手机上类型为file cache的内存大小,为0kB,不能满足cameraserver进程的内存申请请求。再之后,内存分配模块会获取手机上类型为anonmemory的内存大小,为0kB,不能满足cameraserver进程的内存申请请求。再之后,内存分配模块会获取手机上类型为slab reclaim的内存大小,为0kB,不能满足cameraserver进程的内存申请请求。再之后,内存分配模块会获取手机上类型为swap memory的内存大小,为0kB,不能满足cameraserver进程的内存申请请求。再之后,内存分配模块会获取手机上类型为kill memory的内存大小,为24kB,可以满足cameraserver进程的内存申请请求。再之后,内存分配模块会通过销毁进程的方式释放内存,并将释放得到的内存分配给cameraserver。其中,内存分配模块可以通过内存查询工具获取到,pcp free、mem free、file cache、anon memory、slab reclaim、swap memory和kill memory的内存大小。
举例来说,参见图12,内存分配模块接收到了“AA”音乐播放应用的数据备份进程的内存申请请求,并得到该进程请求的内存大小为128kB,以及该进程匹配的内存类型为第三等级的file cache。之后,内存分配模块可以为“AA”音乐播放应用的数据备份进程分配目标内存类型的内存。也就是,内存分配模块可以通过将文件页丢弃的方式来进行内存释放;内存分配模块释放得到的内存大小为64kB,小于128kB,不能满足“AA”音乐播放应用的数据备份进程的内存需要。之后,内存分配模块可以从内存查询工具处获取手机上anonmemory类型的内存大小;内存分配模块获取到手机上anon memory类型的内存大小为0kB,小于128kB,不能满足“AA”音乐播放应用的数据备份进程的内存需要。再之后,内存分配模块可以从内存查询工具处获取手机上slab reclaim类型的内存大小;内存分配模块获取到手机上slab reclaim类型的内存大小为0kB,小于128kB,不能满足“AA”音乐播放应用的数据备份进程的内存需要。再之后,内存分配模块可以从内存查询工具出获取手机上swapmemory类型的内存大小;内存分配模块获取到手机上swap memory类型的内存大小为132kB,大于128kB,可以满足“AA”音乐播放应用的数据备份进程的内存需要。则内存分配模块可以通过将压缩后的匿名页转移的方式释放得到内存,如得到了136kB大小的内存。之后,内存分配模块就可以将上述136kB大小的内存中128kB大小的部分,分配给“AA”音乐播放应用的数据备份进程。
在一些实施例中,内存分配模块可以先从目标内存类型的内存中为该进程分配内存。若目标内存类型的内存不能满足该进程的内存需要,则内存分配模块可以从申请时延比目标内存类型高(也就是,等级比目标内存类型等级低)的内存中为该进程分配内存。若申请时延比目标内存类型高(也就是,等级比目标内存类型等级低)的内存仍然不能满足该进程的内存需要,则内存分配模块可以从申请时延比目标内存类型低(也就是,等级比目标内存类型等级高)的内存中为该进程分配内存。这样,可以进一步地避免进程获取不到内存,导致进程饥饿的现象发生。
在一些实施例中,内存分配模块从目标内存类型以及申请时延比目标内存类型高的内存类型中循环搜索满足分配条件的内存类型的过程可以被称为第一循环搜索过程。
在一些实施例中,内存分配模块可以先执行第一循环搜索,如果执行第一循环搜索的过程满足循环切换条件则,执行第二循环搜索过程。其中,第二循环搜索过程包括:从内存申请时延最低的内存类型,向内存申请时延最高的内存类型循环搜索,直至搜索得到满足分配条件的内存类型。以及,循环切换条件可以是上述第一循环搜索过程超过预设时间(如,0.3秒,0.1秒),或者,上述第一循环搜索次数超过预设次数(如,5次,10次)。
这样,可以进一步地减少进程发生进程饥饿的情况,可以进一步地减少进程因为得不到内存而导致该进程无法运行的情况。
示例性的,参见图13内存分配模块接收到了“XX”进程的内存申请请求,并得到目标内存类型为匿名页压缩释放内存。内存分配模块可以基于匿名页压缩释放内存执行上述第一循环搜索过程;也就是,从匿名页压缩释放内存开始,向进程销毁释放内存,循环搜索满足分配条件的内存类型。如第一循环搜索的过程满足循环切换条件,则内存分配模块执行第二循环搜索过程。也就是,从处理器核空闲内存向进程销毁释放内存循环搜索,直至搜索得到满足分配条件的内存类型。
举例来说,内存分配模块接收到了“XX”进程的内存申请请求,并得到该进程请求的内存大小为“xx”kB以及目标内存类型为anon memory。之后,内存分配模块可以获取手机上匿名页压缩释放内存的内存大小。若匿名页压缩释放内存的内存大小大于等于“xx”kB(满足分配条件),则内存分配模块会为“XX”进程分配匿名页压缩释放内存。若匿名页压缩释放内存的内存大小小于“xx”kB(不满足分配条件),则内存分配模块会获取等级比匿名页压缩释放内存类型低的内存类型的内存大小。
例如,在匿名页压缩释放内存的内存大小小于“xx”kB的情况下,内存分配模块会获取分配器释放内存的内存大小,若分配器释放内存的内存大小大于等于“xx”kB(满足分配条件),则内存分配模块会将分配器释放内存分配给为“XX”进程。若分配器释放内存的内存大小小于“xx”kB(不满足分配条件),则内存分配模块会获取等级比分配器释放内存类型低的内存类型的内存大小。
例如,在分配器释放内存的大小小于“xx”kB的情况下,内存分配模块会获取匿名页转移释放内存的内存大小。若匿名页转移释放内存的内存大小大于等于“xx”kB(满足分配条件),则内存分配模块会为“XX”进程分配匿名页转移释放内存。若匿名页转移释放内存的内存大小小于“xx”kB(不满足分配条件),则内存分配模块会获取等级比匿名页转移释放内存类型低的内存类型的内存大小。
例如,在匿名页转移释放内存的内存大小小于“xx”kB的情况下,内存分配模块会获取进程销毁释放内存的内存大小。若进程销毁释放内存的内存大小大于等于“xx”kB(满足分配条件),则内存分配模块会为“XX”进程分配进程销毁释放内存。若进程销毁释放内存的内存大小小于“xx”kB(不满足分配条件),且第一循环过程达到循环切换条件。此时,内存分配模块会获取等级最高的内存类型的可用内存量。
例如,在进程销毁释放内存的内存大小小于“xx”kB的情况下,内存分配模块会获取处理器核空闲内存的内存大小;若处理器核空闲内存的内存大小大于等于“xx”kB(满足分配条件),则内存分配模块会为“XX”进程分配处理器核空闲内存。若处理器核空闲内存的内存大小小于“xx”kB(不满足分配条件),则内存分配模块会获取等级比处理器核空闲内存类型低的内存类型的内存大小。
例如,在处理器核空闲内存的内存大小小于“xx”kB的情况下,内存分配模块会获取全局空闲内存的内存大小。若全局空闲内存的内存大小大于等于“xx”kB(满足分配条件),则内存分配模块会为“XX”进程分配全局空闲内存。若全局空闲内存的内存大小小于“xx”kB(不满足分配条件),则内存分配模块会获取等级比全局空闲内存类型低的内存类型的内存大小。
例如,在全局空闲内存的内存大小小于“xx”kB的情况下,内存分配模块会获取文件页释放内存的内存大小;若文件页释放内存的内存大小大于等于“xx”kB(满足分配条件),则内存分配模块会为“XX”进程分配文件页释放内存。若文件页释放内存的内存大小小于“xx”kB(不满足分配条件),则内存分配模块会获取等级比文件页释放内存类型低的内存类型的内存大小。这样,内存分配模块就可以进一步地避免“XX”进程获取不到内存,导致进程饥饿的现象方式。
在一些实施例中,在文件页释放内存的内存大小小于“xx”kB的情况下,内存分配模块可以再次获取目标内存类型的内存大小,也就是匿名页压缩释放内存的内存大小,循环地按照目标内存类型的内存、等级比目标内存类型低的内存以及等级比目标内存类型高的内存中为“XX”进程分配内存。这样,可以进一步地避免“XX”进程获取不到内存,导致进程饥饿的现象发生。
在一些实施例中,内存分配模块可以通过向进程发送内存地址的方式为进程分配内存。其中,该内存地址可以是虚拟内存地址也可以是物理内存地址。这样,进程在接收到该内存地址之后,就可以基于该内存地址,向内存分配模块分配的内存中进行读数据、写数据等等操作。
在一些实施例中,内存分配模块还可以基于不同的目标内存类型执行不同的循环搜索过程。例如,对内存申请时延比较高(如,mem free、file cache等等)的目标内存类型执行第一循环搜索过程,对内存申请时延比较低(如,anon memory、slab reclaim、swapmemory等等)的目标内存类型执行第三循环搜索过程。其中,第三循环搜索过程是指,从目标内存类型,以及内存申请时延比目标内存类型低的内存类型中循环搜索,直至搜索得到满足分配条件的内存类型。这样,对于一些高时延需要的进程,在满足这些进程时延需要的情况下,可以减少这些进程发送进程饥饿的情况。以及,对于一些时延要求低的进程,在不影响其他进程的内存申请的情况下,可以减少这些进程发生进程饥饿的情况。
示例性的,参见图14,在目标内存类型是文件页释放内存的情况下,内存分配模块可以对文件页释放内存执行第三循环搜索过程。这样,可以使得一些内存时延需求比较低的进程不会影响到时延需求高的进程,同时还能减少内存时延需求低的进程发生进程饥饿的情况。同时,也能给一些内存时延需要高的进程分配内存申请时延低的内存,从而使得要求低时延的进程能够分配到内存申请时延也低的内存类型,减少电子设备上出现的短时延要求的进程因内存分配时延高而导致的应用响应延迟、应用卡顿等现象,可以提升用户的使用体验。
例如,假设“KK”进程的内存请求量是“nn”,目标内存类型是文件页释放内存。内存分配模块可以获取文件页释放内存的可用内存量;若文件释放内存的可用内存量不能满足分配条件,则内存分配模块会获取全局释放内存的可用内存量;若全局释放内存的可用内存量不能满足分配条件,则内存分配模块会获取处理器核空闲内存的可用内存量。若处理器核空闲内存不能满足分配条件,则内存分配模块可以再次获取文件页释放内存的可用内存量,直至得到满足分配条件的内存类型。
例如,假设“KK”进程的内存请求量是“nn”,目标内存类型是匿名页压缩释放内存。内存分配模块会基于匿名页压缩释放内存执行第一循环搜索,此过程可参见上述相关描述,在此不再赘述。
在一些实施例中,参见图15,本申请实施例提供的内存分配方法还可以包括步骤S103。
S103.进程接收内存分配模块分配的内存。
在一些实施例中,参见图16,上述步骤S103可以包括:步骤S103a-S103b。
S103a.进程接收内存分配模块发送的内存地址。
S103b.进程由内核态切换为用户态,并基于该内存地址,读取数据。
可以理解的是,为了实现上述功能,电子设备包含了执行各个功能相应的硬件和/或软件模块。结合本文中所公开的实施例描述的各示例的算法步骤,本申请能够以硬件或硬件和计算机软件的结合形式来实现。某个功能究竟以硬件还是计算机软件驱动硬件的方式来执行,取决于技术方案的特定应用和设计约束条件。本领域技术人员可以结合实施例对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
本实施例可以根据上述方法示例对电子设备进行功能模块的划分,例如,可以对应各个功能划分各个功能模块,也可以将两个或两个以上的功能集成在一个处理模块中。上述集成的模块可以采用硬件的形式实现。需要说明的是,本实施例中对模块的划分是示意性的,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。例如,将内存分配模块中执行上述步骤S101的部分,划分为内存申请解析模块;将内存分配模块中执行上述步骤S102的部分划分为,内存类型匹配模块;将内存分配模块中执行上述步骤S103的部分划分为,内存释放分配模块等等。相关技术人员可以根据实际的使用需要对模块的划分进行设计,本申请实施例对内存分配模块的划分不做任何限制。
本申请实施例还提供一种电子设备,如图17所示,该电子设备可以包括一个或者多个处理器1501、存储器1502和通信接口1503。
其中,存储器1502、通信接口1503与处理器1501耦合。例如,存储器1502、通信接口1503与处理器1501可以通过总线1504耦合在一起。
其中,通信接口1503用于与其他设备进行数据传输。存储器1502中存储有计算机程序代码。计算机程序代码包括计算机指令,当计算机指令被处理器1501执行时,使得电子设备执行本申请实施例中的投屏方法。
其中,处理器1501可以是处理器或控制器,例如可以是中央处理器(centralprocessing unit,CPU),通用处理器,数字信号处理器(digital signal processor,DSP),专用集成电路(application-specific integrated circuit,ASIC),现场可编程门阵列(field programmable gate array,FPGA)或者其他可编程逻辑器件、晶体管逻辑器件、硬件部件或者其任意组合。其可以实现或执行结合本公开内容所描述的各种示例性的逻辑方框,模块和电路。所述处理器也可以是实现计算功能的组合,例如包含一个或多个微处理器组合,DSP和微处理器的组合等等。
其中,总线1504可以是外设部件互连标准(peripheral componentinterconnect,PCI)总线或扩展工业标准结构(extended industry standardarchitecture, EISA)总线等。上述总线1504可以分为地址总线、数据总线、控制总线等。为便于表示,图17中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
本申请实施例还提供一种计算机可读存储介质,该计算机存储介质中存储有计算机程序代码,当上述处理器执行该计算机程序代码时,电子设备执行上述方法实施例中的相关方法步骤。
本申请实施例还提供了一种计算机程序产品,当该计算机程序产品在计算机上运行时,使得计算机执行上述方法实施例中的相关方法步骤。
其中,本申请提供的电子设备、计算机存储介质或者计算机程序产品均用于执行上文所提供的对应的方法,因此,其所能达到的有益效果可参考上文所提供的对应的方法中的有益效果,此处不再赘述。
通过以上实施方式的描述,所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个装置,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是一个物理单元或多个物理单元,即可以位于一个地方,或者也可以分布到多个不同地方。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个可读取存储介质中。基于这样的理解,本申请实施例的技术方案本质上或者说做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该软件产品存储在一个存储介质中,包括若干指令用以使得一个设备(可以是单片机,芯片等)或处理器(processor)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(read only memory,ROM)、随机存取存储器(random access memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
以上内容,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何在本申请揭露的技术范围内的变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以所述权利要求的保护范围为准。

Claims (15)

1.一种内存分配方法,其特征在于,应用于电子设备,所述电子设备包括多种内存类型的内存和多个进程,所述多种内存类型对应的内存申请时延不同,所述方法包括:
接收目标进程的内存申请请求;所述目标进程是所述多个进程中的任一进程;
基于所述目标进程的内存申请请求得到目标内存类型;所述目标内存类型是所述多种内存类型中,对应的内存申请时延与所述目标进程匹配的内存类型;
基于所述目标内存类型为所述目标进程分配内存。
2.根据权利要求1所述的方法,其特征在于,所述基于所述目标进程的内存申请请求得到目标内存类型,包括:
基于所述目标进程的内存申请请求得到所述目标进程的目标优先级,并基于所述目标优先级得到目标内存类型;其中,所述进程对所述电子设备的重要程度和所述进程的优先级正相关;和/或,所述进程与用户交互的相关性和所述进程的优先级正相关;
或者,基于所述目标进程的内存申请请求得到所述目标进程的进程标识,并基于所述进程标识得到目标内存类型;所述目标内存类型对应的内存申请时延与所述进程标识相匹配;
或者,基于所述目标进程的内存申请请求得到所述目标进程的进程类型,并基于所述目标进程的进程类型得到目标内存类型;所述目标内存类型对应的内存申请时延与所述目标进程的进程类型相匹配。
3.根据权利要求2所述的方法,其特征在于,所述基于所述目标进程的内存申请请求得到所述目标进程的目标优先级,包括:
基于所述内存申请请求得到所述目标进程的进程标识,并基于所述进程标识调用函数库获取所述目标优先级;
或者,解析所述内存申请请求中的预设字段得到所述目标优先级;
或者,基于所述内存申请请求得到所述目标进程的进程类型,并基于所述目标进程的进程类型获取所述目标优先级。
4.根据权利要求3所述的方法,其特征在于,所述优先级包括进程调整adj等级;所述基于所述目标进程的进程类型获取所述目标优先级,包括:
基于进程类型与adj等级的对应关系,确定所述目标进程的进程类型对应的目标adj等级;所述进程类型与用户交互的相关性和所述进程类型的adj等级的数值负相关,和/或,所述进程类型对电子设备运行的重要程度和所述进程类型的adj等级的数值负相关。
5.根据权利要求2所述的方法,其特征在于,所述基于所述目标优先级得到目标内存类型,包括:
根据优先级与内存类型的对应关系,确定所述目标优先级匹配的目标内存类型;其中,所述内存类型对应的优先级和所述内存类型对应的申请时延负相关;
或者,基于所述目标优先级得到所述目标优先级对应的历史分配内存类型,并根据所述历史分配内存类型确定目标内存类型。
6.根据权利要求5所述的方法,其特征在于,所述方法还包括:
确定所述多种内存类型的内存申请时延,基于所述多种内存类型的内存申请时延调整所述优先级与内存类型的对应关系。
7.根据权利要求2所述的方法,其特征在于,所述基于所述进程标识得到目标内存类型,包括:
基于所述进程标识得到所述进程标识对应的内存申请时延;
确定所述多种内存类型中,对应的内存申请时延与所述进程标识对应的内存申请时延差值最小的内存类型为所述目标内存类型;
或者,所述基于所述目标进程的进程类型得到目标内存类型,包括:
基于所述目标进程的进程类型得到所述目标进程的进程类型对应的内存申请时延;
确定所述多种内存类型中,对应的申请时延与所述目标进程的进程类型对应的内存申请时延差值最小的内存类型为目标内存类型。
8.根据权利要求2所述的方法,其特征在于,所述方法还包括:
获取所述多种内存类型对应的内存申请时延范围;
所述基于所述进程标识得到目标内存类型,包括:基于所述进程标识得到所述进程标识对应的内存申请时延;确定所述进程标识对应的内存申请时延在所述内存申请时延范围中的内存类型为目标内存类型;
或者,所述基于所述目标进程的进程类型得到目标内存类型,包括:基于所述目标进程的进程类型得到所述目标进程对应的内存申请时延;确定所述目标进程对应的内存申请时延在所述内存申请时延范围中的内存类型为目标内存类型。
9.根据权利要求1-8任一项所述的方法,其特征在于,按照对应的内存申请时延从低到高的顺序,所述多种内存类型包括:处理器核空闲内存、全局空闲内存、文件页释放内存、匿名页压缩释放内存、匿名页转移释放内存、分配器释放内存和进程销毁释放内存中的一种或多种。
10.根据权利要求9所述的方法,其特征在于,所述文件页释放内存,包括:可扩展只读文件系统文件页释放内存,内存友好文件系统文件页释放内存,第四代扩展文件系统文件页释放内存,可扩展文件分配表文件页释放内存;
所述匿名页压缩释放内存,包括:第一匿名页压缩释放内存和第二匿名页压缩释放内存;所述第一匿名页压缩释放内存的活跃度高于所述第二匿名页压缩释放内存的活跃度;所述活跃度是使用所述匿名页的进程的活跃程度;
所述分配器释放内存,包括:第一分配器释放内存和第二分配器释放内存;所述第一分配器释放内存对所述电子设备资源的占用程度低于所述第二分配器释放内存对所述电子设备资源的占用程度;其中,所述对所述电子设备资源的占用程度包括对所述电子设备上的输入输出接口的占用程度。
11.根据权利要求9所述的方法,其特征在于,所述方法还包括:基于所述内存申请请求得到所述目标进程的内存申请量;
所述基于所述目标内存类型为所述目标进程分配内存,包括:
基于所述目标内存类型,执行第一循环搜索,以得到满足分配条件的内存;
为所述目标进程分配所述满足分配条件的内存;
其中,所述第一循环搜索包括:
按照所述内存申请时延从低到高的顺序,从所述目标内存类型和所述内存申请时延比所述目标内存类型高的内存中循环搜索,直至搜索得到所述满足分配条件的内存;所述满足分配条件的内存的可分配内存量大于或等于所述内存申请量;所述可分配内存量是通过内存查询工具查询得到的。
12.根据权利要求11所述的方法,其特征在于,所述方法还包括:
若所述第一循环搜索满足循环切换条件,则执行第二循环搜索;
所述循环切换条件包括:所述第一循环搜索的搜索次数大于或等于预设次数,和/或所述第一循环搜索的搜索时间大于或等于预设时间;
所述第二循环搜索包括:
按照所述内存申请时延从低到高的顺序,从所述多种内存类型的内存中循环搜索,直至搜索得到所述满足分配条件的内存。
13.根据权利要求11所述的方法,其特征在于,所述基于所述目标内存类型,执行第一循环搜索,以得到满足分配条件的内存包括:
若所述目标内存类型是所述匿名页压缩释放内存,或者是所述分配器释放内存,或者是所述匿名页转移释放内存,则基于所述目标内存类型执行所述第一循环搜索,以得到所述满足分配条件的内存;
若所述目标内存类型是所述文件页释放内存,或者是所述全局空闲内存,则基于所述目标内存类型执行第三循环搜索,以得到所述满足分配条件的内存;
所述第三循环搜索包括:
按照所述内存申请时延从高到低的顺序,从所述目标内存类型和所述内存申请时延比所述目标内存类型低的内存中循环搜索,直至搜索得到所述满足分配条件的内存。
14.一种电子设备,其特征在于,所述电子设备包括存储器、一个或多个处理器,所述存储器与所述处理器耦合;其中,所述存储器中存储有计算机程序代码,所述计算机程序代码包括计算机指令;当所述计算机指令被所述处理器执行时,使得所述电子设备执行如权利要求1-13任一项所述的方法。
15.一种计算机可读存储介质,其特征在于,包括计算机指令,当所述计算机指令在电子设备上运行时,使得所述电子设备执行如权利要求1-13任一项所述的方法。
CN202310830925.8A 2023-07-07 2023-07-07 内存分配方法、电子设备及存储介质 Active CN116541180B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310830925.8A CN116541180B (zh) 2023-07-07 2023-07-07 内存分配方法、电子设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310830925.8A CN116541180B (zh) 2023-07-07 2023-07-07 内存分配方法、电子设备及存储介质

Publications (2)

Publication Number Publication Date
CN116541180A true CN116541180A (zh) 2023-08-04
CN116541180B CN116541180B (zh) 2024-07-05

Family

ID=87456455

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310830925.8A Active CN116541180B (zh) 2023-07-07 2023-07-07 内存分配方法、电子设备及存储介质

Country Status (1)

Country Link
CN (1) CN116541180B (zh)

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112799842A (zh) * 2021-02-01 2021-05-14 安徽芯纪元科技有限公司 一种数字信号处理器嵌入式操作系统内存管理方法
CN116069493A (zh) * 2021-11-03 2023-05-05 腾讯科技(深圳)有限公司 一种数据处理方法、装置、设备以及可读存储介质

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112799842A (zh) * 2021-02-01 2021-05-14 安徽芯纪元科技有限公司 一种数字信号处理器嵌入式操作系统内存管理方法
CN116069493A (zh) * 2021-11-03 2023-05-05 腾讯科技(深圳)有限公司 一种数据处理方法、装置、设备以及可读存储介质

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
侯伟凡等: ""改进的Spark Shuffle内存分配算法"", 《计算机应用》, no. 12, 10 December 2017 (2017-12-10), pages 63 - 67 *

Also Published As

Publication number Publication date
CN116541180B (zh) 2024-07-05

Similar Documents

Publication Publication Date Title
US11531625B2 (en) Memory management method and apparatus
CN111506262B (zh) 一种存储系统、文件存储和读取方法及终端设备
CN111966492B (zh) 内存回收方法、装置、电子设备及计算机可读存储介质
WO2019128431A1 (en) Memory processing method and device and storage medium
CN111090521A (zh) 内存分配方法、装置、存储介质及电子设备
EP4328705A1 (en) Storage space arrangement method and electronic device
CN113204407A (zh) 一种内存超配管理方法及装置
CN111078410A (zh) 内存分配方法、装置、存储介质及电子设备
WO2024099448A1 (zh) 内存释放、内存恢复方法、装置、计算机设备及存储介质
CN107003940B (zh) 用于在非统一存储器架构中提供改进的延迟的系统和方法
WO2019128542A1 (zh) 应用处理方法、电子设备、计算机可读存储介质
CN116107922A (zh) 一种应用程序的管理方法及电子设备
CN116541180B (zh) 内存分配方法、电子设备及存储介质
CN111008079B (zh) 进程管理方法、装置、存储介质及电子设备
WO2023185684A1 (zh) 一种应用程序的进程查杀方法及电子设备
CN107111560B (zh) 用于在非统一存储器架构中提供改进的延迟的系统和方法
CN111444117A (zh) 存储空间碎片化实现方法、装置、存储介质及电子设备
CN115718663A (zh) Binder驱动内存管理方法、装置、设备及存储介质
CN113032153B (zh) 容器服务资源动态扩容方法、系统、装置及存储介质
CN113778688A (zh) 内存管理系统、内存管理方法、内存管理装置
CN117707639B (zh) 应用启动加速方法、电子设备及存储介质
CN117708070B (zh) 一种文件压缩方法及电子设备
CN116049113B (zh) 文件系统的整理方法、电子设备及计算机可读存储介质
CN116361012B (zh) 一种内存页分配方法及电子设备
CN117112194B (zh) 一种内存扩展方法及相关设备

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