线程与进程 叁歲伎倆 2024-04-06 10:39 17阅读 0赞 ### 一、线程 ### **1.1 什么是线程?** 线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,**是处理器调度和分派的基本单位。** 一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。 一个标准的线程由线程ID,当前指令指针PC,寄存器和堆栈组成。而进程由内存空间(代码,数据,进程空间,打开的文件)和一个或多个线程组成。 ### **1.2两种线程模型** ### **0.1.1 用户级线程 ULT** 用户程序实现,不依赖操作系统核心,应用提供创建、同步、调度和管理线程的函数来控制用户线程。 不需要用户态/内核态切换,速度快。 内核对ULT无感知,线程阻塞则进程(包括它的所有线程)阻塞。 **0.1.2 内核级线程 KLT——JAVA虚拟机使用的线程模型(KLT)** 系统内核管理线程(KLT),内核保存线程的状态和上下文信息,线程阻塞不会引起进程阻塞。 在多处理器系统上,多线程在多处理器上并行运行。 线程的创建、调度和管理由内核完成,效率比ULT要慢,比进程操作快。 ### 1.3两种线程模型线程的生命周期分为五个阶段:新建(new)、就绪(runnable)、运行(running)、阻塞(blocked)、死亡(dead) ### ![在这里插入图片描述][6bb9d07808e04c53812e7a3f2067ca73.png_pic_center] 1. 新建状态(New) Thread t1=new Thread(); 创建一个线程对象后,该线程对象就处于新建状态,此时它不能运行,与其他Java对象一样,仅仅由Java虚拟机为其分配了内存,没有表现出任何线程的动态特征。 1. 就绪状态(Runnable) t1.start(); 当线程对象调用了start()方法后,该线程就进入就绪状态。处于就绪状态的线程位于线程队列中,此时它只是具备了运行的条件,能否获得CPU的使用权并开始运行,还需要等待系统的调度。 1. 运行状态(Running) 如果处于就绪状态的线程获得了CPU的使用权,并开始执行run()方法中的线程执行体,则该线程处于运行状态。一个线程启动后,它可能不会一直处于运行状态,当运行状态的线程使用完系统分配的时间后,系统就会剥夺该线程占用的CPU资源,让其他线程获得执行的机会。需要注意的是,只有处于就绪状态的线程才可能转换到运行状态。 4.阻塞状态(Blocked) 一个正在执行的线程在某些特殊情况下,如被人为挂起或执行耗时的输入/输出操作时,会让出CPU的使用权并暂时中止自己的执行,进人阻塞状态。线程进人阻塞状态后,就不能进入排队队列。只有当引起阻塞的原因被消除后,线程才可以转入就绪状态。 **下面就列举一下线程由运行状态转换成阻塞状态的原因,以及如何从阻塞状态转换成就绪状态。** > ·当线程试图获取某个对象的同步锁时,如里该销被其他线程所持有,则当前线程会进入阻塞状态,如果想从阻塞状态进入就绪状态就必须获取到其他线程所持有的锁。 > ·当线程调用了一个阻塞式的I/O方法时,该线程就会进入阻寒状态,如果想进入就绪状态就必须要等到这个阻塞的I/O方法返回。 > ·当线程调用了某个对象的wait()方法时,也会使线程进入阻塞状态,如果想进入就绪状态就需要使用notify()方法唤醒该线程。 > ·当线程调用了Thread的sleep(long > millis)方法时,也会使线程进入阻塞状态,在这种情况下,只需等到线程睡眠的时间到了后,线程就会自动进入就绪状态。 ·当在一个线程中调用了另一个线程的join()方法时,会使当前线程进入阻塞状态,在这种情况下,需要等到新加入的线程运行结束后才会结束阻塞状态,进入就绪状态。 需要注意的是,线程从阻塞状态只能进入就绪状态,而不能直接进人运行状态,也就是说,结束阻塞的线程需要重新进入可运行池中,等待系统的调度。 5.死亡状态(Terminated) 如果线程调用stop()方法或nun()方法正常执行完毕,或者线程抛出一个未捕获的异常(Exception)错误(Error),线程就进入死亡状态。一旦进入死亡状态,线程将不再拥有运行的资格,也不能再转换到其他状态。 ### 二、进程 ### 2.1 什么是进程? **进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。** 进程是一种抽象的概念,从来没有统一的标准定义。 **进程一般由程序,数据集合和进程控制块三部分组成**:程序用于描述进程要完成的功能,是控制进程执行的指令集;数据集合是程序在执行时所需要的数据和工作区;程序控制块包含进程的描述信息和控制信息是进程存在的唯一标志。 ### 三、线程与进程 ### 3.1 关系: > 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。 > > 资源分配给进程,同一进程的所有线程共享该进程的所有资源。 > > 处理机分给线程,即真正在处理机上运行的是线程。 > > 线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。线程是指进程内的一个执行单元,也是进程内的可调度实体。 3.2 区别: > 线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位; > > 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线; > > 进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段,数据集,堆等)及一些进程级的资源(如打开文件和信号等),某进程内的线程在其他进程不可见; > > 线程上下文切换比进程上下文切换要快得多。 ### 四、线程安全 ### 当多个线程共享对通用对象的访问时,它们可能彼此冲突,带来新的bug,程序也会因此受到破坏。 [6bb9d07808e04c53812e7a3f2067ca73.png_pic_center]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/06/890f13a134a24aaeb7521235b53ad03a.png
相关 进程与线程 有那么一些零碎的小知识点,偶尔很迷惑,偶尔被忽略,偶然却发现它们很重要,也是各大笔试和面试高频出现考点。这段时间正好在温习这些,就整理在这里,一起学习一起提高!后面还会继续补充 痛定思痛。/ 2022年05月30日 00:19/ 0 赞/ 300 阅读
相关 线程与进程 1.定义 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本 - 日理万妓/ 2022年05月23日 01:56/ 0 赞/ 150 阅读
相关 进程与线程 [进程与线程][Link 1] 推荐一篇讲解的非常透彻且非常形象的文章,阮一峰的一篇博文。 原文链接:[进程与线程的一个简单解释][Link 2] posted @ 秒速五厘米/ 2022年03月22日 11:09/ 0 赞/ 297 阅读
相关 线程与进程 进程 1. 进程是资源分配的最小单位。 2. 开销: 有独立的代码和数据空间,程序切换开销大。 3. 坏境: 能同时运行多个进程(程序)。 4. 内存: 系统在运 骑猪看日落/ 2022年03月17日 10:14/ 0 赞/ 264 阅读
相关 进程与线程 进程,是一个活动的实体,我们平时所说的程序或者可执行文件并不是一个进程,他们都属于被动实体,只有将程序或者可执行文件调入到内存中才能成为一个活动实体,才能称之为进程。 进程是 小鱼儿/ 2022年01月16日 04:27/ 0 赞/ 311 阅读
相关 进程与线程 进程的定义 由于程序在并发执行时,各次执行的结果不同,所以用“程序”这个概念已无法描述程序的并发执行,所以必须引入新的概念 – 进程来描述程序的并发执行。 根据1978 比眉伴天荒/ 2022年01月15日 01:05/ 0 赞/ 324 阅读
相关 进程与线程 进程至少包含三个组成要素:程序快、代码块以及进程控制块; 进程是系统中资源分配和保护的基本单位; 线程作为CPU的调度和分派的基本单位; 每个进程在创建的时候,至少 Dear 丶/ 2022年01月11日 07:49/ 0 赞/ 351 阅读
相关 进程与线程 一般可以把独立运行的程序看作一个进程,进程之间是相互独立存在的,像qq音乐,谷歌浏览器一样他们都是独立存在的,而且互不影响。 进程想要执行任务必须依赖于线程,进程中的最小执行 ﹏ヽ暗。殇╰゛Y/ 2021年12月03日 10:49/ 0 赞/ 287 阅读
相关 进程与线程 进程与线程: 基本概念: 进程:进程是正在运行的程序的实例。每个进程都有自己的地址空间,一般情况下,它包括文本区域、数据区域和堆栈。文本区域存储处理器执行的代码;数据区 落日映苍穹つ/ 2021年09月26日 13:08/ 0 赞/ 423 阅读
相关 进程与线程 进程与线程 1 进程 1.1 进程的概念 进程就是正在运行的程序,它代表了程序所占用的内存区域 1.2 进程的特点 独立性 进程是系 忘是亡心i/ 2021年09月07日 06:19/ 0 赞/ 634 阅读
还没有评论,来说两句吧...