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

概述

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

联系

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

  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)

大家都在看

  • MySQL45讲-2-一条SQL更新语句是如何执行的?

    前面我们了解了SQL查询语句是如何执行的,一条SQL查询语句的过程需要经过连接器、分析器、优化器、执行器等功能模块,最终到达存储引擎。 在MySQL中,可以恢复到半个月内的任何一个…

    数据库 2023年5月24日
    095
  • 【StoneDB】从库如何规避不支持的DML和DDL

    (以下情况仅针对StoneDB 1.0版本不支持的部分DML和DDL操作,StoneDB 2.0及以上版本将无需此类操作)在主从复制中,主库的任何更新都将同步到从库。如果从库不想重…

    数据库 2023年5月24日
    095
  • 第03章 MySQL基本的SELECT语句

    第03章 MySQL基本的SELECT语句 1. SQL概述 1.1 SQL背景知识 1946 年,世界上第一台电脑诞生,如今,借由这台电脑发展起来的互联网已经自成江湖。在这几十年…

    数据库 2023年5月24日
    091
  • 第十九章 基于注解的AOP编程

    组装切面 将2 3 4步放在切面类中: 定义切面类: @Aspect 定义额外功能: @Around 原始方法的运行: ProceedingJoinPoint.proceed() …

    数据库 2023年6月14日
    086
  • Linux网络配置

    Linux网络配置 NAT网络配置 查看网络IP和网关 可以在 编辑->虚拟网络编辑器中 查看网络IP和网关 说明:1.什么是IP协议/地址?即”网络之间能相互连…

    数据库 2023年6月16日
    091
  • dns服务之bind配置内网解析部分子域名,其它子域名转发

    bind配置内网解析部分子域名,其它子域名转发。以下以m.xxx.com和admin.xxx.com由内网dns解析,其它*.xxx.com转发给外网dns解析为例配置。文件/et…

    数据库 2023年6月14日
    0107
  • 55 道MySQL基础题

    1.一张表,里面有 ID 自增主键,当 insert 了 17 条记录之后, 删除了第 15, 16, 17 条记录,再把 Mysql 重启,再 insert 一条记 录,这条记录…

    数据库 2023年5月24日
    0113
  • 用SQL语句执行存储过程

    DECLARE @return_value int EXEC @return_value =[存储过程名称]@参数1 =N ‘参数值’,@参数2 =N &#…

    数据库 2023年6月11日
    0103
  • 工程师成长阶段感悟

    从 2013 年陆续开始做软件研发工作, 去过不少公司, 做过一些类型项目, 桌面开发, web 开发, 手游开发, 端游开发, 棋牌, 视频云服务, 电商. 刚毕业那会在国企, …

    数据库 2023年6月9日
    0102
  • Mysql的知识梳理

    数据准备: –建表 create table customer_jia(CID int(4), Cname varchar(20), Csex varchar(2), …

    数据库 2023年5月24日
    0118
  • 省去跨表联查与注释查询的存储过程

    1 — 打印query存储过程的帮助信…

    数据库 2023年5月24日
    070
  • django中有关ajax的部分

    Django_ajax AJAX(Asynchronous Javascript And XML)翻译成中文就是”异步Javascript和XML”。即使用…

    数据库 2023年6月14日
    096
  • MySQL删除重复数据

    重复数据如图所示 自关联,保留id最小的那一条,其它的都删除 DELETE t1 FROM invest_year t1, invest_year t2 WHERE t1.pro_…

    数据库 2023年6月14日
    092
  • go interface{}使用

    先上代码 为什么会报错? 因为空接口拥有两个指针,内存布局上会占用两个机器字长。 对于长度为n的空接口切片而言,它的每个元素都是以2机器字长为单位的连续空间,因此总共会占用 2n个…

    数据库 2023年6月9日
    079
  • MySQL8.0 DDL原子性特性

    1. DDL原子性概述 8.0之前并没有统一的数据字典dd,server层和引擎层各有一套元数据,sever层的元数据包括(.frm,.opt,.par,.trg等),用于存储表定…

    数据库 2023年6月9日
    061
  • 如何把 MySQL 备份验证性能提升 10 倍

    JuiceFS 非常适合用来做 MySQL 物理备份,具体使用参考我们的官方文档。最近有个客户在测试时反馈,备份验证的数据准备( xtrabackup –prepare)过程非常…

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