进程与线程的关系和区别

来源:互联网 发布:吉利剃须刀哪款好 知乎 编辑:程序博客网 时间:2024/05/21 14:55

定义

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

关系

  • 一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行;
  • 相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列;

区别

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

总结

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

优缺点

线程和进程在使用上各有优缺点:

  • 线程执行开销小,但不利用资源的管理和保护,而进程相反;
  • 同时,线程适合于在SMP机器上运行,而进程则可以在跨机器迁移;

另一种表述方式:

概括:进程和线程都是一个时间段的描述,是CPU工作时间段的描述;

背景
CPU+RAM+各种资源(比如显卡,光驱,键盘,GPS等等外设)构成了我们的电脑,但是电脑的运行,实际就是CPU和相关寄存器以及RAM之间的事情。

一个最最基础的事实: CPU太快,太快,太快了,寄存器仅仅能够追上它的脚步,RAM和别的挂在各总线上的设备完全是望其项背。那当多个任务要执行的时候怎么办?轮流着来?或者谁优先级高谁先来?不管怎么样的策略,一句话就是在CPU看来就是轮流着来;

一个必须知道的事实: 执行一段程序代码,实现一个功能的过程介绍,当得到CPU的时候,相关的资源必须已经到位,显卡啊,GPS啊什么的必须到位,然后CPU开始执行。这里除了CPU以外所有的就构成了这个程序的执行环境,也就是我们所定义的程序上下文。当这个程序执行完了,或者分配给它的CPU执行时间用完了,那它就被切换出去了,等待CPU下一次宠幸。在被切换出去的最后一步工作就是保存程序的上下文,因为这个是下次它被CPU宠幸的运行环境,必须保存;

“串联起来的事实:” 前面讲过在CPU看来所有的任务都是一个一个的轮流执行的,具体的轮流方法就是:

  • 先加载程序A的上下文,然后开始执行A,保存程序A的上下文,调入下一个要执行的程序B的程序上下文,然后开始执行B,保存程序B的上下文。

something Important

进程和线程就是这样的背景出来的,两个名词不过是对应的CPU时间段的描述,名词就是这样的功能。

  • 进程就是包含上下文切换的程序执行时间总和 = CPU加载上下文 + CPU执行 + CPU保存上下文

线程是什么呢?

进程的粒度太大,每次都要有上下文的调入,保存,调出。如果我们把进程比喻成一个运行在电脑上的软件,那么一个软件的执行不可能是一条逻辑执行的,必须有多个分支和多个程序段,就好比要实现程序A,实际分成a,b,c等多个块组合而成,那么这里具体的执行就可能变成:

程序A得到CPU->CPU加载上下文,开始执行程序A的a小段,然后执行A的b小段,然后再执行A的c小段,最后保存A的上下文。
这里a,b,c的执行是共享了A的上下文,CPU在执行的时候没有进行上下文切换的。这里的a,b,c就是线程,也就是说线程是共享了进程的上下文环境的更为细小的CPU时间段。

so,进程和线程都是一个时间段的描述,是CPU工作时间段的描述,不过是粒度大小不同。