操作系统——进程与线程

文章目录

  • 一、进程的概念
    • 1. 进程定义
    • 2. 进程的状态及其转换
      • (1)三种基本状态
      • (2)创建状态和终止状态
    • 3. 挂起操作和进程状态的转换
      • (1)引入挂起操作的原因
      • (2)引入挂起操作后 五个状态的转换
    • 4. 进程控制块PCB
      • (1)进程控制块 PCB 的作用
      • (2)进程控制块中的信息
      • (3)进程控制块的组织方式
  • 二、进程控制
    • 1. 进程的创建
      • (1)引起进程创建的事件
      • (2)进程创建的步骤
    • 2. 进程的终止
      • (1)引起进程终止的事件
      • (2)进程终止的步骤
    • 3. 进程的阻塞与唤醒
      • (1)引起进程阻塞与唤醒的事件
      • (2)进程阻塞的步骤
      • (3)进程唤醒的步骤
    • 4. 进程的挂起与激活
      • (1)进程挂起的步骤
      • (2)进程激活的步骤
  • 三、进程同步
    • 1. 进程同步的概念
      • (1)两种形式的制约关系
      • (2)临界资源与临界区
      • (3)同步机制应遵循的规则
    • 2. 硬件同步机制
      • (1)关中断
      • (2)利用 Test-and-Set 指令实现互斥
      • (3)利用 Swap 指令实现进程互斥
    • 3. 信号量机制
      • (1)整型信号量
      • (2)记录型信号量
      • (3)AND型信号量
      • (4)信号量集
    • 4. 信号量的应用:
    • 5. 管程机制
      • (1)管程定义
      • (2)条件变量
    • 6. 进程同步的经典问题
      • (1)生产者-消费者问题
      • (2)哲学家进餐问题
      • (3)读者-写者问题
  • 四、进程通信
    • 1. 进程通信的类型
      • (1)共享存储器系统
      • (2)消息传递系统
      • (3)管道(pipe)通信系统
      • (4)客户机-服务器系统
    • 2. 消息传递通信的实现方式
      • (1)直接消息传递系统
      • (2)信箱通信
      • (3)直接消息传递系统实例
  • 五、线程的概念
    • 1. 线程的概念
    • 2. 线程的状态
    • 3. 线程控制块TCB
  • 六、线程的实现
    • 1. 线程的实现方式
      • (1)内核支持线程(Kernel Supported Threads)
      • (2)用户级线程(User Level Thread)
      • (3)组合方式
    • 2. 线程的创建和终止


一、进程的概念

1. 进程定义

  • 进程实体(进程):程序段 + 相关的数据段 + 进程控制块(PCB);
    • PCB:包含了 进程的描述信息和控制信息,是进程动态特性的直接反映;是进程存在的唯一标志;
    • 进程的创建和撤销实际上 是PCB的创建和撤销;
  • 进程定义:进程是进程实体运行的过程,是系统进行资源分配和调度的一个独立单位;

2. 进程的状态及其转换

(1)三种基本状态

操作系统——进程与线程_第1张图片

  • 就绪状态
    当进程已分配到除CPU以外的所有必要资源后,只要再获得CPU,就可以立即运行,进程这时的状态称为就绪状态。在一个系统中可能多个进程处于就绪状态,通常将它们排成一个队列,称为就绪队列。
  • 执行状态
    进程已获得CPU,其程序正在执行。在单处理机系统中,只有一个进程处于执行状态,在多处理机系统中,则有多个进程处于执行状态。
  • 阻塞状态
    处于执行状态的线程由于发生某事件而暂停无法继续执行时,便放弃处理机而处于暂停状态,此时进程的状态称为阻塞状态,或等待状态或封锁状态。如IO请求,申请缓存空间等,处于阻塞状态的进程也会排成一个队列,可能还会根据不同的阻塞原因排成多个队列。

(2)创建状态和终止状态

