进程间的四种⾼级通信⽅式
进程间的四种⾼级通信⽅式
进程通信是指进程之间的信息交换。由于进程的互斥与同步,需要在进程间交换⼀定的信息,故称进程通信。但通过进程交换信息是⼀种低级进程通信,以信号量机制为例,原因如下:
效率低。⽣产者每次只能向缓冲池投放⼀个产品(消息) ,消费者每次只能从缓冲池中得到⼀个消息。
通信对⽤户不透明。OS为进程间通信提供了共享存储器。⽽关于进程间通信所需之共享数据结构的设置、数据的传送、进程的互斥与同步,都必须由程序员去实现。
1 共享存储器系统
在贡献存储器系统中,相互通信的进程共享某些数据结构或贡献存储区,进程间通过这些空间进⾏通信。据此,⼜可以把他们分为⼀下两种类型。
1.1 基于共享数据结构的通信⽅式
在这种通信⽅式中,要求诸进程公⽤某些数据结构,借以实现诸进程间的信息交换,如⽣产者-消费者中的
有界缓存区。OS仅提供共享存储器,由程序员负责对公⽤数据结构的设置及对进程间同步的处理。这种通信⽅式仅适⽤于传递相对少量的数据,通信效率低下,属于低级通信。
1.2 基于共享存储区的通信⽅式
为了传输⼤量数据,在内存中划出了⼀块共享存储区域,诸进程可通过对该共享区的读或写交换信息,实现通信,数据形式和位置甚⾄访问控制都是由进程负责,⽽不是OS。这种通信⽅式属于⾼级通信。需要通信的进程在进程通信前,先向系统申请获得共享存储区中的⼀个分区,并将其附加到⾃⼰的⾃⼰的地址空间中,便可对其中的数据进⾏正常读写,读写完或者不在需要时,将其归还给共享存储区,完成数据通信。
2 管道(pipe)通信系统
所谓“管道”,是指⽤于连接⼀个读进程和⼀个写进程以实现他们之间通信的⼀个⽂件,⼜名pipe⽂件。向管道(共享⽂件)提供输⼊的发送进程(即写进程)以字符流形式将⼤量数据送⼊管道,⽽接受管道输出的接受进程(即读进程)则从管道中接受数据。由于发送进程和接受进程都是利⽤管道通信的,故⼜称管道通信。
为了协调双⽅的通信,管道机制必须提供⼀下三⽅⾯的协调能⼒。
互斥。即当⼀个进程正在对pipe进⾏读/写操作时,其他进程必须等待
同步。跟⽣产者-消费者模式类似。当写进程把⼀定数量的数据写⼊pipe,便去睡眠等待,当直到读进程取⾛数据后再把他唤醒。当读进程读⼀个空pipe时,也应睡眠等待,直⾄写进程将数据写⼊管道后才将之唤醒。
确定对⽅是否存在。只有确定对⽅已存在才⾏通信。
3 消息传递系统
在该机制中,进程不必借助任何共享存储区或者数据结构,⽽是以格式化的消息(message)为单位,将通信的数据封装在消息中,并利⽤操作系统提供的⼀组通信命令(原语),在进程间进⾏消息传递,完成进程间的数据交换。
该⽅式隐藏了通信实现细节,使通信过程对⽤户透明化,降低了通信程序设计的复杂性和错误率。
基于消息传递系统的通信⽅式属于⾼级通信⽅式,因实现⽅式的不同,可分为两类。
直接通信⽅式。是指发送进程利⽤OS所提供的发送原语,直接把消息发送给⽬标进程
间接通信⽅式。是指发送和接受进程,都通过共享中间实体(称为邮箱)的⽅式进⾏消息的发送和接收,完成进程间的通信。
4 客户机-服务器系统
其主要实现⽅法分为三类:套接字,远程过程调⽤和远程⽅法调⽤
4.1 套接字
⼀个套接字就是⼀个通信标识类型的数据结构,包含了通信⽬的地址、通信使⽤端⼝号、通信⽹络的传输层协议、进程所在的⽹络地址、以及针对客户或服务器程序提供的不同系统调⽤,是进程通信和⽹络通信的基本构件。套接字包括两类
基于⽂件型。通信进程都位于同⼀台机器中的环境中,套接字是基于本地⽂件系统⽀持的,⼀个套接字关联到⼀个特殊的⽂件,通信双⽅通过对这个特殊⽂件的读写实现通信,其原理类似管道。
进程通信方式基于⽹络型。该类型通常采⽤的是⾮对称⽅式通信,即发送者需要提供接收者命名。通信双⽅的进程运⾏在不同主机的⽹络环境下,被分配了⼀堆套接字,⼀个属于接受进程(或服务器),⼀个属于发送进程(或客户端)。⼀般的,发送进程发出连接请求时,随机申请⼀个套接字,主机位置分之⼀个端⼝,与该套接字绑定,不再分配给其他进程。接受进程(或服务端)拥有全局公认的套接字和指定的端⼝,
并通过监听端⼝等待客户请求。
套接字的优势在于,它不仅适⽤于同⼀台计算机内部的进程通信,也适⽤于⽹络环境中不同计算机的进程通信。
4.2 远程过程调⽤和远程⽅法调⽤
远程过程(函数)调⽤RPC(Remote Produce Call),是⼀个通信协议,⽤于通过⽹络连接的系统。该协议允许运⾏于⼀台主机(本地)系统上的进程调⽤另⼀台主机(远程)系统上的进程
负责处理远程过程调⽤的进程有两个,⼀个是本地客户进程,另⼀个是远程服务进程,这两个进程通常也被称为⽹络守护进程,主要负责在⽹络间的消息传递,⼀般情况下,这两个进程都是处于阻塞状态,等待消息。
为了使远程过程调⽤看上去和本地过程调⽤⼀样,即希望实现RPC的透明性,使得调⽤者感受不到此次调⽤的过程是在其他主机(远程)上执⾏的,RPC引⼊了⼀个存根的概念:在本地客户端,每个能够独⽴运⾏的远程调⽤过程都拥有⼀个客户存根,本地进程远程调⽤远程过程实际是调⽤该过程关联的存根;与此类似,在每个远程进程所在服务器端,其所对应的实际可执⾏进程也存在⼀个服务器存根与其关联。本地客户存根与对应的远程服务器的存根⼀般也是处于等待状态,等待消息。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论