• 从生命周期的角度看线程和进程之间的异同


    概述

    进程与线程想必都不陌生,两者有诸多相同点,甚至可以这样说,线程就是“轻量级的进程”。而且两者基本的五个状态也几乎一样,但进程和线程在状态切换时的触发条件却有诸多不同,因而本文从“生命周期”的角度去谈一谈两者之间的异同。

    联系

    就从状态本身而言,两者的状态类别和对应含义几乎是完全一致的分别为:

    1. 初始状态:刚被创建的状态
    2. 可运行状态(就绪状态):可以被分配CPU的状态
    3. 运行状态:获取到CPU正在运行的状态
    4. 休眠状态(阻塞状态):等待某个事件时,会被转换到该状态
    5. 终止状态(结束状态):执行完成或者遇到异常情况时,会进入该状态。

    注意:上边的五种状态时比较通用的状态,但在不同的操作系统中,进程的状态也会有扩充和精简。同样的在不同的编程语言中,对线程的生命状态也会有精简和合并;比如java语言中把可运行状态运行状态进行了合并,但对休眠状态进行了扩充,分成了阻塞状态无时限状态有时限状态三种状态。

    区别

    虽然说,进程和线程的生命周期(或者状态)有诸多相似点,但它们两者在不同状态间切换的条件是不同的。

    比如对进程来说五种状态的转换图如下所示:

    进程的状态

    就绪状态 --> 运行状态:当处于就绪状态的进程被调度后,获得处理机资源,此时进程就由就绪状态转换成运行状态

    运行状态-->阻塞状态:处于运行状态的进程在时间片用完之后,不得不让出处理机,此时进程就有运行状态转成阻塞状态。

    阻塞状态-->就绪状态:当进程等待的事件到来时,中断处理程序必须把相应进程的状态由阻塞状态转换成就绪状态。

    而对线程来说状态状态切换(以java的线程为例)如下所示:

    image-20210101165455636

    整个状态的转换过程如下:

    java线程中状态转换:

    1. RUNNABLE与BLOCKED的状态转换:
      只有线程在等待synchronized的隐式锁时,synchronized修饰的方法、代码块同一时刻只能允许一个线程执行,其他线程只能等待,这种情况下,等待的线程就会从RUNNABLE转换到BLOCKED状态。而当等待获得到synchronized隐式锁时,就又会从BLOCKED转换到RUNNABLE状态。
      并且java层面上不关心操作系统进程的调度状态,因为在JVM看来,等待CPU使用权和等待IO没有区别,都是在等待某个资源,因此都被归为RUNNABLE状态。
    2. RUNNABLE与WAITING的状态转换
      1. 获取到synchronized的隐式锁的进程,调用无参数的Object.wait()方法
      2. 调用无参数的Thread.join()方法
      3. 调用LOCKSupport.park()方法。LockSupport.unpark(Thread thread)课唤醒目标线程,目标线程的状态又会从WAITNG状态转换成RUNNABLE状态
    3. RUNNABLE与TIMED_WEAITING的状态转换
      1.调用带超时参数的Thread.sleep(long millis)方法
      2.获得synchronized隐式锁的线程,调用带超时参数的Object.wait(long timeout)方法
      3. 调用带超时参数的LockSupport.parkNanos(Object blocker,long dealing)方法
      4. 调用带超时参数锁的Thread.join(long millis)方法
      5. 调用带超时参数的LockSupport.parkUnitl(long deadline)方法
    4. 从NEW到RUNNABLE状态
      线程在创建成功后,调用其对应的start方法就会从RUNNABLE状态转换成
      4.从RUNNABLE到TERMINATED状态
      通过调用Thread.interrupt()方法,也可以调用stop()方法,但当前方法被废止了。

    总结

    本文主要从生命周期的角度总结了线程和进程之间的异同点,当然在其他方面两者还有诸多不同,比如进程是资源调度的基本单位,它拥有属于自己的系统资源,而线程本身不拥有系统资源,多个线程之间共享进程的资源。关于这些不同点,本文不在详述。

  • 相关阅读:
    201771010111 李瑞红 《第十二周学习总结》
    201771010111李瑞红《第十一周学习总结》
    李瑞红201771010111第十周 学习总结
    李瑞红201771010111《第九周学习总结》
    201771010111李瑞红《面向对象的程序设计》第八周实验总结
    2017710101111李瑞红《第七周学习总结》
    李瑞红201771010111《第六周学习总结》
    李瑞红201771010111《面向对象程序设计(java)》第四周学习总结
    201771010113 李婷华《面向对象程序设计(Java)》第十二周总结
    201771010113 李婷华 《面向对象程序设计(Java)》第十一周总结
  • 原文地址:https://www.cnblogs.com/goWithHappy/p/difference-with-process-and-thread.html
Copyright © 2020-2023  润新知