操作系统——进程与线程_第2张图片

  • 创建状态
    创建一个进程一般需要两步。
    • 首先,为一个新进程创建PCB,并填写必要的管理信息;
    • 其次,把该进程转入就绪状态并插入就绪队列之中。
    • 当创建一个新进程时,系统为其分配了PCB,填写了进程标志等信息,但由于该进程所必需的资源或其他信息(如内存)尚未分配等,此时,进程虽拥有了PCB,但是其自身却未进入内存,即创建工作尚未完成,此时进程还不能被调度运行,其所处的状态就是创建状态。
  • 终止状态
    进程的终止也需要两步。
    • 首先,等待操作系统进行善后处理,
    • 其次,将其PCB清零,并将PCB空间返回给操作系统。
    • 进入终止状态的进程以后不能再执行,但是在操作系统中任然保留一个记录,其中保存状态码和一些计时统计数据,供其它进程收集,一旦其它进程完成对终止状态进程的信息提取后,操作系统将删除该进程。

3. 挂起操作和进程状态的转换

  • 挂起操作 <—> 激活操作
    挂起原语:Suspend;
    激活原语:Active;

(1)引入挂起操作的原因

  • 端用户的请求
    当终端用户在自己的程序运行期间发现有可疑问题时,希望暂时使自己的程序静止下来,即让正在执行的进程暂停执行;若此时用户进程正处于就绪状态而未执行,则该进程暂不接受调度,以便用户研究其执行情况或对程序进行修改,这种状态就称为挂起状态。
  • 父进程请求
    有时父进程希望挂起自己的某个子进程,以便考查和修改该子进程,或者协调各子进程间的活动。
  • 负荷调节的需要
    当实时系统中的工作负荷较重,已可能影响到对实时任务的控制时,可由系统把一些不重要的进程挂起,以保证系统能够正常运行。
  • 操作系统的需要
    操作系统有时希望挂起某些进程,以便检查运行中的资源使用情况或进行记账。

(2)引入挂起操作后 五个状态的转换

操作系统——进程与线程_第3张图片

4. 进程控制块PCB

  • 计算机系统中,对于每个资源和每个进程,都设置了一个数据结构,我们称之为:资源信息表进程信息表,其中包含了资源或进程的标识、描述、状态等信息以及一批指针。
  • 这些数据结构主要分为以下四类:
    内存表、设备表、文件表、用于进程管理的进程表;

(1)进程控制块 PCB 的作用

  • 进程控制块PCB,是进程实体的一部分,是操作系统中最重要的记录型数据结构。PCB中记录了操作系统所需的,用于描述进程当前情况以及控制进程运行的全部信息。
  • 进程控制块的作用,是使一个在多道程序环境下能独立运行的程序,成为一个能独立运行的基本单位,一个能与其他进程并发执行的进程。
  • 或者说,OS是根据PCB来对并发执行的进程进行控制和管理的。PCB是进程存在的唯一标识

(2)进程控制块中的信息

  • 进程标识符
    用于唯一地标识一个进程。
    • 内部标识符(由系统赋予的唯一一个数字,通常为进程的序号,为方便系统使用);
    • 外部标识符(由创建者提供,可描述进程的家族关系)。
  • 处理机的状态
    当处理机被中断时,其寄存器的信息都必须保存在进程的PCB中,以便该进程重新执行时,能从断点继续执行。
  • 进程调度信息
    • 进程状态(指明进程的当前状态,作为进程调度和对换时的依据),
    • 进程优先级(用于描述进程使用处理机的优先级别,优先级高的进程应该优先获取处理机),
    • 进程调度所需的其他信息(与进程调度算法有关,如进程已等待CPU的时间总和,进程已执行的时间总和等),
    • 事件(进程由执行状态转变为阻塞状态所等待发生的事件,即阻塞原因)。
  • 进程控制信息
    • 程序和数据的地址(进程的程序和数据所在的内存或外存首址,以便在调度该进程时,能从PCB中找到其程序和数据),
    • 进程同步和通信机制(实现进程同步和进程通信时必需的机制,如消息队列指针,信号量等),
    • 资源清单(除CPU以外的进程所需的全部资源以及已经分配到该进程的资源的清单),
    • 链接地址(本进程PCB所在队列中的下一个进程的PCB的首地址)。

