一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

进程运行方法、装置、设备及计算机可读存储介质与流程

2022-02-24 10:57:46 来源:中国专利 TAG:


1.本技术实施例涉及计算机操作系统技术领域,涉及但不限于一种进程运行方法、装置、设备及计算机可读存储介质。


背景技术:

2.在单个操作系统中,同一时刻只会有一个进程的窗口处于前台,对于处于前台的进程系统会给予其更多的中央处理器(cpu,center process unit)时间片,并且用户输入会首先发送到前台进程里,并且对于某些应用程序(例如游戏应用程序)如果判断到自身处于前台进程,那么会加快图形渲染的速度,提高帧率。比如在后台会以30fps的帧率运行,在前台会以60fps以上的帧率运行。因此,对于很多应用程序来说,运行在前台才能有更好的体验。
3.在相关技术中,采用在操作系统中部署多个虚拟机系统,以实现多个进程同时运行在前台,但是该方案中间加入了虚拟机特权转化、调度导致部分性能的损失。


技术实现要素:

4.本技术实施例提供一种进程运行方法、装置、设备及计算机可读存储介质,通过hook机制,在单个操作系统中同时运行多个前台进程,实现多开运行。
5.本技术实施例的技术方案是这样实现的:
6.本技术实施例提供一种进程运行方法,包括:
7.在第一前台进程运行过程中,当监测到该第一前台进程的第一调用对象调用进入内核态的预设函数时,跳转到该预设函数对应的第一回调函数;
8.当基于该预设函数确定不需要进入内核态时,在用户态下执行该第一回调函数;
9.获取该第一回调函数的第一执行结果;
10.将该第一执行结果返回给该第一调用对象。
11.本技术实施例提供一种进程运行装置,包括:
12.第一跳转模块,用于当在第一前台进程运行过程中,当监测到该第一前台进程的第一调用对象调用进入内核态的预设函数时,跳转到该预设函数对应的第一回调函数;
13.第一执行模块,用于当基于该预设函数确定不需要进入内核态时,在用户态下执行该第一回调函数;
14.第一获取模块,用于获取该第一回调函数的第一执行结果;
15.结果返回模块,用于将该第一执行结果返回给该第一调用对象。
16.在一些实施例中,该装置还包括:
17.第一切换模块,用于在基于该预设函数确定需要进入内核态时,通过系统调用将该第一前台进程切换至内核态;
18.第二执行模块,用于在内核态下执行该预设函数,得到该预设函数的第二执行结果;
19.第二切换模块,用于通过系统返回函数将该第一前台进程从内核态返回至用户态;
20.结果返回模块,用于将该第二执行结果返回给该第一调用对象。
21.在一些实施例中,该第一执行模块,还用于:
22.在基于该预设函数确定不需要进入内核态时,获取该第一前台进程对应的沙盒子系统;
23.在该沙盒子系统中执行该第一回调函数。
24.在一些实施例中,该装置还包括:
25.第一确定模块,用于当该预设函数为获取进程是否处于前台所调用的第一函数时,确定不需要进入内核态;或者,
26.第二确定模块,用于当该预设函数为设置进程的第一窗口为前台窗口所调用的第二函数时,确定不需要进入内核态;或者,
27.第三确定模块,用于当该预设函数为从基于目标点确定目标窗口所调用的第三函数时,确定不需要进入内核态;
28.第四确定模块,用于当该预设函数为分发切换窗口消息所调用的第四函数时,确定不需要进入内核态。
29.在一些实施例中,该装置还包括:
30.hook模块,用于当该预设函数为该第四函数时,挂钩hook该第四函数,以屏蔽切换窗口消息;
31.发送模块,用于当确定沙盒子系统内的窗口需要该切换窗口消息时,将该切换窗口消息发送至该沙盒子系统内的目标窗口。
32.在一些实施例中,不同沙盒子系统至少维护不同进程的前台窗口、焦点窗口、激活窗口对应的资源。
33.在一些实施例中,该装置还包括:
34.第二获取模块,用于获取进入内核态需要调用的多个函数;
35.第五确定模块,用于基于接收到针对该多个函数的选择操作,确定预设函数;
36.第三获取模块,用于获取该预设函数对应的回调函数。
37.在一些实施例中,该第一前台进程为游戏进程。
38.在一些实施例中,该装置还包括:
39.第一启动模块,用于响应于游戏客户端触发的游戏启动请求,启动游戏进程;
40.第六确定模块,用于将该游戏进程确定为不同于第一前台进程的第二前台进程,并在用户态下运行该第二前台进程;
41.第二跳转模块,用于在第二前台进程运行过程中,当监测到该第二前台进程的第二调用对象调用进入内核态的其中一个预设函数时,跳转到该预设函数对应的第二回调函数;
42.第三执行模块,用于当基于所述预设函数确定不需要进入内核态时,在用户态下执行所述第二回调函数;
43.第四获取模块,用于获取该第二回调函数的第三执行结果,并将该第三执行结果返回给该第二调用对象。
44.本技术实施例提供一种计算机设备,包括:
45.存储器,用于存储可执行指令;处理器,用于执行该存储器中存储的可执行指令时,实现上述的方法。
46.本技术实施例提供一种计算机可读存储介质,存储有可执行指令,用于引起处理器执行时,实现上述的方法。
47.本技术实施例具有以下有益效果:
48.当监测到第一前台进程执行到进入内核态的预设函数时,利用hook机制,跳转到该预设函数对应的第一回调函数(也即hook函数),并进一步基于预设函数确定是否需要进入内核态,当基于该预设函数确定不需要进入内核态时,在用户态下执行该第一回调函数,并获取该第一回调函数的第一执行结果;将该第一执行结果返回给该第一调用对象。这样,对于单个操作系统,多个前台进程可以同时运行在自己的用户态,并且能够实现该预设函数的功能,从而实现多开运行。
附图说明
49.图1是本技术实施例提供的进程运行系统的网络架构示意图;
50.图2是本技术实施例提供的服务器的结构示意图;
51.图3是本技术实施例提供的进程运行方法的一个可选的流程示意图;
52.图4为本技术实施例提供的进程运行方法的再一种实现流程示意图;
53.图5为本技术实施例提供的进程运行方法的另一种实现流程示意图。
具体实施方式
54.为了使本技术的目的、技术方案和优点更加清楚,下面将结合附图对本技术作进一步地详细描述,所描述的实施例不应视为对本技术的限制,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本技术保护的范围。
55.在以下的描述中,涉及到“一些实施例”,其描述了所有可能实施例的子集,但是可以理解,“一些实施例”可以是所有可能实施例的相同子集或不同子集,并且可以在不冲突的情况下相互结合。除非另有定义,本技术实施例所使用的所有的技术和科学术语与属于本技术实施例的技术领域的技术人员通常理解的含义相同。本技术实施例所使用的术语只是为了描述本技术实施例的目的,不是旨在限制本技术。
56.以下对本技术实施例涉及到的科学术语进行说明。
57.1)内核态(kernel mode),cpu可以访问内存所有数据,包括外围设备,例如硬盘,网卡。cpu也可以将自己从一个程序切换到另一个程序。
58.2)用户态(user mode),只能受限的访问内存,且不允许访问外围设备.占用cpu的能力被剥夺,cpu资源可以被其他程序获取。
59.3)挂钩(hook),类似中断机制,在代码触发hook过程的时候即触发预定义好的hook回调过程,待回调过程执行完毕再回到原有代码位置继续执行。
60.4)沙盒,一种模拟系统的环境。在物理机层面提供资源(文件、注册表、进程、键盘、鼠标、外设、显示器、声卡等)的隔离、各个进程间所看到的资源都不相同。
61.5)虚拟机(vm,virtual machine),
62.6)动态链接库(dll,dynamic link library)。一种可执行的windowspe格式文件。
63.在相关技术中,实现多个前台进程同时运行,需要多个虚拟机系统才能实现,而该实现方案由于中间加入了虚拟机特权转化、调度导致了部分性能的损失,而这种损失在图形渲染操作方面尤为明显,至少存在10%-20%的损失不等。
64.基于此,本技术实施例提供一种进程运行方法,采用单个操作系统,通过hook机制结合沙盒子系统的隔离机制完成多开运行。进一步地,基于用户态代码的hook,在进入内核之前做好资源共享和隔离的判断,能够减少进入内核特权转化带来的性能损失,而图形化相关操作也直接使用物理机显卡,保证了性能的最大化。
65.下面说明本技术实施例提供的进程运行设备的示例性应用,本技术实施例提供的计算机设备可以实施为笔记本电脑,平板电脑,台式计算机,移动设备(例如,移动电话,便携式音乐播放器,个人数字助理,专用消息设备,便携式游戏设备)等智能终端,也可以实施为服务器。下面,将说明计算机设备实施为服务器时的示例性应用。
66.参见图1,图1为本技术实施例提供的进程运行系统20的网络架构示意图。如图1所示,该进程运行系统20中包括用户终端100(在图1中示例性的示出三个用户终端,分别为用户终端100-1、用户终端100-2、用户终端100-3)、网络200和服务器300。其中,用户终端100上运行有应用程序,例如可以是游戏应用程序,还可以是购物应用程序、即时通讯应用程序等。在实现本技术实施例的进程运行方法时,以用户终端100-1运行有游戏应用程序a、用户100-2运行为游戏应用程序b、用户终端100-3运行有游戏应用程序c为例说明。游戏应用程序a、游戏应用程序b和游戏应用程序c为不同的游戏应用程序。
67.在本技术实施例中,游戏应用程序a、游戏应用程序b和游戏应用程序c对应同一个服务器300,该服务器300利用本技术实施例提供的进程运行方法能够同时运行多个前台进程,因此当用户终端100-1运行游戏应用程序a,且同时用户终端100-2运行游戏应用程序b,且同时用户终端100-3运行游戏应用程序c时,服务器300中会同时运行游戏应用程序a、游戏应用程序b和游戏应用程序c对应的进程a、进程b和进程c,从而使得一个单个的服务器300可以同时运行多个游戏进程,同时处理不同游戏应用程序的游戏数据,从而提高服务器300的使用有效率。
68.在本技术实施例中,服务器300可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、以及大数据和人工智能平台等基础云计算服务的云服务器,服务器可以通过有线或无线通信方式进行直接或间接地连接,本技术在此不做限制。
69.人工智能云服务,一般也被称作是aiaas(ai as a service,中文为“ai即服务”)。这是目前主流的一种人工智能平台的服务方式,具体来说aiaas平台会把几类常见的ai服务进行拆分,并在云端提供独立或者打包的服务。这种服务模式类似于开了一个ai主题商城:所有的开发者都可以通过api接口的方式来接入使用平台提供的一种或者是多种人工智能服务,部分资深的开发者还可以使用平台提供的ai框架和ai基础设施来部署和运维自己专属的云人工智能服务,在本发明实施例提供的进程运行方法中,可以通过人工智能云服务提供的ai框架和ai基础设施来部署和运维进行运行系统。
70.参见图2,图2是本技术实施例提供的服务器300的结构示意图,图2所示的服务器
300包括:至少一个处理器310、存储器350、至少一个网络接口320和用户接口330。服务器300中的各个组件通过总线系统340耦合在一起。可理解,总线系统340用于实现这些组件之间的连接通信。总线系统340除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图2中将各种总线都标为总线系统340。
71.处理器310可以是一种集成电路芯片,具有信号的处理能力,例如通用处理器、数字信号处理器(dsp,digital signal processor),或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等,其中,通用处理器可以是微处理器或者任何常规的处理器等。
72.用户接口330包括使得能够呈现媒体内容的一个或多个输出装置331,包括一个或多个扬声器和/或一个或多个视觉显示屏。用户接口330还包括一个或多个输入装置332,包括有助于用户输入的用户接口部件,比如键盘、鼠标、麦克风、触屏显示屏、摄像头、其他输入按钮和控件。
73.存储器350可以是可移除的,不可移除的或其组合。示例性的硬件设备包括固态存储器,硬盘驱动器,光盘驱动器等。存储器350可选地包括在物理位置上远离处理器310的一个或多个存储设备。存储器350包括易失性存储器或非易失性存储器,也可包括易失性和非易失性存储器两者。非易失性存储器可以是只读存储器(rom,read only memory),易失性存储器可以是随机存取存储器(ram,random access memory)。本技术实施例描述的存储器350旨在包括任意适合类型的存储器。在一些实施例中,存储器350能够存储数据以支持各种操作,这些数据的示例包括程序、模块和数据结构或者其子集或超集,下面示例性说明。
74.操作系统351,包括用于处理各种基本系统服务和执行硬件相关任务的系统程序,例如框架层、核心库层、驱动层等,用于实现各种基础业务以及处理基于硬件的任务;
75.网络通信模块352,用于经由一个或多个(有线或无线)网络接口320到达其他计算设备,示例性的网络接口320包括:蓝牙、无线相容性认证(wifi)、和通用串行总线(usb,universal serial bus)等;
76.输入处理模块353,用于对一个或多个来自一个或多个输入装置332之一的一个或多个用户输入或互动进行检测以及翻译所检测的输入或互动。
77.在一些实施例中,本技术实施例提供的装置可以采用软件方式实现,图2示出了存储在存储器350中的一种进程运行装置354,该进程运行装置354可以是服务器300中的进程运行装置,其可以是程序和插件等形式的软件,包括以下软件模块:第一跳转模块3541、第一执行模块3542、第一获取模块3543和结果返回模块3544,这些模块是逻辑上的,因此根据所实现的功能可以进行任意的组合或进一步拆分。将在下文中说明各个模块的功能。
78.在另一些实施例中,本技术实施例提供的装置可以采用硬件方式实现,作为示例,本技术实施例提供的装置可以是采用硬件译码处理器形式的处理器,其被编程以执行本技术实施例提供的进程运行方法,例如,硬件译码处理器形式的处理器可以采用一个或多个应用专用集成电路(asic,application specific integrated circuit)、dsp、可编程逻辑器件(pld,programmable logic device)、复杂可编程逻辑器件(cpld,complex programmable logic device)、现场可编程门阵列(fpga,field-programmable gate array)或其他电子元件。
79.下面将结合本技术实施例提供的服务器300的示例性应用和实施,说明本技术实
施例提供的进程运行方法。参见图3,图3是本技术实施例提供的进程运行方法的一个可选的流程示意图,将结合图3示出的步骤进行说明。
80.步骤s101,在第一前台进程运行过程中,当监测到该第一前台进程的第一调用对象调用进入内核态的预设函数时,跳转到该预设函数对应的第一回调函数。
81.这里,在步骤s101中第一前台进程是运行在用户态的,当第一前台进程中的第一调用对象调用进入内核态的预设函数时,首先会跳转到该预设函数对应的hook第一回调函数。在本技术实施例中,第一调用对象也可以称为调用者,实际为一段可执行的代码程序。
82.在一些实施例中,在该第一前台进程开始执行时,会拉取预先设置好的dll关键函数,也即预设函数,并且已经为预设函数设置好对应的第一回调函数,也即该第一前台进程在开始运行时,已经将该预设函数替换为第一回调函数。需要说明的是,执行预设函数与执行第一回调函数所完成的功能是相同的。
83.步骤s102,当基于该预设函数确定不需要进入内核态时,在用户态下执行该第一回调函数。
84.在一些实施例中,在步骤s102之前,基于该预设函数确定该第一前台进程的当前线程是否需要进入内核态,当确定该第一前台进程的当前线程不需要进入内核态以执行预设函数时,该第一前台进程的当前线程在用户态下执行该第一回调函数,并得到该第一回调函数的第一执行结果。
85.步骤s103,获取该第一回调函数的第一执行结果。
86.步骤s104,将该第一执行结果返回给该第一调用对象。
87.这里,将第一执行结果返回给第一调用对象,在实际实现时,可以是返回给第一调用对象对应的地址。
88.在一些实施例中,第一调用对象在获取到该第一执行结果后,该第一前台进程继续在用户态下运行,这样虽然该第一前台进程在运行过程中,第一前台进程的调用者需要调用进入内核态的预设函数时,可以通过hook回调机制,在用户态下即可得到调用预设函数的效果,而不必进入内核态,从而可以实现多个进程都运行在前台,实现多开运行。
89.在本技术实施例提供的进程运行方法中,当监测到第一前台进程执行到进入内核态的预设函数时,利用hook机制,跳转到该预设函数对应的第一回调函数(也即hook函数),并进一步基于预设函数确定是否需要进入内核态,当基于该预设函数确定不需要进入内核态时,在用户态下执行该第一回调函数,并获取该第一回调函数的第一执行结果;将该第一执行结果返回给该第一调用对象;这样,对于单个操作系统,多个前台进程可以同时运行在自己的用户态,并且能够实现该预设函数的功能,从而实现多开运行。
90.基于前述的实施例,本技术实施例再提供一种进程运行方法,图4为本技术实施例提供的进程运行方法的再一种实现流程示意图,如图4所示,该流程包括:
91.步骤s201,启动并运行第一进程,并将该第一进程确定为第一前台进程。
92.这里,在第一进程启动后,运行在用户态,此时会hook住进程内进入内核态的预设函数。
93.步骤s202,在该第一前台进程运行过程中,当监测到该第一前台进程的第一调用对象调用进入内核态的预设函数时,跳转到该预设函数对应的第一回调函数。
94.这里,在该第一前台进程运行过程中,当监测到该第一前台进程的第一调用对象
调用进入内核态的预设函数时,基于hook机制跳转到该预设函数对应的hook第一回调函数。
95.步骤s203,基于该预设函数确定是否需要进入内核态。
96.这里,基于预设函数的实现功能,或者调用时机确定是否需要进入内核态,其中,当该预设函数的功能为获取进程是否处于前台所调用;或者,当预设函数的功能为设置进程的第一窗口为前台窗口或激活窗口;或者当预设函数的调用时机为分发切换窗口消息时,确定不需要进入内核态,此时进入步骤s208;当确定需要进入内核态时,进入步骤s204。
97.步骤s204,通过系统调用将该第一前台进程切换至内核态。
98.这里,步骤s204在实现时,可以通过syscall函数实现系统调用,从而将该第一前台进程或者说该第一前台进程的当前线程从用户态进入内核态。
99.所有用户进程都是运行在用户态的,但是有时候用户进程确实需要做一些内核态的事情,例如从硬盘读取数据、或者从键盘获取输入等,而唯一可以做这些事情的就是操作系统,所以此时用户进程就需要先操作系统请求以用户进程的名义来执行这些操作。此时需要从用户态切换到内核态,这种机制也即系统调用。
100.当一个进程执行系统调用而陷入内核代码中执行时,就称进程处于内核态。此时处理器处于特权级最高的(例如可以是0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。当进程在执行用户自己的代码时,则称其处于用户态。即此时处理器在特权级最低的(例如可以是3级)用户代码中运行。
101.步骤s205,在内核态下执行该预设函数,得到该预设函数的第二执行结果。
102.这里,该第一前台进程的当前线程在内核态下执行该预设函数,从而得到该预设函数的第二执行结果。
103.步骤s206,通过系统返回函数将该第一前台进程从内核态返回至用户态。
104.这里,在内核态下执行完预设函数后,可以通过系统返回函数sysret将该第一前台进程,进一步地是将该第一前台进程的当前线程从内核态,返回至用户态。
105.步骤s207,将该第二执行结果返回给该第一调用对象。
106.这里,在用户态下该第一前台进程的当前线程将该第二执行结果返回至该第一调用对象,该第一调用对象在获取到第二执行结果后,该第一前台进程继续在用户态下运行。
107.步骤s208,在用户态下执行该第一回调函数。
108.这里,步骤s208在实现时,可以首先确定该第一前台进程对应的沙盒子系统,然后在该沙盒子系统中执行该第一回调函数。由于不同沙盒子系统至少维护不同进程的前台窗口、焦点窗口、激活窗口对应的资源,也就是说,在本技术实施例中,结合沙盒子系统的隔离机制,能够将不同的进程的资源隔离开,从而使得多个进程之间的执行互不影响。
109.步骤s209,获取该第一回调函数的第一执行结果。
110.步骤s210,将该第一执行结果返回给该第一调用对象。
111.这里,在将第一执行结果返回给该第一调用对象后,该第一前台进程继续在用户态下运行。
112.在本技术实施例提供的进程运行方法中,当监测到第一前台进程执行到进入内核态的预设函数时,利用hook机制,跳转到该预设函数对应的第一回调函数(也即hook函数),并进一步基于预设函数确定是否需要进入内核态,当基于该预设函数确定不需要进入内核
态时,基于沙盒子系统的隔离机制在用户态下执行该第一回调函数,并获取该第一回调函数的第一执行结果;将该第一执行结果返回给该第一调用对象;当基于预设函数确定需要进入内核态时,通过系统调用进入内核态,并执行预设函数,以得到第二执行结果,然后通过系统返回过程返回用户态,并将第二执行结果返回至第一调用对象,这样,对于单个操作系统,通过hook机制结合沙盒子系统的隔离机制,在进入内核之前就做好了资源共享和隔离的判断,减少进入内核特权转化带来的性能损失,使得多个前台进程可以同时运行在自己的用户态,并且能够实现预设函数的功能,从而实现多开运行,并将性能最优化。
113.在一些实施例中,图3所示的步骤s102“在基于该预设函数确定不需要进入内核态时,在用户态执行该第一回调函数”可以通过以下步骤实现:
114.步骤s1021,在基于该预设函数确定不需要进入内核态时,获取该第一前台进程对应的沙盒子系统。
115.这里,以游戏进程为例,每个游戏进程对应有一个沙盒子系统,并且不同沙盒子系统至少维护不同进程的前台窗口、焦点窗口、激活窗口对应的资源,而并不使用不会使用当前操作系统真正的窗口资源,从而实现资源的隔离。
116.步骤s1022,在该沙盒子系统中执行该第一回调函数。
117.这里,在沙盒子系统中执行该第一回调函数,从而得到第一执行结果。
118.沙盒子系统独立于服务器本机安装的实际操作系统,由于不同的沙盒子系统是互相隔离的,并且在沙盒子系统中可以安全地运行可执行文件,而不会对服务器本机的操作系统造成持久的影响,当进程结束后,沙盒子系统中的数据都会被丢弃,而不会占用服务器的存储空间。
119.在一些实施例中,在获取到预设函数的第一回调函数之后,还需要判断是否需要进入内核态以执行该预设函数,在实现时,可以判断预设函数是否为获取进程是否处于前台所调用的第一函数,第一函数可以是ntusergetforegroundwindow、ntusergetfocus、ntusergetactivewindow、ntusergetcapture中的至少之一。其中,预设函数为确定进程是否处于前台所调用的第一函数时,确定不需要进入内核态。
120.还可以是判断预设函数是否为设置进程的第一窗口为前台窗口所调用的第二函数,第二函数可以是ntusersetforegroundwindow、ntusersetfocus、ntusersetactivewindow、ntusersetcapture中的至少之一。当该预设函数为设置进程的第一窗口为前台窗口所调用的第二函数时,确定不需要进入内核态。
121.还可以是判断预设函数是否为基于桌面的目标点中确定目标窗口所调用的第三函数,第三函数可以是ntuserwindowfrompoint、ntuserchildwinowfrompointex中的至少之一,当该预设函数为基于桌面的目标点确定目标窗口所调用的第三函数时,确定不需要进入内核态。
122.还可以是判断预设函数是否为分发切换窗口消息所调用的第四函数,第四函数可以是usercallwinproccheckwow。当该预设函数为分发切换窗口消息所调用的第四函数时,确定不需要进入内核态。
123.当存在多个窗口,用户在多个窗口之间相互切换的时候,操作系统默认会给当前点击的窗口发送一些激活消息,例如wm_activateapp、wm_activate、wm_setfocus,并且给之前处于激活状态的窗口发送去激活的消息,例如,wm_ncactivate、wm_killfocus等,当应
用程序收到这些消息的时候就会被动认为进入了前台或者退出了前台。例如,当前运行有游戏进程a和游戏进程b,并且游戏进程a存在两个窗口,分别为wa1和wa2;游戏进程b也存在两个窗口,分别为wb1和wb2;假设当前的前台窗口为wa1,当用户点击了wb2窗口,从而激活wb2时,会向wb2发送wm_activate消息,并向wa1发送wm_ncactivate消息,但是由于wa1和wb2对应有不同的进程,不同进程之间并不关心对方的激活或去激活消息。
124.因此,在本技术实施例中,当该预设函数为分发切换窗口消息所调用的第四函数时,挂钩hook该第四函数,以屏蔽切换窗口消息,这样进程就不会接收到不属于自己的激活或去激活窗口的消息。并且当确定沙盒子系统内的窗口需要该切换窗口消息时,将该切换窗口消息发送至该沙盒子系统内的目标窗口。
125.承接上述的举例,在hook住第四函数,例如hook住usercallwinproccheckwow,并屏蔽掉切换窗口消息之后,可以将wm_ncactivate消息发送给沙盒子系统内的目标窗口,也即wb1。
126.在一些实施例中,在步骤s101之前,还可以执行以下步骤,以从所有进入内核需要调用的函数中确定出关键的预设函数:
127.步骤s301,获取进入内核态需要调用的多个函数;
128.这里,在步骤s301中获取的可以是进入内核态需要调用的所有函数。
129.步骤s302,基于接收到针对该多个函数的选择操作,确定至少一个预设函数。
130.这里,由于在沙盒子系统中维度有各个进程的前台窗口、焦点窗口、激活窗口等相关窗口资源,因此步骤s302在实现时,可以是将针对确定前台窗口、焦点窗口、激活窗口的函数、分发激活窗口或前台窗口切换消息、基于目标点确定焦点窗口的函数确定为预设函数。
131.步骤s303,获取各个预设函数对应的各个回调函数。
132.这里,该回调函数也即为hook回调函数,该回调函数可以完成与预设函数相同的功能,但是执行回调函数在用户态即可,无需进入内核态。
133.基于前述的实施例,本技术实施例再提供一种进程运行方法,应用于图1所示的网络架构,本实施例提供的进程运行方法可以包括以下流程:
134.步骤s501,第一用户终端接收针对游戏客户端的第一游戏启动指令。
135.这里,游戏客户端可以安装于第一用户终端的游戏应用程序客户端,还可以是第一用户终端通过浏览器应用程序所访问的网页版游戏客户端。
136.在一些实施例中,第一用户终端在启动游戏之前,需要首先完成登录过程,进一步地,可以是第一用户终端将账号和密码发送至认证服务器进行验证,如果验证通过,给用户分配一个会话密钥(sessionkey),并把这个sessionkey发送给客户端及服务器,在后续进入游戏过程中,服务器将验证sessionkey合法性,如果和客户端携带的sessionkey不一致,将无法成功开启游戏服务。
137.步骤s502,第一用户终端向服务器发送第一游戏启动请求。
138.这里,该第一游戏启动请求中包含第一会话密钥(sessionkey),该会话密钥用户验证用户的合法性。
139.在本技术实施例中,该服务器可以是云服务器集群,该云服务器集群可以包括控制服务器(集群)、流媒体服务器(集群)、游戏服务器(集群)等。第一用户中暖通过互联网与
云服务器集群连接,为用户提供跨平台游戏体验。
140.步骤s503,服务器在接收到该第一启动游戏请求后,启动对应的第一游戏进程。
141.这里,服务器在接收到该启动游戏请求后,获取其中携带的会话密钥,并基于该会话密钥验证用户的合法性,在验证用户合法的情况下为该第一用户终端分配全局唯一的游戏会话编码,进而基于该游戏会话编码建立与第一用户终端的通信连接,并启动对应的第一游戏进程。
142.在云游戏平台中,可以由控制服务器对用户合法性进行验证,在验证通过后,还可以通过负载均衡功能计算出负载最小的流媒体服务器和游戏服务器,进而使得第一用户终端建立与该负载最小的流媒体服务器之间的通信连接,并且该负载最小的流媒体服务器与该负载最小的游戏服务器建立通信连接。在游戏服务器中启动对应的第一游戏进程。
143.步骤s504,服务器将该第一游戏进程作为第一前台进程,并在用户态下运行该第一前台进程。
144.这里,在实现时,第一游戏进程实际是运行于游戏服务器中的。
145.步骤s505,在第一前台进程运行过程中,当服务器监测到所述第一前台进程的第一调用对象调用进入内核态的预设函数时,跳转到所述预设函数对应的第一回调函数。
146.步骤s506,服务器基于所述预设函数确定是否需要进入内核态。
147.这里,当基于所述预设函数确定不需要进入内核态时,进入步骤s507;当基于预设函数确定需要进入内核态时,进入步骤s510。
148.步骤s507,服务器在用户态下执行所述第一回调函数。
149.步骤s508,服务器获取所述第一回调函数的第一执行结果。
150.步骤s509,服务器将所述第一执行结果返回给所述第一调用对象。
151.步骤s510,服务器通过系统调用将所述第一前台进程切换至内核态。
152.步骤s511,服务器在内核态下执行所述预设函数,得到所述预设函数的第二执行结果。
153.步骤s512,服务器通过系统返回函数将所述第一前台进程从内核态返回至用户态。
154.步骤s513,服务器将所述第二执行结果返回给所述第一调用对象。
155.步骤s514,服务器第二用户终端接收针对游戏客户端的第二游戏启动指令。
156.步骤s515,第二用户终端向服务器发送第二游戏启动请求。
157.这里,该第二游戏启动请求中包含第二会话密钥(sessionkey),该会话密钥用户验证用户的合法性。
158.步骤s516,服务器响应于第二游戏客户端触发的第二游戏启动请求,启动第二游戏进程。
159.步骤s517,服务器将所述第二游戏进程确定为第二前台进程,并在用户态下运行所述第二前台进程。
160.步骤s518,在第二前台进程运行过程中,当服务器监测到所述第二前台进程的第二调用对象调用进入内核态的其中一个预设函数时,跳转到该预设函数对应的第二回调函数。
161.在本技术实施例中,两个或两个以上前台进程同时运行在同一操作系统中,所述
前台进程分别对应调用其中任意一个预设函数。并且第二前台进程的第二调用对象所调用的预设函数可以是与第一前台进程的第一调用对象所调用的预设函数是相同的,也可以是不同的;对应地,第二回调函数与第一回调函数可以是相同的,也可以是不同的。
162.步骤s519,当基于所述预设函数确定不需要进入内核态时,服务器在用户态下执行所述第二回调函数。
163.步骤s520,服务器获取所述第二回调函数的第三执行结果,并将所述第三执行结果返回给所述第二调用对象。
164.需要说明的是,本实施例中与其它实施例中相同步骤或概念的解释可以参考其它实施例中的描述。在实际实现时,步骤s515至步骤s520可以在步骤s501至步骤s514任意步骤之间执行,还可以是在步骤s502之前执行。
165.在一些实施例中,当基于预设函数确定需要进入内核态时,需要首先确定当前是否有前台进程运行在内核态,如果当前有前台进程运行在内核态时,需要等待当前运行在内核态的前台进程执行完并切换至用户态时,再将第二前台进程切换至内核态,并执行相应操作。
166.在本技术实施例中,以运行第一前台进程和第二前台进程为例进行说明,在实际实现过程中,还可以同时运行有第三前台进程、第四前台进程等,利用本技术实施例提供的方法,当同时运行有多个前台进程时,如果前台进程的调用对象调用了进入内核态的预设函数时,如果多个前台进程中有一个是需要进入内核态,或者都需要进入内核态的,那么此时多个游戏进程均可同时运行于前台,从而提高游戏的图形渲染速度,提高游戏帧率,进而提高用户的游戏体验。
167.下面,将说明本技术实施例在一个实际的应用场景中的示例性应用。
168.在本技术实施例中,以游戏进程为例进行说明。图5为本技术实施例提供的进程运行方法的另一种实现流程示意图,如图5所示,该流程包括:
169.步骤s601,启动游戏进程。
170.步骤s602,在用户态下接收到进入内核操作。
171.步骤s603,执行hook中断。
172.步骤s604,判断是否使用系统实现。
173.这里,执行到进入内核的函数时,跳转到hook回调函数判断是否直接由系统实现。如果需要使用系统实现,进入步骤s605;如果不需要使用系统实现,进入步骤s608。
174.步骤s605,调用系统调用(syscall)函数,以进入内核态。
175.这里,如果是由系统实现,则维持原始函数逻辑不变,调用系统调用(syscall)函数,以进入内核态。
176.步骤s606,在内核态下执行操作。
177.步骤s607,调用系统返回(sysret)函数,以返回用户态。
178.这里,在步骤s607后,执行步骤s609。
179.步骤s608,在用户态下执行操作。
180.这里,如果不由系统实现,则由模拟函数实现,在用户态下执行操作。
181.步骤s609,在用户态下操作完成。
182.在本技术实施例中,需要挂起的系统关键dll和相关关键函数可以包括:
183.user32.dll:usercallwinproccheckwow;
184.win32u.dll:ntusercallmessage、ntusergetforegroundwindow、ntusergetfocus、ntusergetactivewindow、ntusersetforegroundwindow、ntusersetfocus、ntusersetactivewindow、ntuserwindowfrompoint、ntuserchildwinowfrompointex等。
185.在每一个游戏沙盒中,会维护一套自己的前台窗口、焦点窗口、激活窗口等相关资源,不会使用当前操作系统真正的窗口资源。
186.在图5所示的hook中断过程中,需要判断游戏进程是否使用操作系统实现。示例性地,判断的场景分为如下几种:
187.1、在一个游戏进程中,游戏进程会主动调用ntusergetforegroundwindow、ntusergetfocus、ntusergetactivewindow、ntusergetcapture等相关函数来获取当前是否处于前台,所以针对以上几个函数不会使用操作系统的实现,而是使用沙盒自己的实现。
188.2、当游戏进程想设置自己某个窗口为前台或者为激活态的时候会调用ntusersetforegroundwindow、ntusersetfocus、ntusersetactivewindow、ntusersetcapture等相关函数,此时也不会使用操作系统的实现,而是使用沙盒自己的实现。
189.3、在游戏需要从桌面某个点寻找某个窗口的时候,会调用ntuserwindowfrompoint、ntuserchildwinowfrompointex等函数。由于会有多个沙盒运行在单个操作系统上,所以当沙盒a在桌面的某个点上寻找到的窗口可能会是沙盒b里面的窗口。因此也不会使用操作系统的实现,而是使用沙盒自己的实现。
190.4、当游戏中存在多个窗口,用户在多个窗口之间相互切换的时候,操作系统默认会给当前点击的窗口发送一些激活,并给上一次激活的窗口发送失去激活的消息:wm_activateapp、wm_ncactivate、wm_activate、wm_setfocus、wm_killfocus等消息,当应用程序收到这些消息的时候就会被动认为进入了前台或者退出了前台。所以沙盒会通过挂起(hook)函数usercallwinproccheckwow来屏蔽掉所有窗口中的上述消息。而当沙盒内窗口真正需要这些消息的时候就放行,让其走系统默认的实现,这样沙盒内的游戏就会正确的收到前后台切换的消息了。
191.本技术实施例提供的多前台进程运行方法,基于用户态代码的hook,在进入内核之前就做好了资源共享和隔离的判断,能够减少进入内核特权转化带来的性能损失,并且图形化相关操作也直接使用物理机显卡,能够保证性能的最大化。另外,在运行相同游戏情况下,hook技术会比虚拟机技术在单台云游戏服务器运行游戏实例的数量上更多,从而能够减小资源消耗,并且降低服务器成本。
192.下面继续说明本技术实施例提供的进程运行装置354实施为软件模块的示例性结构,在一些实施例中,如图2所示,存储在存储器350的进程运行装置354中的软件模块可以是服务器300中的进程运行装置,包括:
193.第一跳转模块3541,用于当监测到第一前台进程执行到进入内核态的预设函数时,跳转到该预设函数对应的第一回调函数;
194.第一执行模块3542,用于当基于该预设函数确定不需要进入内核态时,在用户态下执行该第一回调函数;
195.第一获取模块3543,用于获取该第一回调函数的第一执行结果;
196.结果返回模块3544,用于将该第一执行结果返回给该第一调用对象。
197.在一些实施例中,该装置还包括:
198.第一切换模块,用于在基于该预设函数确定需要进入内核态时,通过系统调用将该第一前台进程切换至内核态;
199.第二执行模块,用于在内核态下执行该预设函数,得到该预设函数的第二执行结果;
200.第二切换模块,用于通过系统返回函数将该第一前台进程从内核态返回至用户态;
201.结果返回模块,用于将该第二执行结果返回给该第一调用对象。
202.在一些实施例中,该第一执行模块,还用于:
203.在基于该预设函数确定不需要进入内核态时,获取该第一前台进程对应的沙盒子系统;
204.在该沙盒子系统中执行该第一回调函数。
205.在一些实施例中,该装置还包括:
206.第一确定模块,用于当该预设函数为获取进程是否处于前台所调用的第一函数时,确定不需要进入内核态;或者,
207.第二确定模块,用于当该预设函数为设置进程的第一窗口为前台窗口所调用的第二函数时,确定不需要进入内核态;或者,
208.第三确定模块,用于当该预设函数为基于目标点确定目标窗口所调用的第三函数时,确定不需要进入内核态;
209.第四确定模块,用于当该预设函数为分发切换窗口消息所调用的第四函数时,确定不需要进入内核态。
210.在一些实施例中,该装置还包括:
211.hook模块,用于当该预设函数为该第四函数时,挂钩hook该第四函数,以屏蔽切换窗口消息;
212.发送模块,用于当确定沙盒子系统内的窗口需要该切换窗口消息时,将该切换窗口消息发送至该沙盒子系统内的目标窗口。
213.在一些实施例中,不同沙盒子系统至少维护不同进程的前台窗口、焦点窗口、激活窗口对应的资源。
214.在一些实施例中,两个或两个以上前台进程同时运行在同一操作系统中,所述前台进程分别对应调用其中任意一个预设函数。
215.在一些实施例中,该装置还包括:
216.第二获取模块,用于获取进入内核态需要调用的多个函数;
217.第五确定模块,用于基于接收到针对该多个函数的选择操作,确定该预设函数;
218.第三获取模块,用于获取该预设函数对应的第一回调函数。
219.在一些实施例中,该第一前台进程为游戏进程。
220.在一些实施例中,该装置还包括:
221.第一启动模块,用于响应于游戏客户端触发的游戏启动请求,启动游戏进程;
222.第六确定模块,用于将该游戏进程确定为不同于该第一前台进程的第二前台进程,并在用户态下运行该第二前台进程;
223.第二跳转模块,用于在第二前台进程运行过程中,当监测到该第二前台进程的第二调用对象调用进入内核态的其中一个预设函数时,跳转到该预设函数对应的第二回调函数;
224.第三执行模块,用于当基于所述预设函数确定不需要进入内核态时,在用户态下执行所述第二回调函数;
225.第四获取模块,用于获取该第二回调函数的第三执行结果,并将该第三执行结果返回给该第二调用对象。
226.需要说明的是,本技术实施例装置的描述,与上述方法实施例的描述是类似的,具有同方法实施例相似的有益效果,因此不做赘述。对于本装置实施例中未披露的技术细节,请参照本技术方法实施例的描述而理解。
227.本技术实施例提供一种存储有可执行指令的存储介质,其中存储有可执行指令,当可执行指令被处理器执行时,将引起处理器执行本技术实施例提供的方法,例如,如图3示出的方法。
228.在一些实施例中,存储介质可以是计算机可读存储介质,例如,铁电存储器(fram,ferromagnetic random access memory)、只读存储器(rom,read only memory)、可编程只读存储器(prom,programmable read only memory)、可擦除可编程只读存储器(eprom,erasable programmable read only memory)、带电可擦可编程只读存储器(eeprom,electrically erasable programmable read only memory)、闪存、磁表面存储器、光盘、或光盘只读存储器(cd-rom,compact disk-read only memory)等存储器;也可以是包括上述存储器之一或任意组合的各种设备。
229.在一些实施例中,可执行指令可以采用程序、软件、软件模块、脚本或代码的形式,按任意形式的编程语言(包括编译或解释语言,或者声明性或过程性语言)来编写,并且其可按任意形式部署,包括被部署为独立的程序或者被部署为模块、组件、子例程或者适合在计算环境中使用的其它单元。
230.作为示例,可执行指令可以但不一定对应于文件系统中的文件,可以可被存储在保存其它程序或数据的文件的一部分,例如,存储在超文本标记语言(html,hyper text markup language)文档中的一个或多个脚本中,存储在专用于所讨论的程序的单个文件中,或者,存储在多个协同文件(例如,存储一个或多个模块、子程序或代码部分的文件)中。作为示例,可执行指令可被部署为在一个计算设备上执行,或者在位于一个地点的多个计算设备上执行,又或者,在分布在多个地点且通过通信网络互连的多个计算设备上执行。
231.以上所述,仅为本技术的实施例而已,并非用于限定本技术的保护范围。凡在本技术的精神和范围之内所作的任何修改、等同替换和改进等,均包含在本技术的保护范围之内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献