用户进程抢占方法、装置、设备及计算机存储介质与流程

文档序号:31711476发布日期:2022-10-04 19:19阅读:66来源:国知局
用户进程抢占方法、装置、设备及计算机存储介质与流程

1.本技术实施例涉及计算机技术领域,特别涉及一种用户进程抢占方法、装置、设备及计算机存储介质。


背景技术:

2.在计算机的操作系统中,如果一个用户进程正在运行,当前有另一个更重要的用户进程也需要运行,且另一个用户进程运行时需要使用前一个用户进程所占用的资源,此时,操作系统中的调度器则会通知前一个用户进程中止执行,以释放前一个用户进程所占用的资源,然后另一个用户进程才能基于释放的资源运行。前述过程便可称为用户进程抢占。
3.相关技术中,为了避免因为其他用户进程的抢占而导致当前用户进程突然中止,用户进程在运行过程中,如果遇到其他用户进程当前需要抢占该用户进程运行时所占用的资源,该用户进程可以向内核申请延迟抢占,内核在允许该申请后,该用户进程便可继续运行,直至该用户进程运行完毕,然后释放所占用的资源,以便其他用户进程运行。但是该技术容易出现恶意程序持续占用资源的情况,从而导致其他用户进程一直无法运行。


技术实现要素:

