一种CPU资源分配方法和终端与流程

文档序号:11250721阅读:661来源:国知局
一种CPU资源分配方法和终端与流程

本发明涉及终端技术领域,尤其涉及一种cpu资源分配方法和终端。



背景技术:

目前,随着互联网的发展和终端技术的发展,人们越来越依赖于终端,尤其是移动终端来完成衣食住行等方方面面的事情。各种功能、各种类型的应用应运而生,为用户提供服务。随之而来的是用户终端上装载的应用越来越多,所以移动终端需要同时运行的程序、进程的数量也越来越大。

为了终端能够运行流畅,带给用户良好的体验,终端上的cpu核在短短几年之间从两核到四核再到八核。虽然如今的终端厂商极力增加cpu的数量和提高cpu的频率,但是随着应用提供的功能类型的增多以及功能的逐渐强大和全面,用户终端上装载的应用也越来越多,终端需要运行的进程也越来越多,单单依靠在终端上提高cpu数量和频率的方式已经不能满足用户的需要了,而且cpu数量和频率的提高对终端厂商而言意味着终端成本的增加,此外更多的cpu意味着更多的功耗,这对终端的续航能力也提出了新的要求。因此,现有技术中急需一种既能保证用户体验流畅度,又能合理分配cpu资源,在不影响终端性能的同时,又能够降低终端功耗的方案。



技术实现要素:

本发明的主要目的在于提出一种cpu资源分配方法和终端,旨在解决现有技术中缺乏既能保证用户体验流畅度,又能合理分配cpu资源,在不影响终端性能的同时降低终端功耗的方案的问题。

为实现上述目的,本发明提供的一种终端,包括:

设置模块,用于确定终端内处于非终止状态的进程,根据进程对用户与终端的交互体验的重要程度,将进程划分为预设的不同等级的cpu设置节点;

监测模块,用于监测终端内各个cpu核心的状态,确定当前在线的cpu核心的信息;

分配模块,用于根据各个cpu设置节点的等级的高低,为各个cpu设置节点分配运行进程的在线cpu核心的资源。

进一步的,监测模块,用于为每个cpu核心设置监视器,利用监视器监听对应的各cpu核心的系统文件变化;当系统文件发生变化,读取变化后的内容,根据内容确定各cpu核心是否在线。

进一步的,分配模块,用于若在线cpu核心的频率相同,则按照cpu设置节点的等级高低为各等级cpu设置节点设置在线cpu核心的分配数量;其中,同一cpu核心可同时分配给不同等级的cpu设置节点;否则,则优先将高频率的在线cpu核心分配给等级高的cpu设置节点,以及为等级高的cpu设置节点分配更多数量的cpu核心。

进一步的,设置模块,用于根据进程当前所需的cpu核心资源的高低,将进程划分为等级不同的cpu设置节点;cpu设置节点等级越高,对应的进程所需的cpu核心资源越高;或者,根据进程是否与用户直接交互,将进程划分为不同类型,将不同类型的进程划分为不同等级的cpu设置节点。

进一步的,设置模块,用于将终端内处于非终止状态的进程按照前台进程、后台进程、系统进程分为三类,分别对应于前台进程节点、后台进程节点、系统进程节点;前台进程节点等级最高,后台进程节点等级最低。

为实现上述目的,本发明还提供的一种cpu资源分配方法,包括:

确定终端内处于非终止状态的进程,根据进程对用户与终端的交互体验的重要程度,将进程划分为预设的不同等级的cpu设置节点;

监测终端内各个cpu核心的状态,获取当前在线的cpu核心的信息;

根据各个cpu设置节点的等级的高低,为各个cpu设置节点分配运行进程的在线cpu核心的资源。

进一步的,监测终端内各个cpu核心的状态,确定当前在线的cpu核心的信息包括:

为每个cpu核心设置监视器,利用监视器监听对应的各cpu核心的系统文件变化;

当系统文件发生变化,读取变化后的内容,根据内容确定各cpu核心是否在线。

进一步的,根据各个cpu设置节点的等级的高低,为各个cpu设置节点分配运行进程的在线cpu核心的资源包括:

若在线cpu核心的频率相同,则按照cpu设置节点的等级高低为各等级cpu设置节点设置在线cpu核心的分配数量;其中,同一cpu核心可同时分配给不同等级的cpu设置节点;

否则,则优先将高频率的在线cpu核心分配给等级高的cpu设置节点,以及为等级高的cpu设置节点分配更多数量的cpu核心。

进一步的,根据进程对用户与终端的交互体验的重要程度,将进程划分为预设的不同等级的cpu设置节点包括:

根据进程当前所需的cpu核心资源的高低,将进程划分为等级不同的cpu设置节点;cpu设置节点等级越高,对应的进程所需的cpu核心资源越高;

或者,根据进程是否与用户直接交互,将进程划分为不同类型,将不同类型的进程划分为不同等级的cpu设置节点。

进一步的,根据进程是否与用户直接交互,将进程划分为不同类型,将不同类型的进程划分为不同等级的cpu设置节点包括包括:

将终端内处于非终止状态的进程按照前台进程、后台进程、系统进程分为三类,分别对应于前台进程节点、后台进程节点、系统进程节点;前台进程节点等级最高,后台进程节点等级最低。

采用本发明,终端可以确定自身处于非终止状态的进程,根据这些进程对用户与终端的交互体验的重要程度,将进程划分为预设的不同等级的cpu设置节点;并监测终端内各个cpu核心的状态,获取当前在线的cpu核心的信息;根据各个cpu设置节点的等级的高低,为各个cpu设置节点分配运行进程的在线cpu核心的资源。由于本发明中是根据各cpu核心在线情况以及处于非终止状态的进程的重要性,动态地为处于非终止状态的进程分配运行该进程的cpu核心资源,可以保证重要进程的运行,提高了android整体性能,保证用户体验的流畅,并且在此基础上尽可能降低终端功耗,从而达到性能与功耗的平衡。在终端使用过程中,进程分类、cpu核心资源分配策略,都可以二次微调,进一步保证终端的性能与功耗的平衡。

附图说明

图1为实现本发明各个实施例的移动终端的硬件结构示意图;

图2是本发明的一种终端的模块示意图;

图3是本发明的图2中的终端识别前台进程、后台进程的方法的流程图;

图4是本发明的图2中的终端动态监测cpu核心状态的方法的流程图;

图5是本发明一种终端的硬件结构示意图;

图6是本发明的一种cpu资源分配方法的流程图;

图7是本发明的一种识别前台进程、后台进程的方法的流程图。

本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。

具体实施方式

应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

现在将参考附图描述实现本发明各个实施例的移动终端。在后续的描述中,使用用于表示元件的诸如“模块”、“部件”或“单元”的后缀仅为了有利于本发明的说明,其本身并没有特定的意义。因此,"模块"与"部件"可以混合地使用。

移动终端可以以各种形式来实施。例如,本发明中描述的终端可以包括诸如移动电话、智能电话、笔记本电脑、数字广播接收器、pda(个人数字助理)、pad(平板电脑)、pmp(便携式多媒体播放器)、导航装置等等的移动终端以及诸如数字tv、台式计算机等等的固定终端。下面,假设终端是移动终端,然而,本领域技术人员将理解的是,除了特别用于移动目的的元件之外,根据本发明的实施方式的构造也能够应用于固定类型的终端。

