加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_新乡站长网 (https://www.0373zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

线程与进程

发布时间:2022-10-10 11:16:06 所属栏目:Unix 来源:
导读:  一、线程

  1.1 什么是线程?

  线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。

  一个进程可以有一个或多个线程,各个线程之间共享程序的
  一、线程
 
  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)
 
  新建状态(New)
 
  Thread  t1=new Thread();
  创建一个线程对象后,该线程对象就处于新建状态,此时它不能运行,与其他Java对象一样,仅仅由Java虚拟机为其分配了内存,没有表现出任何线程的动态特征。
 
  就绪状态(Runnable)
 
  t1.start();
  当线程对象调用了start()方法后,该线程就进入就绪状态。处于就绪状态的线程位于线程队列中,此时它只是具备了运行的条件,能否获得CPU的使用权并开始运行,还需要等待系统的调度。
 
  运行状态(Running)
 
  如果处于就绪状态的线程获得了CPU的使用权,并开始执行run()方法中的线程执行体,则该线程处于运行状态。一个线程启动后,它可能不会一直处于运行状态,当运行状态的线程使用完系统分配的时间后,系统就会剥夺该线程占用的CPU资源,让其他线程获得执行的机会。需要注意的是,只有处于就绪状态的线程才可能转换到运行状态。
 
  4.阻塞状态(Blocked)
 
  一个正在执行的线程在某些特殊情况下,如被人为挂起或执行耗时的输入/输出操作时,会让出CPU的使用权并暂时中止自己的执行,进人阻塞状态。线程进人阻塞状态后,就不能进入排队队列。只有当引起阻塞的原因被消除后,线程才可以转入就绪状态。
 
  下面就列举一下线程由运行状态转换成阻塞状态的原因,以及如何从阻塞状态转换成就绪状态。
 
  ·当线程试图获取某个对象的同步锁时,如里该销被其他线程所持有,则当前线程会进入阻塞状态,如果想从阻塞状态进入就绪状态就必须获取到其他线程所持有的锁。
 
  ·当线程调用了一个阻塞式的I/O方法时,该线程就会进入阻寒状态,如果想进入就绪状态就必须要等到这个阻塞的I/O方法返回。
 
  ·当线程调用了某个对象的wait()方法时,也会使线程进入阻塞状态,如果想进入就绪状态就需要使用notify()方法唤醒该线程。
 
  ·当线程调用了Thread的sleep(long
 
  millis)方法时,也会使线程进入阻塞状态,在这种情况下,只需等到线程睡眠的时间到了后,线程就会自动进入就绪状态。
 
  ·当在一个线程中调用了另一个线程的join()方法时,会使当前线程进入阻塞状态,在这种情况下,需要等到新加入的线程运行结束后才会结束阻塞状态,进入就绪状态。
 
  需要注意的是,线程从阻塞状态只能进入就绪状态unix线程切换,而不能直接进人运行状态,也就是说,结束阻塞的线程需要重新进入可运行池中,等待系统的调度。
 
  5.死亡状态(Terminated)
 
  如果线程调用stop()方法或nun()方法正常执行完毕,或者线程抛出一个未捕获的异常(Exception)错误(Error),线程就进入死亡状态。一旦进入死亡状态,线程将不再拥有运行的资格,也不能再转换到其他状态。
 
  二、进程
 
  2.1 什么是进程?
 
  进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。
 
  进程是一种抽象的概念,从来没有统一的标准定义。
 
  进程一般由程序,数据集合和进程控制块三部分组成:程序用于描述进程要完成的功能,是控制进程执行的指令集;数据集合是程序在执行时所需要的数据和工作区;程序控制块包含进程的描述信息和控制信息是进程存在的唯一标志。
 
  三、线程与进程
 
  3.1 关系:
 
  一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
 
  资源分配给进程,同一进程的所有线程共享该进程的所有资源。
 
  处理机分给线程,即真正在处理机上运行的是线程。
 
  线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。线程是指进程内的一个执行单元,也是进程内的可调度实体。
 
  3.2 区别:
 
  线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;
 
  一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
 
  进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段,数据集,堆等)及一些进程级的资源(如打开文件和信号等),某进程内的线程在其他进程不可见;
 
  线程上下文切换比进程上下文切换要快得多。
 
  四、线程安全
 
  当多个线程共享对通用对象的访问时,它们可能彼此冲突,带来新的bug,程序也会因此受到破坏。
 

(编辑:开发网_新乡站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章