跳到主要内容

进程和线程

进程(process)和线程(thread)是操作系统的基本概念,都是一个时间段的描述,是 CPU 工作时间段的描述,不过是颗粒大小不同。

进程(process)

定义

  • 狭义定义: 进程是正在运行的程序的实例(an instance of a computer program that is being executed)。
  • 广义定义: 进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度(若不支持线程机制,进程的系统调度的单位。否则,线程是系统调度的单位,进程则为线程的容器)的独立单位。

原因

操作系统引入进程的概念的原因:

  • 从理论角度看,是对正在运行的程序过程的抽象;
  • 从实现角度看,是一种数据结构,目的在于清晰地刻画动态系统的内在规律,有效管理和调度进入计算机系统主存储器运行的程序。

特点

  • 用户下达运行程序的命令后,就会产生进程,进程是程序的一次执行过程。同一程序可产生多个进程(一对多关系)。
  • 任何进程都可以同其他进程一起并发执行
  • 进程需要一些资源才能完成工作,如 CPU 使用时间、存储器、文件以及 I/O 设备,且为依序逐一进行,也就是每个 CPU 核心任何时间内仅能运行一项进程。
  • 进程是是正在运行程序的抽象。它代表运行的 CPU,也称进程是对 CPU 的抽象。(虚拟技术的支持,将一个 CPU 变幻为多个虚拟的 CPU)
  • 进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位。
  • 操作系统为每个进程分配了独立的地址空间。
  • 进程由程序、数据和进程控制块三部分组成。

状态

进程在运行时,状态(state)会改变。所谓状态,就是指进程当前的动作:

  • 新生(new):进程新产生中。
  • 运行(running):正在运行。
  • 等待(waiting):等待某事发生,例如等待用户输入完成。亦称“阻塞”(blocked)
  • 就绪(ready):排班中,等待 CPU。
  • 结束(terminated):完成运行。

各状态名称可能随不同操作系统而相异;对于单 CPU 系统(UP),任何时间可能有多个进程为等待、就绪,但必定仅有一个进程在运行。

提示

进程的各个状态之间是不能随意切换的,例如当进程运行时因 IO 操作而阻塞,当 IO 操作完成后并不会直接恢复回运行态,而是转为就绪态等待 CPU 的调度。

线程(thread)

定义和特征

是操作系统能够进行运算调度的最小单位(程序执行时的最小单位)。它是进程的一个执行流,是 CPU 调度和分派的基本单位。

  • 一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。
  • 线程由 CPU 独立调度执行,在多 CPU 环境下就允许多个线程同时运行。
  • 同样多线程也可以实现并发操作,每个请求分配一个线程来处理。

状态

线程有四种基本状态,分别为:

  • 产生(spawn)
  • 中断(block)
  • 非中断(unblock)
  • 结束(finish)

为什么引入线程?

首先我们引入了进程这个概念,虽然进程有利于资源的管理和保护。然而在实际应用中,进程有这样的问题:

  1. 进程切换的代价(开销)比较大。
  2. 在一个进程内也需要并行执行多个程序,实现不同的功能。
  3. 进程有时候性能比较低。

引入线程有以下三个方面的考虑:

  1. 程序的需求:比如打开一个浏览器,我想一边浏览网页,一边下载文件,一边播放音乐。如果一个浏览器是一个进程,那么这样的需求需要线程机制。
  2. 开销的考虑:在进程内创建、终止线程比创建、终止进程要快。同一进程内的线程间切换比进程间的切换要快,尤其是用户级线程间的切换。线程之间相互通信无须通过内核(同一进程内的线程共享内存和文件)
  3. 性能的考虑:多个线程中,任务功能不同(有的负责计算,有的负责 I/O),如果有多个处理器,一个进程就可以有很多的任务同时在执行。

进程与线程的区别

  • 定义方式: 进程是计算机管理运行程序的一种方式,一个进程下可包含一个或者多个线程。线程是一个进程中代码的不同执行路线,也可以理解为子进程。
  • 角色方面: 进程是操作系统分配资源的最小单位,线程是程序执行的最小单位。
  • 资源共享方面: 进程之间不能共享资源(相互独立),而线程共享所在进程的地址空间和其它资源。同时线程还有自己的栈和栈指针,程序计数器等寄存器。
  • 独立性方面: 进程有自己独立的地址空间,而线程没有,线程必须依赖于进程而存在。
  • 性能开销方面: 线程上下文调度/切换比进程上下文切换要 快得多
  • 通信方面: 进程间通信 IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。

其他