4.本技术实施例提供了一种用户进程抢占方法、装置、设备及计算机存储介质等,可以一定程度上避免恶意程序持续占用资源从而导致其他用户进程一直无法运行的情况。下面通过多个方面介绍本技术,应理解的是,以下各方面的实现方式和有益效果可以相互参考。
5.第一方面,提供了一种用户进程抢占方法,方法由操作系统执行,操作系统的内核中注册有第一应用程序对应的抢占标记信息,抢占标记信息用于标识第一应用程序中的不可被抢占代码段,不可被抢占代码段为第一应用程序中的部分代码段,第一应用程序为任一应用程序,第一用户进程为运行第一应用程序的进程。
6.在该方法中,在第一用户进程运行的过程中,如果内核检测到抢占请求,则获取第一应用程序对应的抢占标记信息,该抢占请求指示第二用户进程需要抢占第一用户进程所占用的资源;如果内核基于第一应用程序对应的抢占标记信息,判断出第一用户进程当前运行的代码属于不可被抢占代码段中的代码,则允许第一用户进程继续运行。
7.本技术实施例提供的用户抢占方法至少可以实现如下技术效果:
8.(1)对于任一应用程序的代码,标注出不可被抢占的代码段。运行该应用程序的用户进程在运行不可被抢占代码段的时间内,内核不会允许其他用户进程抢占该用户进程。由于在用户进程运行的过程中,用户进程会自然退出一个代码段,然后运行下一个代码段,因此,针对标注的不可被抢占代码段,用户进程在运行完该不可被抢占代码段中的代码后,同样会自然退出不可被抢占代码段,这样该用户进程就不会一直占用共享资源而不允许其他用户进程抢占,也即是,不会出现恶意程序一直占用共享资源的问题。也即是,通过本申
请实施例提供的用户抢占方法可以利用代码执行会自然退出不可被抢占代码段的特性来一定程度上避免恶意程序长时间抢占共享资源的情况。
9.(2)通过本技术实施例提供的用户进程抢占方法,利用应用程序中标注的不可被抢占代码段,内核便可允许当前正在运行的用户进程继续允许,无需通过优先级继承的方式才能避免由于其他用户进程抢占而导致当前用户进程中止,因此也就不存在优先级继承技术带来的系统死锁、以及高优先级用户进程连读多次阻塞的问题。
10.基于第一方面提供的方法,在一种可能的实现方式中,获取第一用户进程对应的抢占标记信息之后,在该方法中,如果内核基于第一应用程序对应的抢占标记信息,判断出第一用户进程当前运行的代码不属于不可被抢占代码段中的代码,则停止第一用户进程,运行第二用户进程。
11.基于上述过程,内核只有在不可被抢占代码段内不允许其他用户进程抢占,而在普通业务代码内,则允许其他用户进程抢占,从而实现利用代码执行会自然退出不可被抢占代码段的特性来一定程度上避免恶意程序长时间抢占共享资源的情况。
12.基于第一方面提供的方法,在一种可能的实现方式中,抢占标记信息为第一应用程序的不可被抢占代码段中的代码的地址。
13.这种场景下,内核基于第一应用程序对应的抢占标记信息,判断出第一用户进程当前运行的代码属于不可被抢占代码段中的代码的实现过程可以为:内核获取程序计数器pc的当前数值,如果pc的当前数值所指示的地址为抢占标记信息中地址,则确定第一用户进程当前运行的代码属于不可被抢占代码段中的代码。
14.在具体实现时,可以直接基于pc的当前数值来判断当前执行代码是否属于不可被抢占代码,提高了内核调度的效率。
15.基于第一方面提供的方法,在一种可能的实现方式中,操作系统还包括程序编译器和程序加载器。
16.这种场景下,在该方法中,响应于标注指令,程序编译器将第一应用程序的第一代码标注为不可被抢占代码,第一代码为第一应用程序中的任一代码;程序加载器调用第一系统调用函数,第一系统调用函数用于指示内核将标注的不可被抢占代码的标识添加至内核中第一应用程序对应的抢占标记信息中。
17.由于应用程序的代码中哪些属于不可被抢占代码可以由用户指定,因此本技术实施例可以让用户可以有更多的选择性,从而提高用户进程运行的效率。
18.基于第一方面提供的方法,在一种可能的实现方式中,程序加载器调用第一系统调用函数的实现过程可以为:如果标注的不可被抢占代码段为线性执行的代码,则程序加载器调用第一系统调用函数。
19.基于第一方面提供的方法,在一种可能的实现方式中,程序编译器将第一应用程序的第一代码标注为不可被抢占代码之后,在该方法中,如果标注的不可被抢占代码为页内循环的代码,则程序加载器不执行调用第一系统调用函数的操作。
20.如果标注的不可被抢占代码段中的代码存在页内循环代码,此时第一用户进程在运行不可被抢占代码段时,由于页内循环代码的存在将会出现第一用户进程一直处于运行不可被抢占代码段的场景,这样同样会出现第一用户进程长久占用共享资源而导致其他用户进程无法运行的问题。因此,程序编译器在标注不可被抢占代码段后,程序加载器在将不
可被抢占代码段注册到内核之前还需对标注的不可被抢占代码段进行检查,只有在标注的不可被抢占代码段不存在页内循环的情况(也即是标注的不可被抢占代码段为线性执行的代码),才会将标注的不可被代码段注册到内核中。
21.基于第一方面提供的方法,在一种可能的实现方式中,程序加载器调用第一系统调用函数之后,在该方法中,内核将第一应用程序对应的抢占标记信息配置为只读模式。
22.程序加载器在调用第一系统调用函数之后,为了避免存在恶意程序修改内核中注册的不可被抢占代码段的标识,从而导致第一用户进程长久占用共享资源而导致其他用户进程无法运行,内核还可以将注册的不可被抢占代码段标识配置为只读模式。
23.基于第一方面提供的方法,在一种可能的实现方式中,程序加载器调用第一系统调用函数之后,在该方法中,内核在检测标注的不可被抢占代码为线性执行的代码的情况下,将标注的不可被抢占代码的标识添加至第一应用程序对应的不可抢占标记信息中。
24.为了进一步避免不可被抢占代码段中的代码存在页内循环代码,内核在将标注的不可被抢占代码的标识添加到第一应用程序对应的抢占标记信息之前,也可以先对标注的不可被抢占代码进行检测。然后在检测标注的不可被抢占代码中不存在页内循环的代码的情况下,将标注的不可被抢占代码的标识添加至第一应用程序对应的抢占标记信息中。相应地,在检测标注的不可被抢占代码中存在页内循环的代码的情况下,则不将标注的不可被抢占代码的标识添加至第一应用程序对应的抢占标记信息中。
25.基于第一方面提供的方法,在一种可能的实现方式中,程序加载器调用第一系统调用函数之后,在该方法中,响应于删除指令,程序加载器调用第二系统调用函数,第二系统调用函数指示内核从第一应用程序对应的抢占标记信息中移除第二代码的标识,第二代码为第一应用程序对应的不可被抢占代码段中任一代码。
26.在内核中注册了第一应用程序的不可被抢占代码段之后,还可以对已经注册的不可被抢占代码段进行删除,进一步提高了标注不可被抢占代码段的灵活性。
27.第二方面,提供了一种用户进程抢占装置,所述用户进程抢占装置具有实现上述第一方面中用户进程抢占方法行为的功能。所述用户进程抢占装置包括至少一个模块,该至少一个模块用于实现上述第一方面所提供的用户进程抢占方法。
28.第三方面,提供了一种用户进程抢占设备,所述用户进程抢占设备包括存储器和处理器;所述存储器用于存储程序;所述处理器被配置为用于执行所述存储器中存储的所述程序以实现上述用户进程抢占方法。
29.第四方面,提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有指令,当其在计算机上运行时,使得计算机执行上述用户进程抢占方法。
30.第五方面,提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述用户进程抢占方法。
31.上述第二方面、第三方面、第四方面和第五方面所获得的技术效果与第一方面中对应的技术手段获得的技术效果近似,在这里不再赘述。
附图说明
32.图1是本技术实施例提供的一种操作系统的架构示意图;
33.图2是本技术实施例提供的一种在图1所示的操作系统架构下的用户进程抢占流
程示意图;
34.图3是本技术实施例提供的另一种用户抢占流程示意图;
35.图4是本技术实施例提供的一种操作系统的架构示意图;
36.图5是本技术实施例提供的另一种操作系统的架构示意图;
37.图6是本技术实施例提供的一种用户进程抢占方法流程图;
38.图7是本技术实施例提供的一种将应用程序的不可被抢占代码段注册至内核的方法流程图;
39.图8是本技术实施例提供的一种标注不可被抢占代码段的流程示意图;
40.图9是本技术实施例提供的一种标注不可被抢占代码段和调度用户进程的方法流程图;
41.图10是本技术实施例提供的一种标注不可被抢占代码段的示意图;
42.图11是本技术实施例提供的一种另用户进程抢占方法流程图;
43.图12是本技术实施例提供的一种用户进程抢占装置的结构示意图;
44.图13是本技术实施例提供的一种计算机设备的结构示意图。
具体实施方式
45.为使本技术实施例的目的、技术方案和优点更加清楚,下面将结合附图对本技术实施方式作进一步地详细描述。
46.应当理解的是,本文提及的“多个”是指两个或两个以上。在本技术的描述中,除非另有说明,“/”表示或的意思,例如,a/b可以表示a或b;本文中的“和/或”仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。另外,为了便于清楚描述本技术实施例的技术方案,在本技术的实施例中,采用了“第一”、“第二”等字样对功能和作用基本相同的相同项或相似项进行区分。本领域技术人员可以理解“第一”、“第二”等字样并不对数量和执行次序进行限定,并且“第一”、“第二”等字样也并不限定一定不同。
47.在对本技术实施例进行详细解释说明之前,先对本技术实施例的应用场景进行详细解释说明。
48.在计算机的操作系统中,需要限制不同的程序之间的访问能力,以防止他们获取别的程序的内存数据或者获取诸如硬盘网卡等外围设备的数据从而导致数据泄露,因此,目前针对操作系统划分出两个权限等级:用户态和内核态。其中,用户态是指中央处理器(central processing unit,cpu)只能受限的访问部分内存,且不允许访问外围设备。内核态是指cpu可以访问内存的所有数据,且允许访问外围设备。
49.目前应用程序通常是运行在用户态的,因此应用程序还可以称为用户态程序。此外,运行应用程序是通过加载的进程实现的,每运行一个应用程序则需加载一个进程,也即是一个应用程序对应一个进程。由于应用程序通常是运行在用户态的,因此运行应用程序的进程也称为用户进程。
50.不同用户进程通常存在访问同一资源的场景,这些资源可以称为共享资源,共享资源对应的代码段称为临界区。为了保证共享资源的一致性,对共享资源的访问需要保证互斥性。也即是,不同用户进程不能同时访问同一共享资源,进而出现不同用户进程同时修
改同一共享资源的情况。因此,每次只能允许一个用户进程对共享资源进行访问。基于该原因,针对共享资源可以配置唯一一个锁,用户进程在拿到该锁(相当于抢占到共享资源)之后才能运行,如果另一个用户进程也需要运行,则另一个用户进程则需要抢占到该锁才能运行。
51.也即是,运行在操作系统上的用户进程在任何时间都面临被抢占的风险。当持锁的用户进程抢占到该共享资源时,被抢占的用户进程则无法继续执行,此时被抢占的用户进程往往会忙等或陷入内核进行等待。这会导致系统整体性能下降。
52.其中,陷入内核是指用户进程在执行时,为了访问系统资源(该系统资源包括硬件或内核数据),此时用户进程需要进行系统调用。用户进程在进行系统调用时,该用户进程被暂时终止执行,该用户进程上下文也会被内核中断程序保存起来。然后cpu开始执行一段需要的内核代码,这样cpu便进入了内核态,因此称之为陷入内核。
53.为了解决上述抢占导致的问题,业界普遍采用如下方法为关闭抢占。此时,持有共享资源的用户进程,操作系统可以允许它执行到共享资源释放(yield),从而避免上述抢占带来的问题。然而该方法仍然存在很多不足,比如由于盲目地关闭用户进程的抢占功能,会使得恶意进程有机可乘,从而使得恶意进程持续占用共享资源,从而降低系统的执行效率。
54.基于上述问题,目前业界又提出了两种抢占方法,为了便于理解本技术实施例的技术效果,在此先对这两种抢占方法进行详细解释说明。
55.图1是本技术实施例提供的一种操作系统的架构示意图。如图1所示,该操作系统包括用户进程(thread)和内核,针对用户进程配置抢占延迟特性(preemption delay feature)模块,用户进程可以通过抢占延迟特性模块,向内核发出抢占延迟的请求,从而让用户进程获得更多的运行时间,以避免正在运行的用户进程由于其他用户进程抢占而中止。其中,图1中的内核也称为操作系统内核,该内核中部署有内核调度器,前述用户进程向内核发出抢占延迟的请求具体是指:向内核中的内核调度器发送该抢占延迟的请求。也即是,在本技术实施例中,内核中确定各个用户进程继续运行还是中止运行的实际执行主体为内核调度器,后续涉及的内核的相关操作均是指内核调度器的相关操作,后续不再对此详细说明。
56.图2是本技术实施例提供的一种在图1所示的操作系统架构下的用户进程抢占流程示意图。如图2所示,在某个用户进程(图2中将该用户进程标记为第一用户进程)正在运行的过程中,如果存在其他用户进程(图2中将其他用户进程标记为第二用户进程)需要抢占第一用户进程运行时所占用的资源,第一用户进程可以通知内核需要延迟抢占时间点,以争取更多的时间执行当前的任务。内核在接收到该延迟抢占时间点的申请时,进行延迟抢占的必要操作(该必要操作为中断打断等),也即是内核通知第一用户进程进入中断模式(也即是勿扰模式),第一用户进程进入中断模式后,内核便可通知第一用户进程允许延迟抢占。第一用户进程在延迟后的抢占时间点到达时,需要主动释放占用的共享资源。此时,内核便可调度之前需要抢占的第二用户进程基于释放的共享资源运行。其中,第一用户进程在延迟后的抢占时间点到达时,如果没有主动释放占用的共享资源,则内核会对第一用户进程进行惩罚,比如,下次如果第一用户进程申请延迟抢占时间点,内核会拒绝第一用户进程的申请。
57.图2所示的抢占流程能够有效实现如下效果:某个用户进程在运行未结束之前,申
linkable format,elf)文件),这个过程就称为链接。在本技术实施例中,程序编译器在编译应用程序的代码的过程中,将对应用程序的代码进行标注。具体地,标注应用程序的代码中哪些代码属于不可被抢占代码段,哪些代码属于可被抢占代码段。在本技术实施例中,不可被抢占代码段是指运行过程中不允许由于其他用户进程的抢占而导致中止运行的代码,可被抢占代码段是指运行过程如果存在其他用户进程抢占则允许中止运行的代码。
66.程序编译器403在编译得到应用程序的可执行文件后,便可在可执行文件中添加一个头部,该头部指示了该应用程序的一些加载顺序等重要信息,以便后续程序加载基于这些重要信息将应用程序的可执行文件加载到内核中。
67.程序加载器402用于将应用程序的可执行文件加载至内核401,从而实现应用程序对应的用户进程的运行。程序加载器402在将应用程序的可执行文件加载至内核401时,由于预先标注了应用程序的代码中哪些代码属于不可被抢占代码段,哪些代码属于可被抢占代码段,因此,程序加载器402可以将应用程序的代码中属于不可被抢占代码段的代码注册至内核,以便后续内核调度器基于该不可被抢占代码段判断是否允许别的应用程序的用户进程抢占该应用程序的用户进程。
68.在一种可能的实现方式中,可以在内核中新增抢占标记信息,该抢占标记信息用于标识第一应用程序的不可被抢占代码段。如此,上述程序加载器402将应用程序中属于不可被抢占代码段的代码注册至内核具体是指:程序加载器402将应用程序的不可被抢占代码段的代码的标识添加到可被抢占标记信息中。需要说明的是,为了便于后续快速查找,内核中的抢占标记信息是以应用程序为单位的,也即是,每个应用程序对应一个抢占标记信息。
69.示例地,上述抢占标记信息为所述第一应用程序中的不可被抢占代码段中的代码的地址,此时,抢占标记信息可以称为抢占地址表。如图4所示,可以在内核中新增抢占地址表,该抢占地址表用于存储第一应用程序的不可被抢占代码段的地址。如此,上述程序加载器402将应用程序中属于不可被抢占代码段的代码注册至内核具体是指:程序加载器402将应用程序的不可被抢占代码段的代码地址添加到抢占地址表中。同样为了便于后续快速查找,内核中的抢占地址表是以应用程序为单位的,也即是,每个应用程序对应一个抢占地址表。
70.需要说明的是,上述抢占地址表仅仅是将将应用程序中属于不可被抢占代码段的代码注册至内核的一种途径,本技术实施例并不限定具体如何将应用程序中属于不可被抢占代码段的代码注册至内核,任意能够将应用程序中属于不可被抢占代码段的代码注册至内核均在本技术实施例的保护范围之内。比如,程序加载器还可以将应用程序的不可被抢占代码段的其他标识注册至内核。
71.基于上述图4所示的操作系统的架构的功能,需要在图4所示的操作系统中新增几个软件模块以实现上述图4所示的操作系统的架构的功能。图5是本技术实施例提供的另一种操作系统的架构示意图。如图5所示,针对程序编译器403新增了代码类型标注模块,该代码类型标注模块用于实现在应用程序的代码中标注哪些代码属于不可被抢占代码段,哪些代码属于可被抢占代码段,从而得到含有标注信息的应用程序代码。针对程序加载器402还配置了标注信息注册模块,该标注信息注册模块用于实现将应用程序的不可被抢占代码段注册到内核中。针对内核调度器401配置了识别类型标注模块,该识别类型标注模块用于实
现内核调度器如何判断应用程序当前运行的代码是否属于注册的不可被抢占代码段中的代码。比如,内核调度器可以基于抢占地址表判断应用程序当前运行的代码是否属于不可被抢占代码段中的代码。
72.基于图5所示的操作系统的架构可知,本技术实施例贯穿程序编译,程序加载,内核进程调度三个阶段。在程序编译这个阶段,新增提供给用户可以标注应用程序代码特性的模块,用户可以给不同的应用程序代码标注不同的标注信息,比如标注一段代码为不可被抢占的代码。程序加载器会在加载阶段把这些标注信息注册进操作操作系统的内核。最后,内核中新增识别类型标注模块,在内核调度器进行调度时,会调用识别类型标注模块以根据标注信息来做判断是否允许其他用户进程抢占当前正在运行的用户进程,而不是直接调度。
73.基于图4以及图5所示的操作系统,本技术实施例至少可以实现以下技术效果:
74.(1)对于任一应用程序的代码,标注出不可被抢占的代码段。运行该应用程序的用户进程在运行不可被抢占代码段的时间内,内核调度器不会允许其他用户进程抢占该用户进程。而在用户进程在运行可被抢占代码段的时间内,内核调度器会允许其他用户进程抢占该用户进程。由于在用户进程运行的过程中,用户进程会自然退出一个代码段,然后运行下一个代码段,因此,针对标注的不可被抢占代码段,用户进程在运行完该不可被抢占代码段中的代码后,同样会自然退出不可被抢占代码段,这样该用户进程就不会一直占用共享资源而不允许其他用户进程抢占,也即是,不会出现恶意程序一直占用共享资源的问题。也即是,通过本技术实施例提供的操作系统可以利用代码执行会自然退出不可被抢占代码段的特性来一定程度上避免恶意程序长时间抢占共享资源的情况。
75.(2)另外,通过本技术实施例提供的操作系统,利用应用程序中标注的不可被抢占代码段,内核调度器便可允许当前正在运行的用户进程继续允许,无需通过优先级继承的方式才能避免由于其他用户进程抢占而导致当前用户进程中止,因此也就不存在优先级继承技术带来的系统死锁、以及高优先级用户进程连读多次阻塞的问题。
76.(3)由于应用程序的代码中哪些属于不可被抢占代码可以由用户指定,因此本技术实施例可以让用户可以有更多的选择性,从而提高用户进程运行的效率。
77.需要说明的是,图5所示的操作系统中新增的代码类型标注模块、标注信息注册模块以及识别类型标注模块均是软件模块,本技术实施例并不限定这些软件模块的具体名称,在应用本技术实施例中,只需保证图5所示的操作系统中的程序编译器、程序加载器以及内核调度器能够实现相应功能即可。
78.另外,为了能够实现上述图4以及图5所示的操作系统的功能,需要对内核的配置进行修改,以使内核能够支持操作系统实现上述功能。为了后续便于说明,下面先对针对内核新增的配置进行详细解释说明。
79.(1)内核中增加用于存储注册的不可被抢占代码段的标识的数据结构。
80.如前述所示,该数据结构可以为一个抢占地址表,该抢占地址表用于存储各个应用程序的不可被抢占代码段的地址。可选地,该抢占地址表中的地址可以以树形数据结构存储,以便于快速从该抢占地址表中查询某个地址。示例地,在代码中,新增的用于存储注册的不可被抢占代码段的数据结构可以标记为“btree*non_preemption_section_tree”,该数据结构即为一种树形数据结构。
81.(2)添加第一系统调用函数,第一系统调用函数用于实现将不可被抢占代码段的标识注册至内核,也即是,当程序加载器调用第一系统调用函数时,内核便可执行将不可被抢占代码段的标识注册至内核的操作。示例地,第一系统调用函数的代码可以为“register_non_preemption_section(section*)”。
82.(3)添加第二系统调用函数,第二系统调用函数用于实现将不可被抢占代码段的标识从内核中移除,也即是,当程序加载器调用第二系统调用函数时,内核便可执行将不可被抢占代码段的标识从内核中移除的操作。示例地,第二系统调用函数的代码可以为“unregister_non_preemption_section(section*)”。
83.基于图4以及图5所示的操作系统架构,下面对本技术实施例提供的用户进程抢占方法进行详细解说明。
84.图6是本技术实施例提供的一种用户进程抢占方法流程图。如图6所示,该方法包括如下几个步骤。
85.步骤601:在第一用户进程运行的过程中,如果内核调度器检测到抢占请求,则获取第一应用程序对应的抢占标记信息,该抢占标记信息用于标识第一应用程序中的不可被抢占代码段,该不可被抢占代码段为第一应用程序中的部分代码段,第一应用程序为任一应用程序,第一用户进程为运行第一应用程序的进程,该抢占请求指示第二用户进程需要抢占第一用户进程所占用的资源。
86.基于前述内容可知,在本技术实施例中,对于任一的应用程序的代码,预先标注出了哪些代码属于不可被抢占代码段,而不可被抢占代码段是指运行过程中不允许由于其他用户进程的抢占而导致中止运行的代码,因此,在步骤601中,在第一用户进程运行的过程中,如果内核调度器检测到指示第二用户进程需要抢占第一用户进程所占用的资源的抢占请求,则获取第一应用程序对应的抢占标记信息,由于抢占标记信息用于标识第一应用程序中的不可被抢占代码段,因此相当于确定出第一应用程序对应的不可被抢占代码段,以便于后续内核调度器基于第一应用程序对应的不可被抢占代码段,判断是否需要中止运行第一应用程序并调度第二应用程序运行。
87.如前述实施例,在抢占标记信息为抢占地址表的情况下,在一种可能的实现方式中,内核中预先注册有各个应用程序的抢占地址表,每个应用程序的抢占地址表指示相应应用程序的不可被抢占代码段的代码地址。这种场景下,获取第一应用程序对应的不可被抢占标记信息具体是指:获取第一应用程序的抢占地址表。
88.步骤602:如果基于第一应用程序对应的抢占标记信息,判断出第一用户进程当前运行的代码属于不可被抢占代码段中的代码,则内核调度器允许第一用户进程继续运行。
89.相应地,如果基于第一应用程序对应的抢占标记信息,判断出第一用户进程执行运行的代码不属于不可被抢占代码段中的代码,则停止第一用户进程,运行第二用户进程。
90.通过步骤602,对于第一应用程序的不可被抢占代码段中的代码,这些代码的运行过程不会因为其他用户进程的抢占而中断执行。对于第一应用程序而言,不可被抢占代码段仅仅是第一应用程序代码中的部分代码,因此第一用户进程在运行时,会自然退出不可被抢占代码段,继续运行下一个代码段。如此,第一用户进程就不用一直占用共享资源而不允许其他用户进程抢占。从而一定程度上避免了恶意进程一直抢占共享资源而导致其他用户进程无法运行的情况。此外,通过步骤601和步骤602,无需通过优先级继承的方式就能避
免由于其他用户进程抢占而导致当前用户进程中止,因此也就不存在优先级继承技术带来的系统死锁、以及高优先级用户进程连读多次阻塞的问题。
91.此外,对于操作系统而言,操作系统中的程序计数器(program counter,pc)能够指示当前正在执行的代码的地址,因此,在步骤601中获取的是第一应用程序对应的抢占地址表的情况下,步骤602的实现方式为:确定pc的当前数值,如果pc的当前数值指示的代码地址属于第一应用程序的抢占地址表中的地址,则表明第一用户进程当前运行的代码属于不可被抢占代码段中的代码,此时内核调度器则允许第一用户进程继续运行。
92.相应地,如果pc的当前数值指示的代码地址不属于第一应用程序的抢占地址表中的地址,则表明第一用户进程当前运行的代码不属于不可被抢占代码段中的代码,此时内核调度器则中止第一用户进程的运行,并调度第二用户进程运行。需要说明的是,第二用户进程并不是任意需要抢占第一用户进程的用户进程,比如在存在多个其他用户进程需要抢占第一用户进程的场景中,内核调度器会优先将优先级高的其他用户进程作为第二用户进程进行调度。
93.另外,当第一用户进程离开不可被抢占代码段后,第一用户进程将执行可被抢占代码段中的代码,此时如果出现其他用户进程抢占第一用户进程所占用的资源,由于当前执行代码属于可被抢占代码段,因此内核调度器会中断第一用户进程,从而使得第一用户进程发生陷入内核,此时内核调度器将进行如下操作:按正常可被抢占流程执行或者触发调度。其中,按正常可被抢占流程执行是指:按照其他用户进程的优先级调度优先级最高的用户进程抢占。触发调度是指:基于业务需求调度某个优先级并不是很高的用户进程抢占。
94.通过图6所示的实施例可知,本技术实施例提供了一种避免由于其他用户进程抢占而导致当前用户进程中止的方法。并且利用应用程序中标注的不可被抢占代码段,内核调度器便可允许当前正在运行的用户进程继续允许,无需通过优先级继承的方式才能避免由于其他用户进程抢占而导致当前用户进程中止,因此也就不存在优先级继承技术带来的系统死锁、以及高优先级用户进程连读多次阻塞的问题。此外,该方法可以利用代码执行会自然退出不可被抢占代码段的特性来一定程度上避免恶意程序长时间抢占共享资源的情况。
95.基于前述内容可知,为了实现图6所示的用户进程抢占方法,需要预先将各个应用程序的不可被抢占代码段注册至内核中。下面以图7所示的实施例为例说明如何将应用程序的不可被抢占代码段注册至内核。也即是,图7是本技术实施例提供的一种将应用程序的不可被抢占代码段注册至内核的方法流程图。具体地,如图7所示,该方法包括如下几个步骤。
96.步骤701:响应于标注指令,程序编译器将第一应用程序的第一代码标注为不可被抢占代码,第一代码为第一应用程序中的任一代码。
97.其中,标注指令是由用户通过预设操作触发,也即是,在本技术实施例中,任一应用程序中的不可被抢占代码段可以由用户基于业务需求设置,提高了配置不可被抢占代码段的灵活性。
98.在一种可能的实现方式中,程序编译器在编译得到第一应用程序的源代码之后,在当前显示界面上显示第一应用程序的源代码以及标注控件,当程序编译器检测到用户针对该标注控件的选择操作时,表明当前检测到标注指令,将用户选择的代码标注为不可被
抢占代码。其中,标注控件用于提供用户触发该标注指令。显示界面上显示的标注控件可以为一个图标、也可以为其他类型的标记符号。
99.示例地,程序编译器可以通过.non-preemption(用来标注的函数)来标注第一应用程序中的不可被抢占代码。具体实现时的逻辑代码可以表示为:__attribute__((section(“.non-preemption”))),该逻辑代码表示将选择的第一应用程序的代码标注为不可被抢占代码。
100.此外,程序编译器在编译过程中标注不可被抢占代码后,由于标注的不可被抢占代码可能为多个,因此,在后续链接代码的过程中,可以将标注的不可被抢占代码放在一个指定的字段内,以实现对标注的不可被抢占代码的整合。
101.示例地,程序编译器在链接的过程中,可以在elf文件内部添加特殊的不可被抢占(no-preemptive)字段。并且将希望在执行期不被抢占的代码(也即是前述标注的不可被抢占代码)放在该字段内,从而得到第一应用程序的不可被抢占代码段。
102.步骤702:程序加载器调用第一系统调用函数,第一系统调用函数用于指示内核将标注的不可被抢占代码的标识添加至内核中的第一应用程序对应的抢占标记信息中。
103.如前述实施例,在抢占标记信息为抢占地址表的情况下,步骤702中程序加载器调用第一系统调用函数之后,内核将标注的不可被抢占代码的标识添加至内核中的第一应用程序的抢占标记信息中具体是指:内核将标注的不可被抢占代码的地址添加至内核中第一应用程序对应的抢占地址表中。
104.此外,示例地,在程序编译器链接后的可执行文件为elf文件的情况下,程序加载器具体可以为elf加载器(elfloader)。
105.上述步骤701和步骤702可以通过图8所示的流程图进一步说明。如图8所示,图8是本技术实施例提供的一种标注不可被抢占代码段的流程示意图。在图8中,对于任一应用程序(图8中以第一应用程序为例进行说明)的源代码,在程序编译器编译的过程中,基于标注指令标注了第一应用程序中的两个不可被抢占的代码,在标注不可被抢占代码后,剩下的两个代码默认为普通业务代码(普通业务代码也即是可被抢占的代码)。图8中是以标注后得到两个不可被抢占代码以及两个普通业务代码为例进行说明。在标注了不可被抢占业务代码和普通业务代码之后,程序编译器在链接代码的过程中,将各个普通业务代码整合在普通代码段中,将各个不可被抢占代码段整合在不可被抢占代码段(no-preemptive segment)中。后续elf加载器便可将链接后的不可被抢占代码段的地址注册至内核中的抢占地址表。其中,内核中每个用户进程对应有进程控制块(task control block,tcb),每个用户进程对应的tcb用于存储该用户进程的管理信息,该管理信息包括抢占地址表、优先级等内容。以便于后续内核调度器从第一用户进程对应的tcb中获取第一应用程序对应的抢占地址表。
106.此外,如果标注的不可被抢占代码段中的代码存在页内循环代码,此时第一用户进程在运行不可被抢占代码段时,由于页内循环代码的存在将会出现第一用户进程一直处于运行不可被抢占代码段的场景,这样同样会出现第一用户进程长久占用共享资源而导致其他用户进程无法运行的问题。因此,程序编译器在标注不可被抢占代码段后,程序加载器在将不可被抢占代码段注册到内核之前还需对标注的不可被抢占代码段进行检查,只有在标注的不可被抢占代码段不存在页内循环的情况(也即是标注的不可被抢占代码段为线性
执行的代码),才会将标注的不可被代码段注册到内核中。
107.基于上述理由,程序加载器调用第一系统调用函数的实现方式具体可以为:如果标注的不可被抢占代码段为线性执行的代码,则程序加载器调用第一系统调用函数。相应地,如果标注的不可被抢占代码段为页内循环的代码,则程序加载器不会调用第一系统调用函数。也即是不会将标注的不可被抢占代码注册到内核中,也即是不会将标注的不可被抢占代码的标识添加到内核中的抢占标记信息中。
108.另外,程序加载器在调用第一系统调用函数之后,为了进一步避免不可被抢占代码段中的代码存在页内循环代码,内核在将标注的不可被抢占代码的标识添加到第一应用程序对应的抢占标记信息之前,也可以先对标注的不可被抢占代码进行检测。然后在检测标注的不可被抢占代码中不存在页内循环的代码的情况下,将标注的不可被抢占代码的标识添加至第一应用程序对应的抢占标记信息中。相应地,在检测标注的不可被抢占代码中存在页内循环的代码的情况下,则不将标注的不可被抢占代码的标识添加至第一应用程序对应的抢占标记信息中。
109.此外,程序加载器在调用第一系统调用函数之后,为了避免存在恶意程序修改内核中注册的不可被抢占代码段的标识,从而导致第一用户进程长久占用共享资源而导致其他用户进程无法运行,内核还可以将注册的不可被抢占代码段标识配置为只读模式。也即是,程序加载器调用第一系统调用函数之后,内核还会将第一应用程序对应的抢占标记信息配置为只读模式。
110.在内核中注册了第一应用程序的不可被抢占代码段之后,还可以对已经注册的不可被抢占代码段进行删除,进一步提高了标注不可被抢占代码段的灵活性。因此,在一种可能的实现方式中,响应于删除指令,程序加载器调用第二系统调用函数,第二系统调用函数指示内核从第一应用程序对应的抢占标记信息中移除第二代码的标识,第二代码为第一应用程序对应的不可被抢占代码段中任一代码。
111.上述删除指令可以有以下两种场景。一种场景是:当第一用户进程运行完第一应用程序后,为了减轻内核的负担,程序加载器会调用第二系统调用函数,以使内核调度器删除内核中第一应用程序对应的抢占标记信息,也即是,删除内核中注册的第一应用程序对应的不可被抢占代码段。
112.另一种场景是:用户基于程序编译器删除之前标注的一些不可被抢占代码比如为第二代码,此时程序加载器同样会调用第二系统调用函数,以使内核调度器删除内核中第一应用程序对应的抢占标记信息中第二代码的标识。
113.基于图7所示的实施例,用户也可以基于业务需求灵活配置第一应用程序中的不可被抢占代码段,从而实现图6所示的实施例的技术效果,进一步提高了用户进程运行的灵活性。
114.上述图7和图6用于分别对如何标注不可被抢占代码段和如何基于标注的不可被抢占代码段调度用户进程进行详细解释说明。下面以图9所示的流程图对这两个过程进一步详细说明。图9是本技术实施例提供的一种标注不可被抢占代码段和调度用户进程的方法流程图。如图9所示,该方法包括四个步骤。
115.步骤一:在编写第一应用程序的源代码时,将希望不被抢占的小段代码通过调用标注函数.non-preemption来实现将该小段代码标注为不可被抢占代码,具体实现的逻辑
代码如图9所示为:
116.int non preemption_function(int input)
117.__attribute__((section(“.non-preemption”)))
118.{
119.non—preemption code body
120.}。
121.步骤二:在链接源代码的过程中,将标注的不可被抢占代码4k对齐存放在一个特殊的中字段(如前述示例的.non-preemption字段)中。具体实现的逻辑代码如图9所示为:
122..text:
123..non-preemption:
124.binary data of int non-preemption_function
125.(int input)。
126.步骤一和步骤二还可以进一步通过图10所示的示意图说明。图10是本技术实施例提供的一种标注不可被抢占代码段的示意图。如图10所示,对于多个应用程序中任一应用程序的代码,通过添加标注得到包括标注信息(该标注信息用于指示对应的代码为不可被抢占代码)的应用程序的代码(图10中将包括标注信息的应用程序的代码标记为应用程序’)。
127.步骤三:elfl加载器在加载第一应用程序的代码的过程中,检查第一应用程序的代码是否含有不可被抢占代码段,如果有的话,则需要调用第一系统调用函数将检查到的不可被抢占代码段注册到内核中。具体实现的逻辑代码如图9所示为:
128.for each sect in non-preemption-section:
129.syscall_register_non_preemption_section。
130.具体地,步骤三可以进一步通过下述a、b、c三个步骤实现:a.elfl加载器分析第一应用程序的代码段中的标注的不可被抢占代码段。b.elfl加载器检查不可被抢占代码段是否都是线性执行。c.elf加载器在检测不可被抢占代码段都是线性执行后,调用第一系统调用函数register_non_preempt_section,以实现将该不可被抢占代码段的代码地址注册到第一应用程序对应抢占地址表。如图9所示,该抢占地址表可以树形数据结构(示例地,该树形数据结构表示为non_preemption_section_tree),此时相当于将不可被抢占代码段注册到第一应用程序对应的non_preemption_section_tree中。
131.步骤四:内核调度器在触发调度时检查pc当前数值是否在当前tcb对应的non_preemption_section_tree中。如果pc当前数值在non_preemption_section_tree中,表明当前运行的代码属于不可被抢占代码段中的代码,此时内核调度器就直接继续调度当前用户进程,也即是中止其他用户进程抢占当前用户进程。如果pc当前数值不在non_preemption_section_tree中,表明当前运行的代码不属于不可被抢占代码段中的代码,此时内核调度器则走正常调度流程,也即是允许其他用户进程抢占当前用户进程所占用的共享资源。
132.下面以图11为例对本技术实施例提供的用户抢占方法进一步进行详细说明。图11是本技术实施例提供的另一种用户进程抢占方法流程图,如图11所示,对于第一应用程序,预先将第一应用程序的代码标注为不可被抢占代码段和普通业务代码段(普通业务代码段
也即是可被抢占代码段)。后续实现第一应用程序的第一用户进程在运行时,如果需要执行不可被抢占代码段中的代码,则需要先请求执行不可被抢占代码段中的代码所需的共享资源的锁,在请求锁之后,如果获取到该锁,则基于该共享资源执行不可被抢占代码段中的代码,并在执行完不可被抢占代码段中的代码后,释放该锁,以便于其他用户进程基于该锁使用该共享资源。此外,第一用户进程在执行完不可被抢占代码段中的代码后,便可继续执行普通业务代码。
133.在第一用户进程执行第一应用程序的代码的过程中,如果存在第二用户进程抢占第一用户进程所占用的资源,则内核调度器检查pc的当前数值,基于pc的当前数值所指示的地址判断是否允许抢占。
134.如果基于pc的当前数值判断出:在第一用户进程执行普通业务代码段的过程中,存在第二用户进程抢占第一用户进程所占用的资源。此时,内核调度器则停止运行第一用户进程,调度第二用户进程运行。这种状况下,第一用户进程就陷入内核。
135.如果基于pc的当前数值判断出:在第一用户进程执行不可被抢占代码段的过程中,存在第二用户进程抢占第一用户进程所占用的资源。此时,内核调度器则停止运行第一用户进程,调度第二用户进程运行。
136.综上所述,在本技术实施例中,对于任一应用程序的代码,可以标注出不可被抢占的代码段。运行该应用程序的用户进程在运行不可被抢占代码段的时间内,内核调度器不会允许其他用户进程抢占该用户进程。而在用户进程在运行可被抢占代码段的时间内,内核调度器会允许其他用户进程抢占该用户进程。由于在用户进程运行的过程中,用户进程会自然退出一个代码段,然后运行下一个代码段,因此,针对标注的不可被抢占代码段,用户进程在运行完该不可被抢占代码段中的代码后,同样会自然退出不可被抢占代码段,这样该用户进程就不会一直占用共享资源而不允许其他用户进程抢占,也即是,不会出现恶意程序一直占用共享资源的问题。也即是,通过本技术实施例提供的操作系统可以利用代码执行会自然退出不可被抢占代码段的特性来一定程度上避免恶意程序长时间抢占共享资源的情况。
137.另外,通过本技术实施例提供的操作系统,利用应用程序中标注的不可被抢占代码段,内核调度器便可允许当前正在运行的用户进程继续允许,无需通过优先级继承的方式才能避免由于其他用户进程抢占而导致当前用户进程中止,因此也就不存在优先级继承技术带来的系统死锁、以及高优先级用户进程连读多次阻塞的问题。
138.此外,由于应用程序的代码中哪些属于不可被抢占代码可以由用户指定,因此本技术实施例可以让用户可以有更多的选择性,从而提高用户进程运行的效率。
139.图12是本技术实施例提供的一种用户进程抢占装置的结构示意图。该装置部署于操作系统中,操作系统的内核中注册有第一应用程序对应的抢占标记信息,抢占标记信息用于标识第一应用程序中的不可被抢占代码段,不可被抢占代码段为第一应用程序中的部分代码段,第一应用程序为任一应用程序,第一用户进程为运行第一应用程序的进程。如图12所示,该装置1200包括如下几个模块。
140.获取模块1201,用于在第一用户进程运行的过程中,如果检测到第二用户进程抢占第一用户进程所占用的资源,则获取第一应用程序对应的抢占标记信息,第二用户进程为除第一用户进程外其他用户进程。具体实现方式可以参考图6实施例中的步骤601。
141.调度模块1202,用于如果基于第一应用程序对应的抢占标记信息,判断出第一用户进程当前运行的代码属于不可被抢占代码段中的代码,则允许第一用户进程继续运行。具体实现方式可以参考图6实施例中的步骤602。
142.可选地,调度模块还用于:
143.如果基于第一应用程序对应的抢占标记信息,判断出第一用户进程当前运行的代码不属于不可被抢占代码段中的代码,则停止第一用户进程,运行第二用户进程。
144.可选地,抢占标记信息为第一应用程序的不可被抢占代码段中的代码的地址;
145.调度模块用于:
146.获取程序计数器pc的当前数值,如果pc的当前数值所指示的地址为抢占标记信息中地址,则确定第一用户进程当前运行的代码属于不可被抢占代码段中的代码。
147.可选地,该装置还包括:
148.标注模块,用于响应于标注指令,将第一应用程序的第一代码标注为不可被抢占代码,第一代码为第一应用程序中的任一代码。具体实现方式可以参考图7实施例中的步骤701。
149.第一调用模块,用于调用第一系统调用函数,第一系统调用函数用于指示将标注的不可被抢占代码的标识添加至内核中第一应用程序对应的抢占标记信息中。具体实现方式可以参考图7实施例中的步骤702。
150.可选地,第一调用模块用于:
151.如果标注的不可被抢占代码段为线性执行的代码,则程序加载器调用第一系统调用函数。
152.可选地,第一调用模块用于:
153.如果标注的不可被抢占代码为页内循环的代码,则不执行调用第一系统调用函数的操作。
154.可选地,该装置还包括:
155.配置模块,用于将第一应用程序对应的抢占标记信息配置为只读模式。
156.可选地,该装置还包括:
157.添加模块,用于在检测标注的不可被抢占代码为线性执行的代码的情况下,将标注的不可被抢占代码的标识添加至第一应用程序对应的不可抢占标记信息中。
158.可选地,该装置还包括:
159.删除模块,用于响应于删除指令,调用第二系统调用函数,第二系统调用函数指示从第一应用程序对应的抢占标记信息中移除第二代码的标识,第二代码为第一应用程序对应的不可被抢占代码段中任一代码。
160.综上所述,在本技术实施例中,对于任一应用程序的代码,可以标注出不可被抢占的代码段。运行该应用程序的用户进程在运行不可被抢占代码段的时间内,内核调度器不会允许其他用户进程抢占该用户进程。而在用户进程在运行可被抢占代码段的时间内,内核调度器会允许其他用户进程抢占该用户进程。由于在用户进程运行的过程中,用户进程会自然退出一个代码段,然后运行下一个代码段,因此,针对标注的不可被抢占代码段,用户进程在运行完该不可被抢占代码段中的代码后,同样会自然退出不可被抢占代码段,这样该用户进程就不会一直占用共享资源而不允许其他用户进程抢占,也即是,不会出现恶
意程序一直占用共享资源的问题。也即是,通过本技术实施例提供的操作系统可以利用代码执行会自然退出不可被抢占代码段的特性来一定程度上避免恶意程序长时间抢占共享资源的情况。
161.另外,通过本技术实施例提供的操作系统,利用应用程序中标注的不可被抢占代码段,内核调度器便可允许当前正在运行的用户进程继续允许,无需通过优先级继承的方式才能避免由于其他用户进程抢占而导致当前用户进程中止,因此也就不存在优先级继承技术带来的系统死锁、以及高优先级用户进程连读多次阻塞的问题。
162.此外,由于应用程序的代码中哪些属于不可被抢占代码可以由用户指定,因此本技术实施例可以让用户可以有更多的选择性,从而提高用户进程运行的效率。
163.需要说明的是:上述实施例提供的用户进程抢占装置在调度用户进程时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将设备的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的用户进程抢占装置与用户进程抢占方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
164.图13是本技术施例提供的一种计算机设备的结构示意图。前述实施例中操作系统可以为图13所示的计算机设备中的操作系统。参见图13,该计算机设备包括至少一个处理器1301,通信总线1302、存储器1303以及至少一个通信接口1304。
165.处理器1301可以是一个通用中央处理器(central processing unit,cpu)、特定应用集成电路(application-specific integrated circuit,asic)或一个或多个用于控制本技术方案程序执行的集成电路。
166.通信总线1302可包括一通路,在上述组件之间传送信息。
167.存储器1303可以是只读存储器(read-only memory,rom)或可存储静态信息和指令的其它类型的静态存储设备,随机存取存储器(random access memory,ram)或者可存储信息和指令的其它类型的动态存储设备,也可以是电可擦可编程只读存储器(electrically erasable programmable read-only memory,eeprom)、只读光盘(compact disc read-only memory,cd-rom)或其它光盘存储、光碟存储(包括压缩光碟、激光碟、光碟、数字通用光碟、蓝光光碟等)、磁盘或者其它磁存储设备、或者能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其它介质,但不限于此。存储器1303可以是独立存在,通过通信总线1302与处理器1301相连接。存储器1303也可以和处理器1301集成在一起。
168.其中,存储器1303用于存储执行本技术方案的程序代码,并由处理器1301来控制执行。处理器1301用于执行存储器1303中存储的程序代码。程序代码中可以包括一个或多个软件模块。
169.通信接口1304,使用任何收发器一类的装置,用于与其它设备或通信网络通信,如以太网,无线接入网(radio access network,ran),无线局域网(wireless local area networks,wlan)等。
170.在具体实现中,作为一种实施例,计算机设备可以包括多个处理器,例如图13中所示的处理器1301和处理器1305。这些处理器中的每一个可以是一个单核(single-cpu)处理器,也可以是一个多核(multi-cpu)处理器。这里的处理器可以指一个或多个设备、电路、
和/或用于处理数据(例如计算机程序指令)的处理核。
171.上述的计算机设备可以是一个通用计算机设备或者是一个专用计算机设备。在具体实现中,计算机设备可以是台式机、便携式电脑、网络服务器、掌上电脑(personal digital assistant,pda)、移动手机、平板电脑、无线终端设备、通信设备或者嵌入式设备。本技术实施例不限定计算机设备的类型。
172.在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意结合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机指令时,全部或部分地产生按照本技术实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如:同轴电缆、光纤、数据用户线(digital subscriber line,dsl))或无线(例如:红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质(例如:软盘、硬盘、磁带)、光介质(例如:数字通用光盘(digital versatile disc,dvd))、或者半导体介质(例如:固态硬盘(solid state disk,ssd))等。
173.本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
174.以上所述为本技术提供的实施例,并不用以限制本技术实施例,凡在本技术实施例的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本技术实施例的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1