一种任务被多线程执行并发出请求的确定方法和电子设备与流程

文档序号:32607944发布日期:2022-12-20 18:30阅读:48来源:国知局
一种任务被多线程执行并发出请求的确定方法和电子设备与流程

1.本发明涉及线程执行研究技术领域,尤其涉及一种任务被多线程执行并 发出请求的确定方法和电子设备。


背景技术:

2.在android平台下,如果使用了c++的native程序来开发的网络请求程 序,其网络请求任务则是具有io的功能耗时的任务会设计成多线程执行的, 由于io是一个耗时操作则为了保障的程序性能,需要多线程来执行,且一定 涉及到线程队列来调度任务和暂存任务,一旦具有任务队列那么任务则会在 队列中进行排队等候多个线程来消费任务并去执行任务。同时对于android平 台通常是java层来投递网络任务而native层则执行网络任务。因此其具有跨 语言的情况下来执行多个请求任务。
3.因此如何能够确认的任务是能够在多个线程中同时并发得到执行的, 而不是被任务队列排序成单任务的执行,是亟待解决的问题。


技术实现要素:

4.本发明提供了一种任务被多线程执行并发出请求的确定方法,基于hook 的方式,进行阶段性的采样,获取每个任务阶段的执行时间和线程id;
5.并对应别创建多个线程,能够进行并发任务请求统计,并进行分阶段的耗时 函数统计,利于线程执行阶段的确定和优化。
6.一种任务被多线程执行并发出请求的确定方法,包括:
7.建立枚举变量,以区分并判断任务的执行阶段;
8.并建立数据结构,以存储任务的阶段信息;
9.确定任务执行阶段;
10.基于hook的方式,在每个阶段层的执行过程中,进行阶段性的采样,以 获取调用堆栈信息、每个任务阶段的执行时间和线程id;
11.基于每个任务请求,对应创建多个线程,以进行并发任务请求统计和阶 段的耗时函数统计。
12.优选的是,所述枚举变量对应任务的执行阶段,其包括:任务在java层 中执行阶段、任务从java层转投递到native中执行阶段、任务在native层中 执行阶段和任务从native层转投递到java中执行阶段。
13.优选的是,所述数据结构对应任务的阶段信息,其包括:任务的阶段信 息、任务此阶段执行的线程id、任务执行的耗时和函数调用堆栈信息。
14.优选的是,基于hook的方式,在每个阶段层的执行过程中,进行阶段性 的采样,以获取调用堆栈信息、每个任务阶段的执行时间和线程id,其具体 包括:
15.定义一个结构变量info data;
16.将所述结构变量的类型赋值为任务在java层中执行阶段;
17.将所述结构变量的id赋值为当前java层执行的线程id;
18.当任务开始时,获取一次系统的当前时间;
19.基于hook的方式,获取当前的函数调用堆栈信息,以确定任务执行阶段 和对应的任务阶段的执行时间。
20.优选的是,基于每个任务请求,对应创建多个线程,以进行并发任务请 求统计和阶段的耗时函数统计,其具体包括:
21.基于每个任务请求,对应创建多个线程,以对应执行所述任务请求;
22.并在每个任务请求执行前,创建了一个统计线程,以统计调用堆栈信息 和线程id;
23.基于任务的每个阶段的执行时间进行排序;
24.对于任务请求,进行并发任务请求统计和阶段的耗时函数统计。
25.优选的是,所述创建线程个数不大于cpu的内核数,所述基于任务的每 个阶段的执行时间进行排序采用降序排列。
26.优选的是,在每个任务请求执行前,创建了一个统计线程,以统计调用 堆栈信息和线程id,其具体包括:
27.基于每个阶段的执行时间进行采样;
28.统计线程则会遍历系统中的所有线程,并暂停所有线程的执行;
29.获取到所有线程同一时刻的执行函数调用堆栈和每个任务的执行线程id 并存储到堆栈信息中。
30.优选的是,对于任务请求,进行并发任务请求统计和阶段的耗时函数统 计,其具体包括:
31.首先,遍历每个任务执行阶段;
32.若任务在执行时发生了线程的变化,则判断存在非并发执行的任务请求;
33.若任务在执行时未发生线程的变化,则判断当前任务的整个执行都是一 个独立的线程
34.然后,查看线程id变化;
35.基于函数调用堆栈,以确定函数存在串行执行;
36.基于统计频率判断一个请求任务的并行执行时间和串行执行时间。
37.第二方面,本发明实施例提供了一种电子设备,包括应用处理器和存储 器,其特征在于,所述处理器用于实现所述存储器中存储得计算机管理程序 式时实现所述的任务被多线程执行并发出请求的确定方法。
38.第三方面,本发明实施例提供了一种计算机可读存储介质,其上存储有 计算机管理类程序,其特征在于,所述计算机管理类程序被处理器执行时实 现所述的任务被多线程执行并发出请求的确定方法。
39.有益效果
40.本发明提供了一种任务被多线程执行并发出请求的确定方法,基于hook 的方式,进行阶段性的采样,获取每个任务阶段的执行时间和线程id;
41.并对应别创建多个线程,能够进行并发任务请求统计,并进行分阶段的耗时 函数统计,利于线程执行阶段的确定和优化。
附图说明
42.图1为本发明所述的一种任务被多线程执行并发出请求的确定方法流程 图。
43.图2为本发明所述的基于hook的方式进行阶段性的采样的流程图。
44.图3为本发明实施例提供的任务被多线程执行的并发出请求的确定装置 的硬件结构示意图。
45.图4为本发明实施例提供的一种可能的电子设备的实施例示意图。
46.图5为本发明实施例提供的一种可能的计算机可读存储介质的实施例示 意图。
具体实施方式
47.以下由特定的具体实施例说明本发明的实施方式,熟悉此技术的人士可 由本说明书所揭露的内容轻易地了解本发明的其他优点及功效,显然,所描 述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的 实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其 他实施例,都属于本发明保护的范围。
48.需要说明的是,在本发明的描述中,术语“中”、“上”、“下”、“横”、“内
”ꢀ
等指示的方向或位置关系的术语是基于附图所示的方向或位置关系,这仅仅 是为了便于描述,而不是指示或暗示所述装置或元件必须具有特定的方位、 以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第 一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性。
49.此外,还需要说明的是,在本发明的描述中,除非另有明确的规定和限 定,术语“设置”、“安装”、“相连”、“连接”应做广义理解,例如,可以是固定 连接,也可以是可拆卸连接,或一体地连接;可以是机械连接;可以是直接 相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通。对于本 领域技术人员而言,可根据具体情况理解上述术语在本发明中的具体含义。
50.如图1所示,基于背景技术提出的技术问题,本发明提供了一种任务被 多线程执行并发出请求的确定方法,包括:
51.步骤s110、建立枚举变量,以区分并判断任务的执行阶段;具体的说, 可以由如下代码实现:
52.定义枚举变量enumtype;
53.枚举变量对应任务的执行阶段,其包括:java_type=0、java_to_native_type、native_type和native_to_java_type;
54.其中,java_type=0表示任务在java层中执行;java_to_native_type表示 任务从java层转投递到native中执行;native_type表示任务在native层中执 行;native_to_java_type表示任务从native层转投递到java中执行。
55.需要特别说明的是,为了便于后续统计和分析,需要对任务的执行各个 阶段进行区分,以方便获取任务的每一个阶段的执行情况,从而实现了便于 通过获取的数据能够知任务的线程执行情况,同时基于时间也便于统计后续 任务是否存在多个线程并发情况的有益效果。
56.步骤s120、并建立数据结构,以存储任务的阶段信息,具体的说,可以 由如下代码实现:
57.定义数据结构structinfo;
58.数据结构包括对应任务的阶段信息,其具体包括:type etype、threadid id、time time和list《stackfunction》stack;
59.其中,type etype存储任务的阶段信息,threadid id存储任务此阶段执 行的线程id,time time存储任务执行的耗时,list《stackfunction》stack存储 的是函数调用堆栈信息;
60.需要特别说明的是,设计一个数据结构,便于存储各个阶段的信息,实 现了便于后期线程创建后的对比和分析的有益效果。
61.步骤s130、确定任务执行阶段;
62.需要特别说明的是,一个任务则存在多个阶段的执行,java层投递的请 求任务放到natvie的c++中执行,存在一个请求任务有部分功能是在java层 执行的,有部分功能是在native的c++中执行的,而在native执行完成后,又 会把结果给到java层,同时可能还涉及到任务的中间结果也会通过回调给到 java层,因此涉及到一个任务会跨多个线程的情况,从而通过确定任务执行 阶段,实现了区分耗时的有益效果。
63.如图2所示,步骤s140、基于hook的方式,在每个阶段层的执行过程 中,进行阶段性的采样,以获取调用堆栈信息、每个任务阶段的执行时间和 线程id;具体的说,包括如下步骤:
64.步骤s141、定义一个结构变量info data;
65.步骤s142、将data.etype类型赋值为java_type阶段;
66.将data.id赋值为当前java层执行的线程id;
67.步骤s143、当任务开始时,获取一次系统的当前时间;
68.步骤s144、基于hook的方式,获取当前的函数调用堆栈信息,以确定 任务执行阶段和对应的任务阶段的执行时间;针对每个任务阶段,具体的确 定过程如下:
69.1)java_type阶段。
70.由于请求任务都是从java层发起的,因此确定java层的阶段则比较容易, 也就是任务发起的阶段。
71.2)java_to_native_type阶段定义。
72.首先,要想投递到native层执行会在native编写一些功能接口,提供给 java层来执行。因此对于java层中如果定义了native的方法则是进行native 的调用。可以把所有在java层注册的与native对应的函数进行hook,
73.基于hook则可以获取到java层的调用堆栈,同时也可以获取此函数对应 于native的哪个函数。同时此函数的调用开始则是java层阶段的调用结束时 间。data.times也就是java_type阶段的时间在可以用此时刻减去java层任务 开始的时间则得到了其在java_type阶段的执行时间。
74.通过java层来获取此函数的调用堆栈信息。
75.3)native_type阶段。
76.在java_to_native_type阶段执行后,会从java层转到native执行,其执 行的函数马上则会转到native的代码中执行,那么可以对c++的native函数 进行hook,从而可以获取到native函数执行开始的时间,此时间也是 java_to_native_type阶段执行结束的时
间,因可以计算出java_to_native_type 阶段的时间则是当前时刻减去java_to_native_type阶段hook的时间点。
77.在native_type阶段时,记录native_type阶段的起始时间。
78.而当在native执行时,最终都会调用java层接口来推送数据到java层, 因则可以在native调用java层时进行hook,从而可以改造到native调用java 层的时机,从而获取此时刻则可以知道其在native层的执行总时间。
79.4)native_to_java_type阶段。
80.在native执行时,当期任务执行完成后,又会将任务的结果反推送给java 层,因此会通过反射的方式来调用java层的接口来将结果告知java层。则可 以通过对java层提供给native层的接口进行hook,从而可以获取到native层 推送结果数据的时刻。而在native调用结束时和最终native调用到了java层 时则可以获取到native转到java层的执行时间。此阶段native把请求的结果 给到了java层,从而整个请求则执行结束了。
81.需要特别说明的是,本步骤基于hook的方式来获取每个阶段的耗时情 况,较通过函数调用来获取则没有hook的方式获取的时间更准确,实现了 更准确的统计到每个阶段的完整耗时的有益效果。
82.步骤s150、基于每个任务请求,对应创建多个线程,以进行并发任务请 求统计和阶段的耗时函数统计。具体的说:
83.整个程序中会存在一个ui渲染的线程也就是主线程,而此线程主要用于 界面渲染,所以此线程不能够执行任何的耗时操作会创建一个线程用于后续 的任务统计和数据获取功能。
84.同时对于每一个任务请求,会创建一个线程来执行一个任务请求。如果 是为了设计任务并发数,那么并发线程个数则不能大于当前的cpu的内核数, 因此如果内核数是10,任务并发数则不能超过8个任务。即如果设计的是4 个线程,则可以统计4个请求任务的并发情况,具体包括:
85.1.设计每个阶段层采样的方法。
86.当上述功能已经设计好任务请求的各个阶段后,可以通过每个阶段的执 行时间,知道的任务在各个阶段的总耗时时间数据。而对于本文来说,需要 知道每个阶段层的执行是否存在并发执行的情况,因此需要在每个阶段层的 执行过程中进行阶段性的采样来获取其调用堆栈信息和线程id。
87.具体是对于任何一个任务在执行时,设计了一个线程用于统计信息,其 他4个线程用于执行请求的任务。
88.在采样时,方法是:统计线程在任务执行到每个阶段时会基于这段时间 内设计一个基于每个阶段的执行时间来进行采样,统计线程会遍历系统中的 所有线程,并暂停所有线程的执行,只有所有线程的执行都暂停了,才能够 准确获取到所有线程同一时刻的执行函数调用堆栈,获取堆栈后存储到堆栈 信息中,同时需要获取每个任务的执行线程id,同时也进行存储。
89.基于任务的每个阶段的执行时间进行大小排序,也就是耗时越多的则越 排在前面。在优选实施例中,采用频率也是基于时间来进行的,耗时越多的 阶段的采用频率则越多。
90.在另一实施例中,在统计阶段采用如下对比方式进行对比:
91.横向对比:首先对任务请求进行横向对比,也就是每个任务从开始到结 束的每个阶段,查看其线程的变化情况。如果一个任务从开始到结束都是一 个线程,说明此任务是一个完全的线程执行,而其他任务也每个都是一个不 同的线程说明当前任务的整个执行都是一个独立的线程,任务发挥了最大的 并行执行。而如果任务在执行时发生了线程的变化,则说明存在任务的线程 切换,那么则会存在任务有串行执行的情况,存在不是并发执行的情况。
92.纵向对比:对于多个任务,可以查看每个阶段,其执行任务时,线程id 是否是不一样的并发情况,对于如果任务是一个多线程的并行任务,可以看 到每个任务执行时其线程都是不一样的,如果多个任务的线程id是一个id 则说明此阶段存在任务在一个线程中进行排队执行的情况。可以基于统计频 率来判断一个请求任务有多长时间是在并行执行,有多少时间是在串行执行。 而基于函数调用堆栈,则可以知道那些函数存在串行执行,因此基于堆栈则 很容易的查找到该函数并进行并行执行的优化。
93.而基于每个阶段进行分开统计,则由于任务设计时,有些阶段是需要在 某个阶段进行串行执行的,例如任务的线程队列,或者任务的投递阶段,而 本文统计每个阶段,则可以知道任务的总耗时在哪个阶段,并且基于阶段的 调用堆栈方便的进行阶段的耗时函数统计。
94.需要特别说明的是,由于在每个阶段由于语言不一样,不方便统计native 的堆栈和java的堆栈,所以分开阶段进行统计,实现了分阶段,方便统计的 有益效果。
95.在另一实施例中,提供了具体数据效果举例:
96.例如是4个线程执行4个请求任务,则希望能够通过数据查看其是否存 在大量时间是并发的情况。
97.threadid id;存储任务此阶段执行的线程id。
98.time time;存储任务执行的耗时。
99.list《stackfunction》stack;
100.上述是在每个阶段都会存储的多个数据采样。
101.举例当前是在native_type阶段执行任务。
102.采样则会记录下当前每个请求的每个采样数据时,请求执行所在的线程 id,如果是4个任务的并发请求,当然希望看到的是4个并发任务是在4个 不同的线程id执行,并且在所有采样数据中都是保持了4个不同的线程中执 行。那么如果4个任务存在有任务的线程id是相同的,则需要查看相同线程 id所消耗的时间,那么也就是存在这样的一段时间内4个任务可能有没有进 行并发执行的情况而是在同一个队列或者是在一起进行排队的情况,那么此 时可以去查看下的函数调用堆栈stack,此时基于函数调用堆栈则可以去查看 当前任务是在那一段代码中去进行了排队是执行的顺序执行而不是并发执 行。
103.那么通过调整的代码并不断的进行上述的试验采集数据分析数据,最终 达到4个请求任务都是在不同的4个线程中并发的执行。则达到了最大的性 能化。
104.本发明提供了一种任务被多线程执行并发出请求的确定方法,基于hook 的方式,进行阶段性的采样,获取每个任务阶段的执行时间和线程id;并对 应别创建多个线程,能够进行并发任务请求统计,并进行分阶段的耗时函数 统计,利于线程执行阶段的确定和最
大性能优化。
105.下面从硬件处理的角度对本技术实施例中的任务被多线程执行的并发出 请求的确定方装置进行详细描述,图3为本发明实施例提供的任务被多线程 执行的并发出请求的确定装置的硬件结构示意图;请参阅图3,本发明实施 例中的任务被多线程执行的并发出请求的确定装置实施例的模块图
106.为一个实施例,包括:
107.输入装置301、输出装置302、处理器303和存储器304(其中处理器303 的数量可以一个或多个,图3中以一个处理器303为例)。在本发明的一些实 施例中,输入装置301、输出装置302、处理器303和存储器304可通过总线 或其它方式连接,其中,图3中以通过总线连接为例。
108.其中,通过调用存储器304存储的操作指令,处理器303,用于执行如下 步骤:
109.建立枚举变量,以区分并判断任务的执行阶段;
110.并建立数据结构,以存储任务的阶段信息;
111.确定任务执行阶段;
112.基于hook的方式,在每个阶段层的执行过程中,进行阶段性的采样,以 获取调用堆栈信息、每个任务阶段的执行时间和线程id;
113.基于每个任务请求,对应创建多个线程,以进行并发任务请求统计和阶 段的耗时函数统计。
114.通过调用存储器304存储的操作指令,处理器303,还用于执行图1对应 的实施例中的任一方式。
115.图4为本发明实施例提供的一种可能的电子设备的实施例示意图,如4 所示。
116.在另一实施例中,本发明还提供了一种电子设备,包括存储器410、处理 器420及存储在存储器420上并可在处理器420上运行的计算机程序411, 处理器420执行计算机程序411时实现以下步骤。
117.建立枚举变量,以区分并判断任务的执行阶段;
118.并建立数据结构,以存储任务的阶段信息;
119.确定任务执行阶段;
120.基于hook的方式,在每个阶段层的执行过程中,进行阶段性的采样,以 获取调用堆栈信息、每个任务阶段的执行时间和线程id;
121.基于每个任务请求,对应创建多个线程,以进行并发任务请求统计和阶 段的耗时函数统计。
122.由于本实施例所介绍的电子设备为实施本发明实施例中,故而基于本发 明实施例中所介绍的方法,本领域所属技术人员能够了解本实施例的电子设 备的具体实施方式以及其各种变化形式,所以在此对于该电子设备如何实现 本发明实施例中的方法不再详细介绍,只要本领域所属技术人员实施本发明 实施例中的方法所采用的设备,都属于本技术所欲保护的范围。
123.图5为本发明实施例提供的一种可能的计算机可读存储介质的实施例示 意图,请参阅图5。
124.如图5所示,本实施例提供了一种计算机可读存储介质500,其上存储 有计算机程
序511,该计算机程序511被处理器执行时实现如下步骤:
125.建立枚举变量,以区分并判断任务的执行阶段;
126.并建立数据结构,以存储任务的阶段信息;
127.确定任务执行阶段;
128.基于hook的方式,在每个阶段层的执行过程中,进行阶段性的采样,以 获取调用堆栈信息、每个任务阶段的执行时间和线程id;
129.基于每个任务请求,对应创建多个线程,以进行并发任务请求统计和阶 段的耗时函数统计。
130.在具体实施过程中,该计算机程序511被处理器执行时可以实现图1对 应的实施例中任一实施方式。
131.需要说明的是,在上述实施例中,对各个实施例的描述都各有侧重,某 个实施例中没有详细描述的部分,可以参见其它实施例的相关描述。
132.本领域内的技术人员应明白,本技术的实施例可提供为方法、系统、或 计算机程序产品。因此,本技术可采用完全硬件实施例、完全软件实施例、 或结合软件和硬件方面的实施例的形式。而且,本技术可采用在一个或多个 其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘 存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。
133.本技术是参照根据本技术实施例的方法、设备(系统)、和计算机程序产 品的流程图和/或方框图来描述。应理解可由计算机程序指令实现流程图和/ 或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方 框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式 计算机或者其他可编程数据处理设备的处理器以产生一个机器,使得通过计 算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图 一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
134.这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设 备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器 中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或 多个流程和/或方框图一个方框或多个方框中指定的功能。
135.这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上, 使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的 处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图 一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
136.本发明实施例还提供了一种计算机程序产品,该计算机程序产品包括计 算机软件指令,当计算机软件指令在处理设备上运行时,使得处理设备执行 如图1对应实施例中的阻止系统函数调用的方法中的流程。
137.所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执 行所述计算机程序指令时,全部或部分地产生按照本技术实施例所述的流程 或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其 他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从 一个计算机可读存储介质向另一计算机可读存储
介质传输,例如,所述计算 机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同 轴电缆、光纤、数字用户线(digital subscriber line,dsl))或无线(例如红 外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进 行传输。所述计算机可读存储介质可以是计算机能够存储的任何可用介质或 者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所 述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如, dvd)、或者半导体介质(例如固态硬盘(solid state disk,ssd))等。
138.所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描 述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应 过程,在此不再赘述。
139.在本技术所提供的几个实施例中,应该理解到,所揭露的系统,装置和 方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示 意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可 以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个 系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间 的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合 或通信连接,可以是电性,机械或其它的形式。
140.所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作 为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方, 或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或 者全部单元来实现本实施例方案的目的。
141.另外,在本技术各个实施例中的各功能单元可以集成在一个处理单元中, 也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单 元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单 元的形式实现。
142.所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售 或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本 申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的 全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个 存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机, 服务器,或者网络设备等)执行本技术各个实施例所述方法的全部或部分步 骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(read-only memory, rom)、随机存取存储器(random access memory,ram)、磁碟或者光盘等 各种可以存储程序代码的介质。
143.至此,已经结合附图所示的优选实施方式描述了本发明的技术方案,但 是,本领域技术人员容易理解的是,本发明的保护范围显然不局限于这些具 体实施方式。在不偏离本发明的原理的前提下,本领域技术人员可以对相关 技术特征做出等同的更改或替换,这些更改或替换之后的技术方案都将落入 本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1