3) 进程间通信:进程通信的类型(直接通信和间接通信方式)、消息传递系统中的几个问题、消息缓冲队列通信机制。

2.5.1 进程通信的类型

1 .共享存储器系统
 (1) 基于共享数据结构的通信方式。在这种通信方式中,要求诸进程公用某些数据结构,借以实现诸进程间的信息交换。如在生产者—消费者问题中,就是用有界缓冲区这种数据结构来实现通信的。这里,公用数据结构的设置及对进程间同步的处理,都是程序员的职责。这无疑增加了程序员的负担,而操作系统却只须提供共享存储器。因此,这种通信方式是低效的,只适于传递相对少量的数据。
 (2) 基于共享存储区的通信方式。为了传输大量数据,在存储器中划出了一块共享存储区,诸进程可通过对共享存储区中数据的读或写来实现通信。这种通信方式属于高级通信。进程在通信前,先向系统申请获得共享存储区中的一个分区,并指定该分区的关键字;若系统已经给其他进程分配了这样的分区,则将该分区的描述符返回给申请者,继之,由申请者把获得的共享存储分区连接到本进程上;此后,便可像读、写普通存储器一样地读、写该公用存储分区。
   2 .消息传递系统
  消息传递系统(Message passing system)是当前应用最为广泛的一种进程间的通信机制。在该机制中,进程间的数据交换是以格式化的消息(message)为单位的;在计算机网络中,又把message称为报文。程序员直接利用操作系统提供的一组通信命令(原语),不仅能实现大量数据的传递,而且还隐藏了通信的实现细节,使通信过程对用户是透明的,从而大大减化了通信程序编制的复杂性,因而获得了广泛的应用。
  特别值得一提的是,在当今最为流行的微内核操作系统中,微内核与服务器之间的通信,无一例外地都采用了消息传递机制。又由于它能很好地支持多处理机系统、分布式系统和计算机网络,因此它也成为这些领域最主要的通信工具。消息传递系统的通信方式属于高级通信方式。又因其实现方式的不同而进一步分成直接通信方式和间接通信方式两种。
  3 .管道通信
  所谓“管道”,是指用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件,又名pipe文件。向管道(共享文件)提供输入的发送进程(即写进程),以字符流形式将大量的数据送入管道;而接受管道输出的接收进程(即读进程),则从管道中接收(读)数据。由于发送进程和接收进程是利用管道进行通信的,故又称为管道通信。这种方式首创于UNIX系统,由于它能有效地传送大量数据,因而又被引入到许多其它的操作系统中。
  为了协调双方的通信,管道机制必须提供以下三方面的协调能力:
  (1) 互斥,即当一个进程正在对pipe执行读/写操作时,其它(另一)进程必须等待。
  (2) 同步,指当写(输入)进程把一定数量(如4 KB)的数据写入pipe,便去睡眠等待,直到读(输出)进程取走数据后,再把它唤醒。当读进程读一空pipe时,也应睡眠等待,直至写进程将数据写入管道后,才将之唤醒。
  (3) 确定对方是否存在,只有确定了对方已存在时,才能进行通信。

2.5.2 消息传递通信的实现方法

1 .直接通信方式
  这是指发送进程利用OS所提供的发送命令,直接把消息发送给目标进程。此时,要求发送进程和接收进程都以显式方式提供对方的标识符。通常,系统提供下述两条通信命令(原语):
  Send(Receiver,message); 发送一个消息给接收进程;
  Receive(Sender,message); 接收Sender发来的消息;
  例如,原语Send(P 2 ,m 1 )表示将消息m 1 发送给接收进程P 2 ;而原语Receive(P 1 ,m 1 )则表示接收由P 1 发来的消息m 1 。
  在某些情况下,接收进程可与多个发送进程通信,因此,它不可能事先指定发送进程。例如,用于提供打印服务的进程,它可以接收来自任何一个进程的“打印请求”消息。对于这样的应用,在接收进程接收消息的原语中,表示源进程的参数,也是完成通信后的返回值,接收原语可表示为:
  Receive (id,message);
  我们还可以利用直接通信原语来解决生产者—消费者问题。当生产者生产出一个产品(消息)后,便用Send原语将消息发送给消费者进程;而消费者进程则利用Receive原语来得到一个消息。如果消息尚未生产出来,消费者必须等待,直至生产者进程将消息发送过来。生产者—消费者的通信过程可分别描述如下:

