进程间通信(IPC)
进程间通信(Inter-Process Communication)是指两个进程或者线程之间传送数据或者信号的一些技术或者方法。进程是计算机进行资源分配的最小的单位。每个进程都有自己独立的系统资源,而且彼此之间是相对隔离的。为了使得不同的进程之间能够互相访问,相互协同工作,就出现了进程之间的通信。这些进程可以运行在同一个计算机上或者有网络连接的不同计算机上。进程间通信技术包括了消息传递、同步、共享内存和远程过程调用等等,IPC是一种标准的UNIX通信机制。
过程调用的类型
在我们了解C/S模型的时候,主要有三种不同类型的过程调用
本地过程调用(Local Procedure Call,LPC):是指被调用的函数与调用的函数处于同一个进程中。比较典型的情况就是调用者通过某条机器指令把控制过程传递给新的过程,被调用的过程保存机器寄存器中的值,并且在栈顶分配为其本地变量空间。
同主机的远程过程调用(Remote Procedure Call,RPC): 是指调用的函数和被调用的函数不在同一个进程中,但是在同一个主机上
不同主机间的远程过程调用:是指一台主机上的客户端调用另一台主机上的某个服务器的处理函数。
什么是远程过程调用
RPC,远程过程调用,是指计算机A上的进程,调用计算机B上的进程。过程中A上的进程被挂起,而B上的进程开始执行,当返回值返回到A上的时候A上的线程继续执行。调用方可以通过参数的形式将信息传递到被调用方,然后通过回传的消息来接收到反馈的结果。整个的过程对于开发来讲是透明的。
远程过程调用采用客户机/服务器(C/S)模式,请求程序就可以看做一个客户机,服务提供程序就是一台服务器。和一般的本地操作过程调用一样,远程过程调用也是同步操作,在远程过程调用完成之前,需要暂时的终止请求程序。使用相同地址空间的低权限线程允许同时运行多个过程调用。
RPC的基本操作
首先来考虑一下本地的过程调用如何实现
count = read(fd,buf,nbytes)
fd 表示文件描述符。buf 是用来存储读入数据的数组。nbytes 表示实际写入的数据字节数。如果这个调用位于主程序中,那么在调用之前堆栈的状态如下图a所示。为了进行调用,调用方首先需要将参数反序入栈,也就是最后一个参数先入栈。如图b所示,在read完毕之后,它将返回值放入到一个寄存器中,移出返回地址,并且将控制权交给调用方。调用方之后将参数从栈中按照顺序移出,这样使得整个的调用都回到最初的状态。
RPC实现思想与本地的调用相同,假设程序要从某个文件中读取数据,开发者通过执行read方法用来调用数据。在传统的系统中,read线程是由连接器从库中读取,然后连接器再将其插入到目标程序中,read过程是一个比较短的过程,一般通过一个等效的操作来完成。也就是read操作是位于用户程序与本地系统之间的接口。
虽然read方法执行了系统调用,但其本身依然是通过出栈入栈的方式进行调用。
RPC通过类似的途径来获得透明性,当read实际上是一个远程过程的时候,库中就放入的是read的另外的版本,被称为是客户存根(client stub)。这种版本也是跟上面的调用类似。唯一不同的就是他不是要求操作系统提供数据,而是将参数打包成消息,然后请求将此消息发送到服务器。如图所示。
当消息到达服务器时候,服务器上的操作系统将其传递给服务器存根(server stub)。服务器存根是客户端存根在服务器端的等价物,也是一段代码。用来将通过网络输入的请求转换为本地过程调用。服务器存根一般先调用receive,然后会被阻塞,等待消息输入。收到消息后,服务器将参数从消息中提取出来,然后通过正常的方式进行调用。
这样从服务器的角度来看,整个的过程调用就与客户端调用是一样的。参数和返回地址都位于栈中,然后一切如初。服务器执行完操作之后,就会以同样的方式返回到客户端,然后继续等待客户端的请求。
总体来讲,远程过程调用包括如下的一些步骤。
客户过程以正常地调用调用客户存根为主
客户存根生成一个消息,然后还有调用本地操作系统
客户端操作系统将消息发送到远程服务器系统
远程服务器系统将消息交给服务器存根
服务器存根将参数提取出来,然后调用服务器
服务器执行要求的操作之后, 将结果返回给服务器存根
服务器存根将消息打包成一个消息字后,然后调用服务器本地操作系统。
服务器本地操作系统将含有结果的消息发送到客户端操作系统。
客户端操作系统将消息交给客户端存根
客户端存根将消息提取出来,返回给客户端的调用
RPC的主要好处是双重的,首先开发者可以通过过程调用的语义来调用远程函数并且获取响应。其次,简化了分布式应用程序开发的难度,因为RPC隐藏了所有的网络代码存根函数,应用程序不用担心一些具体的细节问题。例如socket 端口、数据解析等等。RPC在OSI的参考模型中直接跨域了会话层和表示层。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。