操作系统(4)-进程管理-进程间通信


🚀前言

在多道程序环境的系统中存在多个可以并发执行的进程,故进程间必然存在资源共享和相互合作的问题。进程通信是指各个进程交换信息的过程

🚀同步机制

进程同步机制的主要任务,是对多个相关进程在执行次序上进行协调,使并发执行的诸进程之间能按照一定的规则(或时序)共享系统资源,并能很好地相互合作,从而使程序的执行具有可再现性。

🚁两种形式的制约关系

在多道程序环境下,对于同处于一个系统中的多个进程,由于它们共享系统中的资源,或为完成某一任务而相互合作,它们之间可能存在着以下两种形式的制约关系:

🛴互斥:间接相互制约关系

进程的互斥是指系统中多个进程因争用临界资源而互斥执行。

多个程序在并发执行时,由于共享系统资源,如CPU,I/O设备等,致使在这些并发执行的程序之间形成相互制约的关系。对于像打印机,磁带机这样的临界资源,必须保证多个进程对之只能互斥地访问,由此,在这些进程间形成了源于对该类资源共享的所谓间接相互制约关系。为了保证这些进程能有序地运行,对于系统中的这类资源,必须由系统实施统一分配,即用户在要使用之前,应先提出申请,而不允许用户进程直接使用。

🛴同步:直接相互制约关系

进程间的同步是指在系统中一些需要相互合作,协同工作的进程,这样的相互联系称为进程的同步。

某些应用程序,为了完成某任务而建立了两个或多个进程。这些进程将为完成同一项任务而相互合作。进程间的直接制约关系就是源于它们之间的相互合作。例如,有两个相互合作的进程一输入进程a和计算进程b,它们之间共享一个缓冲区。进程a通过级冲向进程b提供数据。进程b从缓冲中取出数据,并对数据进行处理。但如果该缓冲空时,计算进程因不能获得所需数据而被阻塞。一旦进程a把数据输入缓冲区后便将进程b唤醒;反之,当缓冲区已满时,进程a因不能再向缓冲区投放数据而被阻塞,当进程b将缓冲区数据取走后便可唤醒a。

在多道程序环境下,由于存在着上述两类相互制约关系,进程在运行过程中是否能获得处理机运行与以怎样的速度运行,并不能由进程自身所控制,此即进程的异步性。由此会产生对共享变量或数据结构等资源不正确的访问次序,从而造成进程每次执行结果的不一致。这种差错往往与时间有关,故称为"与时间有关的错误"。为了杜绝这种差错,必须对进程的执行次序进行协调,保证诸进程能按序执行。

🚁其他概念

临界资源:在多道程序系统环境中,各进程可以共享各类资源,但有些资源一次只能供一个进程使用。如打印机。
临界区:临界区(CriticalSection,CS)是进程中对临界资源实施操作的那段程序。本质是一段代码。
互斥信号量:对临界资源采用互斥访问,使用互斥信号量后其他进程无法访问,初值为1。
同步信号量:对共享资源的访问控制,初值一般是共享资源的数量。

🚁同步机制应遵循的规则

为实现进程互斥地进入自己的临界区,可用软件方法,更多的是在系统中设置专门的同步机构来协调各进程间的运行。所有同步机制都应遵循下述四条准则:

  • 空闲让进。当无进程处于临界区时,表明临界资源处于空闲状态,应允许一个请求进入临界区的进程立即进入自己的临界区,以有效地利用临界资源。
  • 忙则等待。当已有进程进入临界区时,表明临界资源正在被访问,因而其它试图进入临界区的进程必须等待,以保证对临界资源的互斥访问。
  • 有限等待。对要求访问临界资源的进程,应保证在有限时间内能进入自己的临界区,以免陷入"死等"状态。
  • 让权等待。当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入"忙等"状态。

🚀信号量机制

信号量机制是一种有效的进程同步与互斥工具。它从整型信号量经记录型信号量,进而发展为"信号量集"机制。现在,信号量机制已被广泛地应用于单处理机和多处理机系统以及计算机网络中。

🚁信号量与PV操作