repeatproduce an item in nextp;send(consumer,nextp);until false;repeatreceive(producer,nextc);consume the item in nextc;until false;

2 .间接通信方式
  间接通信方式指进程之间的通信需要通过作为共享数据结构的实体。该实体用来暂存发送进程发送给目标进程的消息;接收进程则从该实体中取出对方发送给自己的消息。通常把这种中间实体称为信箱。消息在信箱中可以安全地保存,只允许核准的目标用户随时读取。因此,利用信箱通信方式,既可实现实时通信,又可实现非实时通信。
  系统为信箱通信提供了若干条原语,分别用于信箱的创建、撤消和消息的发送、接收等。
  (1) 信箱的创建和撤消。进程可利用信箱创建原语来建立一个新信箱。创建者进程应给出信箱名字、信箱属性(公用、私用或共享);对于共享信箱,还应给出共享者的名字。当进程不再需要读信箱时,可用信箱撤消原语将之撤消。
  (2) 消息的发送和接收。当进程之间要利用信箱进行通信时,必须使用共享信箱,并利用系统提供的下述通信原语进行通信:
  Send(mailbox,message); 将一个消息发送到指定信箱;
  Receive(mailbox,message); 从指定信箱中接收一个消息;
  信箱可由操作系统创建,也可由用户进程创建,创建者是信箱的拥有者。据此,可把信箱分为以下三类。
  (2) 消息的发送和接收。当进程之间要利用信箱进行通信时,必须使用共享信箱,并利用系统提供的下述通信原语进行通信:
  Send(mailbox,message); 将一个消息发送到指定信箱;
  Receive(mailbox,message); 从指定信箱中接收一个消息;
  信箱可由操作系统创建,也可由用户进程创建,创建者是信箱的拥有者。据此,可把信箱分为以下三类。
   1) 私用信箱
  用户进程可为自己建立一个新信箱,并作为该进程的一部分。信箱的拥有者有权从信箱中读取消息,其他用户则只能将自己构成的消息发送到该信箱中。这种私用信箱可采用单向通信链路的信箱来实现。当拥有该信箱的进程结束时,信箱也随之消失。
  2) 公用信箱
  它由操作系统创建,并提供给系统中的所有核准进程使用。核准进程既可把消息发送到该信箱中,也可从信箱中读取发送给自己的消息。显然,公用信箱应采用双向通信链路的信箱来实现。通常,公用信箱在系统运行期间始终存在。
  (3) 一对多关系。允许一个发送进程与多个接收进程进行交互,使发送进程可用广播方式向接收者(多个)发送消息。
  (4) 多对多关系。允许建立一个公用信箱,让多个进程都能向信箱中投递消息;也可从信箱中取走属于自己的消息。

2.5.3 消息传递系统实现中的若干问题

