发明内容
本发明提供一种终端设备系统程序的启动方法及装置,以解决现有技术中系统资源使用效率低的技术问题。
本发明提供一种终端设备系统程序的启动方法,所述方法包括:
将系统程序内包含的多个程序模块划分为多个任务组,每个所述任务组中包括至少一个程序模块,具有依赖关系的两个程序模块被分配在不同的任务组,每个所述任务组中的部分或全部程序模块与其它任务组中的程序模块具有依赖关系;
根据各任务组之间程序模块的依赖关系,确定各个所述任务组的组间启动顺序;
按照所述任务组内各程序模块并行启动,各任务组之间根据所述组间启动顺序依次启动的方式启动系统程序。
本发明提供还一种终端设备系统程序的启动装置,包括:处理器、存储器和通信接口,所述处理器、所述存储器和所述通信接口通信总线相连;
所述通信接口,用于接收和发送信号;
所述存储器,用于存储程序代码;
所述处理器,用于读取所述存储器中存储的程序代码,并执行如权利要求1至8中任一项所述的方法。
本发明的实施例提供的技术方案可以包括以下有益效果:
本发明提供一种终端设备系统程序的启动方法及装置,本方法将多个程序模块划分为多个任务组,每个任务组中至少存在一个程序模块与其它任务组中程序模块具有依赖关系,而每个任务组内的各个程序模块之间不具有依赖关系。以上分组方式,使得系统程序内各个程序模块的依赖关系更为清晰,在根据实际需求增减需要启动的程序模块时,可根据程序模块的依赖关系直接调整相关任务组,从而增强系统程序启动的可配置性能和可扩展性能。本方法中,各任务组之间根据相应程序模块的依赖关系依次启动,可确保各个任务组内程序模块的正常启动;任务组内各程序模块以并行方式启动,有利缩短系统程序的启动时间,提高系统资源的使用效率。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本发明。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本发明相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本发明的一些方面相一致的装置的例子。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其它实施例的不同之处。
图2是本发明实施例1中提供的一种终端设备系统程序启动方法的方法流程图。由图2可见,本方法可包括以下步骤:
步骤S101:将系统程序内包含的多个程序模块划分为多个任务组。
每个所述任务组中包括至少一个程序模块,具有依赖关系的两个程序模块被分配在不同的任务组,每个所述任务组中的部分或全部程序模块与其它任务组中的程序模块具有依赖关系。
通常,系统层次高的程序模块需要依赖系统层次低的程序模块,因而,可借助于程序模块所属的系统层次划分任务组。当然,对于划分任务组,其他可能的实施方式也可以是,先确定出与其他程序模块具有依赖关系的多个程序模块,将以上确定出的多个程序模块中具有依赖关系的程序模块划分为不同的任务组,与系统程序内其他程序模块均不具有依赖关系的程序模块,可随机划分到以上任意一个任务组中。
例如,本实施例中,系统程序可包括程序模块1-程序模块N,共N个程序模块。其中,程序模块1、程序模块2、程序模块5、程序模块10和程序模块15与系统程序内其他程序模块具有依赖关系。具体的,程序模块2依赖程序模块1;程序模块5和程序模块10均依赖程序模块2,且程序模块5和程序模块10之间不存在依赖关系;程序模块15依赖程序模块10。
图3是本发明实施例1中提供的一种系统程序内包含的多个程序模块划分任务组的流程示意图。由图3可见,本方法可先确定出与系统程序内其他程序模块具有依赖关系的程序模块1、程序模块2、程序模块5、程序模块10和程序模块15,再根据以上5个程序模块之间的依赖关系,将彼此具有依赖关系的程序模块1、程序模块2和程序模块15分别划分至任务组11、任务组12和任务组13,将不存在依赖关系的程序模块5和程序模块10划分至任务组14。对于除程序模块1、程序模块2、程序模块5、程序模块10和程序模块15以外的其他程序模块,可随机划分至任务组11、任务组12、任务组13和任务组14中的任意一组。
步骤S102:根据各任务组之间程序模块的依赖关系,确定各个所述任务组的组间启动顺序。
本实施例中,程序模块2依赖程序模块1;程序模块5和程序模块10均依赖程序模块2,且程序模块5和程序模块10之间不存在依赖关系;程序模块15依赖程序模块10,因此,各任务组的组间启动顺序应为任务组11>任务组12>任务组14>任务组13。
步骤S103:按照所述任务组内各程序模块并行启动,各任务组之间根据所述组间启动顺序依次启动的方式启动系统程序。
本发明提供一种终端设备系统程序的启动方法及装置,本方法将多个程序模块划分为多个任务组,每个任务组中至少存在一个程序模块与其它任务组中程序模块具有依赖关系,而每个任务组内的各个程序模块之间不具有依赖关系。以上分组方式,使得系统程序内各个程序模块的依赖关系更为清晰,在根据实际需求增减需要启动的程序模块时,可根据程序模块的依赖关系直接调整相关任务组,从而增强系统程序启动的可配置性能和可扩展性能。本方法中,各任务组之间根据相应程序模块的依赖关系依次启动,可确保各个任务组内程序模块的正常启动;任务组内各程序模块以并行方式启动,有利缩短系统程序的启动时间,提高系统资源的使用效率。
本发明实施例2中,系统程序内包括的程序模块可为IIC(集成电路总线,英文全称:Inter-Integrated Circuit)、GPIO(总线扩展器,英文全称:General Purpose InputOutput)、总线驱动、设置管理模块、数据访问中间件、消息中间件、对象中间件、数字电视协议栈、外接功放设备以及移动存储器。
图4是本发明实施例2中提供的一种终端设备系统程序启动方法的方法流程图。由图4可见,本方法可包括以下步骤:
步骤S201:确定系统程序内包含的所述多个程序模块的系统层次。
实施例2中各个程序模块的系统层次可确定为:IIC、GPIO、总线驱动和设置管理模块属于硬件抽象层;数据访问中间件、消息中间件、对象中间件和数字电视协议栈属于中间件层;高频头、外接功放设备以及移动存储器属于外围设备管理模块。
步骤S202:确定属于同一系统层次的各个程序模块之间的依赖关系。
确定属于同一系统层次的各个程序模块之间的依赖关系,即判断属于同一系统层次的程序模块是否需要调用本系统层次其它程序模块提供的方法,或者访问本系统层次其它程序模块中的某些数据成员。经过以上判断,本实施例中,属于同一系统层次的各个程序模块之间的依赖关系均不存在依赖关系。
步骤S203:将属于同一系统层次的各个程序模块划分为至少一个任务组。
由于属于同一系统层次的各个程序模块之间的依赖关系均不存在依赖关系,因此,可将硬件抽象层对应的各程序模块划分为任务组21、中间件层对应的各程序模块划分为任务组22、外围设备管理模块对应的各程序模块划分为任务组23。
步骤S204:根据各任务组之间程序模块的依赖关系,确定各个所述任务组的组间启动顺序。
本实施例可按照各个程序模块所属的系统层次由低到高的顺序,确定各个所述任务组的组间启动顺序。本实施例中系统层次由低到高依次为硬件抽象层、中间件层和外围设备管理模块,因而,相应的各个所述任务组的组间启动顺序为:任务组21>任务组22>任务组23。
图5是本发明实施例2中提供的一种多线程的工作示意图。由图5可见,线程池内包括M个线程,所述M个线程可分为工作和空闲两种状态。线程池首先为第一个任务组(任务组21)分配四个线程,其中,每一个线程关联第一个任务组中的一个程序模块。分配至任务组21的四个线程并行启动。在任务组21中的各程序模块均启动完成后,线程池将接收到各程序模块的反馈信息,此时,线程池再为任务组22分配相应的线程,并以此类推,从而实现任务组内各程序模块并行启动,各任务组之间根据组间启动顺序依次启动。
在本发明其他可能的情况中,例如,任务组内程序模块的数量较大或者线程池内处于空闲状态的线程较少,线程池无法为任务组内每一个程序模块分配一个相关联的线程时,线程池可以根据任务组内程序模块的数量创建新的线程,以使任务组内各程序模块均可以实现并行启动。线程池具体的工作流程可体现为以下步骤。
步骤S205:线程池为所述组间启动顺序中第一个任务组内的各程序模块分别分配一个相关联的线程。
步骤S206:各线程同时调用相应程序模块的抽象接口。
本发明所述的程序模块可继承统一的抽象接口,这些接口包含但不限于:检测相关资源是否可用、初始化硬件及程序模块、向系统注册、挂载,以使程序模块对外可用。其中,每一个程序模块可包括多个抽象接口,相关联的线程可按照固定逻辑依次调用所述多个抽象接口,若多个抽象接口均调用成功,则相应的程序模块调用完成。
步骤S207:判断所述第一个任务组内的各程序模块的抽象接口是否均完成调用,如果是,则执行步骤S208。
图6是本发明实施例2中提供的一种步骤S207的方法流程图。由图6可见,步骤S207可包括以下步骤:
步骤S2071:确定是否接收到所述第一个任务组内全部程序模块的执行结果信息。如果是,则执行步骤S2072。
步骤S2072:判断所述执行结果信息是否均为执行成功信息。如果所述执行结果信息均为执行成功信息,则执行步骤S2073。
步骤S2073:确认所述第一个任务组内各程序模块的抽象接口均完成调用。
与程序模块相关联的线程在执行结束时,将执行结果信息发送至线程池。当相应程序模块的抽象接口全部被调用成功时,则线程发送的执行结果信息为执行成功信息;当相应程序模块的抽象接口由于调用参数错误、调用方式错误,或者被依赖的程序模块未预先启动等原因无法被全部调用成功时,则线程发送的执行结果信息为执行失败信息。在对应任务组内的全部线程均反馈执行成功信息后,所述对应任务组启动完成。
步骤S208:按照所述组间启动顺序同时启动下一任务组内的各程序模块。
步骤S209:判断所述下一任务组内的各程序模块是否均完成启动,若是,则重复执行本步骤S208。
图7是本发明实施例3中提供的一种终端设备系统程序启动方法的方法流程图。由图7可见,本方法可包括以下步骤:
步骤S301:确定系统程序内包含的所述多个程序模块的系统层次。
步骤S302:在同一系统层次内,确定各个程序模块之间所具有的各个依赖关系的依赖级数。其中,所述依赖级数至少为两级,每一级至少对应一个程序模块。
在同一系统层次内,各个程序模块之间也可能具有依赖关系(如硬件抽象层中的高频头需要依赖IIC)。有时,各个程序模块之间的依赖关系还可能比较复杂,可能存在一个程序模块依赖多个程序模块的多重依赖关系,或者,多个程序模块依次依赖的链状依赖关系。因此,为了明确划分同一系统层次内各个程序模块之间的依赖关系,可将同一系统层次内的多种依赖关系对应设置为不同的依赖级数。依赖关系的依赖级数越低,则构成此依赖关系的程序模块需要越早启动,以便依赖此程序模块的其他程序模块可以顺利启动。
步骤S303:将所述各个依赖关系中属于同一级别的程序模块划分为一组。
由于同一任务组内的各个程序模块需并行启动,因此,彼此之间具有依赖关系的程序模块需要分别划分在不同的任务组中,以确保各个程序模块的顺利启动。本实施例中,可将各个依赖关系中属于同一级别的程序模块划分为一组。
步骤S304:将与所属系统层次内的程序模块均不具有依赖关系的程序模块,随机划分到所属系统层次的任意一个任务组中。
更为优选的,在本发明其他实施例中,也可以将与所属系统层次内的程序模块均不具有依赖关系的程序模块,平均划分到所属系统层次的各个任务组中。如果以上不具有依赖关系的程序模块的数量与任务组的数量不匹配,无法将以上程序模块完全平均划分到所属系统层次的各个任务组中,则可以随机选择出一个任务组,保证此任务组以外的其他任务组内程序模块的数量均相同。
以上平均划分的分配方式,可使各个任务组内程序模块的数量相对均衡,避免线程池针对某一个程序模块数量较多的任务组创建大量线程后,再为后续其他任务组分配线程时,出现大量处于空闲状态的线程,造成系统资源的浪费,降低系统资源的使用效率。
例如,本实施例中,某一系统层次内可包括程序模块1-程序模块M,共M个程序模块。其中,程序模块1-程序模块8与本系统层次内其他程序模块具有依赖关系,其余程序模块与本系统层次内其他程序模块不具有依赖关系。
图8是本发明实施例3中提供的一种同一系统程序内多个程序模块划分任务组的流程示意图。
由图8可见,本方法可先确定程序模块1-程序模块8的依赖关系。具体的,程序模块2依赖程序模块1、程序模块4依赖程序模块2和程序模块3、程序模块5依赖程序模块3、程序模块6和程序模块7均依赖程序模块5、程序模块8依赖程序模块7。按照以上依赖关系,可将程序模块1的依赖级数确定为1级、程序模块2的依赖级数确定为2级、程序模块3的依赖级数确定为3级、程序模块4(程序模块5)的依赖级数确定为4级、程序模块5(程序模块4)的依赖级数确定为5级、程序模块6和程序模块7的依赖级数确定为6级、程序模块8的依赖级数确定为7级。按照以上依赖级数,将属于同一级别的程序模块划分为一组,即将程序模块1-程序模块8相应划分为7个任务组。同时,将与所属系统层次内的程序模块均不具有依赖关系的程序模块平均分配至以上7个任务组中。
步骤S305:根据各个所述任务组的系统层次,确定不同系统层次的所述各个任务组的组间启动顺序。
步骤S306:如果同一系统层次内包括多个任务组,则根据同一系统层次内各个任务组中程序模块的依赖级数,确定同一系统层次内各个任务组的组间启动顺序。
步骤S307:按照所述任务组内各程序模块并行启动,各任务组之间根据所述组间启动顺序依次启动的方式启动系统程序。
图9是本发明实施例提供的一种终端设备系统程序启动装置的结构示意图。如图9所示,该启动装置900,其结构可包括:至少一个处理器(processor)901、内存(memory)902、外围设备接口(peripheral interface)903、输入/输出子系统(I/O subsystem)904、电力线路905和通信线路906。
在图9中,箭头表示能进行计算机系统的构成要素间的通信和数据传送,且其可利用高速串行总线(high-speed serial bus)、并行总线(parallel bus)、存储区域网络(SAN,Storage Area Network)和/或其他适当的通信技术而实现。
内存902可包括操作系统912和启动控制例程922。例如,内存902可包括高速随机存取存储器(high-speed random access memory)、磁盘、静态随机存取存储器(SPAM)、动态随机存取存储器(DRAM)、只读存储器(ROM)、闪存或非挥发性内存。内存902可存储用于操作系统912和启动控制例程922的程序编码,也就是说可包括启动装置900的动作所需的程序模块、指令集架构或其之外的多种数据。此时,处理器901或外围设备接口906等其他控制器与内存902的存取可通过处理器901进行控制。
外围设备接口903可将启动装置900的输入和/或输出外围设备与处理器901和内存902相结合。并且,输入/输出子系统904可将多种输入/输出外围设备与外围设备接口906相结合。例如,输入/输出子系统904可包括显示器、键盘、鼠标、打印机或根据需要用于将照相机、各种传感器等外围设备与外围设备接口903相结合的控制器。输入/输出外围也可不经过输入/输出子系统904而与外围设备接口903相结合,即终端设备电路及制冷设备电路也可不经过输入/输出子系统904而与外围设备接口903相结合。
电力线路905可向终端设备的电路元件的全部或部分供给电力。例如,电力线路905可包括如电力管理系统、电池或交流(AC)之一个以上的电源、充电系统、电源故障检测电路(power failure detection circuit)、电力变换器或逆变器、电力状态标记符或用于电力生成、管理、分配的任意其他电路元件。
处理器901通过施行存储在内存902中的程序模块或指令集架构可执行启动装置900的多种功能且处理数据。也就是说,处理器901通过执行基本的算术、逻辑以及计算机系统的输入/输出演算,可构成为处理计算机程序的命令。
以上所述的本发明实施方式,并不构成对本发明保护范围的限定。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明的保护范围之内。
需要说明的是,在本文中,诸如“第一”和“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上所述仅是本发明的具体实施方式,使本领域技术人员能够理解或实现本发明。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。