第一节 进程间通信的基本方式
- 通信分为低级通信和高级通信。
- 低级通信一般用于本机内进程之间,包括信号(Signal),信号量(Semaphore)等,采用共享变量的方法来实现。
- 高级通信不仅用于本机,还适用于网络,包括消息队列(Message Queue),共享内存(Shared Memory),套接字(Socket)和邮箱通信(Post Box)等。网络上主要使用高级通信。
一,进程间低级通信
-
低级通信方式传递的信息一般比较少,进程间的低级通信方式以信号量为主。
-
用信号量可以实现互斥,方法如下
-
先为临界资源设置一个互斥信号量S,其初值为1,在每个进程中,将临界区代码置于P(S)和V(S)原语之间。在运行过程中,必须成对使用P和V原语;缺少P原语,则不能保证互斥访问,缺少V原语,则不能在使用临界资源之后,将其释放;P,V原语不能颠倒,重复或遗漏。
-
用信号量实现互斥的原型
-
type def semaphore; //定义信号量 semaphore S = 1; //信号量赋初值 PROC1; PROC2 P(S); P(S); critical section critical section V(S); V(S); remainder section remainder section
-
二,消息缓冲通信
- 消息缓冲机制的通信方式适用于网络中各节点主机之间的进程通信。
- 基本思想
- 根据“生产者—消费者”的基本原理,利用公共消息缓冲区实现进程之间和各节点主机之间的信息交换。
- 基本方法
- 发送者调用消息发送原语send(receiver,a),而接收者调用消息接收原语receive(b)。
- a,b分别表示发送进程中准备发送的消息在内存区的首地址以及接收进程用于存放收到的信息在内存的首地址。
- 在发送者和接收者对内存消息区访问时需要遵循互斥约束,一般用P,V操作原语来实现send和receive原语。
- 基本原理
- 当发送者要发送消息时,执行send系统调用命令,产生自愿性中断进入操作系统核心。操作系统为发送者分配一个空缓冲区,并将所发送的消息内容从发送者空间复制到该缓冲区中;然后将此缓冲区连接到接收者的消息队列末尾;发送者就完成了发送,返回到发送者用户态继续执行。
- 当接收者执行到receive系统调用命令时,也产生自愿性中断,进入操作系统核心;操作系统将载有消息的缓冲区从消息队列中取出,并将消息内容复制到接收者空间中,然后收回空闲缓冲区;排列到空闲缓冲区末尾。接收者完成了消息接收,返回到接收者用户态继续执行。
- 消息传递机制注意事项
- sender:消息发送者名。发送者一般是隐含的,发送进程便是发送者。
- size:消息长度
- text:消息正文。
- 为保证发送者和接收者对共享内存区的互斥访问,需要设置以下信号量
- 每个进程有一个mutex0,保证对消息队列的互斥操作,初值为1。
- 消息缓冲区数量是有限的,设为buffe。初值为空闲消息缓冲区个数。
- 设定mutex1,专门用于对空闲消息缓冲区数的互斥操作,初值为1。
- 设定message,用于管理接收者消息,初值为0。
三,信箱通信
- 信箱通信也称为邮箱通信,是一种高级通信,也是间接通信。
1,信(邮)箱
- 信箱是一种数据结构,逻辑上分成两部分。
- 信箱头和由若干格子组成的信箱体。
- 信箱在创建时必须建立信箱头,其中包含:信箱名称,信箱大小,创建者的进程名等。
- 信箱通信满足的条件
- 发送者发送消息时,信箱中至少要有一个空格存放该信件。
- 接收者接收消息时,信箱中至少要有一个信件存在。
- 信箱可由OS创建,也可由用户进程创建。
- 使用信箱通信时,发送者和接收者之间存在的四种关系。
- 一对一关系:为发送者和接收者建立一条专用的通信链路。
- 多对一关系:允许多个用户进程与单个提供服务的进程进行交互,也称客户/服务器交互。
- 一对多关系:允许一个发送者与多个接收者交互,使发送者用广播的形式,发送信件。
- 多对多关系:允许建立一个公用信箱,让多个发送者进程都能向信箱投递消息,多个接收者进程也可取走属于自己的信件。
- 信箱通信的算法
- 发送者调用过程deposit(m)将信件m发送到信箱,接收者调用过程remove(m),将信件m从信箱中取出。为确保信箱数据一致性,需设置两个信号量。
- Fromnum:发送者的私用信号量。记录信箱空格,初值为n。
- Mesnum:接收者的私用信号量。记录信箱有信件的个数,初值为0。
- 两个信号量确保发送者不会向已经满的信箱中发送信件,接收者不会从空的信箱中读取信件,而避免死锁。
- 发送者调用过程deposit(m)将信件m发送到信箱,接收者调用过程remove(m),将信件m从信箱中取出。为确保信箱数据一致性,需设置两个信号量。
第二节 基于消息传递的通信方式
一,消息传递的通信机制
- 在计算机网络系统中,各节点主机上的进程之间普遍采用消息传递(Message Passing)的通信方式。
- 通信方式
- 一个进程发送一条消息,另一个进程接收这一消息。一个消息只有在它已经发送出来的条件下才能被接收,因而两者需要取得同步。当一个进程在接收到消息时,它将从发送进程那里取得某些信息,于是实现了两进程之间的通信,这种通信方式不需要使用共享变量。
二,客户/服务器模式
- 基本思想
- 把操作系统构造为一组相互合作的进程。在网络中,每个节点即可以作为一个服务器,也可以作为一个客户机。在一个客户机上,可以运行一个客户进程,也可以运行多个客户进程。同样,在一个服务器上可以运行多个服务进程或客户和服务进程的混合组合。
- 工作过程
- 客户端发送一个请求信息给服务器要求某一种服务,服务器完成这一请求后返回计算结果或错误信息。所有的信息传送都是由底层内核通过二个系统调用的原语完成的。
三,客户/服务器间的通信
- 通信过程
- 服务器首先获得本地的计算机地址,创建通信端口,打开侦听口,等待接收客户机消息。
- 程序设计为一旦服务器接收到客户机发来的消息,服务器会向客户机回送一条消息。
- 客户机向固定地址的服务器建立通信连接,成功后向服务器发送一条消息,然后等待服务器返回应答。
四,进程间通信的原语
- 通信原语构成了网络操作系统的通信机制。
- 原语(Primtive)是指系统的一组指令集合,该组指令在执行过程中不可被中断,原语即是原子操作,多个指令组成的集合不可分割。这样的操作可以保证指令执行的完整性。
- **send()和receive()**即为通信原语。
五,通信协议
- 网络协议(Network Protocol),也称为网络通信协议(Network Communication Protocol)是对计算机之间通信的信息格式,它能被收/发双方都认可的传送信息内容的一组定义。
第三节 通信原语的设计
一,通信原语的类型
- 同步原语与异步原语
- 缓冲原语与非缓冲原语
- 可靠原语与非可靠原语
二,同步原语和异步原语
- 同步原语也称为阻塞原语,即当发送者调用该原语时,必须对接收者具有明确的要求,当接收者准备就绪可以接收信息时,发送者立即将信息发送给对方,若接收者未准备好时,那么发送者会自我阻塞,等待接收者就绪。而且,当处于发送状态时,发送者会等待信息完全发送完毕再返回。
- 优点
- 信息的传递不过多地占用处理机的时间,但是设计不当可能会造成死锁或饥饿。解决方案:异步原语。
- 异步原语也称为非阻塞原语,当发送者调用通信原语时,先查找接收者,不管找到或未找到,不等信息发出或不发出,原语立即返回调用程序,并返回发送成功或失败的信息,进而继续执行下面的指令代码。
- 优点
- 可以保证进程运行的效率,始终保持处理机处于繁忙状态。
- 缺点
- 发送者并不知道信息何时发送完毕,发送缓冲区何时可用,若发送缓冲区的信息还未发送完,而发送者将新的信息送入缓冲区时可能会发送不可预测的结果,此时需要有其他机制来保证安全,否则可能会造成系统的崩溃。
三,缓冲原语和非缓冲原语
- 缓冲通信原语和非缓冲通信原语的根本区别在于是否在内核存在一块内存用来存放过早到达的信息。如果有则是缓冲原语,否则就是非缓冲原语。
- 对内核缓冲区的管理最简单的方法是定义一个称为信箱(Mailbox)的数据结构。接收者进程通知服务进程为它创建一个信箱,并指定一个可供查询的地址。当发送者发送消息时,在信息包中携带了这一地址,当含有该地址的所有到达的信息都将被放进该信箱。接收者可以调用接收原语从信箱中取出一个信息,取出以后便可以进行下一次操作,直到信息被取完。如果信箱中没有信息则就返回。
- 信箱缓冲技术不能解决所有的过早接收到信息的问题,若有限的信箱装满后,服务进程又面临相同的问题,是抛弃信息还是覆盖原有的信息。缓冲原语部分解决了接收者的信息丢失问题,但是,没有解决根本问题。
四,可靠原语和非可靠原语
- 在开环的系统中通信,不能保证发送者发送的信息是完整可靠的,也不保证信息一定会送达接收者手里,因此,这种通信原语称为非可靠原语。
- 如果我们希望发送者发出的信息保证会送达接收者手里,我们可以要求发送出去的信息有回执,具体在客户/服务器模型上可以采用“确认”的方法。
- 在服务器端设置一个计时器,当服务器接到客户机的请求后开始计时,若在规定时间内不能完成计算,则服务器内核向客户机内核发送收到的确认信息,通知客户机不必再发请求,只需等待应答。若在规定的时间内完成计算,则直接将结果应答给客户,省去一次确认过程。
第四节 远程过程调用(RPC)
一,远程过程调用概念
-
在计算机系统中,如果用户进程调用本机的API时,可以通过本地过程(或函数)调用(Local Produce Call)的方式实现。在调用时,调用进程必须给出被调用的过程名,传送所需参数和提供返回参数的缓冲区。
-
在网络系统中,不同节点主机之间也可以采用过程调用的方式进行通信,称为远程过程调用(Remote Produce Call,RPC)。
-
远程过程调用是一个协议,用户进程可以使用这个协议请求网络中另一计算机节点上某程序的服务而不需知道网络细节。远程过程调用使用的是客户/服务器模型。请求进程是客户,服务提供进程则为服务器。
-
RPC跨域了网络通信的开放系统互连模型中的传输层与应用层。RPC使得网络中包括多个分布程序的应用程序的开发变得更加容易。
二,远程过程调用与通信原语的比较
- 远程过程调用在使用中的不便之处
- 远程过程调用的参数传递在异构平台之间的通用性能不能满足用户要求。
- 远程过程调用设计为请求/应答形式,不能在一次调用过程中多次接收中间结果,缺乏人机交互的灵活性。
- 远程过程调用不能传递大量数据。
- 对于远程过程调用,应该根据其特定灵活应用,对于需要有良好的格式操作,并不关心底层机制的应用需要可以使用它;而对于系统级应用,还是采用通信原语好。
第五节 组通信
一,组通信概念
- 组是定义为在某一系统中相互有关系的进程的集合。当一个信息发送给这个组时,该组所有成员都可以接收。组通信实现了“一对多”的通信形式。组的建立是动态的,在某一时刻组的成员是一定的,而到下一时刻,可能有的组内的成员会离开,新的组员会加入,因此,成组的管理要有一个特定的机构。
- 组的概念是逻辑的,是一个形式上的组合,当客户机向这样一个组发送信息时,不必关心该组内服务器有多少或服务器位于何处。
二,实现方法
- 多播
- 广播
- 单播
三,流媒体数据广播
- 流媒体是指在网络中使用数据流式传输技术的连续时基媒体,如音频,视频或多媒体文件。
- 流媒体传输技术就是把连续的声音和图像信息经过压缩处理后放在服务器上,用户不必一次下载完毕才开始播放,而是一边下载,一边收听,观看的高效网络传输方式。
- 实现流媒体传输有两种方式
- 实时流媒体传输(Real-Time Steaming Transport)
- 顺序流媒体传输(Progressive Streaming Transport)
1,实时流媒体传输
- 实时流媒体传输是保证媒体信号带宽与网络连接匹配,使媒体能够被实时观看到。它需要专用的流媒体服务器与传输协议。实时流式传输需要特定服务器,如:Quick Time Streaming Server,Real Server与Windows Media Server。
2,顺序流媒体传输
- 顺序流媒体传输是顺序下载,在下载文件的同时用户可观看已下载部分内容,而不能跳到还未下载的部分。
3,流媒体播放方式
- 单播
- 客户端与媒体服务器之间需要建立一个单独的数据通道,从一台服务器送出的每个数据包只能传送给一个客户机,这种传送方式称为单播。
- 多播
- 多播利用组通信方式构建一种具有组播能力的网络,允许路由器一次将数据包复制到多个通道上。采用多播方式,单台服务器能够对几十万台客户机同时发送相同的连续数据流而无延时或少延时。
- 点播与广播
- 点播是客户端与服务器之间的主动的连接。
- 广播指的是用户被动接收流媒体,用不着就抛弃