1 .通信链路
  为使在发送进程和接收进程之间能进行通信,必须在两者之间建立一条通信链路(communication link)。有两种方式建立通信链路。第一种方式是由发送进程在通信之前用显式的“建立连接”命令(原语)请求系统为之建立一条通信链路;在链路使用完后,也用显式方式拆除链路。这种方式主要用于计算机网络中。第二种方式是发送进程无须明确提出建立链路的请求,只须利用系统提供的发送命令(原语),系统会自动地为之建立一条链路。这种方式主要用于单机系统中。
  根据通信链路的连接方法,又可把通信链路分为两类:
  (1) 点—点连接通信链路,这时的一条链路只连接两个结点(进程);
  (2) 多点连接链路,指用一条链路连接多个(n>2)结点(进程)。
  而根据通信方式的不同,则又可把链路分成两种:
  (1) 单向通信链路,只允许发送进程向接收进程发送消息,或者相反;
  还可根据通信链路容量的不同而把链路分成两类:一是无容量通信链路,在这种通信链路上没有缓冲区,因而不能暂存任何消息;再者就是有容量通信链路,指在通信链路中设置了缓冲区,因而能暂存消息。缓冲区数目愈多,通信链路的容量愈大。
  2 .消息的格式
  在消息传递系统中所传递的消息,必须具有一定的消息格式。在单机系统环境中,由于发送进程和接收进程处于同一台机器中,有着相同的环境,故其消息格式比较简单;但在计算机网络环境下,不仅源和目标进程所处的环境不同,而且信息的传输距离很远,可能要跨越若干个完全不同的网络,致使所用的消息格式比较复杂。通常,可把一个消息分成消息头和消息正文两部分。消息头包括消息在传输时所需的控制信息,如源进程名、目标进程名、消息长度、消息类型、消息编号及发送的日期和时间;而消息正文则是发送进程实际上所发送的数据。
  在某些OS中,消息采用比较短的定长消息格式,这便减少了对消息的处理和存储开销。这种方式可用于办公自动化系统中,为用户提供快速的便笺式通信;但这对要发送较长消息的用户是不方便的。在有的OS中,采用变长的消息格式,即进程所发送消息的长度是可变的。系统无论在处理还是在存储变长消息时,都可能会付出更多的开销,但这方便了用户。这两种消息格式各有其优缺点,故在很多系统(包括计算机网络)中,是同时都用的。
    3 .进程同步方式
  在进程之间进行通信时,同样需要有进程同步机制,以使诸进程间能协调通信。不论是发送进程,还是接收进程,在完成消息的发送或接收后,都存在两种可能性,即进程或者继续发送(接收),或者阻塞。由此,我们可得到以下三种情况:
  (1) 发送进程阻塞,接收进程阻塞。这种情况主要用于进程之间紧密同步(tight synchronization),发送进程和接收进程之间无缓冲时。这两个进程平时都处于阻塞状态,直到有消息传递时。这种同步方式称为汇合(rendezrous)。
  (2) 发送进程不阻塞,接收进程阻塞。这是一种应用最广的进程同步方式。平时,发送进程不阻塞,因而它可以尽快地把一个或多个消息发送给多个目标; 而接收进程平时则处于阻塞状态,直到发送进程发来消息时才被唤醒。例如,在服务器上通常都设置了多个服务进程,它们分别用于提供不同的服务,如打印服务。平时,这些服务进程都处于阻塞状态,一旦有请求服务的消息到达时,系统便唤醒相应的服务进程,去完成用户所要求的服务。处理完后,若无新的服务请求,服务进程又阻塞。
  (3) 发送进程和接收进程均不阻塞。这也是一种较常见的进程同步形式。平时,发送进程和接收进程都在忙于自己的事情,仅当发生某事件使它无法继续运行时,才把自己阻塞起来等待。例如,在发送进程和接收进程之间联系着一个消息队列时,该消息队列最多能接纳n个消息,这样,发送进程便可以连续地向消息队列中发送消息而不必等待;接收进程也可以连续地从消息队列中取得消息,也不必等待。只有当消息队列中的消息数已达到n个时,即消息队列已满,发送进程无法向消息队列中发送消息时才会阻塞;类似地,只有当消息队列中的消息数为0,接收进程已无法从消息队列中取得消息时才会阻塞。

2.5.4  消息缓冲队列通信机制

1) 消息缓冲区
  在消息缓冲队列通信方式中,主要利用的数据结构是消息缓冲区。它可描述如下:

type message buffer=recordsender;发送者进程标识符size ; 消息长度text ; 消息正文next ; 指向下一个消息缓冲区的指针end
  1. PCB中有关通信的数据项
      在操作系统中采用了消息缓冲队列通信机制时,除了需要为进程设置消息缓冲队列外,还应在进程的PCB中增加消息队列队首指针,用于对消息队列进行操作,以及用于实现同步的互斥信号量mutex和资源信号量sm。在PCB中应增加的数据项可描述如下:
type processcontrol block=recordmq   ; 消息队列队首指针mutex ; 消息队列互斥信号量sm ; 消息队列资源信号量end

2 .发送原语
发送进程在利用发送原语发送消息之前,应先在自己的内存空间设置一发送区a,见图2-14 所示。把待发送的消息正文、发送进程标识符、消息长度等信息填入其中,然后调用发送原语,把消息发送给目标(接收)进程。发送原语首先根据发送区a中所设置的消息长度a.size来申请一缓冲区i,接着把发送区a中的信息复制到缓冲区i中。为了能将i挂在接收进程的消息队列mq上,应先获得接收进程的内部标识符j,然后将i挂在j.mq上。由于该队列属于临界资源,故在执行insert操作的前后,都要执行wait和signal操作。

发送原语可描述如下:procedure send(receiver,a)begingetbuf(a.size,i);  根据a.size申请缓冲区;i.sender:= a.sender;  将发送区a中的信息复制到消息缓冲区i中;i.size:=a.size;i.text:=a.text;i.next:=0;getid(PCB set,receiver.j);获得接收进程内部标识符;wait(j.mutex);insert(j.mq,i);   将消息缓冲区插入消息队列;signal(j.mutex);signal(j.sm);end


 3 .接收原语
  接收进程调用接收原语receive(b),从自己的消息缓冲队列mq中摘下第一个消息缓冲区i,并将其中的数据复制到以b为首址的指定消息接收区内。接收原语描述如下:

procedure receive(b)beginj:= internal name; j为接收进程内部的标识符;wait(j.sm);wait(j.mutex);remove(j.mq,i); 将消息队列中第一个消息移出;signal(j.mutex);b.sender:=i.sender;  将消息缓冲区i中的信息复制到接收区b;b.size:=i.size;b.text:=i.text;end

