进程与线程


为什么要引入进程和线程的问题呢?

目录
  • 综述
  • 进程
    • 进程的类型
    • 进程的状态
    • 进程的组成
      • 进程控制块(PCB)
      • 程序
    • 进程的管理
      • 进程队列
      • 创建与撤销
    • 进程间关系
  • 线程
    • 线程的结构
      • 线程控制块(TCB)
    • 线程实现
    • 引入多线程
  • 小结

综述

一项新概念的引入一般都是为了更好的描述或构建一个新的体系。进程与线程也不外乎如此。
进程是在多道程序系统中引入,但直到目前为止,进程的定义也未能完全统一。而线程则出现的较晚,但却是弥补了进程的一些缺陷,所以线程又名轻进程。

进程

关于进程这一概念的解释有很多种,但这些解释都具有同一个特性——强调程序的执行,即进程所具有的一种动态特性,这是进程与程序间本质上的差异。

进程与程序的区别:

  1. 程序是静态的,进程是动态的。
  2. 程序可通过存储介质长期保存,进程具有生命周期
  3. 程序和进程是一对多的关系,而进程和程序确只能是一对一

关于进程,我们做出如下讨论。

进程的类型

  1. 系统进程:也称守护进程,一个系统进程所完成的任务是相对独立和具体的,其优先级高于用户进程。
  2. 用户进程:在操作系统之上运行的所有应用程序都称为用户进程。

无论是系统进程还是用户进程,都具有:
并发性,动态性,独立性,交互性,异步性,结构性等几大特性。

注意:进程是调度的基本单位

进程的状态

基本状态有三种:

  1. 运行态(Run):进程占有处理器资源,正在运行。
  2. 就绪态(Ready):进程等待处理器资源,已具备运行条件。
  3. 等待态(Wait):不具备运行条件。

进程状态转换:
运行->就绪:剥夺进程所占有的处理器资源(也可能是进程正常执行结束)。
运行->等待:等待某事件的发生。
就绪->运行:分配进程处理器资源。
就绪->等待:不存在。
等待->就绪:进程所等待的事件以发生,当前正在等待处理器资源。
等待->运行:不存在。

NOTE:
非抢占式调度,不存在运行->就绪的状态转换。
处理器调度算法对于进程的状态转换具有直接的影响,如上所述即为一种情况。

进程的组成

进程控制块(PCB)

进程控制块是标志进程存在的数据结构(对用户透明),在其中包含系统对进程管理所需要的全部信息。

PCB中所包含的信息数量与系统规模,功能成正相关关系。

建立进程->建立PCB
撤销PCB->撤销进程

程序

  1. 代码:不采用绝对地址,采用相对地址。
  2. 数据:一般包含静态变量,动态堆(保存动态变量)以及动态栈。

进程的管理

进程队列

  1. 就绪队列:根据调度算法确定,一般来说,整个系统就只有一个。
  2. 等待队列:与事件个数对等,即每个等待事件有一个等待队列。
  3. 运行队列:与处理器个数有关,每个CPU有一个。

创建与撤销

  1. 创建:
    • 建立一个进程控制块
    • 初始化该进程控制块
    • 为该进程分配存储空间
    • 加载所要执行的程序
    • 将进程控制块送入就绪队列

由父进程创建的子进程是其全盘复制,即子进程除了进程号与父进程不一致外,其他均相同。

  1. 撤销:
    • 撤销进程的内存分配
    • 撤销进程控制块
    • 通知父进程

进程的撤销的原因可以是正常执行结束,也可以是进程执行是发生错误而结束。

进程间关系

逻辑关系:

  1. 相关进程: 具有逻辑联系
  2. 无关进程:无任何逻辑联系

相互作用:

  1. 直接相互作用: 不需要第三方而发生相互作用

只能发生在相关进程之间。

  1. 间接相互作用: 需要第三方才能发生作用

线程

线程与进程相类似,所以又成线程为轻进程,但线程是进程内的一个相对独立的执行流,即一个线程包含多个线程。

进程内的多个线程执行同一程序中相同或不同代码段,共享数据区和堆。
进程是资源的分配单位,线程是CPU的调度单位。

线程的结构

线程控制块(TCB)

TCB中内容较少,因为大多数内容是记录在进程中。
线程的实现方式决定TCB的归属。

TCB归属:操作系统空间,用户进程空间。

线程实现

  1. 核心级别线程(KLT)

    • 并发行好
    • 真正并行
    • 系统开销大
    • 进程状态不具有实际意义
  2. 用户级别线程(ULT)

    • 灵活
    • 实现效率高
    • 不能实现并行
  3. 混合线程

引入多线程

当一个应用中进程间的功能有所重叠(如具有相同的代码和数据),此时如果采用多进程的方式,那么对于系统来说,系统开销是非常巨大的。
所以多线程的引入成为了必需:

  1. 同一进程的多个线程间可共享内存,合作完成某项功能。
  2. 同一进程的多个线程间切换速度快。
  3. 提高处理器与设备之间的并行性。
  4. 多处理器环境下,多线程可并行执行(不同进程)。

只有当同一进程中的多个线程具有相同代码和数据,或者这些线程之间是合作(执行代码不同部分)的,或者是同构(执行相同代码)。才可以采用多线程处理模式。

小结

程序是进程的组成部分,进程是为了执行对应的程序而存在的,如此可知没有程序,进程也失去了讨论的意义。
而没了进程,线程也就不复存在了。