Author : Cyan_RA9
Source : 【卡码笔记】网站
Question : 进程和线程的区别是什么?
【简要回答】
进程和线程的概念
- 进程:进程(Process)是计算机中一个执行的程序实例,每个进程对应一个运行中的程序;进程是操作系统资源分配的最小单位,在未引入线程概念的操作系统中,同样是调度的最小单位。
- 线程:线程(Threads)是比进程更小的概念,也称“轻量级进程(Light Weight Process, LWP),是将进程进一步细分的单位;在多道程序操作系统中,线程概念的引入可以进一步提高程序的并发执行程度,一个进程可以同时拥有多个线程,借助多个线程实现程序的并发执行(而不必借助进程)。
进程和线程的对比
- 调度单位:引入内核级线程后,进程不再是调度的最小单位;线程是调度的最小单位。
- 资源分配:无论是否引入“线程”,进程始终都是资源分配的最小单位;线程只拥有少量资源(来自创建它的进程)。
- 并发性:多个进程间可以并发执行;一个进程的多个线程也能并发执行。
- 独立性:进程之间默认不共享全局变量,且拥有独立的地址空间和不同资源;线程之间只有少数资源不能共享(例如线程的栈区)。
- 系统开销:“进程通信”,“进程切换”开销大;“线程通信”,“线程切换”开销小。
- 多处理机:单个进程只能运行在一个处理机上;多线程进程可以充分利用多处理机(内核级线程)。
- 协同工作:进程之间互不影响;用户级线程的阻塞会影响到整个进程的执行。
【详细回答】
- 进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的独立单位。
- 进程的主要特点:
- 动态性:从创建到消亡,是动态的,具有生命周期。
- 并发性:多个进程并发执行时,会有以下3个特性:
- 间断性:并发的进程有间断运行的特点,当多个进程协同完成同一任务时,需要进行同步等操作,进而导致进程的暂停。
- 失去封闭性:并发进程会共享系统中的资源,任意进程都可能改变某个资源的状态,从而影响到其他进程。失去封闭性意味着进程的执行结果取决于其执行速度,使得进程的执行有不可再现性(每次执行的结果不一定相同);失去封闭性导致了不可再现性。
- 不可再现性:在相同的初始环境和条件下,并发执行的进程可能得到不同的结果。
- 独立性:进程能够独立运行,是资源分配的最小单位,各个进程获得的资源独立于其他进程。
- 异步性:进程以不可预知的状态向前推进。进程的并发性导致了进程的异步性。但是,通过同步与互斥,可以保证在异步性的前提下得到确定(可再现)的结果。
- 未引入线程概念时,进程有两个特点:
①是资源所有权最小单位,指一个进程拥有对资源的控制和所有权,包括内存、I/O通道、I/O设备等;
②是调度/执行的最小单位,指进程是一个可以被操作系统内核调度的独立实体。 - “线程”可以看作是在调度/执行这一属性上对进程的进一步细分——在引入线程前,进程是操作系统调度的最小单位;在引入线程且是由操作系统内核支持的线程(即内核级线程)后,线程是操作系统调度的最小单位。
- 引入线程的优势:
- 进一步提高并发性:在单处理机系统中,线程模型可以分离同一个进程内的CPU计算和I/O访问,让它们并发执行;在多处理机系统中,引入线程模型后,每个内核级线程都能占用一个处理机,这使得多处理机系统的优势得以发挥。
- 共享地址空间与可用数据:线程之间可以直接共享数据而不需要经由操作系统内核,在速度上有很大优势。
- 更轻量级:在很多操作系统中,一个线程的创建比一个进程的创建快10~100倍。(线程的切换和撤销也远快于进程)
- 更好的交互性:线程可以提高图形界面程序的交互性,避免程序“卡死”,使用户得到更好的体验。
【知识图解】
- 进程的基本结构和资源所有权,示意图如下:
- 多进程模型 和 多线程模型 的内存布局,示意图如下:
【知识拓展】
- 线程的实现方式主要分为两类——内核级线程(Kernel Supported Threads,KST)和用户级线程(User-Level Threads,ULT)。
- 用户级线程:线程的管理由应用程序实现,在用户空间下完成,操作系统感知不到线程的存在。在这种实现方式下,系统调度的最小单位依然是进程,线程的调度则由其所在进程实现。
- 内核级线程:需要操作系统内核的支持,其创建、阻塞、撤销和切换都是在内核空间下实现的,内核通过TCB(线程控制块)来对线程进行感知和控制。在这种实现方式下,线程是系统调度的最小单位。