目录
进程
线程
线程的串行
区别
多线程
进程
- 是指计算机中已执行的程序,曾经是分时系统的基本运作单位
- 在面向进程设计的系统(如早期的UNIX,Linux 2.4及更早的版本)中,是程序的基本执行实体
- 在面向线程设计的系统(如当代多数操作系统、Linux 2.6及更新的版本)中,进程本身不是基本执行单位,而是线程的容器
- 程序本身只是指令、数据及其组织形式的描述,相当于一个名词
- 进程才是程序(那些指令和数据)的真正执行实例,可以想像说是现在进行式
- 若干进程有可能与同一个程序相关系,且每个进程皆可以同步(循序)或异步(平行)的方式独立执行
- 所以是在操作系统中运行的一个应用程序
- 比如同时打开QQ,WeChat;操作系统就会分别启动2个进程
- 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内
- 在Windows中,可以通过任务管理器查看正在运行的进程
进程是一种抽象的概念,从来没有统一的标准定义看,一般由程序、数据集合和进程控制块三部分组成:
- 程序用于描述进程要完成的功能,是控制进程执行的指令集
- 数据集合是程序在执行时所需要的数据和工作区
- 程序控制块,包含进程的描述信息和控制信息,是进程存在的唯一标志
线程
- 进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位
- 线程 也被称为 轻量级进程,是程序执行流程的最小单元
- 一个标准的线程由 线程ID、当前指令指针PC、寄存器集合 和 堆栈 组成
- 通常来说,一个进程由一个到多个线程组成,各个线程之间共享程序的内存空间(包括代码段、数据段、堆等)以及一些进程资源(如打开文件和信号)
- 1个进程要想执行任务,必须得有线程(每1个进程至少要有1个线程)
- 一个进程的所有任务都在线程中执行
- 比如使用酷狗播放音乐,使用迅雷下载文件,都需要在线程中执行
线程的串行
- 1个线程中任务的执行是串行的
- 如果要在1个线程中执行多个任务,那么只能一个一个地按顺序执行这些任务
- 在同一时间内,1个线程只能执行1个任务
- 比如在1个线程中下载3个文件(分别是文件A,文件B,文件C)
区别
- 本质区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位
- 在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小
- 所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)
- 内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源
- 包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程
举个例子:进程=火车,线程=车厢
- 线程在进程下行进(单纯的车厢无法运行)
- 一个进程可以包含多个线程(一辆火车可以有多个车厢)
- 不同进程间数据很难共享(一辆火车上的乘客很难换到另外一辆火车,比如站点换乘)
- 同一进程下不同线程间数据很易共享(A车厢换到B车厢很容易)
- 进程要比线程消耗更多的计算机资源(采用多列火车相比多个车厢更耗资源)
- 进程间不会相互影响,一个线程挂掉将导致整个进程挂掉(一列火车不会影响到另外一列火车,但是如果一列火车上中间的一节车厢着火了,将影响到所有车厢)
多线程
- 1个进程中可以开启多个线程,所有线程可以并行(同时)执行不同的任务
- 多线程技术可以提高程序的执行效率
- 比如同时开启3个线程分别下载3个文件
- 多线程的原理
- 现代计算机系统可在同一段时间内以进程的形式将多个程序加载到存储器中,并借由时间共享(或称时分复用),以在一个处理器上表现出同时(平行性)执行的感觉
- 即同一时间,CPU的1个核心只能处理1个线程
- 多线程并发(同时)执行,其实是CPU快速地在多个线程之间调度(切换)
- 如果CPU调度线程的速度足够快,就造成了多线程并发执行的假象
- 同样的,使用多线程技术的操作系统或计算机体系结构,同样程序的平行线程,可在多CPU主机或网络上真正同时执行(在不同的CPU上)
- 使用多线程的原因:
- 某个操作可能会陷入长时间的等待,等待的线程会进入睡眠状态,无法继续执行
- 多线程执行可以有效利用等待时间
- 典型的例子是等待网络响应,这可能需要花费数秒甚至数十秒
- 某个操作(常常是计算)会消耗大量的时间,如果只有一个线程,程序和用户之间的交互就会中断
- 多线程可以让一个线程负责交互,另一个负责计算
- 程序逻辑本身就要求兵法操作,例如一个多任务下载软件
- 多CPU或者多核计算机,本身具备同时执行多个线程的能力,因此单线程程序无法全面发挥计算机的全部计算性能
- 相对于多进程应用,多线程在数据共享方面的效率要高很多