操作系统进程通信

操作系统进程通信

进程通信的类型(高级通信)

1. 共享存储器系统(Shared-Memory System)

在共享存储器系统中,相互通信的进程共享某些数据结构或共享存储区,进程之间能通过这些空间进行通信。

  • 基于共享数据结构的通信方式: 进程间公用某些数据结构,用以实现进程间的信息交换,操作系统仅提供共享存储器 ,由程序员负责对公用数据结构的设置及对进程间同步的处理。这种通信方式仅适用于传递相对少量的数据,通信效率低下,属于低级通信。

  • 基于共享存储区的通信方式: 为了传输大量数据,在内存中划分了一块共享存储区,多个进程可以通过对该共享存储区的读写交换信息实现通信,数据的形式和位置甚至是访问控制都是由进程负责,而不是OS。这种通信方式属于高级通信方式, 需要通信的进程在通信前,先向系统申请获得共享存储区中的一个分区,并将其附加到自己的地址空间中,便可对其中的数据进行正常读写,读写完成或不再需要时,将其归还给共享存储区。

2.管道(pipe)通信系统

  • 管道:用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件,又名pipe文件。
  • 向管道提供输入的发送进程以字符流形式将大量的数据送入管道。
  • 接受管道输出的接收进程则从管道中接收数据。
  • 为了协调双方的通信,管道机制必须提供以下三方面的协调能力:
    • ①互斥,即当一个进程正在对pipe执行读/写操作时,其它进程必须等待。
    • ②同步,指当写进程把一定数量的数据写入pipe,便去的睡眠等待,直到读进程取走数据后再把它唤醒。当读进程读一空pipe时,也应睡眠等待,直至写进程将数据写入管道后才将之唤醒。
    • ③确定对方是否存在,只有确定了对方已存在时才能进行通信。

3.消息传递系统

在该机制中,进程不必借助任何共享存储区或数据结构,而是以格式化的消息为单位,将通信的数据封装在消息中,并利用操作系统提供的一组通信命令(原语),在进程间进行消息传递,完成进程间的数据交换。该方式隐藏了通信实现细节,使通信过程对用户透明化,降低了通信程序设计的复杂性和错误率。
基于消息传递系统的通信方式属于高级通信方式,根据实现方式不同分为两类:

  • (1)直接通信方式: 是指发送进程利用OS所提供的发送原语,直接把消息发送给目的进程;
  • (2)间接通信方式:是指发送进程和接收进程,都通过共享中间实体(称为邮箱)的方式进行消息的发送和接收,完成进程间的通信。

4. 客户机-服务器系统