图1为实现本发明各个实施例一个可选的移动终端的硬件结构示意图。

移动终端100可以包括无线通信单元110、a/v(音频/视频)输入单元120、用户输入单元130、感测单元140、输出单元150、存储器160、接口单元170、控制器180和电源单元190等等。图1示出了具有各种组件的移动终端,但是应理解的是,并不要求实施所有示出的组件,可以替代地实施更多或更少的组件,将在下面详细描述移动终端的元件。

无线通信单元110通常包括一个或多个组件,其允许移动终端100与无线通信系统或网络之间的无线电通信。例如,无线通信单元可以包括广播接收模块111、移动通信模块112、无线互联网模块113、短程通信模块114和位置信息模块115中的至少一个。

广播接收模块111经由广播信道从外部广播管理服务器接收广播信号和/或广播相关信息。广播信道可以包括卫星信道和/或地面信道。广播管理服务器可以是生成并发送广播信号和/或广播相关信息的服务器或者接收之前生成的广播信号和/或广播相关信息并且将其发送给终端的服务器。广播信号可以包括tv广播信号、无线电广播信号、数据广播信号等等。而且,广播信号可以进一步包括与tv或无线电广播信号组合的广播信号。广播相关信息也可以经由移动通信网络提供,并且在该情况下,广播相关信息可以由移动通信模块112来接收。广播信号可以以各种形式存在,例如,其可以以数字多媒体广播(dmb)的电子节目指南(epg)、数字视频广播手持(dvb-h)的电子服务指南(esg)等等的形式而存在。广播接收模块111可以通过使用各种类型的广播系统接收信号广播。特别地,广播接收模块111可以通过使用诸如多媒体广播-地面(dmb-t)、数字多媒体广播-卫星(dmb-s)、数字视频广播-手持(dvb-h),前向链路媒体(mediaflo@)的数据广播系统、地面数字广播综合服务(isdb-t)等等的数字广播系统接收数字广播。广播接收模块111可以被构造为适合提供广播信号的各种广播系统以及上述数字广播系统。经由广播接收模块111接收的广播信号和/或广播相关信息可以存储在存储器160(或者其它类型的存储介质)中。

移动通信模块112将无线电信号发送到基站(例如,接入点等等)、外部终端以及服务器中的至少一个和/或从其接收无线电信号。这样的无线电信号可以包括语音通话信号、视频通话信号、或者根据文本和/或多媒体消息发送和/或接收的各种类型的数据。

无线互联网模块113支持移动终端的无线互联网接入。该模块可以内部或外部地耦接到终端。该模块所涉及的无线互联网接入技术可以包括wlan(无线lan)(wi-fi)、wibro(无线宽带)、wimax(全球微波互联接入)、hsdpa(高速下行链路分组接入)等等。

短程通信模块114是用于支持短程通信的模块。短程通信技术的一些示例包括蓝牙tm、射频识别(rfid)、红外数据协会(irda)、超宽带(uwb)、紫蜂tm等等。

位置信息模块115是用于检查或获取移动终端的位置信息的模块。位置信息模块的典型示例是gps(全球定位系统)。根据当前的技术,gps模块115计算来自三个或更多卫星的距离信息和准确的时间信息并且对于计算的信息应用三角测量法,从而根据经度、纬度和高度准确地计算三维当前位置信息。当前,用于计算位置和时间信息的方法使用三颗卫星并且通过使用另外的一颗卫星校正计算出的位置和时间信息的误差。此外,gps模块115能够通过实时地连续计算当前位置信息来计算速度信息。

a/v输入单元120用于接收音频或视频信号。a/v输入单元120可以包括相机121和麦克风1220,相机121对在视频捕获模式或图像捕获模式中由图像捕获装置获得的静态图片或视频的图像数据进行处理。处理后的图像帧可以显示在显示模块151上。经相机121处理后的图像帧可以存储在存储器160(或其它存储介质)中或者经由无线通信单元110进行发送,可以根据移动终端的构造提供两个或更多相机121。麦克风122可以在电话通话模式、记录模式、语音识别模式等等运行模式中经由麦克风接收声音(音频数据),并且能够将这样的声音处理为音频数据。处理后的音频(语音)数据可以在电话通话模式的情况下转换为可经由移动通信模块112发送到移动通信基站的格式输出。麦克风122可以实施各种类型的噪声消除(或抑制)算法以消除(或抑制)在接收和发送音频信号的过程中产生的噪声或者干扰。

用户输入单元130可以根据用户输入的命令生成键输入数据以控制移动终端的各种操作。用户输入单元130允许用户输入各种类型的信息,并且可以包括键盘、锅仔片、触摸板(例如,检测由于被接触而导致的电阻、压力、电容等等的变化的触敏组件)、滚轮、摇杆等等。特别地,当触摸板以层的形式叠加在显示模块151上时,可以形成触摸屏。该触摸屏可以作为本发明中的触屏,该触摸屏可以在用户点击操作屏幕时,检测到用户触摸触摸屏的位置,并将该触摸位置上报给移动终端的终端系统进行处理。

感测单元140检测移动终端100的当前状态,(例如,移动终端100的打开或关闭状态)、移动终端100的位置、用户对于移动终端100的接触(即,触摸输入)的有无、移动终端100的取向、移动终端100的加速或减速移动和方向等等,并且生成用于控制移动终端100的操作的命令或信号。例如,当移动终端100实施为滑动型移动电话时,感测单元140可以感测该滑动型电话是打开还是关闭。另外,感测单元140能够检测电源单元190是否提供电力或者接口单元170是否与外部装置耦接。感测单元140可以包括接近传感器141。

接口单元170用作至少一个外部装置与移动终端100连接可以通过的接口。例如,外部装置可以包括有线或无线头戴式耳机端口、外部电源(或电池充电器)端口、有线或无线数据端口、存储卡端口、用于连接具有识别模块的装置的端口、音频输入/输出(i/o)端口、视频i/o端口、耳机端口等等。识别模块可以是存储用于验证用户使用移动终端100的各种信息并且可以包括用户识别模块(uim)、客户识别模块(sim)、通用客户识别模块(usim)等等。另外,具有识别模块的装置(下面称为"识别装置")可以采取智能卡的形式,因此,识别装置可以经由端口或其它连接装置与移动终端100连接。接口单元170可以用于接收来自外部装置的输入(例如,数据信息、电力等等)并且将接收到的输入传输到移动终端100内的一个或多个元件或者可以用于在移动终端和外部装置之间传输数据。

另外,当移动终端100与外部底座连接时,接口单元170可以用作允许通过其将电力从底座提供到移动终端100的路径或者可以用作允许从底座输入的各种命令信号通过其传输到移动终端的路径。从底座输入的各种命令信号或电力可以用作用于识别移动终端是否准确地安装在底座上的信号。输出单元150被构造为以视觉、音频和/或触觉方式提供输出信号(例如,音频信号、视频信号、警报信号、振动信号等等)。

输出单元150可以包括显示模块151、音频输出模块152、警报模块153等等。

