前言:最近操作系统复习到线程的状态模型(也可以说进程的状态模型,本文直接用线程来说)时候,网上查阅资料,发现很多文章都说的很不一样,有五状态模型、六状态模型、七状态模型.......虽然都是对的,但是不乏很多刚入门的同学看了会懵,因此本文从操作系统的角度讲解线程的“五状态模型”以及后来提出的“七状态模型”,还从Java角度讲解“六状态模型”。
目录
1、前置知识
2、五状态模型
3、七状态模型
4、六状态模型
1、前置知识
①低级调度(线程调度)
按照某种算法从就绪队列中选取一个进程,将CPU分配给它。
②中级调度(内存调度)
把外存上处于挂起状态已具备运行条件的进程重新调入内存。目的是提高内存利用率和系统吞吐量。
③高级调度(作业调度)
由于内存空间有限,有时无法将用户提交的作业全部放入内存,因此需要确定某种规则来决定将作业调入内存的顺序。
高级调度是按一定的原则从外存上处于后备队列的作业中挑选一个作业,给他们分配内存等必要资源,并建立相应的进程(建立PCB)
2、五状态模型
五状态模型是从操作系统角度来描述的,状态图如下:
- 初始状态:表示线程刚被创建,还未加入就绪队列。也可以说仅是在语言层面创建了线程对象,还未与操作系统线程关联。
- 可运行状态:表明线程获取到了除CPU之外的所有资源,正在就绪队列等待CPU调度。
- 运行态:表明线程此时已经获得了CPU,正在运行。
- 阻塞态:表明此时由于某种原因不能继续运行,主动放弃CPU进入阻塞状态。
- 终止态:表示线程已经执行完毕,生命周期已经结束,不会再转换为其它状态。
过程(箭头)描述:
①:线程被创建后,经过“高级调度(作业调度)”进入就绪队列等待分配CPU时间片。
②:线程由于“低级调度(线程调度)”获得CPU时间片,开始运行。
③:线程CPU时间片用尽,回到就绪队列。
④:线程由于某种原因,主动放弃CPU进入阻塞状态。原因如:a. 竞争锁失败。b. 调用了阻塞API,如 BIO 读写文件,这时该线程实际不会用到 CPU,会导致线程上下文切换,进入“阻塞态”。
⑤:线程获得了除CPU以外的所有资源,被动的从阻塞态变为可运行态,进入阻塞队列。
⑥:表示线程已经执行完毕,生命周期已经结束,不会再转换为其它状态。
⑦:表示CPU分给运行态的线程。
3、七状态模型
七状态模型是在基于五状态模型的基础上构造的,也是从操作系统的角度来分析的,主要是在“可运行态(就绪态)”和“阻塞态”上加了两个状态:“阻塞挂起态”和“就绪挂起态”。
思想和我们“虚拟内存”的思想一样,由于随着越来越多的线程加入内存,导致内存不够用,因此暂时将一些线程调出内存,等需要用的时候再通过“中级调度(内存调度)”调入内存。
七状态图如下:
可见,七状态模型便是我们上述分析的一样,这里不做过多讲解。
4、六状态模型
六状态模型是从 Java API 层面来描述的,根据 Thread.State 枚举,分为如下六种状态:
- NEW:表示线程刚被创建,但是还没有调用 start() 方法,也就是仅仅被NEW出来。
- RUNNABLE:调用Start()方法,进入RUNNABLE。注意!这里RUNNABLE包括了我们操作系统层面的①可运行态(就绪态)②运行态 ③阻塞态。
- TIMED_WAITING:表明线程进入“有限等待”状态,此时线程会等待某个条件发生一定时间,如果在有限时间内发生则继续向下运行,如果超出有限时间条件还没发生,则直接不等待,继续向下运行。通常对应着我们Java里面的Thread.sleep(time),join(time)等方法。
- WAITING:表明线程进入“(无限)等待”状态,此时线程会一直等到条件发生才会向下继续运行。
- BLOCKED:表明线程进入Java层面的阻塞状态,如竞争synchronize锁失败则进入这个状态。
- TERMINATED:表示当前线程代码运行结束。
注意!TIMED_WAITING、WAITING、BLOCKED都是 Java API 层面对【阻塞状态】的细分。
以上是本文针对线程状态从操作系统、Java API角度来解析。大家点个关注!!!谢谢大家了!!!