(3)进程控制块的组织方式

  • 线性方式
    所有PCB组织到一张线性表中。
  • 链接方式
    把具有同一状态的PCB,链接成一个队列,这样可以形成若干就绪队列、阻塞队列和空白队列等,优先级高的进程的PCB排在前面。
  • 索引方式
    系统根据所有进程的状态建立几张索引表,并把各索引表在内存的首地址记录在内存的一些专用单元中,在每个索引表的表目中,记录具有相应状态的某个PCB在PCB表中的地址。

二、进程控制

1. 进程的创建

  • 一个进程可以创建一个子进程,子进程会继承父进程所拥有的资源,
  • 当子进程被撤销时,应该将其从父进程那里获得的资源归还给父进程,此外,撤销父进程时,也必须同时撤销其所有的子进程。

(1)引起进程创建的事件

  • 用户登录
  • 作业调度
  • 提供服务
  • 应用请求

(2)进程创建的步骤

创建原语 Creat

  • 申请空白PCB,为新进程申请获得唯一的数字标识符,并从PCB集合中索取一个空白的PCB。
  • 为新进程分配资源,为新进程的程序和数据以及用户栈分配必要的内存空间。
  • 初始化进程控制块
    • 初始化标识信息,将系统分配的标识符和父进程标识符填入新的PCB中;
    • 初始化处理机状态信息,使程序计数器指向程序的入口地址,使栈指针指向栈顶;
    • 初始化处理机控制信息,将进程的状态设置为就绪状态或静止就绪状态。
  • 将新进程插入到就绪队列,如果进程就绪队列能够接纳新进程,便将新进程插入就绪队列。

2. 进程的终止

(1)引起进程终止的事件

  • 正常结束
  • 异常结束
    在进程运行期间,由于出现某些错误和故障而迫使进程终止。如越界错误,非法指令,等待超时,算术运算错,I/O故障等。
  • 外界干预
    进程应外界的请求而终止运行。如操作员或操作系统干预,父进程请求,父进程终止。

(2)进程终止的步骤

  • 根据被终止的进程的标识符,从PCB集合汇总检索出该进程的PCB,从中读出该进程的状态
  • 若被终止的进程正处于执行状态,应立即终止该进程的执行,并置调度标志位真,用于指示该进程被终止后应重新进行调度。
  • 若该进程还有子孙进程,还应将其子孙进程予以终止,以防他们成为不可控的进程。
  • 将被终止的进程所拥有的全部资源,或者归还给其父进程,或者归还给操作系统。
  • 将被终止的进程PCB从所在队列或链表中移出,等待其他程序来搜集信息。

3. 进程的阻塞与唤醒

(1)引起进程阻塞与唤醒的事件

  • 向系统请求共享资源失败
    请求系统服务,当正在执行的进程请求操作系统提供服务时,由于某种原因,操作系统并不立即满足该进程的要求,该进程只能转变为阻塞状态来等待。
  • 等待某种操作的完成
    启动某种操作,当进程启动某种操作后,如果该进程必须在该操作完成之后才能继续执行,则必须先使该进程阻塞,以等待该操作完成。
  • 新数据尚未到达
    对于相互合作的进程,如果其中一个进程需要先获得另一合作进程提供的数据后才能对数据进行处理,则只要其所需数据尚未到达,该进程只有阻塞。
  • 等待新任务的到达
    系统往往设置一些具有某些特定功能的系统进程,每当这种进程完成任务后,便把自己阻塞起来以等待新任务到来。

(2)进程阻塞的步骤

