内存管理方法、装置、电子设备及存储介质与流程



1.本技术属于内存管理技术领域,具体涉及一种内存管理方法、装置、电子设备及存储介质。


背景技术:



2.内存管理是系统的核心技术之一,对提高系统的用户体验和系统运行的稳定性具有关键作用。当内存紧张时,系统会出现卡顿、运行出错、崩溃等一系列问题。相关技术中,可通过内存压缩缓解内存紧张,但是常规的内存管理方式还存在压缩效率低的问题。


技术实现要素:



3.鉴于上述问题,本技术提出了一种内存管理方法、装置、电子设备以及存储介质,以实现改善上述问题。
4.第一方面,本技术实施例提供了一种内存管理方法,所述方法包括:若当前的空闲内存低于预设内存,唤醒异步线程,所述异步线程为用户线程;通过所述异步线程,对已分配内存进行内存压缩处理。
5.第二方面,本技术实施例提供了一种内存管理装置,所述装置包括:唤醒单元,用于若当前的空闲内存低于预设内存,唤醒异步线程,所述异步线程为用户线程;压缩单元,用于通过所述异步线程,对已分配内存进行内存压缩处理。
6.第三方面,本技术实施例提供了一种电子设备,包括一个或多个处理器以及存储器;一个或多个程序,其中所述一个或多个程序被存储在所述存储器中并被配置为由所述一个或多个处理器执行,所述一个或多个程序配置用于执行上述的方法。
7.第四方面,本技术实施例提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有程序代码,其中,在所述程序代码运行时执行上述的方法。
8.本技术实施例提供了一种内存管理方法、装置、电子设备及存储介质。若当前的空闲内存低于预设内存,唤醒异步线程,所述异步线程为用户线程,通过该异步线程,对已分配内存进行内存压缩处理。通过上述方法,在检测到空闲内存低于预设内存时,通过创建的用户线程提前启动内存压缩操作,可以提升系统响应速度,并且用户线程是完全建立在用户空间的线程库,用户线程的创建、调度、同步和销毁全由库函数在用户空间完成,不需要内核的帮助,因此,通过用户线程对已分配内存进行内存压缩处理,对cpu的消耗是极低的,并且进行内存压缩处理是非常高效的。
附图说明
9.为了更清楚地说明本技术实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
10.图1示出了本技术一实施例提出的一种内存管理方法的应用场景示意图;
11.图2示出了本技术一实施例提出的一种内存管理方法的应用场景示意图;
12.图3示出了本技术一实施例提出的一种内存管理方法的流程图;
13.图4示出了本技术另一实施例提出的一种内存管理方法的流程图;
14.图5示出了本技术再一实施例提出的一种内存管理方法的流程图;
15.图6示出了本技术又一实施例提出的一种内存管理方法的流程图;
16.图7示出了本技术实施例提出的一种内存管理装置的结构框图;
17.图8示出了本技术实施例提出的一种内存管理装置的结构框图;
18.图9示出了本技术实时中的用于执行根据本技术实施例的内存管理方法的电子设备或服务器的结构框图;
19.图10示出了本技术实时中的用于保存或者携带实现根据本技术实施例的内存管理方法的程序代码的存储单元。
具体实施方式
20.下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本技术保护的范围。
21.内存管理是系统的核心技术之一,对提高系统的用户体验和系统运行的稳定性具有关键作用。当内存紧张时,系统会出现卡顿、运行出错、崩溃等一系列问题。相关技术中,可通过内存回收缓解内存紧张。
22.在linux内核系统中,内存回收的流程主要包括有两个,即直接内存回收(direct reclaim内存回收)和后台内存回收(kswapd内存回收)。内核进行内存回收的主要原因有两个:(1)内核需要为任何时刻突发到来的内存申请提供足够的内存,以便cache的使用和其他相关内存的使用不至于让系统的剩余内存长期处于很少的状态;(2)当真的有大于空闲内存的申请到来的时候,会触发强制内存回收。
23.针对上述第一种原因,linux系统设计了kswapd后台程序,当内核分配物理页面时,由于系统内存短缺,没法在低水位情况下分配内存,因此会唤醒kswapd内核线程来异步回收内存。
24.针对上述第二种原因,linux系统会触发直接内存回收(direct reclaim),在内核调用页分配函数分配物理页面时,由于系统内存短缺,不能满足分配请求,内核就会直接触发页面回收机制,尝试回收内存来解决问题。
25.发明人在对相关的内存管理方法的研究中发现,在通过上述两种方式执行内存回收时,都是由当前执行者来完成内存回收的,例如匿名页回收,是由直接内存回收的触发者来执行内存的压缩并把数据写入zram中;对于文件页的回写,也是由直接内存回收的触发者来完成的;同理,当kswapd内核线程执行内存回收的时候,是由kswapd内核线程来完成所有的操作的。通过上述方法,在执行内存回收时,都通过当前执行者来完成内存回收,会导致系统响应速度减慢。
26.因此,发明人提出了本技术中的内存管理方法、装置、电子设备及存储介质。若当
前的空闲内存低于预设内存,唤醒异步线程,所述异步线程为用户线程,通过该异步线程,对已分配内存进行内存压缩处理。通过上述方法,在检测到空闲内存低于预设内存时,通过创建的用户线程提前启动内存压缩操作,可以提升系统响应速度,并且用户线程是完全建立在用户空间的线程库,用户线程的创建、调度、同步和销毁全由库函数在用户空间完成,不需要内核的帮助,因此,通过用户线程对已分配内存进行内存压缩处理,对cpu的消耗是极低的,并且进行内存压缩处理是非常高效的。
27.在本技术实施例中,所提供的内存管理方法可以由电子设备执行。在由电子设备执行的这种方式中,本技术实施例提供的内存管理方法中所有步骤可以均由电子设备执行。例如,如图1所示,通过电子设备100的处理器执行若当前的空闲内存低于预设内存,唤醒异步线程,所述异步线程为用户线程;通过所述异步线程,对已分配内存进行内存压缩处理。
28.再者,本技术实施例提供的内存管理方法也可以由服务器(云端)进行执行。对应的,在由服务器执行的这种方式中,可以由电子设备检测当前的空闲内存是否低于预设内存,若检测到当前的空闲内存低于预设内存,并将当前的空闲内存低于预设内存同步发送给服务器,然后由服务器实时的唤醒异步线程,所述异步线程为用户线程;通过所述异步线程,对已分配内存进行内存压缩处理。
29.另外,还可以由电子设备和服务器协同执行。在由电子设备和服务器协同执行的这种方式中,本技术实施例提供的内存管理方法中的部分步骤由电子设备执行,而另外部分的步骤则由服务器来执行。
30.示例性的,如图2所示,电子设备100可以执行内存管理方法包括的:若当前的空闲内存低于预设内存,唤醒异步线程,所述异步线程为用户线程,然后由服务器200来执行通过所述异步线程,对已分配内存进行内存压缩处理。。
31.需要说明的是,在由电子设备和服务器协同执行的这种方式中,电子设备和服务器分别执行的步骤不限于上述示例中所介绍的方式,在实际应用中,可以根据实际情况动态的调整电子设备和服务器分别执行的步骤。
32.需要说明的是,该电子设备100除了可以为图1和图2中所示的智能手机外,还可以为车机设备、可穿戴设备、平板电脑、笔记本电脑、智能音箱等。服务器120可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集或者分布式系统。
33.下面将结合附图具体描述本技术的各实施例。
34.请参阅图3,本技术实施例提供的一种内存管理方法,应用于如图1或图2所示的电子设备或服务器,所述方法包括:
35.步骤s110:若当前的空闲内存低于预设内存,唤醒异步线程,所述异步线程为用户线程。
36.在本技术实施例中,预设内存为预先设置的表征需要进行内存压缩的空闲内存阈值,预设内存为大于内存水线的内存阈值。异步线程为重新创建的用于进行异步压缩和解压缩的用户线程。其中,用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。
37.可以理解的是,电子设备的系统和应用程序的进程的运行,都需要系统内核为其
分配内存空间。并且随着系统的运行情况,内核不断地进行着内存的回收与分配等。例如,内核可以对内存空间的使用情况进行实时监测,并检测剩余的空闲内存空间是否小于预设内存。
38.一般情况下,系统内核在进行内存管理时会设置有内存水线,系统在分配内存页时,会检测系统剩余的空闲内存空间是否小于该内存水线,如果小于该内存水线,则要进行内存回收。但是,一般在检测到系统剩余的空闲内存空间小于该内存水线时,系统已经处于低内存状态了。再者,内存压缩操作一般比较耗时,如果系统已经处于低内存状态才进行内存压缩处理,会导致系统长时间处于低内存状态,不能及时地完成内存回收,导致内存回收效率低,影响系统的和应用程序的正常运行。
39.为了避免这种系统长期处于低内存状态的情况,本技术实施例的方案会对内存进行提前回收处理,所以预设内存为一个大于内存水线的值,检测到空闲内存空间小于预设内存时,就开始进行内存的压缩处理,而不是等到空闲内存空间低于内存水线时,才进行内存回收。
40.作为一种方式,当检测到系统当前的空闲内存低于预设内存时,唤醒创建的异步线程。其中,在唤醒异步线程之后,可以将唤醒的异步线程的状态设置为“running”。可选的,为了可以唤醒指定的异步线程,可以为创建的异步线程设置一个指定的线程标识,进而当检测到满足对应的唤醒条件时,可以通过该指定的线程标识到创建的异步线程,从而唤醒该异步线程。可选的,在检测到满足指定唤醒条件时,可以通过预设函数唤醒该异步线程。其中,预设函数可以为预先设置的用于唤醒异步线程的函数。
41.步骤s120:通过所述异步线程,对已分配内存进行内存压缩处理。
42.在本技术实施例中,当检测到异步线程被唤醒时,通过该异步线程对已分配内存进行内存压缩处理。其中,已分配内存为内核在进行内存分配时,分配给进程的内存。内存压缩处理是指按照一定的算法对已分配内存进行压缩后存入内存压缩空间中,以释放这些已分配内存占用的一部分空间。例如,对目标内存页进行压缩,并将压缩后的内存页写入内存空间中的内存压缩空间中,以释放这些目标内存页占用的一部分内存空间。
43.当系统需要使用压缩过的数据时,可以从内存压缩空间中到压缩过的数据,将其解压后即可以供系统使用。
44.作为一种方式,在对已分配内存进行内存压缩处理时,可以从所有已分配内存中选取部分已分配内存,进而通过预设压缩算法对该部分已分配内存进行内存压缩处理。其中,部分已分配内存的大小可以根据预设压缩量进行确定。其中,预设压缩量为预先设置的需要进行内存压缩的已分配内存的大小。
45.可选的,在本技术实施例中,内核在给进程分配内存时,已知到每个进程需要多大的内存,进而在给对应的进程分配内存时,可以记录给每个进程分配了多少内存。从而在根据预设压缩量对已分配内存进行内存压缩处理时,可以根据每个进程所对应的内存的大小以及预设压缩量,从全部已分配内存中选择部分已分配内存进行内存压缩处理。示例性的,若预设压缩量为10mb,而进程1对应的内存的大小为2mb,进程2对应的内存的大小为5mb,进程3对应的内存的大小为8mb,进程4对应的内存的大小为3mb,那么在根据每个进程所对应的内存的大小以及预设压缩量,从全部已分配内存中选择部分已分配内存进行内存压缩处理时,可以选择对进程1、进程2和进程4对应的内存进行内存压缩处理;也可以选择对进程1
和进程3对应的内存进行内存压缩处理。
46.在对选择出的部分已分配内存进行内存压缩处理时,可以通过预设压缩算法对该部分已分配内存进行不同压缩比例的压缩处理。其中,压缩比例可以由当前的空闲内存与预设压缩量的比例进行确定,当前的空闲内存越大,对应的压缩比例越大;当前的空闲内存越小,对应的压缩比例越小。压缩比例表征对已分配内存的压缩程度,压缩比例越大,表征对已分配内存的压缩程度越大;压缩比例越小,表征对已分配内存的压缩比例越小。
47.在本技术实施例中,预设压缩算法可以包括zram压缩算法。其中,zram压缩算法可以包括bzip2算法、deflater算法、gzip算法、lzo算法、lz4算法以及snappy算法。
48.其中,bzip2是julian seward开发并按照自由软件/开源软件协议发布的数据压缩算法及程序。seward在1996年7月第一次公开发布了bzip2 0.15版,在随后几年中这个压缩工具稳定性得到改善并且日渐流行,seward在2000年晚些时候发布了1.0版。bzip2比传统的gzip的压缩效率更高,但是它的压缩速度较慢。
49.deflater是同时使用了lz77算法与哈夫曼编码(huffman coding)的一个无损数据压缩算法,deflate压缩与解压的源代码可以在自由、通用的压缩库zlib上到。
50.gzip的实现算法还是deflate,只是在deflate格式上增加了文件头和文件尾,同样jdk也对gzip提供了支持,分别是gzipoutputstream和gzipinputstream类,同样可以发现gzipoutputstream是继承于deflateroutputstream的,gzipinputstream继承于inflaterinputstream,并且可以在源码中发现writeheader和writetrailer方法。
51.lzo是致力于解压速度的一种数据压缩算法,lzo是lempel-ziv-oberhumer的缩写,这个算法是无损算法。
52.lz4是一种无损数据压缩算法,着重于压缩和解压缩速度。
53.snappy(以前称zippy)是google基于lz77的思路用c++语言编写的快速数据压缩与解压程序库,并在2011年开源。它的目标并非最大压缩率或与其他压缩程序库的兼容性,而是非常高的速度和合理的压缩率。
54.上述压缩算法中,lzo和lz4算法是比较成熟的压缩算法。目前linux内核3.10版本只有lzo算法,linux内核3.15版本引入了lz4算法。本系统直接移植这两种算法,lzo算法比lz4算法有更好的压缩比和更快的压缩速度,但是lz4在解压速度上比lzo算法更优秀。
55.本技术提供的一种内存管理方法,若当前的空闲内存低于预设内存,唤醒异步线程,所述异步线程为用户线程,通过该异步线程,对已分配内存进行内存压缩处理。通过上述方法,在检测到空闲内存低于预设内存时,通过创建的用户线程提前启动内存压缩操作,可以提升系统响应速度,并且用户线程是完全建立在用户空间的线程库,用户线程的创建、调度、同步和销毁全由库函数在用户空间完成,不需要内核的帮助,因此,通过用户线程对已分配内存进行内存压缩处理,对cpu的消耗是极低的,并且进行内存压缩处理是非常高效的。
56.请参阅图4,本技术实施例提供的一种内存管理方法,应用于如图1或图2所示的电子设备或服务器,所述方法包括:
57.步骤s210:若当前的空闲内存低于预设内存,唤醒异步线程,所述异步线程为用户线程。
58.步骤s220:获取当前的cpu负载。
59.在本技术实施例中,系统在检测到当前的空闲内存低于预设内存时,可以触发内存回收操作,在执行内存回收操作的过程中,会消耗大量的cpu负载,导致内存回收操作与应用程序会存在竞争cpu的关系,导致应用程序卡顿、性能劣化。并且,由于cpu的频率和功耗不是线性关系的,随着cpu的频率线性增加,cpu的功耗是几何增加的,所以当cpu长时间高频率运行时,cpu的功耗更高;如果执行内存回收操作的执行者和应用程序同时运行的时间越长,会导致cpu高频率运行的时间更长,导致设备续航时间变短。
60.因此,为了降低cpu高频率运行的时间,可以实时对cpu负载进行监测,进而在检测到cpu负载满足预设条件时,才唤醒异步线程。
61.作为一种方式,cpu负载可以包括系统丢帧率。系统丢帧率可以体现cpu负载的高低。也即,系统丢帧率越高,说明cpu负载越高;系统丢帧率越低,说明cpu负载越低。
62.在一些实施例中,可以通过surfaceflinger服务中用于获取帧信息的相关接口来获取系统丢帧率,当然,也可以通过其他方式来获取系统丢帧率,本技术实施例对此不作限定。
63.作为另一种方式,cpu负载也可以包括cpu的运行频率。cpu的运行频率可以提现cpu负载的高低。也即,cpu的运行频率越高,说明cpu负载越高;cpu的运行频率越低,说明cpu负载越低。
64.在本技术实施例中,当前的cpu负载指的是全部cpu节点负载的总和。作为一种方式,可以在检测到异步线程被唤醒时,获取当前的cpu负载,进而在确定当前的cpu负载满足预设条件时,通过异步线程执行后述步骤。也即,当检测到异步线程的状态为“running”时,确定异步线程被唤醒,进而开始获取当前的cpu负载。
65.作为另一种方式,可以在检测到指定应用程序或进程开始运行时,开始获取当前的cpu负载。其中,指定应用程序或进程为需要消耗大量cpu的应用程序或进程。具体的,在检测到消耗大量cpu的应用程序或进程开始运行时,可以对当前的cpu负载进行实时监测。
66.步骤s230:若所述当前的cpu负载小于预设负载阈值,通过所述异步线程,对已分配内存进行内存压缩处理。
67.在本技术实施例中,预设负载阈值为预先设置的表征cpu负载不高,可以支持内存压缩操作。
68.在通过上述方式获取到当前的cpu负载时,可以将获取到的当前的cpu负载与预设负载阈值进行比较,进而判断是否可以对已分配内存进行内存压缩处理。
69.可以理解的是,由于内存压缩比较耗费系统资源,这个判断的目的在于判断当前的cpu负载是否支持内存压缩操作,当cpu负载小于预设负载阈值时,可以判定系统中当前处于运行状态的进程并不需要消耗特别多的系统的资源,因此,系统还有足够的空闲资源用于支持内存压缩。此时,才判定可以执行内存压缩操作。
70.若cpu负载不小于预设负载阈值,则根据空闲内存空间的大小和预设内存,确定出待压缩内存量。由于每一次压缩操作之前并不能精确的估计本次内存压缩的压缩率,因此,可以根据一个预设的期望压缩率,来确定出待压缩内存量,进而根据该待压缩内存量确定目标已分配内存。
71.在确定出目标已分配内存后,通过异步线程对目标已分配内存进行内存压缩处理。
72.本技术提供的一种内存管理方法,若当前的空闲内存低于预设内存,唤醒异步线程,所述异步线程为用户线程,然后获取当前的cpu负载,若当前的cpu负载小于预设负载阈值,通过异步线程,对已分配内存进行内存压缩处理。通过上述方法,在检测到空闲内存低于预设内存时,通过创建的用户线程提前启动内存压缩操作,可以提升系统响应速度,并且用户线程是完全建立在用户空间的线程库,用户线程的创建、调度、同步和销毁全由库函数在用户空间完成,不需要内核的帮助,因此,通过用户线程对已分配内存进行内存压缩处理,对cpu的消耗是极低的,并且进行内存压缩处理是非常高效的。并且在当前的cpu负载小于预设负载阈值的情况下,才通过异步线程对已分配内存进行内存压缩处理,可以进一步降低cpu负载。
73.请参阅图5,本技术实施例提供的一种内存管理方法,应用于如图1或图2所示的电子设备或服务器,所述方法包括:
74.步骤s310:在执行直接内存回收操作或后台内存回收操作时,若当前的空闲内存低于预设内存,唤醒所述异步线程。
75.在本技术实施例中,直接内存回收是指在内存分配时发现空闲内存严重不足,直接启动的内存回收操作。处于慢速分配过程中,直接内存回收只有一种情况下会使用,在慢速分配中无法从zonelist的所有zone中以min阀值分配页框,并且进行异步内存压缩后,还是无法分配到页框的时候,就对zonelist中的所有zone进行一次直接内存回收。注意,直接内存回收是针对zonelist中的所有zone的,它并不像快速内存回收和kswapd内存回收,只会对zonelist中空闲页框不达标的zone进行内存回收。并且在直接内存回收中,有可能唤醒flush内核线程。
76.后台内存回收发生在kswapd内核线程中,每个node有一个swapd内核线程,也就是kswapd内核线程中的内存回收,是只针对所在node的,并且只会对分配了order页框数量后空闲页框数量《此“zone的high阀值+保留页框数量”的zone进行内存回收,并不会对此node的所有zone进行内存回收。
77.当在执行上述内存回收操作的过程中,可以通过内核实时对当前的空闲内存进行监测,当检测到当前的空闲内存低于预设内存时,唤醒异步线程,进而通过异步线程执行内存压缩操作。
78.步骤s320:获取当前多个内核各自对应的cpu负载。
79.在本技术实施例中,多个内核指的是多个cpu内核。
80.为了降低cpu负载,也可以通过选择cpu负载比较低的cpu内核来运行异步线程。作为一种方式,可以实时监测当前多个cpu内核各自对应的cpu负载。
81.步骤s330:将所述多个内核中对应的cpu负载低于所述预设负载阈值的内核作为目标内核。
82.在本技术实施例中,预设负载阈值为预先设置的cpu负载阈值,用于表征cpu负载比较高。对应的cpu负载低于预设负载阈值表征cpu内核的cpu负载较低,可以支持运行异步线程,对已分配内存进行内存压缩处理。
83.在获取到多个cpu内核各自对应的cpu负载后,可以将多个cpu内核各自对应的cpu负载分别与预设负载阈值进行比较,若多个cpu内核中,有cpu内核对应的cpu负载低于预设负载阈值,则将该cpu内核作为目标cpu内核。
84.作为一种方式,若多个cpu内核中只有一个cpu内核对应的cpu负载低于预设负载阈值,则将该cpu内核作为目标cpu内核。
85.作为另一种方式,若多个cpu内核对应的cpu负载均低于预设负载阈值,则可以将多个cpu内核中的任意一个cpu内核作为目标cpu内核。当然,也可以按照一定规则,将多个cpu内核中的某个cpu内核作为目标cpu内核。比如,可以将多个cpu内核各自对应的cpu负载按照从高到低或者从低到高的顺序进行排列,进而可以选择对应的cpu负载最低的cpu内核作为目标cpu内核。或者,将多个cpu内核中对应的cpu负载处于中间位置的cpu内核作为目标cpu内核。其中,若处于同一位置的cpu内核有多个,则可以将多个cpu内核中的任意一个cpu内核作为目标cpu内核,也可以将该多个cpu内存都作为目标cpu内核,在此不做具体限定,可以根据实际需求进行选择。
86.可选的,也可以根据多个cpu内核中各自运行的进程的数量来确定目标cpu内核。具体的,可以将运行的进程的数量最少的cpu内核作为目标cpu内核。其中,每个cpu内核中运行的进程的数量对于cpu内核来说是已知的。
87.步骤s340:通过所述目标内核运行所述异步线程,对已分配内存进行内存压缩处理。
88.在本技术实施例中,当通过上述方式确定了目标cpu内核之后,可以通过目标cpu内核运行异步线程,从而通过该异步线程对已分配内存进行内存压缩处理。
89.通过上述方式,选择cpu负载比较低的cpu内核来运行创建的异步线程,进而通过该异步线程来进行内存压缩处理,可以降低内存回收操作的执行者的cpu负载,降低cpu高频率运行的时长,进而可以提升设备的续航时间,减少发热。
90.本技术提供的一种内存管理方法,在执行直接内存回收操作或后台内存回收操作时,若当前的空闲内存低于预设内存,唤醒异步线程,然后获取当前多个内核各自对应的cpu负载,将多个内核中对应的cpu负载低于预设负载阈值的内核作为目标内核,最后通过目标内核运行该异步线程,对已分配内存进行内存压缩处理。通过上述方法,在检测到空闲内存低于预设内存时,通过创建的用户线程提前启动内存压缩操作,可以提升系统响应速度,并且用户线程是完全建立在用户空间的线程库,用户线程的创建、调度、同步和销毁全由库函数在用户空间完成,不需要内核的帮助,因此,通过用户线程对已分配内存进行内存压缩处理,对cpu的消耗是极低的,并且进行内存压缩处理是非常高效的。并且选择cpu负载较小的内核运行异步线程对已分配内存进行内存压缩处理,可以进一步降低cpu负载。
91.请参阅图6,本技术实施例提供的一种内存管理方法,应用于如图1或图2所示的电子设备或服务器,所述方法包括:
92.步骤s410:若当前的空闲内存低于预设内存,唤醒异步线程,所述异步线程为用户线程。
93.步骤s420:通过所述异步线程,对已分配内存进行内存压缩处理。
94.步骤s430:通过所述异步线程,对已压缩内存进行解压缩处理。
95.在本技术实施例中,当进程访问需要的内存的时候,如果对应的内存在cache中,则可以直接访问;但是如果对应的内存不在cache中,则需要从flash或zram中把内存读取回来,特别是zram,需要完成内存解压缩操作,内存解压缩操作是需要时间并占用cpu的。
96.因此,为了降低cpu高频率运行的时间,也可以通过创建的异步线程来对已压缩内
存进行解压缩处理,进而可以降低对cpu的占用。
97.作为一种方式,响应于将目标应用切换到前台运行的指令,通过所述异步线程提前对所述目标应用对应的内存进行解压缩处理。
98.其中,将目标应用切换到前台运行的指令可以为用户操作触发的,比如用户的切换操作(上滑正在前台运行的应用程序或左滑正在前台运行的应用程序等)。
99.在本技术实施例中,在检测到将目标应用切换到前台运行的指令时,响应于该指令,通过异步线程基于预设解压缩算法,提前对该目标应用对应的内存进行解压缩处理。其中,预设解压缩算法与预设压缩算法对应;目标应用为当前需要在前台显示的应用。
100.可选的,在本技术实施例中,内存压缩处理和内存解压缩处理可以由不同的异步线程执行。其中,异步线程可以包括第一异步线程和第二异步线程。第一异步线程和第二异步线程均为用户线程。
101.作为其中一种方式,通过所述第一异步线程,对已分配内存进行内存压缩处理;通过所述第二异步线程,对已压缩内存进行解压缩处理。
102.在本技术实施例中,在对同一内存进行内存压缩处理和内存解压缩处理时,必定是先对该内存进行内存压缩处理后,再对该内存进行内存解压缩处理,因此,在这种情况下,可以通过同一异步线程对该内存进行处理。具体的,可以通过第一异步线程对该内存进行内存压缩处理后,再通过第一异步线程对该内存进行内存解压缩处理。当然,也可以通过第二异步线程对该内存进行内存压缩处理后,再通过第二异步线程对该内存进行内存解压缩处理。
103.可选的,也可以通过第一异步线程对该内存进行内存压缩处理后,再通过第二异步线程对该内存进行内存解压缩处理。或者,通过第二异步线程对该内存进行内存压缩处理后,再通过第一异步线程对该内存进行内存解压缩处理。
104.在对不同的内存进行内存压缩和内存解压缩操作时,可以通过不同的异步线程同时进行内存解压缩操作和内存解压缩操作。比如,在通过第一异步线程对内存1进行内存压缩处理的同时,通过第二异步线程对内存2进行解压缩处理。或者,在通过第二异步线程对内存1进行内存压缩处理的同时,通过第一异步线程对内存2进行解压缩处理。
105.在本技术实施例中,响应于将目标应用切换到前台运行的指令,通过异步线程提前将该目标应用对应的内存从nandswap或者zram解压到cache中。通过前述方式,可以提升系统响应速度,目标应用不用等着内存压缩完成再进行内存解压缩操作。
106.本技术提供的一种内存管理方法,若当前的空闲内存低于预设内存,唤醒异步线程,然后通过异步线程,对已分配内存进行内存压缩处理,通过异步线程,对已压缩内存进行解压缩处理。通过上述方法,在检测到空闲内存低于预设内存时,通过创建的用户线程提前启动内存压缩操作,可以提升系统响应速度,并且用户线程是完全建立在用户空间的线程库,用户线程的创建、调度、同步和销毁全由库函数在用户空间完成,不需要内核的帮助,因此,通过用户线程对已分配内存进行内存压缩处理,对cpu的消耗是极低的,并且进行内存压缩处理是非常高效的。
107.请参阅图7,本技术实施例提供的一种内存管理装置500,所述装置500包括:
108.唤醒单元510,用于若当前的空闲内存低于预设内存,唤醒异步线程,所述异步线程为用户线程。
109.作为一种方式,唤醒单元510具体用于在执行直接内存回收操作或后台内存回收操作时,若当前的空闲内存低于预设内存,唤醒所述异步线程。
110.压缩单元520,用于通过所述异步线程,对已分配内存进行内存压缩处理。
111.作为一种方式,压缩单元520具体用于获取当前的cpu负载;若所述当前的cpu负载小于预设负载阈值,通过所述异步线程,对已分配内存进行内存压缩处理。
112.作为另一种方式,压缩单元520具体用于获取当前多个内核各自对应的cpu负载;将所述多个内核中对应的cpu负载低于所述预设负载阈值的内核作为目标内核;通过所述目标内核运行所述异步线程,对已分配内存进行内存压缩处理。
113.可选的,压缩单元520具体用于通过所述第一异步线程,对已分配内存进行内存压缩处理。
114.可选的,请参阅图8,所述装置500还包括:
115.解压缩单元530,用于通过所述异步线程,对已压缩内存进行解压缩处理。
116.作为一种方式,解压缩单元530具体用于响应于将目标应用切换到前台运行的指令,通过所述异步线程提前对所述目标应用对应的内存进行解压缩处理。
117.可选的,解压缩单元530具体用于通过所述第二异步线程,对已压缩内存进行解压缩处理。
118.需要说明的是,本技术中装置实施例与前述方法实施例是相互对应的,装置实施例中具体的原理可以参见前述方法实施例中的内容,此处不再赘述。
119.下面将结合图9对本技术提供的一种电子设备或服务器进行说明。
120.请参阅图9,基于上述的内存管理方法、装置,本技术实施例还提供的另一种可以执行前述内存管理方法的电子设备或服务器800。电子设备或服务器800包括相互耦合的一个或多个(图中仅示出一个)处理器802、存储器804以及网络模块806。其中,该存储器804中存储有可以执行前述实施例中内容的程序,而处理器802可以执行该存储器804中存储的程序。
121.其中,处理器802可以包括一个或者多个处理核。处理器802利用各种接口和线路连接整个电子设备或服务器800内的各个部分,通过运行或执行存储在存储器804内的指令、程序、代码集或指令集,以及调用存储在存储器804内的数据,执行服务器800的各种功能和处理数据。可选地,处理器802可以采用数字信号处理(digital signal processing,dsp)、现场可编程门阵列(field-programmable gate array,fpga)、可编程逻辑阵列(programmable logic array,pla)中的至少一种硬件形式来实现。处理器802可集成中央处理器(central processing unit,cpu)、图像处理器(graphics processing unit,gpu)和调制解调器等中的一种或几种的组合。其中,cpu主要处理操作系统、用户界面和应用程序等;gpu用于负责显示内容的渲染和绘制;调制解调器用于处理无线通信。可以理解的是,上述调制解调器也可以不集成到处理器802中,单独通过一块通信芯片进行实现。
122.存储器804可以包括随机存储器(random access memory,ram),也可以包括只读存储器(read-only memory)。存储器804可用于存储指令、程序、代码、代码集或指令集。存储器804可包括存储程序区和存储数据区,其中,存储程序区可存储用于实现操作系统的指令、用于实现至少一个功能的指令(比如触控功能、声音播放功能、图像播放功能等)、用于实现下述各个方法实施例的指令等。存储数据区还可以存储电子设备或服务器800在使用
中所创建的数据(比如电话本、音视频数据、聊天记录数据)等。
123.所述网络模块806用于接收以及发送电磁波,实现电磁波与电信号的相互转换,从而与通讯网络或者其他设备进行通讯,例如和音频播放设备进行通讯。所述网络模块806可包括各种现有的用于执行这些功能的电路元件,例如,天线、射频收发器、数字信号处理器、加密/解密芯片、用户身份模块(sim)卡、存储器等等。所述网络模块806可与各种网络如互联网、企业内部网、无线网络进行通讯或者通过无线网络与其他设备进行通讯。上述的无线网络可包括蜂窝式电话网、无线局域网或者城域网。例如,网络模块806可以与进行信息交互。
124.请参考图10,其示出了本技术实施例提供的一种计算机可读存储介质的结构框图。该计算机可读存储介质900中存储有程序代码,所述程序代码可被处理器调用执行上述方法实施例中所描述的方法。
125.计算机可读存储介质900可以是诸如闪存、eeprom(电可擦除可编程只读存储器)、eprom、硬盘或者rom之类的电子存储器。可选地,计算机可读存储介质900包括非易失性计算机可读介质(non-transitory computer-readable storage medium)。计算机可读存储介质900具有执行上述方法中的任何方法步骤的程序代码910的存储空间。这些程序代码可以从一个或者多个计算机程序产品中读出或者写入到这一个或者多个计算机程序产品中。程序代码910可以例如以适当形式进行压缩。
126.本技术提供的一种内存管理方法、装置、电子设备以及存储介质,若当前的空闲内存低于预设内存,唤醒异步线程,所述异步线程为用户线程,通过该异步线程,对已分配内存进行内存压缩处理。通过上述方法,在检测到空闲内存低于预设内存时,通过创建的用户线程提前启动内存压缩操作,可以提升系统响应速度,并且用户线程是完全建立在用户空间的线程库,用户线程的创建、调度、同步和销毁全由库函数在用户空间完成,不需要内核的帮助,因此,通过用户线程对已分配内存进行内存压缩处理,对cpu的消耗是极低的,并且进行内存压缩处理是非常高效的。
127.上面结合附图对本发明的实施例进行了描述,但是本发明并不局限于上述的具体实施方式,上述的具体实施方式仅仅是示意性的,而不是限制性的,本领域的普通技术人员在本发明的启示下,在不脱离本发明宗旨和权利要求所保护的范围情况下,还可做出很多形式,均属于本发明的保护之内。

