简单理解 进程 & 线程

文章目录

  • 线程与进程之间的区别和联系
  • 进程&线程之间的理解
    • 进程
    • 进程管理 PCB
    • 并行、并发
    • 线程

线程与进程之间的区别和联系

  1. 进程包含线程。都是为了实现并发编程的方式。线程比进程更轻量。

  2. 进程是系统分配资源的基本单位,线程是系统调度执行的基本单位。

    创建进程的时候把分配资源的工作给做了,后续创建线程就可以直接公用之前的资源。

  3. 进程有独立的地址空间,彼此之间不会相互影响,体现进程的独立性=>系统稳定。

    多个线程公用一份地址空间,一个线程一旦抛出异常,就会导致整个进程异常结束。=>多个线程之间容易相互影响。


进程&线程之间的理解

进程

进程简单来说就相当于正在运行的程序,每个进程程都有一个独立的内存空间,并且可以并发执行,多个线程之间不共享数据。(一个进程对应多个PCB)

通过分配资源来执行这个程序包含的指令的过程叫做进程。(进程是在CPU 上执行的)

简单理解 进程 & 线程_第1张图片

缺点:大规模的创建和销毁的资源开销是比较大的。

​ 开销是指:资源的申请和释放。

​ 资源是指:内存资源和文件描述符表。

优点:由于每个进程是独立拥有一块资源空间的,所以他们相对独立,一个进程挂了,对其他的进程不会有什么影响。

进程管理 PCB

通常计算机中大概率包含很多个进程,进程多了,要如何管理呢?

针对计算机中的进程管理采用先描述,再组织的方式进行。

  • 描述:使用一个专门的结构体来记录一个进程里面的各个属性。(PCB进程控制块)
  • 组织:通常用双向链表这样的方式来进行组织。(针对Linux)

PCB包含信息:

  1. pid进程标识

  2. 内存指针:主要存储的就是从exe可执行文件中加载过来的 指令 和 数据。

    ​ 还要保存一些运行程序的中间结果。

  3. 文件描述符表:用来记录当前这个进程在使用哪些文件(fopen、fread、fclose)

  4. 进程调度相关属性

    1. 状态:进程在系统中有很多状态,其中最关键的就是 就绪 和 阻塞 状态。
    2. 优先级:系统给进程进行调度的时候,也不完全是公平的,也会根据优先级的不同,来决定时间分配的权衡。把系统资源调配给更重要的进程上了。
    3. 上下文:这些进程都是轮着上CPU的,一次运行不完,就需要保证下次上CPU运行的时候,接着上次未运行完的位置,继续往后运行。
    4. 记账信息:相当于一个统计信息,会统计每个进程在CPU上都执行了多久,执行多少次。

并行、并发

我们说过进程是在CPU上执行的,现在的CPU大多都是六核十二线程/八核十六线程的,如果我们有几十个、几百个线程需要执行,这显然是不够用的。因此就会有并行、并发机制。

  • 并行:同一时刻,两个进程,同时运行在两个CPU逻辑核心上。
  • 并发:两个进程,同时在一个逻辑核心上,轮流进行。由于CPU切换进程的速度极快。微观上,这俩进程是串行执行的。宏观上,看起来这俩就是"同时"执行的。

由于感知不到是哪种方式调度,并且这两种调度方式,宏观上体现效果都是一样的。通常也会用 “并发” 这个词代指 “并行” 和 “并发”。

线程

其实所谓的线程也可以被称为一种轻量级的进程。

一个线程被分配了一个pcb,没有分配后续的 内存、硬盘…等资源,但线程在进程内部,可以使用进程分配好的资源。(因此进程和线程之间的关系可以认为是 进程 包含 线程)

总结出以下特点:

  1. 一个进程至少包含一个线程。
  2. 相比于进程,线程由于是共用同一份资源空间所以消耗资源更少、速度更快。

缺点:

  1. 在共用资源空间中,相互之间的影响更大了,一个线程挂了,可能会导致这个整个进程的异常结束。
  2. 当多个线程共同访问同一个公共资源的时候,也可能会出现冲突,出现线程安全问题。

这里的进程中也不能包含无限个线程,其取决于CPU的个数等。

一个进程中的多个线程,共同复用了这个进程中的各种资源(内存、硬盘),但是这些线程各自独立的在cpu上进行调度

因此,线程就可以既能够完成 “并发编程” 的效果,又可以 以比较轻量的方式来进行

可以通过下图来简单理解线程、进程之间的关系和工作方式。

简单理解 进程 & 线程_第2张图片

简单理解 进程 & 线程_第3张图片

你可能感兴趣的:(JavaEE,java-ee)