大家可以看下我使用幕布软件画的思维导图,如果大家想使用幕布可以通过我的邀请链接注册,可免费获得一个月高级会员https://mubu.com/inv/477598

4.1 进程通信

进程通信就是指进程之间的信息交换。

早期的时候,由于技术不发达,以及由于进程的同步和互斥需要在进程间交换一定的数据,所以不少人也将他们称为进程通信,但是实质上他们只能被成为低级的进程通信。
以信号量为例,他

  1. 效率低
    生产者或消费者每次只能向缓冲区投放一个产品或者取出一个产品。
  2. 通信对用户不透明

而关于进程间通信所需的数据结构的设置和数据的传送、进程的同步和互斥,都需要程序员去完成,显然是非常不方便的。

所以高级进程通信必须满足如下特点:

  1. 使用方便。
    OS隐藏了实现进程通信的具体细节,向用户提供了一组用于实现高级通信的命令,用户可以方便地直接利用它实现进程之间的通信。
  2. 高效的传送数据。
    用户可以直接利用高级通信命令高效的传送大量的数据。

进程通信主要有共享存储器系统、管道通信系统、消息传递系统以及客户机-服务器系统。

4.1.1 共享存储器系统

共享存储器系统又分为了两种:

  1. 基于共享数据结构的通信方式
    在这种通信方式下,要求进程公用某些数据结构,借以实现诸进程间的信息交换。这种方式仅适用于传递相对少量的数据,通信效率低下,属于低级通信。
  2. 基于共享存储区的通信方式
    为了传输大量数据,就在内存中划出了一块共享存储区域,诸进程可通过对该共享区的读或写交换数据,实现通信,数据的形式和位置甚至访问控制都是由进程负责,而不是OS。

4.1.2 管道通信系统

所谓管道,是指用于连接一个读进程和一个写进程以实现他们之间通信的一块共享存储文件,又叫pipe文件。
向管道提供输入的发送进程以字符流形式将达量的数据送入管道,而接收管道输出的接收进程则从管道中接收数据。
这种方式是UNIX系统IPC最古老的形式。

为了协调双方的通信,他必须提供一下三个功能的协调能力:

  1. 互斥
  2. 同步
  3. 确定对方是否存在

4.1.3 消息传递系统

在这种方式下,集成不再借助任何共享存储区或数据结构,而是以格式化的消息(Message)为单位,将通信的数据封装在消息中,并利用操作系统提供的一组通信命令,在进程间进行消息传递,完成进程间的数据交换。

该方式隐藏了通信实现细节,使通信过程对用户透明化,降低了通信程序设计的复杂性和错误率,成为当前应用最为广泛的一类进程间的通信机制.

4.1.4 客户机-服务器系统

前面的几种通信系统,虽然也可以用于实现不同计算机间进程的双向通信,但是客户机-服务器系统的通信机制,在网络环境的各种应用领域已成为当前主流的通信实现机制,主要分为三类:套接字、远程过程调用和远程方法调用。在这就不多赘述了。

4.2 线程

4.2.1 为什么要引入线程

我们都知道,进程有两个基本属性:①进程是一个可拥有资源的独立单位,一个进程要能独立运行,他必须拥有一定的数据结构。②进程同时又是一个可独立调度和分派的基本单位。

为了程序能并发执行,系统必须能进行创建进程、撤销进程和切换进程操作。但是由于进程是资源的拥有者,所以在上述这些操作中,系统必须为之付出较大的时空开销。这就限制了系统中所设置进程的数目,而且进程切换也不宜过于频繁,从而限制了并发程度的进一步提高。

4.2.2 线程的概念

在上述原因下,引入了线程的概念。学者们将进程的两个属性分开,让作为调度和分派的基本单位不拥有资源,让拥有资源的基本单倍不被频繁的调度。这样的话,就形成了线程的概念。

下面我们从6个方面来比较下进和线程:

  1. 调度的基本单位
    传统OS中,进程是作为独立调度的基本单位,每次调度时,都需要上下文切换,开销大。在引入了线程的OS中,线程是作为独立调度的基本单位,线程切换时只需要保存和设置少量的寄存器内容,切换代价远小于进程。
  2. 并发性
    在引入线程的OS中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间亦可以并发执行,甚至还允许在一个进程中的所有线程都能并发执行。
  3. 拥有资源
    进程可以拥有资源,而且还是系统中拥有资源的一个基本单位。但是线程本身并不拥有资源,而是仅有一点必不可少的、能保证独立运行的资源。
  4. 独立性
    同一进程中的线程之间的独立性比不同进程间的独立性低得多。
  5. 系统开销
    进程切换需要大量的系统开销,而线程间则需要的很少
  6. 支持多处理机系统
    在多处理机系统中,对于传统进程,不管有多少处理机,该进程只能运行在一个处理机上。但是对于多线程进程,可以将一个进程中的多个线程分配到多个处理机上。

4.2.3 线程的状态和线程控制块

与进程一样,线程也拥有三个状态和线程控制块。

4.2.3.1 线程运行的三个状态

线程的三个状态和进程类似。

  1. 运行状态,表示线程已获得处理机而正在运行。
  2. 就绪状态,表示线程已具备各种执行条件,只须再获得CPU便可立即执行。
  3. 阻塞状态,只线程在执行中因某事件受阻而处于暂停状态。

4.2.3.2 线程控制块TCB

线程控制块用来纪录用于控制和管理线程的信息。
线程控制块中通常由这几项:

  1. 线程标识符,为每个线程设置唯一地标识符。
  2. 一组寄存器,包括程序计数器PC、状态寄存器和通用寄存器的内容。
  3. 线程运行状态,用于描述线程正处于何种运行状态。
  4. 优先级,描述线程执行的优先程度。
  5. 线程专有存储区,用于线程切换时存放现场保护信息,和与该线程相关的统计信息等。
  6. 信号屏蔽,即对某些信号加以屏蔽。
  7. 堆栈指针。