block原语

  • 正在执行的进程发现上述某件事情时,由于无法继续运行,于是进程便通过调用阻塞原语block把自己阻塞
  • 可见,进程的阻塞是进程自身的一种主动行为
  • 之后进程会停止执行,并将进程控制块的状态由执行改为阻塞,并将PCB插入阻塞队列,如果系统中设置了因不同事件而阻塞的多个阻塞队列,则应将本进程插入到具有相同事件的阻塞队列中。
  • 最后,转调度程序进行重新调度,将处理机分配给另一就绪进程并进行切换。即保留被阻塞进程的处理机状态到PCB中,再按新进程的PCB中的处理机状态设置CPU环境。

(3)进程唤醒的步骤

wakeup原语

  • 当被阻塞进程所期待的时间出现时,如I/O完成获其所期待的数据已经到达,则由有关进程(如用完并释放I/O设备的进程)调用唤醒原语wakeup将等待该事件的进程唤醒
  • 首先将被阻塞的进程等待该事件的阻塞队列中移出,将其PCB中的现行状态由阻塞改为就绪,然后再将该PCB插入到就绪队列中。

注意:block原语 与 wakeup原语 应该在不同进程中执行。

4. 进程的挂起与激活

(1)进程挂起的步骤

  • 当出现引起进程挂起的事件时,如用户进程请求将自己挂起或父进程请求将自己的某个子进程挂起,系统将利用挂起原语suspend指定进程或处于阻塞状态的进程挂起
  • 检查被挂起进程的状态,若处于活动就绪状态,便将其改为静止就绪,对于活动阻塞状态的进程,则将其改为静止阻塞,若被挂起的状态正在执行,则转向调度程序重新调度。

(2)进程激活的步骤

  • 当发生激活进程的事件时,例如,父进程或用户进程请求激活指定进程,若该进程驻在外存而内存中已有足够的空间时,则可将在外存处于静止就绪状态的该进程换入内存。
  • 这时,利用激活原语active将指定进程激活,激活原语先将进程从外存调入内存检查该进程的现行状态,由对应的静止状态改为活动状态,若使用抢占式调度策略,则有新进程如就绪队列时,应检查是否要进行重新调度,即由调度程序将被激活进程与当前进程进行优先级的比较,如果被激活进程的优先级更低,就不必重新调度,否则,立即剥夺当前进程的运行,把处理机分配给刚被激活的进程。

三、进程同步

1. 进程同步的概念

  • 进程同步机制的主要任务:是对多个相关进程在执行次序上进行协调,以使并发执行的诸进程之间能有效共享资源和相互合作,而从使程序的执行具有可再现性。
  • 在多道程序环境下,当程序并发执行时,由于资源共享和进程合作,使处于一个系统中的诸进程之间可能存在着以下两种形式的制约关系。

(1)两种形式的制约关系

  • 间接相互制约关系
    同处于一个系统中的进程,通常都共享着某种系统资源,如共享CPU、I/O设备等,间接相互制约即源于这种资源共享。
  • 直接相互制约关系
    这种制约主要源于进程间的合作,如A进程通过缓冲向B进程提供数据,当缓冲为空时,B阻塞,待A输入数据后,B被唤醒,缓冲满时,A阻塞,待B取出数据后,A被唤醒。

(2)临界资源与临界区

  • 许多硬件资源如打印机,磁带机等,都属于临界资源,诸进程应该采取互斥方式,实现对这种资源的共享。
  • 人们把在每个进程中访问临界资源的那段代码成为临界区,显然,若能保证诸进程互斥地进入自己的临界区,便可实现诸进程对临界资源的互斥访问。

(3)同步机制应遵循的规则

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

2. 硬件同步机制

利用下面的硬件指令能有效的实现进程互斥,但当临界资源忙碌时,其访问进程必须不断的进行测试,处于一种“忙等”状态,不符合“让权等待”的原则,造成处理机时间的浪费,同时也很难将他们用于解决复杂的进程同步问题。