显示模块151可以显示在移动终端100中处理的信息。例如,当移动终端100处于电话通话模式时,显示模块151可以显示与通话或其它通信(例如,文本消息收发、多媒体文件下载等等)相关的用户界面(ui)或图形用户界面(gui)。当移动终端100处于视频通话模式或者图像捕获模式时,显示模块151可以显示捕获的图像和/或接收的图像、示出视频或图像以及相关功能的ui或gui等等。

同时,当显示模块151和触摸板以层的形式彼此叠加以形成触摸屏时,显示模块151可以用作输入装置和输出装置。显示模块151可以包括液晶显示器(lcd)、薄膜晶体管lcd(tft-lcd)、有机发光二极管(oled)显示器、柔性显示器、三维(3d)显示器等等中的至少一种。这些显示器中的一些可以被构造为透明状以允许用户从外部观看,这可以称为透明显示器,典型的透明显示器可以例如为toled(透明有机发光二极管)显示器等等。根据特定想要的实施方式,移动终端100可以包括两个或更多显示模块(或其它显示装置),例如,移动终端可以包括外部显示模块(未示出)和内部显示模块(未示出)。触摸屏可用于检测触摸输入压力以及触摸输入位置和触摸输入面积。

音频输出模块152可以在移动终端处于呼叫信号接收模式、通话模式、记录模式、语音识别模式、广播接收模式等等模式下时,将无线通信单元110接收的或者在存储器160中存储的音频数据转换音频信号并且输出为声音。而且,音频输出模块152可以提供与移动终端100执行的特定功能相关的音频输出(例如,呼叫信号接收声音、消息接收声音等等)。音频输出模块152可以包括扬声器、蜂鸣器等等。

警报模块153可以提供输出以将事件的发生通知给移动终端100。典型的事件可以包括呼叫接收、消息接收、键信号输入、触摸输入等等。除了音频或视频输出之外,警报模块153可以以不同的方式提供输出以通知事件的发生。例如,警报模块153可以以振动的形式提供输出,当接收到呼叫、消息或一些其它进入通信(incomingcommunication)时,警报模块153可以提供触觉输出(即,振动)以将其通知给用户。通过提供这样的触觉输出,即使在用户的移动电话处于用户的口袋中时,用户也能够识别出各种事件的发生。警报模块153也可以经由显示模块151或音频输出模块152提供通知事件的发生的输出。

存储器160可以存储由控制器180执行的处理和控制操作的软件程序等等,或者可以暂时地存储己经输出或将要输出的数据(例如,电话簿、消息、静态图像、视频等等)。而且,存储器160可以存储关于当触摸施加到触摸屏时输出的各种方式的振动和音频信号的数据。本发明中,存储器160可以用来存储cpu设置节点的信息,cpu设置节点对应的进程情况,为各个进程分配的cpu资源等等。

