# 线程和进程的区别

# 进程和线程

# 概述

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。

线程是进程的一个实体,是 CPU 调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不用有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。

相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。

在串行程序基础上引入线程和进程是为了提高程序的并发度,从而提高程序运行效率和响应时间。

# 区别

进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其他进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。 但对一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

简而言之:

  1. 一个程序至少有一个进程,一个进程至少有一个线程;
  2. 线程的划分尺度小于进程,使得多线程程序的并发性高;
  3. 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率;
  4. 线程在执行过程中和进程还是有区别的,每个独立的线程有一个程序运行入口、顺序执行序列和程序的出口。 但是线程不能够独立执行, 必须依靠存在的应用程序中,有应用程序提供多个线程执行控制;
  5. 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看作多个独立的应用,来实现进程的调度管理以及资源分配。 这就是进程和线程的重要区别。

# 优缺点

线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;进程正好相反。同时,线程适合于在 SMP 机器上运行,而进程则可以跨机器迁移。

# 多进程、多线程

# 概述

进程就是一个程序运行的时候被 CPU 抽象出来,一个程序运行后被抽象为一个进程,但是线程是从一个进程中分割出来的,由于 CPU 处理进程的时候是采用时间片轮转的方式,所以要把一个大个进程分割成多个线程,例如:网际快车中文件分成 100 部分,10 个线程文件就被分成 10 份来同时下载 1- 10 占一个线程 11 - 20 占一个线程,以此类推,线程越多,文件就被分的越多,同时下载当然速度也更快。

进程是程序在计算机上的一次执行活动。 当你运行一个程序,你就启动了一个进程。显然,程序只是一组指令的有序集合,它本身没有任何运行的含义,只是一个静态实体。而进程则不同,它是程序在某个数据集上的执行,是一个动态实体。它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤销,反映了一个程序在一定的数据集上运行的全部动态过程。 进程是操作系统分配资源的单位。 在 Windows 下,进程又被细化为线程,也就是一个进程下有多个能独立运行的更小单位。 线程(Thread)是进程的一个实体,是 CPU 调度和分派的基本单位。 线程不能够独立运行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

线程和进程的关系是: 线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,但进程退出时该进程所产生的进程都会被强制退出并清除。线程可与属于同一进程的其他线程共享进程所拥有的全部资源,但是其本身基本上不用有系统资源,只拥有一点在运行中必不可少的信息(如程序计数器、一组寄存器和栈)。

在同一时间里,同一个计算机系统中如果允许两个或两个以上的进程处于运行状态,这便是多任务。现代的操作系统几乎都是多任务操作系统,能够同时管理多个进程的运行。多任务带来的好处是明显的,比如你可以边听 mp3 边上网,与此同时甚至可以将下载的文档打印出来,而这些任务之间丝毫不会相互干扰。那么这里就涉及到了并行的问题,俗话说,一心不能二用,这对计算机也一样,原则上一个 CPU 只能分配给一个进程,以便运行这个进程。我们通常使用的计算机只有一个 CPU,也就是一个核心,要让它一心多用,同时运行多个进程,就必须使用并发技术。实现并发技术相当复杂, 最容易理解的事「时间片轮转进程调度算法」, 它的思想简单介绍如下:在操作系统的管理下,所有正在运行的进程轮流使用 CPU,每个进程允许占用 CPU 的时间非常短(比如 10 毫秒),这样用户根本感觉不出来 CPU 是在轮流为多个进程服务,就好像所有进程都在不间断运行一样,但实际上在任何时间都只有一个进程占用 CPU。

如果一台计算机有多个 CPU,情况就不同了,如果进程数小于 CPU 数,则不同的进程可以分配给不同的 CPU 来运行,这样,多个进程是真正同时运行的,这便是并行。如果进程数大于 CPU 数,则仍然需要使用并发技术。

在 Windows 下,进行 CPU 分配是以线程为单位的, 一个进程可能有多个线程组成,这是情况更加复杂,简单来说:

总线程数 <= CPU 数量:并行运行

总线程数 >= CPU 数量:并发运行

并行运行的效率显然高于并发运行,所以在多 CPU 的计算机中,多任务的效率比较高。但是,如果在多 CPU 计算机中之运行一个进程(线程),就不能发挥多 CPU 的优势。

多任务操作系统(如:Windows)的基本原理:操作系统将 CPU 的时间分配给多个线程,每个线程在操作系统指定的时间片内完成(注意,这里的多个线程是分属于不同进程的)。操作系统不断的从一个线程的执行切换到另一个线程的执行,如此往复,从宏观上看就好像多个线程在一起执行。由于这多个线程分属于不同的进程,因此在我们看来就好像多个多个进程在同时执行,这就实现了多任务。

# 分类

根据进程与线程的设置,操作系统大致分为如下类型:

  1. 单进程、单线程:MS-DOS 大致是这种操作系统;
  2. 多进程、单线程:多数 UNIX(及类 UNIX 的 LINUX)是这种操作系统;
  3. 多进程、多线程:Win32(Windows NT / 2000 / XP);
  4. 但进程、多线程:VxWorks。

# 进入线程带来的主要好处

  1. 在进程内创建、终止线程比创建、终止进程要快;
  2. 同一进程内的线程间切换比进程间切换要快,尤其是用户级线程间切换。