CN111813521A - 线程调度方法、装置、存储介质及电子设备 - Google Patents
线程调度方法、装置、存储介质及电子设备 Download PDFInfo
- Publication number
- CN111813521A CN111813521A CN202010628766.XA CN202010628766A CN111813521A CN 111813521 A CN111813521 A CN 111813521A CN 202010628766 A CN202010628766 A CN 202010628766A CN 111813521 A CN111813521 A CN 111813521A
- Authority
- CN
- China
- Prior art keywords
- processing unit
- thread
- type
- target
- load
- 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.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 84
- 238000012545 processing Methods 0.000 claims abstract description 441
- 230000008859 change Effects 0.000 claims abstract description 16
- 230000005012 migration Effects 0.000 claims abstract description 12
- 238000013508 migration Methods 0.000 claims abstract description 12
- 238000004590 computer program Methods 0.000 claims description 20
- 230000004044 response Effects 0.000 claims description 5
- 230000000903 blocking effect Effects 0.000 abstract description 4
- 230000008569 process Effects 0.000 description 35
- 230000003993 interaction Effects 0.000 description 12
- 230000003068 static effect Effects 0.000 description 12
- 238000013468 resource allocation Methods 0.000 description 7
- 238000010586 diagram Methods 0.000 description 6
- 230000006870 function Effects 0.000 description 6
- 238000004891 communication Methods 0.000 description 5
- 238000001514 detection method Methods 0.000 description 5
- 238000007726 management method Methods 0.000 description 2
- 230000007246 mechanism Effects 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 230000001133 acceleration Effects 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000011982 device technology Methods 0.000 description 1
- 238000007599 discharging Methods 0.000 description 1
- 238000002372 labelling Methods 0.000 description 1
- 238000012544 monitoring process Methods 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 239000007787 solid Substances 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
- G06F9/4881—Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/48—Indexing scheme relating to G06F9/48
- G06F2209/484—Precedence
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请实施例公开一种线程调度方法、装置、存储介质及电子设备;该方法包括:确定需要变更处理单元的第一类线程,作为目标线程,并确定目标线程所在的初始处理单元;确定可变更的处理单元,构成候选处理单元集合;通过检测处理单元的第二类线程的负载,从候选处理单元集合中确定出第二类线程的负载最小的处理单元,作为目标处理单元,其中,第二类线程直接或间接地执行响应用户操作的任务;将目标线程从初始处理单元迁移至目标处理单元。该方案在对第一类线程进行迁核处理时,将目标线程迁移至第二类线程负载最低的处理单元,避免第一类线程频繁抢占第二类线程资源,导致第二类线程的执行被打断,以保证第二类线程及时得到处理,减少卡顿的产生。
Description
技术领域
本申请涉及电子设备技术领域,具体涉及一种线程调度方法、装置、存储介质及电子设备。
背景技术
安卓系统是目前电子设备应用最广泛的操作系统之一,主要应用于如智能手机、平板电脑等电子设备,其底层由linux内核实现。因此,在电子设备上运行的各个应用线程,同样遵循linux内核的调度规则。线程是运行在处理器上的,当前电子设备都具有多个处理器,为了能够平衡多个处理器的整体性能和功耗,linux内核会做负载均衡,统一协调多个处理器的线程分布情况。
相关技术中,负载均衡机制是传统的linux均衡方案:实时进程的调度是严格按照优先级进行的。在单处理器环境下,处理器上运行着的是优先级最高的进程,直到该进程离开运行状态,下一个“优先级最高的进程”才开始运行,直到所有实时进程都离开运行状态,其他普通进程才会继续运行。
发明内容
本申请实施例提供一种线程调度方法、装置、存储介质及电子设备,能够减少卡顿的产生。
第一方面,本申请实施例提供一种线程调度方法,包括:
确定需要变更处理单元的第一类线程,作为目标线程,并确定所述目标线程所在的初始处理单元;
确定可变更的处理单元,构成候选处理单元集合;
通过检测处理单元的第二类线程的负载,从所述候选处理单元集合中确定出第二类线程的负载最小的处理单元,作为目标处理单元,其中,所述第二类线程直接或间接地执行响应用户操作的任务;
将所述目标线程从所述初始处理单元迁移至所述目标处理单元。
第二方面,本申请实施例还提供一种线程调度装置,包括:
第一确定模块,用于确定需要变更处理单元的第一类线程,作为目标线程,并确定所述目标线程所在的初始处理单元;
第二确定模块,用于确定可变更的处理单元,构成候选处理单元集合;
第三确定模块,用于通过检测处理单元的第二类线程的负载,从所述候选处理单元集合中确定出第二类线程的负载最小的处理单元,作为目标处理单元,其中,所述第二类线程直接或间接地执行响应用户操作的任务;
迁移模块,用于将所述目标线程从所述初始处理单元迁移至所述目标处理单元。
第三方面,本申请实施例还提供一种存储介质,其上存储有计算机程序,当所述计算机程序在计算机上运行时,使得所述计算机执行如本申请任一实施例提供的线程调度方法。
第四方面,本申请实施例还提供一种电子设备,包括处理器和存储器,所述存储器有计算机程序,所述处理器通过调用所述计算机程序,用于执行如本申请任一实施例提供的线程调度方法。
本申请实施例提供的技术方案,通过确定需要变更处理单元的第一类线程,作为目标线程,并确定目标线程所在的初始处理单元,然后确定可变更的处理单元,构成候选处理单元集合,通过检测处理单元的第二类线程的负载,从候选处理单元集合中确定出第二类线程的负载最小的处理单元,作为目标处理单元,其中,第二类线程直接或间接地执行响应用户操作的任务,最后将目标线程从初始处理单元迁移至目标处理单元。通过该方案,在对第一类线程进行迁核处理时,将目标线程迁移至第二类线程负载最低的处理单元,避免第一类线程频繁抢占第二类线程的资源而导致第二类线程的执行被打断,以保证第二类线程可以及时得到处理,减少卡顿的产生。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例提供的线程调度方法的第一种流程示意图。
图2为本申请实施例提供的线程调度方法的第二种流程示意图。
图3为本申请实施例提供的线程调度方法的第三种流程示意图。
图4为本申请实施例提供的线程调度装置的结构示意图。
图5为本申请实施例提供的电子设备的第一种结构示意图。
图6为本申请实施例提供的电子设备的第二种结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述。显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。本文所使用的术语「模块」可看作为在该运算系统上执行的软件对象。本文不同模块、引擎及服务可看作为在该运算系统上的实施对象。基于本申请中的实施例,本领域技术人员在没有付出创造性劳动前提下所获得的所有其他实施例,都属于本申请的保护范围。
在本文中提及“实施例”意味着,结合实施例描述的特定特征、结构或特性可以包含在本申请的至少一个实施例中。在说明书中的各个位置出现该短语并不一定均是指相同的实施例,也不是与其它实施例互斥的独立的或备选的实施例。本领域技术人员显式地和隐式地理解的是,本文所描述的实施例可以与其它实施例相结合。
本申请中的术语“第一”、“第二”和“第三”等是用于区别不同对象,而不是用于描述特定顺序。此外,术语“包括”和“具有”以及它们任何变形,意图在于覆盖不排他的包含。例如包含了一系列步骤或模块的过程、方法、系统、产品或设备没有限定于已列出的步骤或模块,而是某些实施例还包括没有列出的步骤或模块,或某些实施例还包括对于这些过程、方法、产品或设备固有的其它步骤或模块。
本申请实施例提供一种线程调度方法,该线程调度方法的执行主体可以是本申请实施例提供的线程调度装置,或者集成了该线程调度装置的电子设备,其中该线程调度装置可以采用硬件或者软件的方式实现。其中,电子设备可以是智能手机、平板电脑、笔记本电脑、台式电脑、掌上电脑(PDA,Personal Digital Assistant)等设备。
以下分别进行详细说明。需要说明的是,以下实施例的描述顺序不作为对实施例优选顺序的限定。
请参阅图1,图1为本申请实施例提供的线程调度方法的第一种流程示意图。本申请实施例提供的线程调度方法的具体流程可以如下:
在101中,确定需要变更处理单元的第一类线程,作为目标线程,并确定目标线程所在的初始处理单元。
本申请实施例中,电子设备的操作系统可以是基于linux内核的系统,例如,安卓操作系统等。在电子设备上有程序运行时,进程作为程序基本执行主体,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。而进程又是线程的容器,线程是操作系统能够进行运算调度的最小单位,被包含在进程之中,是进程中的实际运作单位,每个线程对应执行不同的任务,一个进程可以有多个线程,但至少有一个线程。对于内核来说,在进行资源调度时,比如CPU调度,都是具体到某个线程的。进程内有一个主线程,它会创建出很多子线程来协助工作。比如一个内容交互应用程序的进程,它会创建一个主线程来执行代码,执行途中也会创建其它子线程来协助运行各部分的任务代码。
在具有多核心处理器的电子设备中,每一个处理器核心可以当作一个独立的处理单元。比如,如果电子设备为八核处理器,则每一个核心为一个独立的处理单元。每个处理单元有各自对应的运行队列,该运行队列中包含分配给该处理单元的任务,每一个任务由对应的线程去执行。
电子设备中可能有一个或者多个程序在同时运行,每个程序至少有一个对应的进程,而一个进程又有至少一个线程在执行任务。因此,电子设备会有多个线程需要执行,需要为这些线程的执行分配CPU资源。内核会按照一定的选核机制为线程分配处理单元。线程被分配了处理单元后,如果线程进入就绪状态,需要执行时,就会被添加至分配的处理单元的运行队列中,等待调度。
在电子设备中一个处理单元的运行队列中,包括多个用于执行任务的线程,但每一线程执行任务的优先级不同,处理单元上运行着的总是优先级最高的线程,直到该线程离开运行状态,下一个“优先级最高的线程”才开始运行,直到所有实时进程都离开运行状态,其他线程才会运行。
其中,当处理单元中包括优先级不同的多个第一类线程时,将多个第一类线程中优先级最低的第一类线程,作为需要变更处理单元的目标线程。
也就是说,在该处理单元中多个第一类线程按照优先级顺序进行任务执行,而优先级最低的第一类线程需要等待其他第一类线程离开运行状态后才能运行,这样就会需要大量的等待时间。因此,可以将目标线程由当前所在处理单元迁移至其他处理单元,即俗称的“迁核”,以便该目标线程能够在其他处理单元中快速执行任务。其中,将该目标线程当前所在处理单元作为初始处理单元。
在102中,确定可变更的处理单元,构成候选处理单元集合。
如果电子设备为八核处理器,则包括八个处理单元,除去目标线程所在的初始处理单元,还包括七个可能作为可变更的处理单元,具体可以是:从除初始处理单元之外的其他处理单元中,确定出没有第一类线程的第一处理单元,并确定出第一类线程的最高执行优先级小于目标线程的执行优先级的第二处理单元;将第一处理单元和第二处理单元构成可变更的候选处理单元集合。
其中,第一类线程可以是实时线程,在处理单元中,实时线程的执行优先级通常高于其他线程。因此,若其他处理单元中没有实时线程,可以将该处理单元作为第一处理单元,将目标线程迁移至该第一处理单元优先执行;若其他处理单元中存在实时线程,但实时线程的最高执行优先级低于目标线程的执行优先级,可以将该处理单元作为第二处理单元,将目标线程迁移至该第二处理单元优先执行。第一处理单元和第二处理单元构成了可变更的候选处理单元集合。其中,第一处理单元指的是没有实时线程的这一类处理单元,可以有一个或多个,第二处理单元也可以有一个或多个。
在103中,通过检测处理单元的第二类线程的负载,从候选处理单元集合中确定出第二类线程的负载最小的处理单元,作为目标处理单元。
本申请实施例中,从线程的运行情况是否会影响到用户体验的角度出发,将那些直接或间接地影响到用户体验的线程标记出来,在资源分配时,将资源向这些线程倾斜。安卓系统的架构包括:应用程序层、应用框架层、系统运行库层及linux内核层。本申请实施例中,电子设备的系统架构至少包括应用框架(framework)层和内核(kernel)层,应用框架层会将一些线程标记为第二类线程,内核层负责对运行队列中的各类线程进行调度执行。其中,在一些实施例中,将第二类线程记为ux(user experience,用户体验)线程。例如,应用框架层为一些直接执行用户交互事件中相关任务的线程添加预设标签,以将这些线程标记为静态ux线程,内核层将一些间接地影响到用户交互事件中相关任务执行的线程标记为动态ux线程。
电子设备在运行过程中,会对用户的各种操作进行响应,需要一些线程来执行相关任务,关于静态ux线程,包括但不限于以下几种线程:前台的UI(userinterface,用户界面)线程,前台的Render(渲染)线程,GL线程,用户输入事件的分发线程,用户输入事件的检测线程,系统动画线程等。这些线程是否能够流畅运行决定着是否会在用户与该进程的交互界面中产生用户可感知的卡顿。
例如,用户使用聊天软件与某一好友聊天,用户在对话框输入文字,电子设备通过服务器将用户输入的文字发送至该好友的电子设备。在这次交互事件中,需要UI线程、Render线程、用户输入事件的分发线程、用户输入事件的检测线程等相关线程执行相关任务,共同工作以完成本次用户交互事件,其中,每一个线程的运行都需要系统为其分配资源。因此,在检测到该聊天软件在前台运行时,识别出这些线程,将其标记为ux线程。
当有新线程创建时,确定新线程的属性信息,并根据属性信息判断新线程是否直接或间接地执行响应用户操作的任务;若判定新线程直接或间接地执行响应用户操作的任务,则为新线程添加预设标签,以将新线程标记为第二类线程。其中,第二类线程直接或间接地执行响应用户操作地任务。
其中,预设标签可以为ux标签,其添加方式如下:Linux使用task_struct结构体描述和记录线程,每个线程都有唯一属于自己的task_struct结构体。task_struct中记录了线程的名称、标识符、状态、优先级、内存指针、上下文数据等属性信息。因此,应用框架层可以在task_struct结构体中增加对应的uxflag成员,以将前台进程的UI线程、Render线程、GL线程等执行用户交互事件中相关任务的线程,通过标记ux flag位,使内核层能够识别该线程的任务属性。
需要说明的是,上述几种静态ux线程仅为举例说明,并不局限于此,只要是直接地执行用户交互事件中相关任务的线程,使得其运行情况直接地影响到用户体验的线程,都可以将其标记为静态ux线程。对于应用框架层来说,在检测到新创建的线程是用来执行用户交互事件,或者检测到某些常驻系统级线程是用以处理用户交互事件时,为这些线程添加ux标签,以将其标记为静态ux线程。
其中,为新线程添加预设标签是在进入处理单元运行队列之前,也就是当新线程创建时,应用框架层便会对新线程是否直接或间接地执行响应用户操作的任务进行识别,并在判定新线程直接或间接地执行响应用户操作的任务时,为新线程添加预设标签。
在本申请实施例中,ux线程的执行优先级一般低于实时线程的执行优先级,因此,当处理单元中同时存在实时线程和ux线程时,会优先执行实时线程,而ux线程会继续等待调度。同时,若该处理单元中的ux线程正在运行,但新增加了实时线程,则该ux线程的运行状态将被打断,会优先执行新增加的实时线程。因此,为了尽量避免ux线程被实时线程打断的情况发生,将实时线程迁移至ux线程负载较低或没有ux线程的处理单元。
即,通过检测处理单元的ux线程的负载,从候选处理单元集合中确定出ux线程的负载最小的处理单元,作为目标处理单元。其中,ux线程的负载最小包括ux线程的负载为零,也就是不存在ux线程的情况。
通过上述实施例,框架层识别出那些直接影响到用户体验的线程并为其添加标记。而线程需要内核为之分配系统资源供其运行。因此,线程在执行任务前,会向内核发送系统资源分配请求。当内核接收到资源分配请求时,可以先判断该线程是否为ux线程,对于ux线程和非ux线程采用不同的资源分配方式。
需要说明的是,这里的第一类线程和第二类线程中的“第一类”和“第二类”,仅仅是为了区分线程是否具有ux标签,而不是说将系统中的线程只划分为这两种类别。本申请的资源分配优化方案是从线程是否具有ux标签这一角度出发的,如果线程同时还具有其他属性,则在资源分配时,考虑了是否具有ux标签这一属性后,仍然会考虑其他属性。
此外,上述实施例介绍了静态ux线程的识别。还有一些线程虽然并没有直接地执行用户交互事件的相关任务,但是这些线程的运行情况也会影响到静态ux线程的运行情况,进而间接地影响到用户交互事件的相关任务的执行。也就是说,这些线程并不是总是与用户体验相关,但是这些线程在执行过程的某段时间内,可能通过资源约束与静态ux线程产生关联,因此,在一些实施例中,为了进一步地减少交互场景下的卡顿现象,内核层将这些与静态ux线程之间有约束关系的线程也标记为ux线程。而一旦这种约束关系结束,就会将该线程恢复至非ux线程。本申请实施例中将这类线程定义为动态ux线程。其中,具体的约束关系包括但不限于进程间通信、线程间通信或者持有临界资源等。比如,静态ux线程通过进程间通信请求的普通线程,静态ux线程通过某种线程间通信方式请求的普通线程,持有静态ux线程需要的等待信号量、读写信号量、互斥锁等临界资源的普通线程等,本申请实施例中将这类线程标记为动态ux线程。
在104中,将目标线程从初始处理单元迁移至目标处理单元。
将该目标线程,即在初始处理单元中优先级最低的实时线程,从初始处理单元迁移至ux线程负载最小的处理单元。
由上可知,本申请实施例提供的线程调度方法,通过先确定需要处理单元的第一类线程,作为目标线程,并确定目标线程所在的初始处理单元,随后确定可变更的处理单元,构成候选处理单元集合,然后通过检测处理单元的第二类线程的负载,从候选处理单元集合中确定出第二类线程的负载最小的处理单元,作为目标处理单元,最后,将目标线程从初始处理单元迁移至目标处理单元。在对第一类线程进行迁核处理时,将目标线程迁移至第二类线程负载为零或第二类线程负载最低的处理单元,避免第一类线程频繁抢占第二类线程的资源而导致第二类线程的执行被打断,以保证第二类线程可以及时得到处理,减少卡顿的产生。
根据前面实施例所描述的方法,以下将举例作进一步详细说明。
请参阅图2,图2为本发明实施例提供的线程调度方法的第二流程示意图。所述方法包括:
在201中,确定需要变更处理单元的第一类线程,作为目标线程,并确定目标线程所在的初始处理单元。
在本申请实施例中,第一类线程可以为实时线程,在电子设备中,实时线程的调度是严格按照优先级来进行的。
需要说明的是,同一类线程也需要按照执行优先级进行调度,当电子设备的处理单元中包括优先级不同的多个实时线程时,将多个实时线程中优先级最低的实时线程进行迁核处理,将其作为需要变更处理单元的目标线程。并将目标线程当前所在处理单元作为初始处理单元。
在202中,确定可变更的处理单元,构成候选处理单元集合。
在处理单元中,实时线程的执行优先级通常高于其他线程。可以从除初始处理单元之外的其他处理单元中,确定出没有实时线程的第一处理单元,并确定出实时线程的最高执行优先级小于目标线程的执行优先级的第二处理单元;将第一处理单元和第二处理单元构成可变更的候选处理单元集合。其中,第一处理单元指的是没有实时线程的这一类处理单元,可以有一个或多个,第二处理单元也可以有一个或多个。
在203中,检测候选处理单元集合中是否有不存在第二类线程的处理单元。
在本申请实施例中,第二类线程可以为ux线程,当有新线程创建时,确定新线程的属性信息,并根据属性信息判断新线程是否直接或间接地执行响应用户操作的任务;若判定新线程直接或间接地执行响应用户操作的任务,则为新线程添加预设标签,以将所述新线程标记为ux线程。
根据为ux线程添加预设标签,检测是否候选处理单元集合中的全部处理单元都存在具有预设标签的线程。若是,则判定候选处理单元集合中没有不存在ux线程的处理单元;若否,则判定候选处理单元集合中有不存在ux线程的处理单元。
在本申请实施例中,ux线程的执行优先级一般低于实时线程的执行优先级,因此,当处理单元中同时存在实时线程和ux线程时,会优先执行实时线程,而ux线程会继续等待调度。同时,若该处理单元中的ux线程正在运行,但新增加了实时线程,则该ux线程的运行状态将被打断,会优先执行新增加的实时线程。因此,为了尽量避免ux线程被实时线程打断的情况发生,将实时线程迁移至ux线程负载较低或没有ux线程的处理单元。当候选处理单元集合中有不存在第二类线程的处理单元时,执行204;当候选处理单元集合中没有不存在第二类线程的处理单元,执行205。
在204中,从不存在第二类线程的处理单元中确定目标处理单元。
若候选处理单元集合中不存在第二类线程的处理单元,也就是候选处理单元集合中不存在ux线程的处理单元,则可以从候选处理单元集合中选取任一处理单元作为目标处理单元。当然,也可以按照一定顺序进行选取,具体情况可以具体设定,在此不再赘述。
在205中,将第二类线程的负载最小的处理单元作为目标处理单元。
若候选处理单元集合中没有不存在第二类线程的处理单元,也就是候选处理单元集合中没有不存在ux线程的处理单元,则从ux线程的负载最小的处理单元作为目标处理单元。当然,ux线程的负载为零的情况也就是不存在ux线程的情况。
在206中,将目标线程从初始处理单元迁移至目标处理单元。
将该目标线程,即在初始处理单元中优先级最低的实时线程,从初始处理单元迁移至ux线程负载最小的处理单元。
由上可知,本申请实施例提出的线程调度方法,通过确定需要变更处理单元的第一类线程,作为目标线程,并确定目标线程所在的初始处理单元,然后确定可变更的处理单元,构成候选处理单元集合,通过检测候选处理单元集合中是否有不存在第二类线程的处理单元,若有,则从不存在第二类线程的处理单元中确定目标处理单元,若没有,则将第二类线程的负载最小的处理单元作为目标处理单元,最后将目标线程从初始处理单元迁移至目标处理单元,在对第一类线程进行迁核处理时,将目标线程迁移至第二类线程负载为零或第二类线程负载最低的处理单元,避免第一类线程频繁抢占第二类线程的资源而导致第二类线程的执行被打断,以保证第二类线程可以及时得到处理,减少卡顿的产生。
请参阅图3,图3为本发明实施例提供的线程调度方法的第三流程示意图。所述方法包括:
在301中,确定需要变更处理单元的第一类线程,作为目标线程,并确定目标线程所在的初始处理单元。
其中,第一类线程可以为实时线程,当电子设备的处理单元中包括优先级不同的多个实时线程时,将多个实时线程中优先级最低的实时线程进行迁核处理,将其作为需要变更处理单元的目标线程,并将目标线程当前所在处理单元作为初始处理单元。
在302中,确定可变更的处理单元,构成候选处理单元集合。
在303中,遍历候选处理单元集合中的处理单元,并检测遍历到的处理单元中第二类线程的负载。
可以理解的是,第二类线程可以为ux线程,遍历候选处理单元集合中处理单元的过程,其实就是对候选处理单元集合中处理单元逐一检测的过程。并检测每一处理单元中ux线程的负载。
在304中,检测遍历到的当前处理单元中的第二类线程的负载是否为零。
若当前处理单元中的第二类线程的负载为零,执行305;若当前处理单元中的第二类线程的负载不为零,执行306。
在305中,将当前处理单元作为目标处理单元。
在对候选处理单元集合中的处理单元进行逐一检测的过程中,若当前检测的处理单元中ux线程的负载为零,也就是该处理单元为不存在ux线程的处理单元,则将该处理单元作为目标处理单元。
在306中,从候选处理单元集合中选取下一个处理单元继续检测,直至检测到第二类线程的负载为零的处理单元,并将第二类线程的负载为零的处理单元作为目标处理单元。
在对候选处理单元集合中的处理单元进行逐一检测的过程中,若当前检测的处理单元中ux线程的负载不为零,并进行下一个处理单元的检测,当检测到候选处理单元集合中的其他处理单元中存在ux负载为零的处理单元,则将该ux负载为零的处理单元作为目标处理单元。
在307中,当检测到候选处理单元中的每一处理单元的第二类线程的负载均不为零时,选取第二类线程的负载最低的处理单元作为目标处理单元。
若遍历候选处理单元中的所有处理单元中ux线程的负载均不为零,则分别记录每一处理单元的ux线程的负载,并从中选取ux线程的负载最低的处理单元作为目标处理单元。
例如,候选处理单元集合中包括3个处理单元,分别为A、B和C,其中,记录A中ux线程的负载为a,记录B中ux线程的负载为b,记录C中ux线程的负载为c,并且a大于b,b大于c,则处理单元C为ux线程负载最低的处理单元,并将处理单元C作为目标处理单元。
在308中,将目标线程从初始处理单元迁移至目标处理单元。
将该目标线程,即在初始处理单元中优先级最低的实时线程,从初始处理单元迁移至ux线程负载最小的处理单元。
由上可知,本申请实施例提出的线程调度方法,通过确定需要变更处理单元的第一类线程,作为目标线程,并确定目标线程所在的初始处理单元,然后确定可变更的处理单元,构成候选处理单元集合,遍历候选处理单元集合中的处理单元,并检测遍历到的处理单元中第二类线程的负载,并检测遍历到的当前处理单元中的第二类线程的负载是否为零,若为零,将当前处理单元作为目标处理单元,若不为零,从候选处理单元集合中选取下一个处理单元继续检测,直至检测到第二类线程的负载为零的处理单元,并将第二类线程的负载为零的处理单元作为目标处理单元,当检测到候选处理单元中的每一处理单元的第二类线程的负载均不为零时,选取第二类线程的负载最低的处理单元作为目标处理单元,最后将目标线程从初始处理单元迁移至目标处理单元,在对第一类线程进行迁核处理时,将目标线程迁移至第二类线程负载为零或第二类线程负载最低的处理单元,避免第一类线程频繁抢占第二类线程的资源而导致第二类线程的执行被打断,以保证第二类线程可以及时得到处理,减少卡顿的产生。
在一实施例中还提供一种线程调度装置。请参阅图4,图4为本申请实施例提供的线程调度装置400的结构示意图。其中该线程调度装置400应用于电子设备,该线程调度装置400包括第一确定模块401、第二确定模块402、第三确定模块403以及迁移模块404,如下:
第一确定模块401,用于确定需要变更处理单元的第一类线程,作为目标线程,并确定目标线程所在的初始处理单元;
第二确定模块402,用于确定可变更的处理单元,构成候选处理单元集合;
第三确定模块403,用于通过检测处理单元的第二类线程的负载,从候选处理单元集合中确定出第二类线程的负载最小的处理单元,作为目标处理单元,其中,第二类线程直接或间接地执行响应用户操作的任务;
迁移模块404,用于将目标线程从初始处理单元迁移至目标处理单元。
在一些实施例中,第三确定模块403可以用于:
检测候选处理单元集合中是否有不存在第二类线程的处理单元;
若候选处理单元集合中有不存在第二类线程的处理单元,则从不存在第二类线程的处理单元中确定出目标处理单元;
若候选处理单元集合中没有不存在第二类线程的处理单元,则将第二类线程的负载最小的处理单元作为目标处理单元。
在一些实施例中,第三确定模块403还可以用于:
遍历候选处理单元集合中的处理单元,并检测遍历到的处理单元中的第二类线程的负载;
当遍历到的当前处理单元中的第二类线程的负载为零时,将当前处理单元作为目标处理单元;
当遍历到的当前处理单元中的第二类线程的负载不为零时,从候选处理单元集合中选取下一个处理单元继续检测,直至检测到第二类线程的负载为零的处理单元,并将第二类线程的负载为零的处理单元作为目标处理单元;
当检测到候选处理单元集合中的每一处理单元的第二类线程的负载均不为零时,选取第二类线程的负载最低的处理单元作为目标处理单元。
在一些实施例中,第一确定单元401可以用于:
当处理单元中包括优先级不同的多个第一类线程时,将多个第一类线程中优先级最低的第一类线程,作为需要变更处理单元的目标线程。
在一些实施例中,第二确定单元402可以用于:
从除初始处理单元之外的其他处理单元中,确定出没有第一类线程的第一处理单元,并确定出第一类线程的最高执行优先级小于目标线程的执行优先级的第二处理单元;
将第一处理单元和第二处理单元构成可变更的候选处理单元集合。
在一些实施例中,第三确定单元403可以包括检测模块,该检测模块可以用于:
检测是否候选处理单元集合中的全部处理单元都存在具有预设标签的线程;
若是,则判定候选处理单元集合中没有不存在第二类线程的处理单元;
若否,则判定候选处理单元集合中有不存在第二类线程的处理单元。
在一些实施例中,检测模块还可以包括标记模块,该标记模块可以用于:
当有新线程创建时,确定新线程的属性信息,并根据所述属性信息判断新线程是否直接或间接地执行响应用户操作的任务;
若判定新线程直接或间接地执行响应用户操作的任务,则为新线程添加预设标签,以将新线程标记为第二类线程。
具体实施时,以上各个模块可以作为独立的实体来实现,也可以进行任意组合,作为同一或若干个实体来实现,以上各个模块的具体实施可参见前面的方法实施例,在此不再赘述。
应当说明的是,本申请实施例提供的线程调度装置与上文实施例中的线程调度方法属于同一构思,在线程调度装置上可以运行线程调度方法实施例中提供的任一方法,其具体实现过程详见线程调度方法实施例,此处不再赘述。
相应的,本申请实施例还提供一种电子设备500。所述电子设备可以是智能手机、平板电脑等设备。请参阅图5,图5为本申请实施例提供的电子设备的第一种结构示意图。该电子设备500包括处理器501和存储器502。其中,处理器501与存储器502电性连接。
处理器501是电子设备500的控制中心,利用各种接口和线路连接整个电子设备的各个部分,通过运行或调用存储在存储器502内的计算机程序,以及调用存储在存储器502内的数据,执行电子设备的各种功能和处理数据,从而对电子设备进行整体监控。
存储器502可用于存储软件程序以及模块,处理器501通过运行存储在存储器502的计算机程序以及模块,从而执行各种功能应用以及数据处理。存储器502可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的计算机程序等;存储数据区可存储根据电子设备的使用所创建的数据等。
此外,存储器502可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。相应地,存储器502还可以包括存储器控制器,以提供处理器501对存储器502的访问。
在本实施例中,电子设备500中的处理器501会按照如下的步骤,将一个或一个以上的计算机程序的进程对应的指令加载到存储器502中,并由处理器501来运行存储在存储器502中的计算机程序,从而实现各种功能,如下:
确定需要变更处理单元的第一类线程,作为目标线程,并确定所述目标线程所在的初始处理单元;
确定可变更的处理单元,构成候选处理单元集合;
通过检测处理单元的第二类线程的负载,从所述候选处理单元集合中确定出第二类线程的负载最小的处理单元,作为目标处理单元,其中,所述第二类线程直接或间接地执行响应用户操作的任务;
将所述目标线程从所述初始处理单元迁移至所述目标处理单元。
在一些实施例中,请参阅图6,图6为本申请实施例提供的电子设备的第二种结构示意图。与图5所示电子设备的区别在于,该电子设备500还包括:显示器503、射频电路504、音频电路505、输入单元506、传感器507以及电源508。其中,处理器501分别与显示器503、射频电路504、音频电路505、输入单元506、传感器507以及电源508电性连接。
显示器503可用于显示由用户输入的信息或提供给用户的信息以及电子设备的各种图形用户接口,这些图形用户接口可以由图像、文本、图标、视频和其任意组合来构成。
射频电路504用于收发射频信号,以通过无线通信与网络设备或其他电子设备进行通信。
音频电路505可以用于通过扬声器、传声器提供用户与电子设备之间的音频接口。其中,音频电路505包括麦克风。所述麦克风与所述处理器501电性连接。所述麦克风用于接收用户输入的语音信息。
输入单元506可用于接收输入的数字、字符信息或用户特征信息(例如指纹),以及产生与用户设置以及功能控制有关的键盘、鼠标、操作杆、光学或者轨迹球信号输入。其中,输入单元506可以包括指纹识别模组。
传感器507用于采集电子设备自身的信息或者用户的信息或者外部环境信息。例如,传感器507可以包括温度传感器、距离传感器、磁场传感器、光线传感器、加速度传感器、指纹传感器、霍尔传感器、位置传感器、陀螺仪、惯性传感器、姿态感应器、气压计、心率传感器等传感器中的一种或多种。
电源508用于给电子设备500的各个部件供电。在一些实施例中,电源508可以通过电源管理系统与处理器501逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能。
虽然图中未示出,电子设备500还可以包括摄像头、蓝牙模块等,在此不再赘述。
在本实施例中,电子设备500中的处理器501会按照如下的步骤,将一个或一个以上的计算机程序的进程对应的指令加载到存储器502中,并由处理器501来运行存储在存储器502中的计算机程序,从而实现各种功能,如下:
确定需要变更处理单元的第一类线程,作为目标线程,并确定所述目标线程所在的初始处理单元;
确定可变更的处理单元,构成候选处理单元集合;
通过检测处理单元的第二类线程的负载,从所述候选处理单元集合中确定出第二类线程的负载最小的处理单元,作为目标处理单元,其中,所述第二类线程直接或间接地执行响应用户操作的任务;
将所述目标线程从所述初始处理单元迁移至所述目标处理单元。
由上可知,相对于现有技术而言,本申请实施例提供了一种电子设备,该电子设备通过确定需要变更处理单元的第一类线程,作为目标线程,并确定目标线程所在的初始处理单元,然后确定可变更的处理单元,构成候选处理单元集合,通过检测处理单元的第二类线程的负载,从候选处理单元集合中确定出第二类线程的负载最小的处理单元,作为目标处理单元,其中,第二类线程直接或间接地执行响应用户操作的任务,最后将目标线程从初始处理单元迁移至目标处理单元,在对第一类线程进行迁核处理时,将目标线程迁移至第二类线程负载最低的处理单元,避免第一类线程频繁抢占第二类线程资源,导致第二类线程的执行被打断,以保证第二类线程及时得到处理,减少卡顿的产生。
本申请实施例还提供一种存储介质,所述存储介质中存储有计算机程序,当所述计算机程序在计算机上运行时,所述计算机执行上述任一实施例所述的线程调度方法。
例如,在一些实施例中,当上述计算机程序在计算机上运行时,该计算机执行如下步骤:
确定需要变更处理单元的第一类线程,作为目标线程,并确定所述目标线程所在的初始处理单元;
确定可变更的处理单元,构成候选处理单元集合;
通过检测处理单元的第二类线程的负载,从所述候选处理单元集合中确定出第二类线程的负载最小的处理单元,作为目标处理单元,其中,所述第二类线程直接或间接地执行响应用户操作的任务;
将所述目标线程从所述初始处理单元迁移至所述目标处理单元。
以上各操作的具体实施方式可参见前面的实施例,在此不再赘述。
其中,该存储介质可以包括:只读存储器(ROM,Read Only Memory)、随机存取记忆体(RAM,Random Access Memory)、磁盘或光盘等。
由于该存储介质中所存储的指令,可以执行本申请实施例所提供的任一种线程调度方法中的步骤,因此,可以实现本申请实施例所提供的任一种线程调度方法所能实现的有益效果,详见前面的实施例,在此不再赘述。
需要说明的是,对本申请实施例的线程调度方法而言,本领域普通测试人员可以理解实现本申请实施例的线程调度方法的全部或部分流程,是可以通过计算机程序来控制相关的硬件来完成,该计算机程序可存储于一计算机可读取存储介质中,如存储在电子设备的存储器中,并被该电子设备内的至少一个处理器执行,在执行过程中可包括如线程调度方法的实施例的流程。
对本申请实施例的线程调度装置而言,其各功能模块可以集成在一个处理芯片中,也可以是各个模块单独物理存在,也可以两个或两个以上模块集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。该集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。
以上对本申请实施例所提供的线程调度方法、装置、存储介质及电子设备进行了详细介绍。本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。
Claims (10)
1.一种线程调度方法,其特征在于,包括:
确定需要变更处理单元的第一类线程,作为目标线程,并确定所述目标线程所在的初始处理单元;
确定可变更的处理单元,构成候选处理单元集合;
通过检测处理单元的第二类线程的负载,从所述候选处理单元集合中确定出第二类线程的负载最小的处理单元,作为目标处理单元,其中,所述第二类线程直接或间接地执行响应用户操作的任务;
将所述目标线程从所述初始处理单元迁移至所述目标处理单元。
2.根据权利要求1所述的线程调度方法,其特征在于,所述通过检测处理单元的第二类线程的负载,从所述候选处理单元集合中确定出第二类线程的负载最小的处理单元,作为目标处理单元,包括:
检测所述候选处理单元集合中是否有不存在第二类线程的处理单元;
若所述候选处理单元集合中有不存在第二类线程的处理单元,则从不存在第二类线程的处理单元中确定出目标处理单元;
若所述候选处理单元集合中没有不存在第二类线程的处理单元,则将第二类线程的负载最小的处理单元作为目标处理单元。
3.根据权利要求1所述的线程调度方法,其特征在于,所述通过检测处理单元的第二类线程的负载,从所述候选处理单元集合中确定出第二类线程的负载最小的处理单元,作为目标处理单元,包括:
遍历所述候选处理单元集合中的处理单元,并检测遍历到的处理单元中的所述第二类线程的负载;
当遍历到的当前处理单元中的所述第二类线程的负载为零时,将所述当前处理单元作为目标处理单元;
当遍历到的当前处理单元中的所述第二类线程的负载不为零时,从所述候选处理单元集合中选取下一个处理单元继续检测,直至检测到第二类线程的负载为零的处理单元,并将第二类线程的负载为零的处理单元作为目标处理单元;
当检测到所述候选处理单元集合中的每一处理单元的第二类线程的负载均不为零时,选取第二类线程的负载最低的处理单元作为目标处理单元。
4.根据权利要求1所述的线程调度方法,其特征在于,所述确定需要变更处理单元的第一类线程,作为目标线程,包括:
当处理单元中包括优先级不同的多个第一类线程时,将所述多个第一类线程中优先级最低的第一类线程,作为需要变更处理单元的目标线程。
5.根据权利要求1所述的线程调度方法,其特征在于,所述确定可变更的处理单元,构成候选处理单元集合,包括:
从除所述初始处理单元之外的其他处理单元中,确定出没有第一类线程的第一处理单元,并确定出第一类线程的最高执行优先级小于所述目标线程的执行优先级的第二处理单元;
将所述第一处理单元和所述第二处理单元构成可变更的所述候选处理单元集合。
6.根据权利要求2所述的线程调度方法,其特征在于,所述检测所述候选处理单元集合中是否有不存在第二类线程的处理单元,包括:
检测是否所述候选处理单元集合中的全部处理单元都存在具有预设标签的线程;
若是,则判定所述候选处理单元集合中没有不存在第二类线程的处理单元;
若否,则判定所述候选处理单元集合中有不存在第二类线程的处理单元。
7.根据权利要求6所述的线程调度方法,其特征在于,所述方法还包括:
当有新线程创建时,确定所述新线程的属性信息,并根据所述属性信息判断所述新线程是否直接或间接地执行响应用户操作的任务;
若判定所述新线程直接或间接地执行响应用户操作的任务,则为所述新线程添加预设标签,以将所述新线程标记为第二类线程。
8.一种线程调度装置,其特征在于,包括:
第一确定模块,用于确定需要变更处理单元的第一类线程,作为目标线程,并确定所述目标线程所在的初始处理单元;
第二确定模块,用于确定可变更的处理单元,构成候选处理单元集合;
第三确定模块,用于通过检测处理单元的第二类线程的负载,从所述候选处理单元集合中确定出第二类线程的负载最小的处理单元,作为目标处理单元,其中,所述第二类线程直接或间接地执行响应用户操作的任务;
迁移模块,用于将所述目标线程从所述初始处理单元迁移至所述目标处理单元。
9.一种存储介质,其上存储有计算机程序,其特征在于,当所述计算机程序在计算机上运行时,使得所述计算机执行如权利要求1至7任一项所述的线程调度方法。
10.一种电子设备,包括处理器和存储器,所述存储器存储有计算机程序,其特征在于,所述处理器通过调用所述计算机程序,用于执行如权利要求1至7任一项所述的线程调度方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010628766.XA CN111813521A (zh) | 2020-07-01 | 2020-07-01 | 线程调度方法、装置、存储介质及电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010628766.XA CN111813521A (zh) | 2020-07-01 | 2020-07-01 | 线程调度方法、装置、存储介质及电子设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN111813521A true CN111813521A (zh) | 2020-10-23 |
Family
ID=72856021
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010628766.XA Pending CN111813521A (zh) | 2020-07-01 | 2020-07-01 | 线程调度方法、装置、存储介质及电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111813521A (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112905326A (zh) * | 2021-02-18 | 2021-06-04 | 上海哔哩哔哩科技有限公司 | 任务处理方法及装置 |
CN113842642A (zh) * | 2021-09-29 | 2021-12-28 | 联想(北京)有限公司 | 一种为游戏应用分配资源的方法及电子设备 |
WO2023019904A1 (zh) * | 2021-08-19 | 2023-02-23 | 苏州浪潮智能科技有限公司 | 一种集群中进程协作的方法、系统、设备和存储介质 |
WO2024007970A1 (zh) * | 2022-07-06 | 2024-01-11 | 华为技术有限公司 | 线程调度方法及电子设备 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108804211A (zh) * | 2018-04-27 | 2018-11-13 | 西安华为技术有限公司 | 线程调度方法、装置、电子设备及存储介质 |
US20200151005A1 (en) * | 2018-11-09 | 2020-05-14 | Samsung Electronics Co., Ltd. | System on chip including a multi-core processor and task scheduling method thereof |
-
2020
- 2020-07-01 CN CN202010628766.XA patent/CN111813521A/zh active Pending
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108804211A (zh) * | 2018-04-27 | 2018-11-13 | 西安华为技术有限公司 | 线程调度方法、装置、电子设备及存储介质 |
US20200151005A1 (en) * | 2018-11-09 | 2020-05-14 | Samsung Electronics Co., Ltd. | System on chip including a multi-core processor and task scheduling method thereof |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112905326A (zh) * | 2021-02-18 | 2021-06-04 | 上海哔哩哔哩科技有限公司 | 任务处理方法及装置 |
CN112905326B (zh) * | 2021-02-18 | 2023-04-11 | 上海哔哩哔哩科技有限公司 | 任务处理方法及装置 |
WO2023019904A1 (zh) * | 2021-08-19 | 2023-02-23 | 苏州浪潮智能科技有限公司 | 一种集群中进程协作的方法、系统、设备和存储介质 |
CN113842642A (zh) * | 2021-09-29 | 2021-12-28 | 联想(北京)有限公司 | 一种为游戏应用分配资源的方法及电子设备 |
CN113842642B (zh) * | 2021-09-29 | 2024-05-28 | 联想(北京)有限公司 | 一种为游戏应用分配资源的方法及电子设备 |
WO2024007970A1 (zh) * | 2022-07-06 | 2024-01-11 | 华为技术有限公司 | 线程调度方法及电子设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111813521A (zh) | 线程调度方法、装置、存储介质及电子设备 | |
US10073711B2 (en) | Virtual machine monitor configured to support latency sensitive virtual machines | |
JP6320520B2 (ja) | 多数の優先順キューに対するスレッドの割り当ておよびスケジューリング | |
CN111831440B (zh) | 内存回收方法、装置、存储介质及电子设备 | |
CN111831441A (zh) | 内存回收方法、装置、存储介质及电子设备 | |
CN111831437B (zh) | 设备管理方法、装置、存储介质及电子设备 | |
CN111831433A (zh) | 资源分配方法、装置、存储介质及电子设备 | |
CN111831434A (zh) | 资源分配方法、装置、存储介质及电子设备 | |
CN111831414A (zh) | 线程迁移方法、装置、存储介质及电子设备 | |
CN111831438A (zh) | 资源分配方法、装置、存储介质及电子设备 | |
US9875141B2 (en) | Managing pools of dynamic resources | |
CN113495780A (zh) | 任务调度方法、装置、存储介质及电子设备 | |
CN111813520A (zh) | 线程调度方法、装置、存储介质及电子设备 | |
EP2613257B1 (en) | Systems and methods for use in performing one or more tasks | |
CN111831435A (zh) | 内存分配方法、装置、存储介质及电子设备 | |
CN111831413A (zh) | 线程调度方法、装置、存储介质及电子设备 | |
CN107977275B (zh) | 基于消息队列的任务处理方法及相关设备 | |
CN111831432B (zh) | Io请求的调度方法、装置、存储介质及电子设备 | |
CN111831436B (zh) | Io请求的调度方法、装置、存储介质及电子设备 | |
CN113495787A (zh) | 资源分配方法、装置、存储介质及电子设备 | |
US20090300636A1 (en) | Regaining control of a processing resource that executes an external execution context | |
CN111831411A (zh) | 任务处理方法、装置、存储介质及电子设备 | |
CN111831442A (zh) | 一种资源分配的方法、装置、存储介质及电子设备 | |
CN111831439A (zh) | Io请求的处理方法、装置、存储介质及电子设备 | |
CN111831462A (zh) | Io请求的处理方法、装置、存储介质及电子设备 |
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 |