您的位置 首页 > 数码极客

【进程是什么意思】从生命周期的角度看线程和进程之间的异同

作者:vcjmhg

来源:

概述

过程和线程不会陌生。两者都有很多共同点。甚至线程可以说是“轻量级进程”。

而且两者基本的五个状态也几乎一样,但进程和线程在状态切换时的触发条件却有诸多不同,因而本文从“生命周期”的角度去谈一谈两者之间的异同。

联系

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

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

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

区别

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

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

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

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

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

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

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

Java 线程中状态转换:

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

总结

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

作者: vcjmhg

出处:

关于作者: admin

无忧经验小编鲁达,内容侵删请Email至wohenlihai#qq.com(#改为@)

热门推荐