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

概述

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

联系

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

  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的状态转换
  3. 获取到synchronized的隐式锁的进程,调用无参数的Object.wait()方法
  4. 调用无参数的Thread.join()方法
  5. 调用LOCKSupport.park()方法。LockSupport.unpark(Thread thread)课唤醒目标线程,目标线程的状态又会从WAITNG状态转换成RUNNABLE状态
  6. RUNNABLE与TIMED_WEAITING的状态转换
    1.调用带超时参数的Thread.sleep(long millis)方法
    2.获得synchronized隐式锁的线程,调用带超时参数的Object.wait(long timeout)方法
  7. 调用带超时参数的LockSupport.parkNanos(Object blocker,long dealing)方法
  8. 调用带超时参数锁的Thread.join(long millis)方法
  9. 调用带超时参数的LockSupport.parkUnitl(long deadline)方法
  10. 从NEW到RUNNABLE状态
    线程在创建成功后,调用其对应的start方法就会从RUNNABLE状态转换成
    4.从RUNNABLE到TERMINATED状态
    通过调用Thread.interrupt()方法,也可以调用stop()方法,但当前方法被废止了。

总结

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

Original: https://www.cnblogs.com/goWithHappy/p/difference-with-process-and-thread.html
Author: vcjmhg
Title: 从生命周期的角度看线程和进程之间的异同

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/599395/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Mock.js的简单使用

    Mock.js的简单使用 简述 Mock.js 是一款 模拟数据生成器,旨在帮助前端攻城师独立于后端进行开发,帮助编写单元测试。 功能 根据数据模板生成模拟数据。 模拟 Ajax …

    数据库 2023年6月11日
    099
  • day42-反射01

    Java反射01 1.反射(reflection)机制 1.1反射机制问题 一个需求引出反射 请看下面问题: 根据配置文件 re.properties 指定信息,创建Cat对象并调…

    数据库 2023年6月11日
    0122
  • Docker常用命令

    镜像:Docker 镜像是用于创建 Docker 容器的模板容器:容器是独立运行的一个或一组应用仓库:用来保存镜像,可以理解为代码控制中的代码仓库 一个仓库中包含多个镜像,以镜像为…

    数据库 2023年6月11日
    075
  • 简单的2021年终总结

    当大家开开心心跨年的时候,我在补年终总结。 小时候恨不得时间过得快一点,现在不这么想了。 我的 2021年,都是平静、反复的一天天,没有出书、没有开源、没有跳槽、没有升官。没错,这…

    数据库 2023年6月6日
    077
  • MySQL实战45讲 10

    10 | MySQL为什么有时候会选错索引? 使用哪个索引是由 MySQL 来确定的 可能遇到的情况:一条本来可以执行得很快的语句,却由于 MySQL 选错了索引,而导致执行速度变…

    数据库 2023年6月16日
    088
  • 图片防盗链

    如何避免别的网站直接通过本网站的url访问本网站资源 简单的防盗 我可以做到请求来的时候先看看当前请求是从哪个网站过来的如果是本网站那么正常访问如果是其他网站直接拒绝请求头里面有一…

    数据库 2023年6月14日
    071
  • 新来的同时问我where 1=1是什么意思

    写在前面 之前在项目代码中写了一条sql查询语句,在where条件搜索中加入了where 1=1,新来的同事之后问我where 1=1 是什么意思,这样没意义啊,我笑了。今天来说明…

    数据库 2023年6月6日
    070
  • ASP.NET CORE WEB项目介绍

    首先创建一个asp.net core web应用程序 第二步 目前官方预置了7种模板项目供我们选择。从中我们可以看出,既有我们熟悉的MVC、WebAPI,又新添加了Razor Pa…

    数据库 2023年6月14日
    088
  • RadonDB MySQL on K8s 2.1.3 发布!

    RadonDB MySQL Kubernetes 于 3 月 24 日正式发布新版本 2.1.3 。该版本主要基于在 2.1.2 进行功能优化和升级。 首先感谢 @andyli02…

    数据库 2023年5月24日
    083
  • Javaweb-JSP详解

    一、什么是JSP Java Server Pages:Java服务器端页面,和Servlet一样,用于动态web技术 最大的特点: 写JSP就像在写HTML 区别: HTML只给用…

    数据库 2023年6月16日
    075
  • 16 两个对象值相同(x.equals(y) == true),但却可以有不同的hashCode,这句话对不对?

    不对,如果两个对象x和y满足x.equals(y) == true,那么他们的哈希码应该相同。 根据hashCode方法协定:在每个重写了equals方法的类中,必须重写hashC…

    数据库 2023年6月6日
    074
  • java-配置tomcat服务器启动出现闪退解决办法

    1.配置tomcat服务器注意的地方:1.1下载tomcat软件,选择绿色免安装版,解压即可使用。1.2tomcat服务器是java语言编写的,想要运行tomcat需要java环境…

    数据库 2023年6月11日
    095
  • 工具 | PG 集群复制管理工具 repmgr

    作者:颜博 青云科技数据库研发工程师目前从事 PostgreSQL 产品开发工作,热衷于 PostgreSQL 数据库的学习和研究 | REPMGR 简介 repmgr[1] 是一…

    数据库 2023年5月24日
    0111
  • MySQL使用步骤

    出现mysqld: Can’t create directory ‘D:\Environment\mysql-5.7.37 \data’ (Er…

    数据库 2023年5月24日
    0137
  • proxySQL with SemiSync

    配置读写分离 先查看一下规则表的表结构 https://github.com/sysown/proxysql/wiki/Main-(runtime)#mysql_query_rul…

    数据库 2023年6月16日
    075
  • JavaWeb核心篇(4)——Cookie和Session

    Java核心篇(4)——Cookie和Session 本篇文章将会简单介绍Cookie和Session的概念和用法 会话跟踪技术 首先我们需要搞清楚会话和会话跟踪的概念: 会话:用…

    数据库 2023年6月14日
    0109
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球