存储器160可以包括至少一种类型的存储介质,存储介质包括闪存、硬盘、多媒体卡、卡型存储器(例如,sd或dx存储器等等)、随机访问存储器(ram)、静态随机访问存储器(sram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、可编程只读存储器(prom)、磁性存储器、磁盘、光盘等等。而且,移动终端100可以与通过网络连接执行存储器160的存储功能的网络存储装置协作。

控制器180通常控制移动终端的总体操作。例如,控制器180执行与语音通话、数据通信、视频通话等等相关的控制和处理。另外,控制器180可以包括用于再现(或回放)多媒体数据的多媒体模块181,多媒体模块181可以构造在控制器180内,或者可以构造为与控制器180分离。控制器180可以执行模式识别处理,以将在触摸屏上执行的手写输入或者图片绘制输入识别为字符或图像。

电源单元190在控制器180的控制下接收外部电力或内部电力并且提供操作各元件和组件所需的适当的电力。

这里描述的各种实施方式可以以使用例如计算机软件、硬件或其任何组合的计算机可读介质来实施。对于硬件实施,这里描述的实施方式可以通过使用特定用途集成电路(asic)、数字信号处理器(dsp)、数字信号处理装置(dspd)、可编程逻辑装置(pld)、现场可编程门阵列(fpga)、处理器、控制器、微控制器、微处理器、被设计为执行这里描述的功能的电子单元中的至少一种来实施,在一些情况下,这样的实施方式可以在控制器180中实施。对于软件实施,诸如过程或功能的实施方式可以与允许执行至少一种功能或操作的单独的软件模块来实施。软件代码可以由以任何适当的编程语言编写的软件应用程序(或程序)来实施,软件代码可以存储在存储器160中并且由控制器180执行。

至此,己经按照其功能描述了移动终端。下面,为了简要起见,将描述诸如折叠型、直板型、摆动型、滑动型移动终端等等的各种类型的移动终端中的滑动型移动终端作为示例。因此,本发明能够应用于任何类型的移动终端,并且不限于滑动型移动终端。

如图1中所示的移动终端100可以被构造为利用经由帧或分组发送数据的诸如有线和无线通信系统以及基于卫星的通信系统来操作。

基于上述移动终端的硬件结构,提出本发明的终端的各个实施例,cpu资源分配方法的各个实施例。本发明的终端,包括:设置模块,用于确定终端内处于非终止状态的进程,根据各进程的重要程度,将进程划分为预设的不同等级的cpu设置节点;监测模块,用于监测终端内各个cpu核心的状态,获取当前在线的cpu核心的信息;分配模块,用于根据各个cpu设置节点的等级的高低,为各个cpu设置节点分配运行进程的在线cpu核心的资源。

实施例一:

终端的进程一般有四个状态,运行,等待,睡眠,终止,而本实施例处理的对象为终端非终止状态的进程。参见图2,本实施例中示出了一种终端,该终端能参考linux内核中的一种cgroups机制,对终端内处于非终止状态的进程按照进程的重要程度分为至少两个不同等级的cpu设置节点(cpuset节点),然后动态获取终端内在线的cpu信息,根据cpuset节点的重要程度,为各个节点分配在线cpu资源。以便终端能够自动限制单个或多个进程所能使用的资源,使得重要的进程可能分配到多的cpu资源,通过对cpu资源的分配保证终端的流畅度,并且在不影响性能的同事,避免新增在线cpu以便降低终端的功耗。

其中,cgroups是linux内核提供的一种机制,可以用来限制单个进程或者多个进程所能使用的资源。资源包括cpu核心、cpu时间片、内存、io、网络数据等。其中cpuset子系统可以限制进程能够运行的cpu核以及能够使用的内存节点。参考上述的机制,对于当前的多核终端如当前主流的8核终端,可以利用cpuset方案来限制进程运行在哪个或哪几个cpu核上,从而达到性能与功耗的平衡。

本实施例的终端包括:设置模块21,用于确定终端内处于非终止状态的进程,根据这些进程对用户与终端的交互体验的重要程度,将进程划分为预设的不同等级的cpu设置节点;监测模块22,用于监测终端内各个cpu核心的状态,获取当前在线的cpu核心的信息;分配模块23,用于根据各个cpu设置节点的等级的高低,为各个cpu设置节点分配运行进程的在线cpu核心的资源。

其中,本实施例的终端一般为多核终端,终端cpu核的数量不限,可以是八核,也可以是其他核数。该终端可以是手机、平板、笔记本电脑等移动终端,也可以是台式电脑等固定终端,本实施例对此没有限定。

我们知道,android提出了组件的概念,组件是搭建应用程序的“积木”;进程的概念被弱化了,它们作为进程的载体而存在。因此,进程的重要程度由它所承载的组件状态决定的。在android中,进程(这里主要指java进程)的管理工作由activitymanagerservice(活动管理服务,后文简称ams)来承担。在ams中有一个成员变量mlruprocesses,保存着系统中所有处于非终止状态的进程(可以理解为活着的进程,包括处于运行状态的进程,处于等待状态的进程,处于睡眠状态的进程)的信息。我们对进程划分为不同等级的cpuset节点,也是基于mlruprocesses进行的。在一个实施例中,设置模块21,用于根据ams的成员变量保存的系统中所有活着的进程的信息,确定终端内处于非终止状态的进程。

进一步的,设置模块21根据处于非终止状态的各进程对用户与终端的交互体验的重要程度,将进程划分为预设的不同等级的cpu设置节点的过程中,是需要确定进程的重要程度的。关于进程对用户与终端交互体验的重要程度可以根据该进程对当前终端流畅度的影响确定,对应终端当前流畅度的影响高的进程(处于非终止状态的进程)则重要程度高。

ams的成员变量mlruprocesses,根据进程重要性由低到高的顺序,保存着系统中所有处于非终止状态的进程的信息。在一个实施例中,终端对于处于非终止状态的进程划分cpuset节点可以直接根据mlruprocesses保存的进程的顺序来进行,mlruprocesses保存的重要性高的进程划分为等级较高的cpu设置节点。cpu设置节点的等级数量可以任意设置,但是考虑到cpu核数的限制,等级数量的设置以不超过cpu核数为宜,例如分为2-4个等级。其中,各个等级的cpu设置节点对应的进程可以根据cpu设置节点的数量和mlruprocesses保存的处于非终止状态的进程的数量决定。例如,处于非终止状态的进程数量为n(n为正整数)个,第一等级(等级最高)cpu设置节点对应的进程的为重要性排在前1/2n个,第二等cpu设置节点对应的进程为在第一等级cpu设置节点中进程的后1/3n个,剩下的进程划分为第三等级cpu设置节点。

在一实施例中,设置模块21可以根据处于非终止状态的各进程当前所需的cpu资源的高低,将进程划分为等级不同的cpu设置节点,例如,分别为不同等级的cpu设置节点设置对应的预设cpu资源范围,若处于非终止状态的进程所需的cpu资源在哪一个预设cpu资源范围内,则将该处于非终止状态的进程划分为对应等级的cpuset节点,其中cpu设置节点等级的数量没有限定。

考虑到在实际应用的时候,考虑到在终端中,需要面对用户、与用户交互的进程是带给用户直接使用体验的进程,若是这些进程运行的cpu资源充足,则终端运行流畅,用户体验度好,反之终端容易出现卡顿、反应慢等问题,降低用户体验,所以这些进程的重要程度较高。而不需要和用户直接交互的进程对终端流畅的体验度影响较小,所以可以认为这些进程的重要程度稍微低一些。所以在一个实施例中,设置模块21,用于根据处于非终止状态的的各进程是否与用户直接交互,将处于非终止状态的的各进程划分为不同类型,将不同类型的进程划分为不同等级的cpu设置节点。其中,进程的类型包括但不限于系统进程,能与用户直接交互的进程、不能与用户直接交互的进程等等。其中,设置模块21可以根据处于非终止状态的的各进程是否属于与用户直接交互的进程类型,将处于非终止状态的进程划分为不同等级的cpu设置节点。例如,将与用户直接交互的进程设置为第一等级(等级最高)cpu设置节点,将不能与用户直接交互的进程设置为第二等级cpu设置节点。

进一步的,考虑到系统进程是维系整个系统的进程,也比较重要,在对进程进行不同等级cpuset节点划分时,可以将进程按照前台进程、后台进程和系统进程划分为三类。设置模块21,用于将终端内处于非终止状态的进程按照前台进程、后台进程、系统进程分为三类,分别对应于前台进程节点、后台进程节点、系统进程节点,其中,前台进程等级最高,后台进程等级最低。

对于设置模块21而言,其需要完成前台、后台、系统进程的识别。其中,系统进程systemserver的识别比较简单,因为系统就一个systemserver进程。但一个进程为前台进程foreground,还是后台进程background,是一个动态的概念,foreground进程可能被推到后台成为background进程,反之background进程也可能推到前台成为foreground进程。终端需要找到对应的转换点,在转换点将进程移入恰当的分类,使得进程受到对应cpuset节点的控制。

进一步的,设置模块21,用于将系统服务进程systemserver划分为系统进程;获取当前正处于前台的活动,将活动的关联进程记为疑似前台进程;获取当前处于非终止状态的进程,若处于非终止状态的进程为疑似前台进程,则判断该进程为前台进程,否则为后台进程。其中,上述活动的关联进程包括活动所在的进程,活动所在进程绑定的服务所在的进程,活动所在进程绑定的内容提供者所在的进程;

根据android内存管理框架,在打开程序或者有程序进入后台时都会执行updateoomadjlocked()函数,所以这个函数就是一个绝佳的分析位置,我们在该函数里面进行foreground/background的识别与转换,

参见图3,该图示出了设置模块21识别前台进程和后台进程的过程,其中,可以理解的是,下列过程中的进程不包括上述的systemserver进程。其中,假设cpuset节点设置为前台进程节点、后台进程节点、系统进程节点,其中系统服务进程systemserver划分为系统进程节点。本实施例下述的方案是建立在已经存在前台进程节点、后台进程节点、系统进程节点的基础上进行的。

根据图3,识别前台进程和后台进程,并划分cpuset节点的方法包括:

s301、执行第一获取指令,该第一获取指令用于从系统对应的存储位置中获取当前处于前台的活动activity;

在系统中,一般updateoomadjlocked()函数中存储有当前正处于前台的活动,所以在s301中,可以进入updateoomadjlocked()函数中获取当前处于前台的活动。

s302、确定当前正处于前台的活动activity,记为top-act;

s303、确定top-act所在的进程,记为top-app;

s304、获取foreground集合,该集合包括:1、top-app;2、top-app绑定的service所在的进程;3、top-app绑定的contentprovider所在的进程;

该上述的foreground集合为前述方案中的疑似前台进程的集合。

s305、判断当前处于前台的活动top-act是否处理完毕,若是,则结束,否则进入s306;

s306、从当前处于前台的活动top-act中取出下一个需要处理的进程app;

s307、判断该进程app是否在foreground集合内,若是,则进入s308a,否则进入s308b;

若是在第一次识别前台进程和后台进程的时候,例如开机的时候,手机从关机状态启动,只要识别出进程app在foreground集合内,就判断是前台进程,加入前台进程节点,否则为后台进程,加入后台进程节点。下面的步骤是已经存在前台进程节点和后台进程节点后,对各节点对应的进程情况的更新过程。

s308a、判断该进程app之前是否为后台进程,若是,则进入s309a1,否则进入s309a2;

在s308a中,在判断该进程app之前是否为后台进程前,还可以先判断该进程app之前是否处于被杀死的状态,若是,则进入s309a1,直接将该进程app设置为前台进程节点;而不用再判断该进程app之前是否为前台进程。

s309a1、将进程app加入前台进程节点(cpuset-foreground);

s309a2、说明进程app一直是前台进程,没有发生前台进程和后台进程的切换,前台进程节点对应的进程中已经存在该进程app,所以不用处理;

s308b、判断该进程app之前是否为前台进程,若是,则进入s309b1,否则进入s309b2;

在s308b中,在判断该进程app之前是否为前台进程前,还可以先判断该进程app之前是否处于被杀死的状态,若是,则进入s309b1,直接将该进程app设置为后台进程节点;而不用再判断该进程app之前是否为后台进程。

s309a1、将进程app加入后台进程节点(cpuset-foreground);

s309a2、说明进程app一直是后台进程,没有发生前台进程/后台进程的切换,后台进程节点对应的进程中已经存在该进程app,所以不用处理。

实际中,为了降功耗,当前cpu都支持dvfs(dynamicvoltageandfrequencyscaling,简称dvfs,动态电压频率调整),对于多核如8核的cpu来说,在负载很高时,8核会同时在线,但在负载较低时,只会有1-2个核在线,这也被称作cpuhotplug。因此,为cpuset节点设置的cpu核心不能是固定的,假若是固定的,当对应的核心下线时,cpuset子节点所管辖的进程将得不到调度!极大影响了系统的性能。所以终端需要监测cpu核心在线状态,根据当前在线的cpu核心,动态设置cpuset节点对应的cpu核心的资源。

其中,监测终端内cpu的状态可以利用现有的安卓系统中的方案实现,也可以根据inux设备模型实现。根据linux设备模型,当第x(对于8核cpu,x的取值为集合[0,7])个cpu核心在线时,sys文件(系统文件)/sys/devices/system/cpu/cpux/online的内容为1,否则sys文件的内容为0。对于8核cpu,一共有8个对应的sys文件。所以我们可以通过设置监视器监视各个cpu的系统文件变化来实现对各cpu的在线状态的确定。

本实施例中的监测模块22,用于为每个cpu核心的设置监视器,利用监视器监听对应的各cpu核心的系统文件变化;当系统文件发生变化,读取变化后的内容,根据内容确定各个cpu核心是否在线。本实施例中每个cpu核心都有各自对应的监视器实现系统文件的监控。该监视器的设置位置可以是在系统文件中,也可以是在系统文件外,监视路径为sys文件路径,监视的事件包括in_modify,即sys文件中被改动,则说明cpu核心的状态发生了改变。

进一步的,监测模块22可以利用linux文件系统变化通知机制—inotify来监测cpu核心在线状态,使得分配模块23完成动态调整cpuset节点对应的cpu核心。

参见图4,示出了监测模块22利用inotify机制+poll系统调用来监测cpu核心在线状态的方法,该方法是在上述图3示出的方法之后进行。该方法的流程包括:

s401、分别为每个cpu核心的sys文件添加一个监视器inotify_watch:监视的路径为sys文件路径;监视的事件为in_modify,代表sys文件被改动;

若终端的cpu是8核cpu,共有8个监视器inotify_watch。

s402、利用监视器inotify_watch获取对应的各cpu核心的状态,加入预设的集合中;

例如将监视器inotify_watch对应inotify_device的文件描述符fd加入到pollfd集合uds中,一共8个fd;这些文件描述符可以实时反映当前的cpu核心状态,所以在s402之后可以直接根据这些描述符fd得到在线的cpu核心信息,然后进入s405进行cpu核心资源的分配。之后,若是cpu核心的状态发生变化,可以利用下面的步骤动态更新cpu在线信息,进而根据实际情况重新分配cpu核心资源。

s403、调用poll监听sys文件变化,其中,如果sys文件没有变化则一直阻塞下去,若是发生变化,则阻塞解除;

s404、判断预设的集合是否遍历完毕,若是,则进入s405,否则进入s406;

s405、根据当前在线cpu集合,为各个cpuset节点设置cpu核心资源;

s406、当前监视器是否监测到了系统文件变化?若是,则进入s407,否则进入s408;

s407、读取系统文件变化后的内容,获得对应的cpu核心在线状态;

s408、更新当前在线cpu集合,更新方式包括:

①如果之前在线而本次下线,则从在线cpu集合中删除对应的cpu核心;

②如果之前下线而本次上线,则将对应的cpu核心加入在线cpu集合。

更新在线cpu集合之后,可以根据当前在线cpu集合,为各个cpuset节点设置cpu核心资源。

当在线cpu核心的信息确定后,分配模块23可以实现cpu资源的分配。其中,考虑到cpu核心的频率可能不同,分配模块23有以下的两种分配方案:

第一:若在线cpu核心的频率相同,则按照cpu设置节点的等级高低为各等级cpu设置节点设置cpu核心的分配数量;例如等级高的cpuset节点分配的cpu核心多,等级低的cpuset节点分配的cpu核心少。

其中,为了提高终端性能,同一cpu可同时分配给不同等级的cpu设置节点。

第二:若cpu核心的频率不完全相同,则优先将高频率的cpu分配给等级高的cpuset节点,以及为等级高的cpuset节点分配更多数量的cpu。例如假如终端上的cpu有四个大核心,四个小核心,则优先将更多的大核心分配给等级高的cpuset节点,例如上文中的前台进程节点,第一等级cpu设置节点。

下面以cpuset节点为前台进程节点、后台进程节点、系统进程节点为例,说明如何合理地为cpuset节点分配核心。以下的示例仅供参考,并不对本实施例中的实际核心的分配有任何限制。

假如本实施例的终端是八核终端,cpu分为大核(对应cpu核心[4-7])、小核(对应cpu核心[0-3]),大核的频率比小核高,当然也更耗电。所以cpuset节点的设置也要考虑大核/小核的在线状态,这里给出一种思路:

①大核与小核都在线时,将1个小核分给cpuset-background,1-2个小核给cpuset-systemserver,其他的小核与大核都分给cpuset-foreground;

②只有小核在线时,将1个小核分给cpuset-background,1-2个小核给cpuset-systemserver,所有小核分给cpuset-foreground,这种情况下,cpuset-background与cpuset-systemserver以及cpuset-foreground可以共用某些小核;

③只有大核在线时,将1个大核分给cpuset-background,1个大核分给cpuset-systemserver,所有大核分给cpuset-foreground。这种情况下,cpuset-background与cpuset-systemserver以及cpuset-foreground可以共用某些大核。

采用本实施例,将linux中先进的机制落地到android系统中,本技术方案扫除了在android上实施cpuset机制的障碍,使得android可以享用linux中cpuset机制的成果,提高了android整体性能。在具体实施阶段,进程分类、cpu核心资源分配策略,都可以二次微调,能有效地保证终端的性能,并且在此基础上尽可能降低终端功耗,从而达到性能与功耗的平衡,保证用户体验的流畅。

实施例二:

参见图5,本实施例示出了一种终端,包括控制器51,存储器52。控制器51用于确定终端内处于非终止状态的进程,根据处于非终止状态的的各进程对用户与终端的交互体验的重要程度,将进程划分为预设的不同等级的cpu设置节点;监测终端内各个cpu核心的状态,获取当前在线的cpu核心的信息;根据各个cpu设置节点的等级的高低,为各个cpu设置节点分配运行进程的在线cpu核心的资源。其中,关于不同等级的cpu设置节点的信息以及为各个cpu设置节点分配运行进程的在线cpu核心资源的信息可以保存在存储器52中。

其中,本实施例的终端一般为多核终端,终端cpu核的数量不限,可以是八核,也可以是其他核数。该终端可以是手机、平板、笔记本电脑等移动终端,也可以是台式电脑等固定终端,本实施例对此没有限定。

我们知道,android提出了组件的概念,组件是搭建应用程序的“积木”;进程的概念被弱化了,它们作为进程的载体而存在。因此,进程的重要程度由它所承载的组件状态决定的。在android中,进程(这里主要指java进程)的管理工作由activitymanagerservice(活动管理服务,后文简称ams)来承担。在ams中有一个成员变量mlruprocesses,保存着系统中所有处于非终止状态的进程的信息。我们对进程划分为不同等级的cpuset节点,也是基于mlruprocesses进行的。在一个实施例中,控制器51用于根据ams的成员变量保存的系统中所有处于非终止状态的进程的信息,确定终端内处于非终止状态的进程。

进一步的,控制器51根据处于非终止状态的的各进程对用户与终端的交互体验的重要程度,将进程划分为预设的不同等级的cpu设置节点的过程中,需要确定进程对用户与终端的交互体验的重要程度。关于该重要程度可以根据该进程对当前终端流畅度的影响确定,对应终端当前流畅度的影响高的进程则重要程度高。

ams的成员变量mlruprocesses,根据进程重要性由低到高的顺序,保存着系统中所有活着的进程的信息。在一个实施例中,终端对于处于非终止状态的进程划分cpuset节点可以直接根据mlruprocesses保存的进程的顺序来进行,mlruprocesses保存的重要性高的进程划分为等级较高的cpu设置节点。cpu设置节点的等级数量可以任意设置,但是考虑到cpu核数的限制,等级数量的设置以不超过cpu核数为宜,例如分为2-4个等级。其中,各个等级的cpu设置节点对应的进程可以根据cpu设置节点的数量和mlruprocesses保存的处于非终止状态的进程的数量决定。例如,处于非终止状态的进程数量为n(n为正整数)个,第一等级(等级最高)cpu设置节点对应的进程的为重要性排在前1/2n个,第二等cpu设置节点对应的进程为在第一等级cpu设置节点中进程的后1/3n个,剩下的进程划分为第三等级cpu设置节点。

在一实施例中,控制器51可以根据处于非终止状态的的各进程当前所需的cpu资源的高低,将进程划分为等级不同的cpu设置节点,例如,分别为不同等级的cpu设置节点设置对应的预设cpu资源范围,若处于非终止状态的进程所需的cpu资源在哪一个预设cpu资源范围内,则将该处于非终止状态的进程划分为对应等级的cpuset节点,其中cpu设置节点等级的数量没有限定。

考虑到在实际应用的时候,考虑到在终端中,需要面对用户、与用户交互的进程是带给用户直接使用体验的进程,若是这些进程运行的cpu资源充足,则终端运行流畅,用户体验度好,反之终端容易出现卡顿、反应慢等问题,降低用户体验,所以这些进程的重要程度较高。而不需要和用户直接交互的进程对终端流畅的体验度影响较小,所以可以认为这些进程的重要程度稍微低一些。所以在一个实施例中,控制器51用于根据处于非终止状态的的各进程是否与用户直接交互,将处于非终止状态的的各进程划分为不同类型,将不同类型的进程划分为不同等级的cpu设置节点。其中,进程的类型包括但不限于系统进程,能与用户直接交互的进程、不能与用户直接交互的进程等等。其中,控制器51可以根据处于非终止状态的的各进程是否属于与用户直接交互的进程类型,将处于非终止状态的进程划分为不同等级的cpu设置节点。例如,将与用户直接交互的进程设置为第一等级(等级最高)cpu设置节点,将不能与用户直接交互的进程设置为第二等级cpu设置节点。

进一步的,考虑到系统进程是维系整个系统的进程,也比较重要,在对进程进行不同等级cpuset节点划分时,可以将进程按照前台进程、后台进程和系统进程划分为三类。控制器51用于将终端内处于非终止状态的进程按照前台进程、后台进程、系统进程分为三类,分别对应于前台进程节点、后台进程节点、系统进程节点,其中,前台进程等级最高,后台进程等级最低。

对于控制器51而言,其需要完成前台、后台、系统进程的识别。其中,系统进程systemserver的识别比较简单,因为系统就一个systemserver进程。但一个进程为前台进程foreground,还是后台进程background,是一个动态的概念,foreground进程可能被推到后台成为background进程,反之background进程也可能推到前台成为foreground进程。终端需要找到对应的转换点,在转换点将进程移入恰当的分类,使得进程受到对应cpuset节点的控制。

进一步的,控制器51用于将系统服务进程systemserver划分为系统进程;获取当前正处于前台的活动,将活动的关联进程记为疑似前台进程;获取当前处于非终止状态的进程,若处于非终止状态的进程为疑似前台进程,则判断该进程为前台进程,否则为后台进程。其中,上述活动的关联进程包括活动所在的进程,活动所在进程绑定的服务所在的进程,活动所在进程绑定的内容提供者所在的进程;

根据android内存管理框架,在打开程序或者有程序进入后台时都会执行updateoomadjlocked()函数,所以这个函数就是一个绝佳的分析位置,我们在该函数里面进行foreground/background的识别与转换,

对于控制器51识别前台进程和后台进程,并划分cpuset节点的方法可以参考实施例一中的图3以及上文关于图3的相关说明。本实施例在此不再赘述。

实际中,为了降功耗,当前cpu都支持dvfs(dynamicvoltageandfrequencyscaling,简称dvfs,动态电压频率调整),对于多核如8核的cpu来说,在负载很高时,8核会同时在线,但在负载较低时,只会有1-2个核在线,这也被称作cpuhotplug。因此,为cpuset节点设置的cpu核心不能是固定的,假若是固定的,当对应的核心下线时,cpuset子节点所管辖的进程将得不到调度!极大影响了系统的性能。所以终端需要监测cpu核心在线状态,根据当前在线的cpu核心,动态设置cpuset节点对应的cpu核心的资源。

其中,控制器51监测终端内cpu的状态可以利用现有的安卓系统中的方案实现,也可以根据inux设备模型实现。根据linux设备模型,当第x(对于8核cpu,x的取值为集合[0,7])个cpu核心在线时,sys文件(系统文件)/sys/devices/system/cpu/cpux/online的内容为1,否则sys文件的内容为0。对于8核cpu,一共有8个对应的sys文件。所以控制器51可以通过设置监视器监视各个cpu的系统文件变化来实现对各cpu的在线状态的确定。

进一步的,本实施例中的控制器51用于为每个cpu核心的设置监视器,利用监视器监听对应的各cpu核心的系统文件变化;当系统文件发生变化,读取变化后的内容,根据内容确定各个cpu核心是否在线。本实施例中每个cpu核心都有各自对应的监视器实现系统文件的监控。该监视器的设置位置可以是在系统文件中,也可以是在系统文件外,监视路径为sys文件路径,监视的事件包括in_modify,即sys文件中被改动,则说明cpu核心的状态发生了改变。

进一步的,控制器51可以利用linux文件系统变化通知机制—inotify来监测cpu核心在线状态,完成动态调整cpuset节点对应的cpu核心。

对于控制器51利用inotify机制+poll系统调用来监测cpu核心在线状态的实例,可以参见实施例一中的图4以及相关说明。本实施例在此不再赘述。

当在线cpu核心的信息确定后,控制器51可以实现cpu资源的分配。其中,考虑到cpu核心的频率可能不同,分配模块23有以下的两种分配方案:

第一:若在线cpu核心的频率相同,则按照cpu设置节点的等级高低为各等级cpu设置节点设置cpu核心的分配数量;例如等级高的cpuset节点分配的cpu核心多,等级低的cpuset节点分配的cpu核心少。

其中,为了提高终端性能,同一cpu可同时分配给不同等级的cpu设置节点。

第二:若cpu核心的频率不完全相同,则优先将高频率的cpu分配给等级高的cpuset节点,以及为等级高的cpuset节点分配更多数量的cpu。例如假如终端上的cpu有四个大核心,四个小核心,则优先将更多的大核心分配给等级高的cpuset节点,例如上文中的前台进程节点,第一等级cpu设置节点。

下面以cpuset节点为前台进程节点、后台进程节点、系统进程节点为例,说明控制器51如何合理地为cpuset节点分配核心。以下的示例仅供参考,并不对本实施例中的实际核心的分配有任何限制。

假如本实施例的终端是八核终端,cpu分为大核(对应cpu核心[4-7])、小核(对应cpu核心[0-3]),大核的频率比小核高,当然也更耗电。所以cpuset节点的设置也要考虑大核/小核的在线状态,这里给出一种思路:

①大核与小核都在线时,控制器51将1个小核分给cpuset-background,1-2个小核给cpuset-systemserver,其他的小核与大核都分给cpuset-foreground;

②只有小核在线时,控制器51将1个小核分给cpuset-background,1-2个小核给cpuset-systemserver,所有小核分给cpuset-foreground,这种情况下,cpuset-background与cpuset-systemserver以及cpuset-foreground可以共用某些小核;

③只有大核在线时,控制器51将1个大核分给cpuset-background,1个大核分给cpuset-systemserver,所有大核分给cpuset-foreground。这种情况下,cpuset-background与cpuset-systemserver以及cpuset-foreground可以共用某些大核。

采用本实施例,android系统中可以享用linux中cpuset机制的成果,根据cpu核心在线情况以及处于非终止状态的进程的重要性,动态地为处于非终止状态的进程分配运行该进程的cpu核心。在具体实施阶段,进程分类、cpu核心资源分配策略,都可以二次微调,能有效地保证终端的性能,并且在此基础上尽可能降低终端功耗,从而达到性能与功耗的平衡,保证用户体验的流畅。

实施例三:

参见图6,本实施例示出一种cpu资源分配方法,包括:

s601、确定终端内处于非终止状态的进程,根据处于非终止状态的的各进程对用户与终端的交互体验的重要程度,将进程划分为预设的不同等级的cpu设置节点;

s602、监测终端内各个cpu核心的状态,获取当前在线的cpu核心的信息;

s603、根据各个cpu设置节点的等级的高低,为各个cpu设置节点分配运行进程的在线cpu核心的资源。

其中,本实施例的终端一般为多核终端,终端cpu核的数量不限,可以是八核,也可以是其他核数。该终端可以是手机、平板、笔记本电脑等移动终端,也可以是台式电脑等固定终端,本实施例对此没有限定。

我们知道,android提出了组件的概念,组件是搭建应用程序的“积木”;进程的概念被弱化了,它们作为进程的载体而存在。因此,进程的重要程度由它所承载的组件状态决定的。在android中,进程(这里主要指java进程)的管理工作由activitymanagerservice(活动管理服务,后文简称ams)来承担。在ams中有一个成员变量mlruprocesses,保存着系统中所有处于非终止状态的进程的信息。我们对进程划分为不同等级的cpuset节点,也是基于mlruprocesses进行的。在一个实施例中,s601中可以根据ams的成员变量保存的系统中所有处于非终止状态的进程的信息,确定终端内处于非终止状态的进程。

进一步的,s601中根据各进程的重要程度,将进程划分为预设的不同等级的cpu设置节点的过程中,是需要确定进程的重要程度的。关于进程的重要程度可以根据该进程对当前终端流畅度的影响确定,对应终端当前流畅度的影响高的进程(处于非终止状态的进程)则重要程度高。

ams的成员变量mlruprocesses,根据进程重要性由低到高的顺序,保存着系统中所有处于非终止状态的进程的信息。在一个实施例中,终端对于处于非终止状态的进程划分cpuset节点可以直接根据mlruprocesses保存的进程的顺序来进行,mlruprocesses保存的重要性高的进程划分为等级较高的cpu设置节点。cpu设置节点的等级数量可以任意设置,但是考虑到cpu核数的限制,等级数量的设置以不超过cpu核数为宜,例如分为2-4个等级。其中,各个等级的cpu设置节点对应的进程可以根据cpu设置节点的数量和mlruprocesses保存的处于非终止状态的进程的数量决定。例如,处于非终止状态的进程数量为n(n为正整数)个,第一等级(等级最高)cpu设置节点对应的进程的为重要性排在前1/2n个,第二等cpu设置节点对应的进程为在第一等级cpu设置节点中进程的后1/3n个,剩下的进程划分为第三等级cpu设置节点。

在一实施例中,s601中的根据处于非终止状态的的各进程对用户与终端的交互体验的重要程度,将进程划分为预设的不同等级的cpu设置节点包括:根据处于非终止状态的的各进程当前所需的cpu资源的高低,将进程划分为等级不同的cpu设置节点,例如,分别为不同等级的cpu设置节点设置对应的预设cpu资源范围,若处于非终止状态的进程所需的cpu资源在哪一个预设cpu资源范围内,则将该处于非终止状态的进程划分为对应等级的cpuset节点,其中cpu设置节点等级的数量没有限定。

考虑到在实际应用的时候,考虑到在终端中,需要面对用户、与用户交互的进程是带给用户直接使用体验的进程,若是这些进程运行的cpu资源充足,则终端运行流畅,用户体验度好,反之终端容易出现卡顿、反应慢等问题,降低用户体验,所以这些进程的重要程度较高。而不需要和用户直接交互的进程对终端流畅的体验度影响较小,所以可以认为这些进程的重要程度稍微低一些。

所以在一个实施例中,s601中的根据处于非终止状态的的各进程对用户与终端的交互体验的重要程度,将进程划分为预设的不同等级的cpu设置节点包括:根据处于非终止状态的的各进程是否与用户直接交互,将处于非终止状态的的各进程划分为不同类型,将不同类型的进程划分为不同等级的cpu设置节点。其中,进程的类型包括但不限于系统进程,能与用户直接交互的进程、不能与用户直接交互的进程等等。其中,s601中可以根据处于非终止状态的的各进程是否属于与用户直接交互的进程类型,将处于非终止状态的进程划分为不同等级的cpu设置节点。例如,将与用户直接交互的进程设置为第一等级(等级最高)cpu设置节点,将不能与用户直接交互的进程设置为第二等级cpu设置节点。

进一步的,考虑到系统进程是维系整个系统的进程,也比较重要,在对进程进行不同等级cpuset节点划分时,可以将进程按照前台进程、后台进程和系统进程划分为三类。根据处于非终止状态的的各进程的类型,将不同类型的进程划分为不同等级的cpu设置节点包括:将终端内处于非终止状态的进程按照前台进程、后台进程、系统进程分为三类,分别对应于前台进程节点、后台进程节点、系统进程节点,其中,前台进程等级最高,后台进程等级最低。

在s601中需要完成前台、后台、系统进程的识别。其中,系统进程systemserver的识别比较简单,因为系统就一个systemserver进程。但一个进程为前台进程foreground,还是后台进程background,是一个动态的概念,foreground进程可能被推到后台成为background进程,反之background进程也可能推到前台成为foreground进程。终端需要找到对应的转换点,在转换点将进程移入恰当的分类,使得进程受到对应cpuset节点的控制。

进一步的将终端内处于非终止状态的进程按照前台进程、后台进程、系统进程分为三类包括:将系统服务进程systemserver划分为系统进程;获取当前正处于前台的活动,将活动的关联进程记为疑似前台进程;获取当前处于非终止状态的进程,若处于非终止状态的进程为疑似前台进程,则判断该进程为前台进程,否则为后台进程。其中,上述活动的关联进程包括活动所在的进程,活动所在进程绑定的服务所在的进程,活动所在进程绑定的内容提供者所在的进程;

根据android内存管理框架,在打开程序或者有程序进入后台时都会执行updateoomadjlocked()函数,所以这个函数就是一个绝佳的分析位置,我们在该函数里面进行foreground/background的识别与转换,

参见图7,该图示出了将终端内处于非终止状态的进程按照前台进程、后台进程、系统进程分为三类的具体方法,该方法包括:

s701、预先设置三种cpuset节点-前台进程节点、后台进程节点、系统进程节点;

s702、将系统服务进程systemserver划分为系统进程节点;

s703、执行第一获取指令,该第一获取指令用于从系统对应的存储位置中获取当前处于前台的活动activity;

在系统中,一般updateoomadjlocked()函数中存储有当前正处于前台的活动,所以在s703中,可以进入updateoomadjlocked()函数中获取当前处于前台的活动。

s704、确定当前正处于前台的活动activity,记为top-act;

s705、确定top-act所在的进程,记为top-app;

s706、获取foreground集合,该集合包括:1、top-app;2、top-app绑定的service所在的进程;3、top-app绑定的contentprovider所在的进程;

该上述的foreground集合为前述方案中的疑似前台进程的集合。

s707、判断当前处于前台的活动top-act是否处理完毕,若是,则结束,否则进入s708;

s708、从当前处于前台的活动top-act中取出下一个需要处理的进程app;

s709、判断该进程app是否在foreground集合内,若是,则进入s710,否则进入s711;

s710、将该进程app为前台进程,划分为前台进程节点,

s711、将该进程app为后台进程,划分为后台进程节点。

实际中,为了降功耗,当前cpu都支持dvfs(dynamicvoltageandfrequencyscaling,简称dvfs,动态电压频率调整),对于多核如8核的cpu来说,在负载很高时,8核会同时在线,但在负载较低时,只会有1-2个核在线,这也被称作cpuhotplug。因此,为cpuset节点设置的cpu核心不能是固定的,假若是固定的,当对应的核心下线时,cpuset子节点所管辖的进程将得不到调度!极大影响了系统的性能。所以终端需要监测cpu核心在线状态,根据当前在线的cpu核心,动态设置cpuset节点对应的cpu核心的资源。

其中,监测终端内cpu的状态可以利用现有的安卓系统中的方案实现,也可以根据inux设备模型实现。根据linux设备模型,当第x(对于8核cpu,x的取值为集合[0,7])个cpu核心在线时,sys文件(系统文件)/sys/devices/system/cpu/cpux/online的内容为1,否则sys文件的内容为0。对于8核cpu,一共有8个对应的sys文件。所以我们可以通过设置监视器监视各个cpu的系统文件变化来实现对各cpu的在线状态的确定。

本实施例中的s602中的监测终端内各个cpu核心的状态,确定当前在线的cpu核心包括:为每个cpu核心的设置监视器,利用监视器监听对应的各cpu核心的系统文件变化;当系统文件发生变化,读取变化后的内容,根据内容确定各个cpu核心是否在线。本实施例中每个cpu核心都有各自对应的监视器实现系统文件的监控。该监视器的设置位置可以是在系统文件中,也可以是在系统文件外,监视路径为sys文件路径,监视的事件包括in_modify,即sys文件中被改动,则说明cpu核心的状态发生了改变。

进一步的,在s602中可以利用linux文件系统变化通知机制—inotify来监测以及poll系统调用来监测cpu核心在线状态。对于利用inotify机制+poll系统调用来监测cpu核心在线状态的方法,参考实施例一中的图4以及相关的叙述。本实施例在此不再赘述。

当在线cpu核心的信息确定后,可以实现cpu资源的分配。其中,考虑到cpu核心的频率可能不同,s603根据各个cpu设置节点的等级的高低,为各个cpu设置节点分配运行进程的在线cpu核心的资源有以下的两种分配方案:

第一:若在线cpu核心的频率相同,则按照cpu设置节点的等级高低为各等级cpu设置节点设置cpu核心的分配数量;例如等级高的cpuset节点分配的cpu核心多,等级低的cpuset节点分配的cpu核心少。

其中,为了提高终端性能,同一cpu可同时分配给不同等级的cpu设置节点。

第二:若cpu核心的频率不完全相同,则优先将高频率的cpu分配给等级高的cpuset节点,以及为等级高的cpuset节点分配更多数量的cpu。例如假如终端上的cpu有四个大核心,四个小核心,则优先将更多的大核心分配给等级高的cpuset节点,例如上文中的前台进程节点,第一等级cpu设置节点。其中,为了提高终端性能,同一cpu可同时分配给不同等级的cpu设置节点。

对于cpuset节点为前台进程节点、后台进程节点、系统进程节点的情况下,cpu核心资源的分配参考前两个实施例的相关叙述,本实施例对此不再赘述。

采用本实施例,将linux中先进的机制落地到android系统中,本技术方案扫除了在android上实施cpuset机制的障碍,使得android可以享用linux中cpuset机制的成果,提高了android整体性能。在具体实施阶段,进程分类、cpu核心资源分配策略,都可以二次微调,能有效地保证终端的性能,并且在此基础上尽可能降低终端功耗,从而达到性能与功耗的平衡,保证用户体验的流畅。

需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。

上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如rom/ram、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例的方法。

以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。

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