从用户的角度来看,过程是正在运行的程序实例,而线程是过程中真正执行工作的根本单位。也就是说一个运行的程序至多蕴含一个过程,一个过程至多蕴含一个线程,线程不能独立于过程而存在。
过程
过程(Process)是操作系统分配资源的根本单位,一个过程领有的资源有本人的堆、栈、虚存空间(页表)、文件描述符等信息。
从编程的角度来了解过程,能够把它看作是一个类或一个 PCB(Process Control Block)过程管制块的构造体,这个构造体中大抵蕴含以下几个内容:
- 过程编号 PID:过程的身份标识。
过程的状态:
- 新建状态
- 就绪状态
- 运行状态
- 阻塞状态
- 销毁状态
- 执行优先级
- 上下文:保留本次执行状态,以便下次继续执行,这个过程就是一个上下文。
内存地址
线程
线程(Thread)是操作系统可能进行运算调度的根本单位。它蕴含在过程中,是过程中的理论运行单位。在 Unix System V 及 SunOS 中线程也被称为轻量过程(lightweight processes),但轻量过程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。
PS:用户线程能够了解为应用程序本人的线程,由程序员创立并管制的线程;而内核线程是内核反对并应用的线程。
线程劣势
线程是轻量级的过程,一个过程中蕴含了多个线程,因而多个线程间能够共享过程资源,线程和过程的关系如下图所示:
其中,堆和办法区是能够共享的区域,而程序计数器和栈是每个线程公有的。
- 程序计数器是一块内存区域,用来记录线程以后要执行的指令地址。
- 栈是用来记录每个线程本人的局部变量的。
- 堆中寄存的是以后程序创立的所有对象。
办法区寄存的是常量和动态变量等信息。
过程和线程的区别
过程和线程的区别次要体现在以下几点。
区别1:从属关系不同
从属关系不同:过程是正在运行程序的实例,过程中蕴含了线程,而线程中不能蕴含过程。
区别2:形容侧重点不同
形容侧重点不同:过程是操作系统分配资源的根本单位,而线程是操作系统调度的根本单位。
区别3:共享资源不同
共享资源不同:多个过程间不能共享资源,每个过程有本人的堆、栈、虚存空间(页表)、文件描述符等信息,而线程能够共享过程资源文件(堆和办法区)。
区别4:上下文切换速度不同
上下文切换速度不同:线程上下文切换速度很快(上下文切换指的是从一个线程切换到另一个线程),而过程的上下文切换的速度比较慢。
区别5:操纵者不同
操纵者不同:个别状况下过程的操纵者是操作系统,而线程的操纵者是编程人员。
总结
过程是操作系统分配资源的根本单位,而线程是操作系统调度的根本单位。一个过程中至多蕴含一个线程,线程不能独立于过程而存在。过程不能共享资源,而线程能够。线程能够看作是轻量级的过程,它们的次要区别体现在:从属关系、形容侧重点、共享资源、上下文切换速度和操纵对象等不同。
参考资料
《Java并发编程之美》
是非审之于己,毁誉听之于人,得失安之于数。
公众号:Java面试真题解析
面试合集:gitee.com/mydb/interview