发明内容
本申请提供一种远程过程调用的处理方法和装置,以解决现有技术实现远程过程调用时,存在实际的I/O读写请求进程必然发生阻塞的问题。本申请另外提供一种远程过程调用的方法和装置,以及一种远程过程调用的处理系统和一种电子设备。
本申请提供一种远程过程调用的处理方法,包括:
接收调用进程发送的对应特定服务进程的服务请求;
将所述服务请求存储到所述服务进程的待处理请求队列中;
当处理到所述服务请求时,操作系统根据所述服务请求,执行所述服务进程,获取进程结果;
将所述进程结果从所述操作系统的内核复制到所述调用进程的存储空间。
可选的,所述服务请求包括读取请求或写入请求。
可选的,在所述接收调用进程发送的对应特定服务进程的服务请求之前,还包括:
启动所述服务进程。
可选的,还包括:
通过所述操作系统内核的线程池,按照请求顺序依次处理所述待处理指令队列中的每一个所述服务请求;所述服务请求共享所述线程池资源。
可选的,在所述接收调用进程发送的对应特定服务进程的服务请求之前,还包括:
建立所述线程池;
将所述服务进程绑定到所述线程池。
可选的,在所述操作系统根据所述服务请求,执行所述服务进程,获取进程结果之前,还包括:
对所述服务请求进行解码。
可选的,所述接收调用进程发送的对应特定服务进程的服务请求,采用如下方式:
通过预先启动的所述服务进程的监听器,接收所述调用进程发送的所述服务请求。
可选的,通过返回的Future模式,将所述进程结果从所述操作系统的内核复制到所述调用进程的存储空间。
可选的,通过预先注册的完成处理器,将所述进程结果从所述操作系统的内核复制到所述调用进程的存储空间;
相应的,在所述执行所述服务进程,获取进程结果之后,还包括:
通过所述操作系统内核的线程池,调用所述完成处理器。
可选的,所述操作系统采用Linux系统,通过Epoll模型支持所述远程过程调用的处理方法;或者,所述操作系统采用Windows系统,通过IOCP模型支持所述远程过程调用的处理方法。
可选的,所述调用进程基于TCP协议的传输通道向所述服务进程发送所述服务请求。
相应的,本申请提供一种远程过程调用的处理装置,包括:
接收单元,用于接收调用进程发送的对应特定服务进程的服务请求;
第一存储单元,用于将所述服务请求存储到所述服务进程的待处理请求队列中;
执行单元,用于当处理到所述服务请求时,操作系统根据所述服务请求,执行所述服务进程,获取进程结果;
第二存储单元,用于将所述进程结果从所述操作系统的内核复制到所述调用进程的存储空间。
可选的,还包括:
启动单元,用于启动所述服务进程。
可选的,还包括:
轮询单元,用于通过所述操作系统内核的线程池,按照请求顺序依次处理所述待处理指令队列中的每一个所述服务请求;所述服务请求共享所述线程池资源。
可选的,还包括:
建立单元,用于建立所述线程池;
绑定单元,用于将所述服务进程绑定到所述线程池。
可选的,还包括:
解码单元,用于对所述服务请求进行解码。
可选的,通过预先注册的完成处理器,将所述进程结果从所述操作系统的内核复制到所述调用进程的存储空间;
相应的,还包括:
调用单元,用于通过所述操作系统内核的线程池,调用所述完成处理器。
此外,本申请还提供一种远程过程调用的方法,包括:
向服务器端发送特定服务进程的服务请求;
接收所述服务进程回送的读取服务结果的通知;
读取所述服务结果。
可选的,在所述向服务器端发送特定服务进程的服务请求之前,还包括:
与所述服务进程建立连接。
可选的,所述服务请求包括读取请求或写入请求。
可选的,基于TCP协议的传输通道向所述服务进程发送所述服务请求。
相应的,本申请提供一种远程过程调用的装置,包括:
发送单元,用于向服务器端发送特定服务进程的服务请求;
接收单元,用于接收所述服务进程回送的读取服务结果的通知;
读取单元,用于读取所述服务结果。包括进程参数的调用指令。
可选的,还包括:
连接单元,用于与所述服务进程建立连接。
此外,本申请还提供一种远程过程调用的处理系统,包括:根据上述任一项所述的远程过程调用的处理装置;以及根据上述任一项所述的远程过程调用的装置。
此外,本申请还提供一种电子设备,所述电子设备包括:
显示器;
处理器;以及
存储器,用于存储远程过程调用的处理装置,所述远程过程调用的处理装置被所述处理器执行时,包括如下步骤:接收调用进程发送的对应特定服务进程的服务请求;将所述服务请求存储到所述服务进程的待处理请求队列中;当处理到所述服务请求时,操作系统根据所述服务请求,执行所述服务进程,获取进程结果;将所述进程结果从所述操作系统的内核复制到所述调用进程的存储空间。
可选的,所述存储远程过程调用的处理装置包括:
接收单元,用于接收调用进程发送的对应特定服务进程的服务请求;
第一存储单元,用于将所述服务请求存储到所述服务进程的待处理请求队列中;
执行单元,用于当处理到所述服务请求时,操作系统根据所述服务请求,执行所述服务进程,获取进程结果;
第二存储单元,用于将所述进程结果从所述操作系统的内核复制到所述调用进程的存储空间。
与现有技术相比,本申请具有以下优点:
本申请提供的远程过程调用的处理方法、远程过程调用的方法、以及相应装置、系统及电子设备,通过将接收到的调用进程发送的对应特定服务进程的服务请求存储到所述服务进程的待处理请求队列中,并由操作系统根据所述服务请求,执行所述服务进程,获取进程结果,最后将所述进程结果从所述操作系统的内核复制到所述调用进程的存储空间。由于调用进程无需等待服务进程执行完成并返回进程结果,而是通过服务进程发送回调通知等方式获取返回的进程结果,使得实现远程过程调用时,实际的I/O读写请求进程不会发生阻塞,操作系统无需遍历所有的用户进程,只需要将数据拷贝给监听该事件的用户进程即可,从而避免了遍历的耗时,并取消了最大并发数的限制,提升远程过程调用的性能。
具体实施方式
在下面的描述中阐述了很多具体细节以便于充分理解本申请。但是本申请能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本申请内涵的情况下做类似推广,因此本申请不受下面公开的具体实施的限制。
在本申请中,提供了一种远程过程调用的处理方法和装置、一种远程过程调用的方法和装置、以及一种远程过程调用的处理系统和一种电子设备。在下面的实施例中逐一进行详细说明。
本申请提供的远程过程调用的处理方法,是基于这样一种设计构思,即:服务进程接收到调用进程发送的服务请求后,首先将服务请求存储到待处理请求队列中,同时由操作系统轮询处理待处理请求队列中的每一个服务请求,当轮询到一个服务请求时,操作系统根据服务请求,执行服务进程,获取进程结果,并通知调用进程操作完成。由于调用进程无需等待服务进程执行完成并返回进程结果,而是通过服务进程发送回调通知的方式获取返回的进程结果,因此本申请提供的方法是一种基于异步非阻塞I/O方式的远程过程调用的处理方法。
请参考图1,其为本申请的远程过程调用的处理方法实施例的流程图。所述方法用于多处理器设备,包括如下步骤:
步骤S101:接收调用进程发送的对应特定服务进程的服务请求。
由于远程过程调用采用客户机/服务器模式,因此本申请实施例所述的调用进程就是一个客户机,而服务进程就是一个服务器。调用进程通过网络向服务进程发送操作指令,即:服务请求。本申请实施例所述的服务请求既可以是读取请求,还可以是写入请求,具体的请求类别取决于服务进程的功能设置。如果服务进程的功能为从服务器端获取数据,则服务请求为读取请求;如果服务进程的功能为向服务器端写入数据,则服务请求为写入请求。
本申请实施例所述的远程过程调用协议,包括两个不同结构的信息:调用信息和答复信息。其中,调用信息即服务请求,包括程序号、程序版本号、过程号和进程参数等。调用信息主体形式如下:
而执行服务进程后获取的最终答复信息取决于服务器对调用信息是接收还是拒绝。通常,答复信息包括区别以下情形的各种信息:1)RPC成功执行调用信息;2)RPC的远程实现不是协议第二版,则返回RPC支持的最低和最高版本号;3)在远程系统中,远程程序不可用;4)远程程序不支持被请求的版本号,返回远程程序所支持的最低和最高版本号;5)请求的过程号不存在,通常是呼叫方协议或程序差错。答复信息形式如下:
enum reply_stat stat
{MSG_ACCEPTED=0,
MSG_DENIED=1}。
在计算机中,客户端的调用进程通过Socket(又称“套接字”)向服务器端的服务进程发出服务请求或者应答网络请求。Socket是一个通信链的句柄,用于描述进程对应的IP地址和端口。Socket实质上提供了进程通信的端点。进程通信之前,客户端和服务器双方首先必须各自创建一个端点,以便建立联系并相互通信。一个完整的Socket有一个本地唯一的Socket号,由操作系统分配。
以JDK1.7为例,当调用进程基于同步I/O操作的方式向服务进程发送调用指令时,java提供Socket类用于客户端建立网络连接时使用,提供ServerSocket类用于服务器端,Socket类和ServerSocket类位于java.net包中。在客户端连接成功时,客户端和服务器端都会产生一个Socket实例,通过操作Socket实例完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket类还是ServerSocket类,均通过SocketImpl类及其子类完成。
在本实施例中,接收调用进程发送的对应特定服务进程的服务请求,采用如下方式:通过预先启动的所述服务进程的监听器,接收所述调用进程发送的所述服务进程的所述服务请求。因此,要实施本申请实施例提供的方法,在所述接收调用进程发送的对应特定服务进程的服务请求之前,还包括:
步骤S201:启动所述服务进程。
客户端调用进程只能对已经启动并处于监听状态的服务进程发起服务请求,否则将返回异常信息。以JDK1.7为例,java提供了一些支持异步I/O操作的封装类,包括:
1)java.nio.channels.AsynchronousChannel,其为所有AIO Channel的父类,用于标记一个通道支持异步I/O操作;
2)java.nio.channels.AsynchronousServerSocketChannel,其为支持数据流读写的服务器端Channel,用于创建TCP服务端、绑定地址、监听端口等,是ServerSocket的AIO版本;
3)java.nio.channels.AsynchronousSocketChannel,其为支持数据流读写的客户端Channel,用于表示一个客户端连接;
4)java.nio.channels.AsynchronousChannelGroup,其为一个用于资源共享的异步通道集合,对异步通道进行分组管理,负责处理I/O事件以及分配给CompletionHandler;
5)java.nio.channels.CompletionHandler,其为完成处理器,定义了一个用户处理就绪事件的接口,为异步I/O操作结果的回调接口,由用户自己实现,异步I/O的数据就绪后回调该处理器消费或处理数据,因此其实质为定义了在I/O操作完成后所作的回调工作。
上述类或接口均位于java.nio.channels包中。
下面给出部分代码实例说明应用上述类启动服务进程的方法,代码实例如下所示:
在上述程序代码中,AsynchronousServerSocketChannel类的静态方法open()用于返回一个异步服务器端Socket通道的实例,并通过bind(SocketAddress local)方法将异步服务器端Socket通道绑定到一个指定的服务地址,并配置该套接字通道负责监听客户端的连接。异步服务器端Socket通道包括一个方法accept(),称为堵塞函数,当客户端调用进程调用此函数后,调用线程将挂起,直到操作系统来通知它,挂起的线程将继续进行工作,也就符合”生产者-消费者”模型。
服务器的监听端口用于等待连接到来,以便accept产生一个AsynchronousSocketChannel来表示一个新建立的连接,因此首先需要客户端调用进程发起一个accept调用,调用是异步的,操作系统将在连接建立后,将最后的结果AsynchronousSocketChannel返回。accept方法具有两个参数,第一个参数是传给CompletionHandler的attchment,第二个参数就是注册的用于回调的CompletionHandler,最后返回结果Future<AsynchronousSocketChannel>。CompletionHandler的回调共用的是AsynchronousChannelGroup绑定的线程池。
步骤S103:将所述服务请求存储到所述服务进程的待处理请求队列中。
本申请实施例提供的远程过程调用的处理方法基于异步非阻塞I/O方式,一个有效请求对应一个线程。服务器的系统资源是有限的,而并发请求的数量可能非常大,数量过多将造成系统拥挤、降低效率。为了限制系统中执行线程的数量,采用线程池以便实现共享资源。
要实施本申请实施例提供的方法,需要通过系统内核的线程池,轮询处理待处理请求队列中的每一个服务请求。在本实施例中,在接收调用进程发送的对应特定服务进程的服务请求之前,还包括:
步骤S202:建立所述线程池。
本申请实施例所述的线程池,其作用为限制系统中执行线程的数量。在实际应用中,根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果。线程池中线程的数量过少将浪费系统资源,数量过多将造成系统拥挤、降低效率。采用线程池控制线程数量,其他线程排队等候。一个服务请求执行完毕,再从队列中取最前面的服务请求开始执行。若队列中没有等待进程,线程池资源处于等待状态。当一个新任务需要运行时,如果线程池中有等待的工作线程,则该新任务进入等待队列。
以JDK-1.7为例,java提供了ExecutorService线程池接口,Executors类是一个用于生成线程池的工厂类,二者均位于java.util.concurrent包中。例如:ExecutorService executor=Executors.newFixedThreadPool(n)创建了一个可以最多容纳n个线程的线程池executor。
步骤S203:将所述服务进程绑定到所述线程池。
以java语言为例,实现基于异步非阻塞I/O的远程过程调用的处理方法,可以通过两种方式来处理异步操作的结果:1)返回的Future模式;2)注册CompletionHandler。在实际应用中,优选采用CompletionHandler的方式,这些handler的调用是由AsynchronousChannelGroup的线程池派发的。
在实际应用中,一个AsynchronousChannelGroup绑定一个线程池,这个线程池执行两个任务:1)处理I/O事件;2)派发CompletionHandler。
以JDK-1.7为例,通过java提供的异步通道管理器AsynchronousChannelGroup将服务进程绑定到线程池。例如:
AsynchronousChannelGroup asyncChannelGroup=AsynchronousChannelGroup.withThreadPool(executor);
AsynchronousServerSocketChannel listener=AsynchronousServerSocketChannel.open(asyncChannelGroup).bind(new InetSocketAddress(port));
上述语句创建用在服务器端的异步Socket,该服务器socket是在预先创建的异步通道管理器中打开的,并为该服务器socket绑定一个本地端口,用来监听客户端的连接。绑定端口之后,建立一个监听线程,用来监听客户端的连接,当有连接进来时,将该连接的套接字加入到待处理请求队列中。此外,再创建几个工作线程,这样在该连接发生请求时,系统内核就会在工作线程通知,并在工作线程中完成对客户端的请求做出一系列响应。
同样地,在每一个客户端也可以通过上述方法创建用在客户端的异步Socket(以下简称客户端socket),该客户端socket是在预先创建的客户端的异步通道管理器中打开的。例如:
通过上述语句客户端socket能够连接到服务器。
为了能够处理待处理请求队列中的每一个服务请求,本申请实施例提供的方法还包括:通过操作系统内核的线程池,按照请求顺序依次轮询处理所述待处理指令队列中的每一个所述服务请求。
步骤S105:当处理到所述服务请求时,操作系统根据所述服务请求,执行所述服务进程,获取进程结果。
通过步骤S103将每一个客户端服务请求存储到待处理请求队列中,然后系统内核将轮询待处理请求队列中的每一个客户端服务请求,根据请求中的进程参数,操作系统的内核线程负责执行连接的服务进程,从而获取进程结果。
按照《Unix网络编程》的划分,I/O模型可以分为:阻塞I/O、非阻塞I/O、I/O复用、信号驱动I/O和异步I/O,而按照POSIX标准来划分I/O模型只分为两类:同步I/O和异步I/O。在具体实现时,一个I/O操作分为两个步骤:发起I/O请求和实际的I/O操作。区分同步I/O和异步I/O的关键在于实际的I/O操作步骤是否发生阻塞,如果实际的I/O读写阻塞了请求进程(即:调用进程),那么就是同步I/O,因此阻塞I/O、非阻塞I/O、I/O服用、信号驱动I/O都是同步I/O;如果实际的I/O读写不阻塞请求进程,而是由操作系统处理实际的I/O操作再将操作结果返回,那么就是异步I/O。区分阻塞I/O和非阻塞I/O的关键在于发起I/O请求是否会被阻塞,如果阻塞直到调用完成,那么就是传统的阻塞I/O;如果不阻塞,那么就是非阻塞I/O。
本申请实施例提供的远程过程调用的处理方法,调用进程无需等待服务进程执行完成并返回进程结果,并且服务进程是通过操作系统执行的,最终服务进程以发送回调通知的方式,通知调用进程获取返回的进程结果。因此,本申请提供的方法是一种基于异步非阻塞I/O方式的远程过程调用的处理方法。
下面列举现有技术中常用的I/O操作的处理过程,以对比的方式说明本申请提供的方法相对现有技术的主要区别点。
1)基于同步阻塞I/O操作的RPC处理过程
以读取操作为例,RPC处理过程如下:首先,客户机调用进程发送一个调用请求到服务进程,然后等待应答信息;在服务器端,服务进程保持睡眠状态直到调用信息的到达为止;当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用请求;最后,客户端调用进程接收答复信息,获得进程结果,然后调用进程继续进行。可见,基于同步阻塞I/O操作的RPC在I/O操作的两个步骤均会发生阻塞。
2)基于同步非阻塞I/O操作的RPC处理过程
以读取操作为例,RPC处理过程如下:首先,客户机调用进程注册读就绪事件和相关联的事件处理器;事件分离器等待读就绪事件的发生;当发生读就绪事件的时候,事件分离器调用注册的事件处理器;事件处理器首先执行实际的读取操作,然后根据读取到的内容进行进一步的处理。写入操作类似于读取操作,只不过第一步注册的是写就绪事件。可见,基于同步非阻塞I/O操作的RPC在发起I/O请求时不会发生阻塞,而实际的I/O操作却会发生阻塞。
3)基于异步非阻塞I/O操作的RPC处理过程
本申请实施例提供的远程过程调用的处理方法基于异步非阻塞I/O操作的方式,以读取操作为例,RPC处理过程如下:首先,客户机调用进程初始化一个异步读取操作,然后注册相应的事件处理器,此时事件分离器不关注读取就绪事件,而是关注读取完成事件;事件分离器等待读取操作完成事件;在事件分离器等待读取操作完成的时候,操作系统调用内核线程完成读取操作,并将读取的内容放入调用进程传递过来的缓存区中,因此在异步非阻塞I/O中,客户机调用进程需要传递缓存区;事件分离器捕获到读取完成事件后,激活客户机调用进程注册的事件处理器,事件处理器直接从缓存区读取数据,而不需要进行实际的读取操作。可见,基于异步非阻塞I/O操作的RPC在上述I/O操作的两个步骤均不会发生阻塞。
在基于同步非阻塞I/O操作的RPC处理过程中,通常要做两件比较底层的事情:1)创建一个seletor,并为其注册各种感兴趣的事件,然后select,等待感兴趣的事情发生;2)当感兴趣的事情发生时,例如读事件,便通过调用线程从通道中读数据到bytebuffer里。而在基于异步非阻塞I/O操作的RPC处理过程中,由操作系统负责第二项工作,第一项工作需要由java的线程去做,即:AsynchronousChannelGroup中的线程池。
综上所述,基于异步非阻塞I/O操作的RPC处理过程与基于同步非阻塞I/O操作的RPC处理过程主要区别在于:真正的读取和写入操作是否由操作系统完成。在异步I/O中,操作系统负责将数据读写到调用进程传递进来的缓冲区供调用进程操作,操作系统扮演了重要角色。在同步非阻塞I/O中,需要调用进程自己读取或者写入数据,而异步非阻塞I/O模式中,调用进程不需要进行实际的读写过程,它只需要从缓存区读取或者写入即可,操作系统会读取缓存区或者写入缓存区到真正的I/O设备。
本申请实施例提供的远程过程调用的处理方法,是一种典型的异步I/O操作。参与方除了调用进程、服务进程、I/O对象(即:套接字),还包括操作系统。在具体实现中,需要操作系统作为“中介方”提供服务。不同操作系统在扮演“中介方”的具体实现上是不同的,但是并不影响本申请提供的远程过程调用的处理方法。在实际应用中,操作系统可以为Linux系统或Windows系统,上述这些不同的方式,都只是具体实施方式的变更,都不偏离本申请的核心,因此都在本申请的保护范围之内。
在本实施例中,服务器操作系统为Linux系统,Linux系统底层基于Epoll模型。Epoll模型是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用I/O接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。当服务进程执行完成时,采用Epoll模型无须遍历整个被监听的描述符集,只要遍历那些被内核I/O事件异步唤醒而加入Ready队列的描述符集合。Epoll模型除了提供select/poll那种I/O事件的电平触发(Level Triggered)外,还提供了边沿触发(Edge Triggered),这就使得调用程序有可能缓存I/O状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率。
综上所述,当有事件响应时,Linux操作系统不会遍历所有的调用进程,只需要将数据拷贝给监听该事件的调用进程即可,从而避免了遍历的耗时。同时,Epoll模型取消了最大并发数的限制,从而提升了应用程序性能。
在实际应中,如果采用Windows操作系统,则通过IOCP(I/O CompletionPort,I/O完成端口)模型,实现基于异步非阻塞的远程过程调用处理方法。IOCP模型属于一种通讯模型,是一个适用于(能控制并发执行的)高负载服务器的技术。IOCP模型实质为一个用于高效处理大量客户端进行数据交换的模型,即:能异步I/O操作的模型。
IOCP是一个异步I/O的API,它可以高效地将I/O事件通知给应用程序。与使用select()或是其它异步方法不同的是,一个套接字与一个完成端口关联了起来,然后就可继续进行正常的Winsock操作了。然而,当一个事件发生的时候,此完成端口就将被操作系统加入一个队列中。然后应用程序可以对核心层进行查询以得到此完成端口。
在本实施例中,在所述操作系统根据所述服务请求,执行所述服务进程,获取进程结果之前,还包括:对所述服务请求进行解码。
由于服务请求中可能存在中文等字符,因此在计算机处理时,需要对服务请求进行解码。需要注意的地方,最好交给一个线程池来处理派发解码出来的消息给完成处理器,以避免阻塞异步通道组绑定的线程池。
步骤S107:将所述进程结果从所述操作系统的内核复制到所述调用进程的存储空间。
Java提供一个CompletionHandler接口,该接口有三个方法,分别对应于处理成功、失败、被取消(通过返回的Future)情况下的回调处理:
其中的泛型参数V表示远程过程调用的结果,而A是发起调用时传入的attchment。在completed方法中,实现将进程结果从操作系统的内核复制到调用进程的存储空间的处理。
请参看图2,其为本申请的远程过程调用的处理方法实施例的类图。其中,AioSendHandler、AioAcceptHandler、AioReadHandler、AioWriteHandler均实现了由java编程语言定义的CompletionHandler接口,AioAcceptHandler为服务器socket响应连接事件的完成处理器,AioReadHandler为服务器socket响应读取事件的完成处理器、AioWriteHandler为服务器socket响应写入事件的完成处理器。
在上述的实施例中,提供了一种远程过程调用的处理方法,与之相对应的,本申请还提供一种远程过程调用的处理装置。该装置是与上述远程过程调用的处理方法的实施例相对应。
请参看图3,其为本申请的远程过程调用的处理装置实施例的示意图。由于装置实施例基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。下述描述的装置实施例仅仅是示意性的。
本实施例的一种远程过程调用的处理装置,包括:
接收单元101,用于接收调用进程发送的对应特定服务进程的服务请求;
第一存储单元102,用于将所述服务请求存储到所述服务进程的待处理请求队列中;
执行单元103,用于当处理到所述服务请求时,操作系统根据所述服务请求,执行所述服务进程,获取进程结果;
第二存储单元104,用于将所述进程结果从所述操作系统的内核复制到所述调用进程的存储空间。
可选的,还包括:
启动单元201,用于启动所述服务进程。
可选的,还包括:
轮询单元202,用于通过所述操作系统内核的线程池,按照请求顺序依次处理所述待处理指令队列中的每一个所述服务请求;所述服务请求共享所述线程池资源。
可选的,还包括:
建立单元203,用于建立所述线程池;
绑定单元204,用于将所述服务进程绑定到所述线程池。
可选的,还包括:
解码单元205,用于对所述服务请求进行解码。
可选的,通过预先注册的完成处理器,将所述进程结果从所述操作系统的内核复制到所述调用进程的存储空间;
相应的,还包括:
调用单元207,用于通过所述操作系统内核的线程池,调用所述完成处理器。
与上述的远程过程调用的处理方法相对应,本申请还提供一种远程过程调用的方法。请参考图4,其为本申请提供的一种远程过程调用的方法的实施例的流程示意图,本实施例与第一实施例内容相同的部分不再赘述,请参见实施例一中的相应部分。本申请提供的一种远程过程调用的方法包括:
步骤S401:向服务器端发送特定服务进程的服务请求。
本申请提供的一种远程过程调用的方法基于异步非阻塞I/O操作的方式,客户端本地的调用进程向服务器端的特定服务进程请求服务。本申请实施例所述的服务请求,既可以是读取请求,还可以是写入请求,具体的请求类别取决于服务进程的功能设置。在本实施例中,调用进程基于TCP协议的传输通道向所述服务进程发送所述服务请求。
步骤S403:接收所述服务进程回送的读取服务结果的通知。
步骤S405:读取所述服务结果。
客户端调用进程基于异步非阻塞I/O操作的方式进行远程过程调用,当发出服务请求后,调用进程无需等待请求完成,即可进行其他操作处理。当服务器端操作系统将服务结果发到客户端指定的缓冲区后,调用客户端预先注册的完成处理器通知调用进程读取服务结果。
在本实施例中,在所述向服务器端发送特定服务进程的服务请求之前,还包括:与所述服务进程建立连接。
在上述的实施例中,提供了一种远程过程调用的方法,与之相对应的,本申请还提供一种远程过程调用的装置。请参看图5,其为本申请的一种远程过程调用的装置的实施例示意图。由于装置实施例基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。下述描述的装置实施例仅仅是示意性的。
本实施例的一种远程过程调用的装置,包括:
发送单元201,用于向服务器端发送特定服务进程的服务请求;
接收单元202,用于接收所述服务进程回送的读取服务结果的通知;
读取单元203,用于读取所述服务结果。包括进程参数的调用指令。
可选的,还包括:
连接单元204,用于与所述服务进程建立连接。
本申请实施例还提供一种远程过程调用的处理系统,如图6所示,该系统包括上述实施例所述的远程过程调用的处理装置601和远程过程调用的装置602。所述远程过程调用的处理装置通常部署于服务器,但并不局限于服务器,也可以是能够实现所述远程过程调用的处理方法的任何设备;所述远程过程调用的装置通常部署于移动通讯设备、个人电脑、PAD、iPad等终端设备。例如,远程过程调用的装置部署在智能手机上,能够向服务器端发送特定服务进程的服务请求,接收服务进程回送的读取服务结果的通知,读取服务结果;所述远程过程调用的装置部署在服务器上,通过接收到调用进程发送的服务请求后,系统内核将服务请求存储到待处理请求队列中,当系统内核轮询到服务请求时,操作系统根据服务请求,执行服务进程,获取进程结果,并将进程结果从操作系统的内核复制到调用进程的存储空间。
本申请实施例还提供一种电子设备,如图7所示,该电子设备包括:
显示器701;
处理器702;以及
存储器703,用于存储远程过程调用的处理装置,所述远程过程调用的处理装置被所述处理器702执行时,包括如下步骤:接收调用进程发送的对应特定服务进程的服务请求;将所述服务请求存储到所述服务进程的待处理请求队列中;当处理到所述服务请求时,操作系统根据所述服务请求,执行所述服务进程,获取进程结果;将所述进程结果从所述操作系统的内核复制到所述调用进程的存储空间。
可选的,所述存储远程过程调用的处理装置包括:
接收单元,用于接收调用进程发送的对应特定服务进程的服务请求;
第一存储单元,用于将所述服务请求存储到所述服务进程的待处理请求队列中;
执行单元,用于当处理到所述服务请求时,操作系统根据所述服务请求,执行所述服务进程,获取进程结果;
第二存储单元,用于将所述进程结果从所述操作系统的内核复制到所述调用进程的存储空间。
本申请提供的远程过程调用的处理方法、远程过程调用的方法、以及相应装置、系统及电子设备,通过将接收到的调用进程发送的对应特定服务进程的服务请求存储到所述服务进程的待处理请求队列中,并由操作系统根据所述服务请求,执行所述服务进程,获取进程结果,最后将所述进程结果从所述操作系统的内核复制到所述调用进程的存储空间。由于调用进程无需等待服务进程执行完成并返回进程结果,而是通过服务进程发送回调通知等方式获取返回的进程结果,使得实现远程过程调用时,实际的I/O读写请求进程不会发生阻塞,操作系统无需遍历所有的用户进程,只需要将数据拷贝给监听该事件的用户进程即可,从而避免了遍历的耗时,并取消了最大并发数的限制,提升远程过程调用的性能。
本申请虽然以较佳实施例公开如上,但其并不是用来限定本申请,任何本领域技术人员在不脱离本申请的精神和范围内,都可以做出可能的变动和修改,因此本申请的保护范围应当以本申请权利要求所界定的范围为准。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
1、计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
2、本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。