信号量S的物理意义:S**>0表示某资源的可用数,若S<0,则其绝对值表示阻塞队列中等待该资源的进程数**。
P操作的定义:申请资源。S:=S-1,若S≥0,则执行P操作的进程继续执行;若S<0,则置该进程为阻塞状态(因为无可用资源),并将其插入阻塞队列。
V操作定义:释放资源。S:=S+1,若S>0,则执行V操作的进程继续执行;若S≤0,则从阻塞状态唤醒一个进程,并将其插入就绪队列,然后执行V操作的进程继续。
P、V操作是两个原子操作,因此,它们在执行时是不可中断的。亦即,当一进程在修改某信号量时,没有其它进程可同时对该信号量进行修改。此外,在P操作中,对S值的测试和做S:=S-1操作时都不可中断。注意,V的定义中没有定义等待线程被重启动的顺序,唯一的要去是V必须只能重启一个正在等待的线程。因此,当有多个线程在等待同一个信号量时,你不能预测V操作要重启哪一个线程。
P和V的定义确保了一个正在运行的程序绝不可能进人这样一种状态,也就是一个正确初始化了的信号量有一个负值。这个属性称为信号量不变性(semaphoreinvariant),为控制并发程序的轨迹线提供了强有力的工具。

🚁利用信号量实现互斥

信号量提供了一种很方便的方法来确保对共享变量的互斥访问。基本思想是将每个共享变量(或者一组相关的共享变量)与一个信号量s(初始为1)联系起来,然后用P(s)和V(s)操作将相应的临界区包围起来。
P(mutex);临界区;V(mutex);

🚁利用信号量调度共享资源

进程的同步是由于进程间合作引起的相互制约的问题,要实现进程的同步可用一个信号量与消息联系起来,当信号量的值为0时表示希望的消息未产生,当信号量的值为非0时表示希望的消息已经存在。假定用信号量S表示某条消息,进程可以通过调用P操作测试消息是否到达,调用V操作通知消息已准备好。最典型的同步问题是单缓冲区的生产者和消费者的同步问题。
生产者产生项目并把它们放入一个有限的缓冲区,消费者从缓冲区取出这些项目,然后消费它们
因为插人和取出项目都涉及更新共享变量,所以我们必须保证对缓冲区的访问是互斥的。但是只保证互斥访问是不够的,我们还需要调度对缓冲区的访问。如果缓冲区是满的(没有空的槽位),那么生产者必须等待直到有一个槽位变为可用。与之相似,如果缓冲区是空的(没有可取用的项目),那么消费者必须等待直到有一个项目变为可用。
方案示例:信号量S1的初值为1,表示缓冲区空,可以将产品送入缓冲区;信号量S2的初值为0,表示缓冲区有产品。
image.png

🚀高级通信原语

进程间通信是指进程之间的信息交换,少则一个信息,多则成千上万个信息。根据交换信息量的多少和效率的高低,进程通信的方式分为低级方式和高级方式。PV操作属于低级通信方式,若用PV操作实现进程间通信,则存在如下问题。

  • 编程难度大。通信对用户不透明,即要用户利用低级通信工具实现进程间的同步与互斥。而且,PV操作使用不当容易引起死锁。
  • 效率低。生产者每次只能向缓冲区放一个消息,消费者只能从缓冲区取一个消息。

为了提高信号通信的效率,传递大量数据,降低程序编制的复杂度,系统引入了高级通信方式。高级通信方式主要分为共享存储模式、消息传递模式和管道通信。

  • 共享存储模式。相互通信的进程共享某些数据结构(或存储区)实现进程之间的通信。
  • 消息传递模式。进程间的数据交换以消息为单位,程序员直接利用系统提供的一组通信命令(原语)来实现通信,如Send(A)、Receive(A)。
  • 管道通信。所谓管道,是指用于连接一个读进程和一个写进程,以实现它们之间通信的共享文件(pipe文件)。向管道(共享文件)提供输入的发送进程(即写进程),以字符流的形式将犬量的数据送入管道;而接收进程可从管道接收犬量的数据。由于它们通信时采用管道,所以称为管道通信。

🚀小结

进程的同步与互斥被认为是低级进程通信,现代操作系统通常为能传送大量数据的高级通信机制。

参考资料:

  • [1]《操作系统导论》
  • [2]《现代操作系统》
  • [3]《系统架构设计师教程》
  • [4]《计算机操作系统》
  • [5]《深入理解计算机系统》

系列文章连接:
操作系统(1)-操作系统概述
操作系统(2)-进程管理-进程基本概念
操作系统(3)-进程管理-受限直接执行
操作系统(4)-进程管理-进程间通信

  • 10
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值