客户机-服务器系统在网络环境的各种应用领域已成为当前主流的通信实现机制,其主要的实现方法分为三类:套接字,远程过程调用和远程方法调用。

  • 1.套接字
    一个套接字就是一个通信标识类型的数据结构,包含了通信目的的地址通信使用的端口号通信网络的传输层协议进程所在的网络地址,以及针对客户端或服务器程序提供的不同系统调用(或API函数)等,是进程通信和网络通信的基本构件。套接字是为客户/服务器模型而设计的,通常套接字包含两类:

    • 基于文件型:通信进程都运行在同一台机器的环境中,套接字是基于本地文件系统支持的,一个套接字关联到一个特殊的文件,通信双方都通过对这个特殊文件的读写实现通信,原理类似管道。
    • 基于网络型:该类型通信采用的是非对称方式通信,即发送者需要提供接收者命名。通信双方的进程运行在不同主机的网络环境下,被分配了一对套接字,一个属于接收进程(服务器端),一个属于发送进程(客户端)。
      • 发送进程发出连接请求时,随机申请一个套接字,主机为之分配一个端口与该套接字绑定,不再分配给其它进程。
      • 接收进程拥有全局公认的套接字和指定端口,并通过监听端口等待客户请求
      • 接收进程一旦收到请求,就接收来自发送进程的连接,完成连接,主机间传输的数据可以准确地发送到通信进程
      • 通信结束时,系统通过关闭接收进程的套接字撤销连接
  • 2.远程过程调用和远程方法调用
    远程过程(函数)调用RPC(Remote Procedure Call),是一个通信协议,用于通过网络连接的系统。该协议允许运行于一台主机(本地)系统上的进程调用另一台主机(远程)系统上的进程,而对程序员表现为常规的过程调用,无需额外地为此编程。如果涉及的软件采用面向对象编程,那么远程过程调用亦可称做远程方法调用。

    负责处理远程过程调用的进程有两个:本地客户进程和远程服务器进程;这两个进程通常被称为网络守护进程,主要负责在网络间的消息传递,一般情况下两个进程都处于阻塞状态,等待消息。

    为了使RPC透明化,引入存根的概念:

    • 在本地客户端,每个能够独立运行的远程过程都拥有一个客户存根,本地进程调用远程过程实际是调用该过程关联的存根
    • 每个远程进程所在的服务器端,其所对应的实际可执行进程也存在一个服务器跟于其关联。
    • 本地客户存根与对应的远程服务器存根一般也是处于阻塞状态,等待消息。

    ⭐远程过程调用的主要步骤:

    • 本地过程调用者以一般方式调用远程过程在本地关联的客户存根,传递相应的参数,然后将控制权转移给客户存根;
    • 客户存根执行,完成包括过程名和调用参数等信息的消息建立,将控制权转移给本地客户进程;
    • 本地客户进程完成与服务器的消息传递,将消息发送到远程服务器进程;
    • 远程服务器进程接收消息后转入执行,并根据其中的远程过程名找到对应额服务器存根,将消息转给服务器存根。
    • 该服务器存根接到消息后,由阻塞状态转入执行状态,拆开消息从中取出过程调用的参数,然后以一般方式调用服务器上关联的过程;
    • 在服务器端的远程过程运行完毕后,将结果返回给与之关联的服务器存根;
    • 该服务器存根获得控制权运行,将结果打包为消息,并将控制权转移给远程服务器进程;
    • 远程服务器进程将消息发送回客户端;
    • 本地客户进程接收到消息后,根据其中的过程名将消息存入关联的客户存根,再将控制权转移给客户存根;
    • 客户存根从消息中取出结果,返回给本地调用者进程,并完成控制权的转移。

    最终本地调用者再次获得控制权,并得到了所需的数据,得以继续运行。将客户过程的本地调用转化为客户存根,再转化为服务器过程的本地调用,对客户与服务器来说,中间步骤是不可见的,因此调用者在整个过程中并不在知道该过程的执行是在远程,而不是在本地,从而实现了透明。

消息传递通信的实现方式

直接消息传递系统

  • 对称寻址方式
    发送进程和接收进程都必须以显式方式提供对方的标识符。
send(receiver,message); 发送一个消息给接收进程
receive(sender,message); 接收sender发来的消息
send(P2,m1); 表示将消息m1发送给接收进程P2
receive(P1,m1); 表示接收由P1发来的消息m1
  • 非对称寻址方式
    接收进程原语中,不需要名命发送进程,只填写表示源进程的参数,即完成通信后的返回值
send(P,message); 发送一个消息给进程P
receive(id,message); 接收来自任何进程的消息,id变量可以设置为进行通信的发送方进程id或名字

信箱通信

信箱通信属于间接通信方式:进程之间的通信需要通过某种中间实体(如共享数据结构等)来完成。该实体建立在随机存储器的公用缓冲区上,用来暂存发送进程发送给目标进程的消息;接收进程可以从该实体中取出发送进程发送给自己的消息,通常把这种中间实体称为信箱,每个信箱都有一个唯一的标识符。

  • 信箱的结构

  • 逻辑上可以分为两部分:

    • 信箱头:用以存放有关信箱的描述信息,如信箱标识符,信箱的拥有者,信箱口令,信箱的空格数等;
    • 信箱体:由若干个可以存放消息(或消息头)的信箱格组成,信箱格的数目以及信箱格的大小是在创建信箱时确定的;
  • 信箱的类型

    • 私用信箱:用户进程为自己建立一个新的信箱,并作为该进程的一部分。信箱的拥有者可以从信箱读取消息,而其它用户则只能将消息发送到该邮箱。随拥有者进程销毁而消失。
    • 公用信箱:由操作系统创建,并提供给系统中所有准核进程使用。系统运行期间始终存在。
    • 共享信箱:由某进程创建,在创建时或创建后指明它是共享的,同时必须指出共享进程的名字。
  • 信箱通信原语:

send(mailbox,message); 将一个消息发送到指定邮箱
receive(mailbox,message); 从指定邮箱接收一个消息
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值