• 面试突击20:进程和线程有什么区别?


    从用户的角度来看,进程是正在运行的程序实例,而线程是进程中真正执行任务的基本单位。也就是说一个运行的程序至少包含一个进程,一个进程至少包含一个线程,线程不能独立于进程而存在。

    进程

    进程(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:用户线程可以理解为应用程序自己的线程,由程序员创建并控制的线程;而内核线程是内核支持并使用的线程。

    线程优势

    线程是轻量级的进程,一个进程中包含了多个线程,因此多个线程间可以共享进程资源,线程和进程的关系如下图所示:
    image.png
    其中,堆和方法区是可以共享的区域,而程序计数器和栈是每个线程私有的。

    • 程序计数器是一块内存区域,用来记录线程当前要执行的指令地址。
    • 栈是用来记录每个线程自己的局部变量的。
    • 堆中存放的是当前程序创建的所有对象。
    • 方法区存放的是常量和静态变量等信息。

    进程和线程的区别

    进程和线程的区别主要体现在以下几点。

    区别1:从属关系不同

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

    区别2:描述侧重点不同

    描述侧重点不同:进程是操作系统分配资源的基本单位,而线程是操作系统调度的基本单位。

    区别3:共享资源不同

    共享资源不同:多个进程间不能共享资源,每个进程有自己的堆、栈、虚存空间(页表)、文件描述符等信息,而线程可以共享进程资源文件(堆和方法区)。

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

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

    区别5:操纵者不同

    操纵者不同:一般情况下进程的操纵者是操作系统,而线程的操纵者是编程人员。

    总结

    进程是操作系统分配资源的基本单位,而线程是操作系统调度的基本单位。一个进程中至少包含一个线程,线程不能独立于进程而存在。进程不能共享资源,而线程可以。线程可以看作是轻量级的进程,它们的主要区别体现在:从属关系、描述侧重点、共享资源、上下文切换速度和操纵对象等不同。

    参考资料

    《Java并发编程之美》

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

    公众号:Java面试真题解析

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

  • 相关阅读:
    利用clear清除浮动的一些问题
    配置SpringBoot方便的切换jar和war
    java并发实战:连接池实现
    canvas绘制圆角头像
    对象的合并及拷贝
    JS数组去重
    浏览器端用JS实现创建和下载图片
    超过固定宽度(或行数)显示...(或省略)
    ssh实现免密登录
    Mac 日常使用问题收集
  • 原文地址:https://www.cnblogs.com/vipstone/p/15870199.html
Copyright © 2020-2023  润新知