(1)关中断

(2)利用 Test-and-Set 指令实现互斥

(3)利用 Swap 指令实现进程互斥

3. 信号量机制

(1)整型信号量

操作系统——进程与线程_第4张图片

(2)记录型信号量

操作系统——进程与线程_第5张图片
在这里插入图片描述
操作系统——进程与线程_第6张图片
操作系统——进程与线程_第7张图片

(3)AND型信号量

操作系统——进程与线程_第8张图片
操作系统——进程与线程_第9张图片

(4)信号量集

操作系统——进程与线程_第10张图片
操作系统——进程与线程_第11张图片

4. 信号量的应用:

  • 实现进程互斥
  • 实现前趋关系

5. 管程机制

(1)管程定义

  • 代表共享资源的数据结构 以及由对该共享数据结构实施操作的一组过程所组成的资源管理程序,共同构成了一个操作系统的资源管理模块,称之为 管程

(2)条件变量

6. 进程同步的经典问题

这篇博客 -----> 经典的进程同步问题

(1)生产者-消费者问题

(2)哲学家进餐问题

(3)读者-写者问题

四、进程通信

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

1. 进程通信的类型

(1)共享存储器系统

  • 相互通信的进程共享某些数据结构或共享存储区,进程之间能够通过这些空间进行通信,基于此,又可以分为如下两种类型:
    • 基于共享数据结构的通信方式,在这种通信中,要求诸进程共用某些数据结构,借此实现进程间的信息交换。
    • 基于共享存储区的通信方式,为了传输大量数据,在存储器中划出一块共享存储区,诸进程可通过对共享存储区中的数据的读或写来实现通信。

(2)消息传递系统

  • 进程间的数据交换是以格式化的消息为单位,程序员直接利用操作系统提供的一组通信命令(原语),不仅能实现大量数据的传递,而且还隐藏了通信的实现细节,使通信过程对用户是透明的,从而大幅减少通信程序编制的复杂性。
  • 基于消息传递系统的通信方式属于高级通信方式,因实现方式不同,分为两类:
    • 直接通信方式,是指发送进程利用OS所提供的发送原语,直接把消息发送给目标进程。
    • 间接通信方式,是指发送和接收进程,都通过共享中间实体的方式进行消息的发送和接收,完成进程之间的通信。

(3)管道(pipe)通信系统

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

(4)客户机-服务器系统

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

  • 套接字 Socket
    • 一个套接字就是一个通信标识类型的数据结构,是进程通信和网络通信的基本构件;
    • 包含了通信目的地址、通信使用的端口号、通信网络的传输层协议、进程所在的网络地址、针对客户或服务器程序提供的不同系统调用等;
    • 套接字是为 客户/服务器模型 设计的,套接字包括两类:
      • 基于文件型,
      • 基于网络型,
    • 套接字的优势
      • 它不仅适用于同一台计算机内部的进程通信,也适用于网络环境中不同计算机之间的进程通信;
      • 每个套接字拥有唯一的套接字号,所以系统中所有的连接都有唯一的一对套接字及端口连接,确保了通信双方之间逻辑链路的唯一性,便于实现数据传输的并发服务;
      • 而且隐藏了通信设施及实现细节,采用统一的接口进行处理。
  • 远程过程调用和远程方法调用
    • 远程过程(函数)调用RPC,是一个通信协议,用于通过网络连接的系统;
    • 如果软件采用面向对象编程,那么远程过程调用也可以称为远程方法调用;
    • 负责处理远程过程调用的进程有两个:本地客户进程、远程服务器进程;这两个进程也被称为网络守护进程,主要负责网络间的消息传递,通常是处于阻塞状态,等待消息;
    • 远程过程调用的主要步骤
      操作系统——进程与线程_第12张图片

2. 消息传递通信的实现方式

(1)直接消息传递系统

  • 在直接消息传递系统中,采用直接通信方式,即发送进程利用OS所提供的发送命令(原语),直接把消息发送给目标进程。
  • 通信命令:
    • send
    • receive