操作系统 第二部分 进程管理(三)相关推荐

  1. (王道408考研操作系统)第二章进程管理-第三节8:经典同步问题之吸烟者问题

    本文接: (王道408考研操作系统)第二章进程管理-第三节6:经典同步问题之生产者与消费者问题 ((王道408考研操作系统)第二章进程管理-第三节7:经典同步问题之多生产者与多消费者问题 文章目录 一 ...

  2. 笔记篇:操作系统第二章 进程管理

    笔记篇:操作系统第二章 进程管理 目录 笔记篇:操作系统第二章 进程管理 2.1 进程的基本概念 2.1.1 程序的顺序执行及其特征 2.1.2 前驱图 2.1.3 程序的并发执行及其特征 2.1.4 ...

  3. (王道408考研操作系统)第二章进程管理-第三节10:经典同步问题之哲学家进餐问题

    本文接: (王道408考研操作系统)第二章进程管理-第三节6:经典同步问题之生产者与消费者问题 ((王道408考研操作系统)第二章进程管理-第三节7:经典同步问题之多生产者与多消费者问题 (王道408 ...

  4. (王道408考研操作系统)第二章进程管理-第三节7:经典同步问题之多生产者与多消费者问题

    注意:生产者与消费者问题Linux系统编程专栏有案例讲解 Linux系统编程39:多线程之基于阻塞队列生产者与消费者模型 Linux系统编程40:多线程之基于环形队列的生产者与消费者模型 本文接:(王 ...

  5. 操作系统第二章 进程管理

    写在前面:本文参考王道论坛的 操作系统考研复习指导单科书 文章目录 第二章 进程管理 进程同步 读者写者问题 哲学家就餐问题 练习题 哲学家就餐:加碗(2019真题) 既是生产者又是消费者 和尚取水( ...

  6. 操作系统 第二章 进程管理

    2.1 进程与线程 第一节零碎知识比较多,关键在于进程状态的切换.进程线程的关系. 第一章中提到过的多道程序环境,由于程序的特点,不能让程序并发,所以引入了进程的概念,让进程来并发,从而实现了多道程序 ...

  7. (王道408考研操作系统)第二章进程管理-第一节4:进程通信(配合Linux)

    文章目录 一:什么是进程通信 二:如何实现进程间通信及其分类 三:通信方式1-共享存储(共享内存) (1)课本基础内容 (2)补充-Linux中的进程通信 四:通信方式2-管道 (1)管道是什么 (2 ...

  8. (王道408考研操作系统)第二章进程管理-第一节3:进程控制(配合Linux讲解)

    文章目录 一:如何实现进程控制 二:进程控制原语 (1)进程创建 A:概述 B:补充-Linux中的创建进程操作 ①:fork() ②:fork()相关问题 (2)进程终止 A:概述 B:补充-僵尸进 ...

  9. 操作系统 第二章进程管理(自我总结式)

    一.程序的顺序执行及其特征 1.程序的顺序执行 在未配置OS的系统中,程序是顺序执行的 通常把应用程序分成若干个程序段,在各程序段之间,按照某种先后顺序执行 2.特征: 程序执行的顺序性 程序环境的封 ...

  10. 3 操作系统第二章 进程管理 进程定义、特征、组织、状态与转换

    文章目录 1 进程的定义和特征 2 进程的组织 3 进程的状态与转换 3.1 进程的状态 3.2 进程状态转换 1 进程的定义和特征 引入进程的原因 为了使程序能够并发执行,并且可以对并发执行的程序加 ...

最新文章

  1. 李宏毅机器学习笔记(五)-----Where does the error come from
  2. TensorFlow2020:如何使用Tensorflow.js执行计算机视觉应用程序?
  3. ICML 2018大奖出炉:伯克利、MIT获最佳论文,复旦大学榜上有名
  4. mysql 数组判断_mysql 判断两个数组是否有交集
  5. python pd Series 添加行_Python数据分析与挖掘的常用工具
  6. 中国电子云发布专属云CECSTACK 以全栈信创赋能千行百业
  7. 南充一中计算机机房被盗,四川省CCF CSP-JS第一轮认证考试在南充一中成功举行...
  8. linux下python开发工具_Python开发工具 Wing IDE
  9. 带“公交一卡通功能”的智能手环会是用户最爱?
  10. Cisdem PDFMaster for Mac(PDF批量转换工具)
  11. mysql基础之mariadb的安装,连接,用户,密码,权限设置语句详解
  12. 尽量使用条件属性(Conditional Attribute)而不是#if/#endif预处理
  13. Java实现函数指针
  14. 【转】Steam 开发者收入计算
  15. 输入一个整数(1~7),显示对应星期英文的缩写
  16. 威纶触摸屏485通信控制多台台达变频器程序
  17. 基于微信小程序云开发(校园许愿墙app)2.0稳定版,以发布上线
  18. 什么决定了局域网特性
  19. pythonturtle画图库使用技巧_Python画图库turtle使用方法简介
  20. Qt程序报错:Socket notifiers cannot be enabled or disabled from another thread

热门文章

  1. SOME/IP不等同于SOA,CommonAPI-RPC通信和vsomeip基于消息通信
  2. 梯度消失的有效解决方法-batch normalization
  3. python中的fft带通滤波器
  4. 第四季-专题18-FLASH驱动程序设计
  5. 解压速度更快, Zstandard 1.4.1 发布
  6. CRS-1714:Unable to discover any voting files
  7. 一起谈.NET技术,ASP.NET的状态管理
  8. oracle中查询被锁的表并释放session
  9. oozie的常见错误
  10. Effective Objective-C 的读书笔记