从用户的角度来看,过程是正在运行的程序实例,而线程是过程中真正执行工作的根本单位。也就是说一个运行的程序至多蕴含一个过程,一个过程至多蕴含一个线程,线程不能独立于过程而存在。

过程

过程(Process)是操作系统分配资源的根本单位,一个过程领有的资源有本人的堆、栈、虚存空间(页表)、文件描述符等信息。
从编程的角度来了解过程,能够把它看作是一个类或一个 PCB(Process Control Block)过程管制块的构造体,这个构造体中大抵蕴含以下几个内容:

  1. 过程编号 PID:过程的身份标识。
  2. 过程的状态:

    1. 新建状态
    2. 就绪状态
    3. 运行状态
    4. 阻塞状态
    5. 销毁状态
  3. 执行优先级
  4. 上下文:保留本次执行状态,以便下次继续执行,这个过程就是一个上下文。
  5. 内存地址

    线程

    线程(Thread)是操作系统可能进行运算调度的根本单位。它蕴含在过程中,是过程中的理论运行单位。在 Unix System V 及 SunOS 中线程也被称为轻量过程(lightweight processes),但轻量过程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。

    PS:用户线程能够了解为应用程序本人的线程,由程序员创立并管制的线程;而内核线程是内核反对并应用的线程。

线程劣势

线程是轻量级的过程,一个过程中蕴含了多个线程,因而多个线程间能够共享过程资源,线程和过程的关系如下图所示:

其中,堆和办法区是能够共享的区域,而程序计数器和栈是每个线程公有的。

  • 程序计数器是一块内存区域,用来记录线程以后要执行的指令地址。
  • 栈是用来记录每个线程本人的局部变量的。
  • 堆中寄存的是以后程序创立的所有对象。
  • 办法区寄存的是常量和动态变量等信息。

    过程和线程的区别

    过程和线程的区别次要体现在以下几点。

    区别1:从属关系不同

    从属关系不同:过程是正在运行程序的实例,过程中蕴含了线程,而线程中不能蕴含过程。

    区别2:形容侧重点不同

    形容侧重点不同:过程是操作系统分配资源的根本单位,而线程是操作系统调度的根本单位。

    区别3:共享资源不同

    共享资源不同:多个过程间不能共享资源,每个过程有本人的堆、栈、虚存空间(页表)、文件描述符等信息,而线程能够共享过程资源文件(堆和办法区)。

    区别4:上下文切换速度不同

    上下文切换速度不同:线程上下文切换速度很快(上下文切换指的是从一个线程切换到另一个线程),而过程的上下文切换的速度比较慢。

    区别5:操纵者不同

    操纵者不同:个别状况下过程的操纵者是操作系统,而线程的操纵者是编程人员。

    总结

    过程是操作系统分配资源的根本单位,而线程是操作系统调度的根本单位。一个过程中至多蕴含一个线程,线程不能独立于过程而存在。过程不能共享资源,而线程能够。线程能够看作是轻量级的过程,它们的次要区别体现在:从属关系、形容侧重点、共享资源、上下文切换速度和操纵对象等不同。

参考资料

《Java并发编程之美》

是非审之于己,毁誉听之于人,得失安之于数。

公众号:Java面试真题解析

面试合集:gitee.com/mydb/interview