(2)信箱通信

  • 属于间接通信方式,即进程之间的通信,需要通过某种中间实体来完成;

(3)直接消息传递系统实例

五、线程的概念

1. 线程的概念

  • 在操作系统中引入线程,是为了减少程序运行时所付出的时空开销,使OS具有更好的并发性;

2. 线程的状态

(与进程之间的状态转换是一样的)

  • 执行状态
  • 就绪状态
  • 阻塞状态

3. 线程控制块TCB

  • 线程标识符
  • 一组寄存器
  • 线程运行状态
  • 优先级
  • 线程专有存储区
  • 信号屏蔽
  • 堆栈指针

六、线程的实现

1. 线程的实现方式

(1)内核支持线程(Kernel Supported Threads)

  • 无论用户进程中的线程,还是系统进程中的线程,它们的创建、撤销和切换等也是依靠内核,在内核空间中实现。内核空间为每个内核支持线程设置了一个线程控制块,内核是根据该控制块而感知某个线程的存在,并对其加以控制。
  • 其优点如下
    • 多处理机系统中,内存能够同时调度同一个进程中多个线程并行执行。
    • 进程中一个线程被阻塞了,内核可以调度该进程中的其他线程,也可以运行其他进程中的线程。
    • 内核支持线程具有很小的数据结构和堆栈,线程切换快,开销小。
    • 内核本身采用多线程技术,提高系统的执行速度和效率。
  • 其缺点是
    • 对用户的线程切换而言,切换开销较大,因为需要进行模式的切换。

(2)用户级线程(User Level Thread)

  • 用户级线程仅存在于用户空间中。对于线程的创建、撤销、同步和通信等,无需利用系统调用来实现,对于用户级线程的切换,通常发生在一个应用进程的诸多线程之间。线程的任务控制块都是设置在用户空间,线程所执行的操作也无需内核的帮助,因而内核完全不知道用户级线程的存在。设置了用户级线程的系统,仍可以以进程为单位进行调度,而设置的是内核支持线程,则以线程为单位进行调度。
  • 其优点如下
    • 线程切换不需要转换到内核空间,节省了切换开销。
    • 调度算法可以是进程专用的,进程可以选择不同的调度算法对自己的线程进行管理和调度,而与操作系统的低级调度算法无关。
    • 用户级线程的实现与操作系统平台无关,在所有的应用程序中都可以对其进行共享。
  • 其缺点如下
    • 系统调用的阻塞问题,当线程执行一个系统调用时,不仅该线程被阻塞,而且进程内的所有线程都会被阻塞,而在内核支持线程方式中,进程中的其他线程仍可以执行。
    • 在单纯的用户级线程实现方式中,多线程应用不能利用多处理机进行多处理的优点,内核每次分配给一个进程的仅有一个CPU,因此进程中仅有一个线程能执行,在该线程放弃CPU之前,其他线程只能等待。

(3)组合方式

  • 内核支持多KST线程的建立、调度和管理,同时也允许用户应用程序简历、调度和管理用户级线程。

2. 线程的创建和终止

  • 在创建新线程时,需要利用一个线程创建函数(或系统调用),并根据相应的参数,如指向线程主程序的入口指针、堆栈的大小、调度的优先级等。在线程创建函数执行完后,将返回一个线程标识符供以后使用。
  • 终止线程的方式有两种,线程完成工作后自愿退出或者线程在运行中出现错误或由于某种原因而被其他线程强行终止。在大多数OS中,线程被终止后并不立即释放它所占有的资源,只有当进程中的其他线程执行了分离函数后,被终止的线程才与资源分离,此时的资源才能被其他线程利用。虽然已被终止但尚未释放资源的线程,仍可以被需要它的线程所调用,以使被终止线程重新恢复运行。

你可能感兴趣的:(操作系统,操作系统,进程,线程)