技术特征:


1.一种内存管理方法,其特征在于,所述方法包括:若当前的空闲内存低于预设内存,唤醒异步线程,所述异步线程为用户线程;通过所述异步线程,对已分配内存进行内存压缩处理。2.根据权利要求1所述的方法,其特征在于,所述通过所述异步线程,对已分配内存进行内存压缩处理,包括:获取当前的cpu负载;若所述当前的cpu负载小于预设负载阈值,通过所述异步线程,对已分配内存进行内存压缩处理。3.根据权利要求2所述的方法,其特征在于,所述通过所述异步线程,对已分配内存进行内存压缩处理,包括:获取当前多个内核各自对应的cpu负载;将所述多个内核中对应的cpu负载低于所述预设负载阈值的内核作为目标内核;通过所述目标内核运行所述异步线程,对已分配内存进行内存压缩处理。4.根据权利要求1所述的方法,其特征在于,所述若当前的空闲内存低于预设内存,唤醒异步线程,包括:在执行直接内存回收操作或后台内存回收操作时,若当前的空闲内存低于预设内存,唤醒所述异步线程。5.根据权利要求1-4任一所述的方法,其特征在于,所述方法还包括:通过所述异步线程,对已压缩内存进行解压缩处理。6.根据权利要求5所述的方法,其特征在于,所述通过所述异步线程,对已压缩内存进行解压缩处理,包括:响应于将目标应用切换到前台运行的指令,通过所述异步线程提前对所述目标应用对应的内存进行解压缩处理。7.根据权利要求5所述的方法,其特征在于,所述异步线程包括第一异步线程和第二异步线程,所述通过所述异步线程,对已分配内存进行内存压缩处理,包括:通过所述第一异步线程,对已分配内存进行内存压缩处理;所述通过所述异步线程,对已压缩内存进行解压缩处理,包括:通过所述第二异步线程,对已压缩内存进行解压缩处理。8.一种内存管理装置,其特征在于,所述装置包括:唤醒单元,用于若当前的空闲内存低于预设内存,唤醒异步线程,所述异步线程为用户线程;压缩单元,用于通过所述异步线程,对已分配内存进行内存压缩处理。9.一种电子设备,其特征在于,包括一个或多个处理器;一个或多个程序被存储在所述存储器中并被配置为由所述一个或多个处理器执行权利要求1-7任一所述的方法。10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有程序代码,其中,在所述程序代码被处理器运行时执行权利要求1-7任一所述的方法。

技术总结


本申请实施例公开了一种内存管理方法、装置、电子设备及存储介质。所述方法包括:若当前的空闲内存低于预设内存,唤醒异步线程,所述异步线程为用户线程;通过所述异步线程,对已分配内存进行内存压缩处理。通过上述方法,在检测到空闲内存低于预设内存时,通过创建的用户线程提前启动内存压缩操作,可以提升系统响应速度,并且用户线程是完全建立在用户空间的线程库,用户线程的创建、调度、同步和销毁全由库函数在用户空间完成,不需要内核的帮助,因此,通过用户线程对已分配内存进行内存压缩处理,对CPU的消耗是极低的,并且进行内存压缩处理是非常高效的。理是非常高效的。理是非常高效的。


技术研发人员:

李培锋 张诗明

受保护的技术使用者:

广东明创软件科技有限公司

技术研发日:

2022.08.23

技术公布日:

2022/12/29

本文发布于:2024-09-23 08:25:46,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/49286.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:内存   线程   所述   内核
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议