进程和线程

老生常谈的话题了,但是总是说不明白。
先来丢一段八股文:

  • 进程是资源分配的最小单位,有自己独立的地址空间(address space)
    线程是程序执行的最小单位,没有独立的地址空间
  • 一个进程可以包含多个线程,至少一个线程。
  • 因为地址空间分配,导致不同的进程间通信非常困难,但是一个进程中的不同线程通信非常方便
  • 线程共享本进程的资源如内存、I/O、cpu等,而进程之间的资源是独立的,能很好的进行资源管理和保护。
    是什么
    进程和线程是不同概念,那么这个概念是怎么划分出来的?
    从功能来说:线程是一组执行同一场景下的任务。进程是不场景所进行的任务。
    从运行来说:
  • CPU调度时都是要进行进行上下文(寄存器、相关变量、环境)的切换。但是线程是进程的子任务,线程的一部分上下文一定是基于进程的,这就是共享的概念来源。这就是八股文的第四点和第一点。
  • 这么说来,可以理解为进程是虚的,没有不存在线程的进程。因为一个进程必须至少有一个线程。那么我们因为就理解了,就算是进程之间进行切换,也是把本线程的进程切换到其他进程的线程,本质还是线程的切换。这就是八股文的第一点。
  • 进程之间由于场景差异较大,因此上下文就差异较大,因此进程切换的开销就会大于线程切换的开销

为什么
原本是单线程,很容易受到IO的限制,CPU空闲。那么改进,变成多线程进行上下文切换调度。但是,显然有一些线程之间的功能相似,环境相似,那么就把他们组织起来,共享一部分相同的资源,这一组线程就是进程。这样CPU在切换时,如果在同一进程的线程之间切换时,就会减少上下文切换开销。而不是每次切换线程,都要重新分配所有的资源和变量,导致上下文变化很大。

怎么用
JAVA一个项目就可以理解为一个进程,那么一个项目内的多个任务自然就叫做多线程。以前一直不理解JAVA多线程为什么不叫多进程,现在想来,根本就没有多进程这一东西。进程是对于操作系统调度而言的。对于程序本身,实际上没有进程的概念,一组线程组合起来,那就是进程了。

posted @ 2021-08-19 17:10  快乐的海盗  阅读(65)  评论(0编辑  收藏  举报