进程状态和线程状态

引子

最近在补OS基础,看的参考书是《操作系统-------精髓与设计原理》(第七版),其中涉及到了对进程状态的讨论。

进程状态

理解最复杂的,最简单自然理解。

一、假设你的电脑只有内存的情况下,就绪、阻塞、运行就很好理解。

(1)运行不说了,就是CPU的PC执向了哪个进程的指令代码并且对应数据和代码都在内存里(看假设,这个100%满足),那么这个进程就是运行态。

(2)就绪就是万事俱备,只要CPU闲下来并且轮到自己了,这个进程马上就能运行,那就是就绪态。
就绪态就是进程等待CPU空闲&&CPU轮到你的状态

(3)阻塞就是一个进程A本来运行的好好的,忽然一个中断信号来了(比如系统调用read()来读取某个文件的内容,那操作系统就要控制硬件发送一个信号给磁盘,让磁盘把数据写到缓冲区去),这个磁盘写到内存缓冲区的过程巨鸡儿慢,这个过程不完成进程A又没法子继续走下去。那就只好放弃线程A,让线程A哪儿凉快哪儿呆着去,这个中断信号的来临让线程A处于阻塞态(等待低速设备的处理)。
阻塞态就是进程等待某个事件发生(内存缓存区有数据)才能继续往下走而这个事件又没有发生的状态。



二、问题在于内存价格太高并且非持久化,又要支持高昂的内存费用又要支持高昂的电费,这是不切实际的,毕竟不是首富。所以存储性介质才是王道,就是慢。
假设你的电脑这时候除了内存还有硬盘了。
引入挂起态:挂起态就是你的内存装不下所有就绪进程和阻塞进程了,不得不把他们放到磁盘里去。

运行态进程的代码+数据可以放到硬盘里去吗?当然不行,那还能叫运行态,运行的进程绝对最重要,遇到这种情况感觉把那些站着茅坑不拉屎的就绪态进程+运行态进程赶到硬盘里去。要是全部赶掉都不能存放,那不就是OOM吗?这时候你要反思你的内存是不是60年代的,或者你的程序对应的进程不符合时代的潮流。比如51单片机就是不能运行某些比较大的程序,加外接内存才有可能。

挂起态:就是就绪态或者阻塞态进程的另一种表现形式。上面个人理解可以称之为非挂起运行态和非挂起阻塞态了。

是否挂起取决于进程代码和数据存储于哪种物理介质中?就绪、阻塞和挂起并不矛盾,前者是CPU调度引发的对进程状态的分类,后者是磁盘调度引发的对于进程状态的分类。

描述方式

(1)状态转换图(主要内容的抽象)

(2)队列轮转图(比较具体的实现)

两状态进程模型(运行态+非运行态)

在这里插入图片描述
在这里插入图片描述
在队列中的就是非运行态!

五状态进程模型(Just Considering Cpu调度,主要引入阻塞)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

挂起进程模型(Considering Cpu调度+磁盘调度,主要引入挂起)

为什么要引入?
在这里插入图片描述

在这里插入图片描述

JVM中的线程状态

线程的6种状态和转换关系

在这里插入图片描述
Blocked
WAITING
TIMED_WAITING
[图片]

JVM中线程的对比和操作系统理论中进程的对比

在这里插入图片描述
[图片]

小结

一、操作系统理论只考虑内存时把进程状态分为  创建,       运行,        就绪,           阻塞,                       终止。
但是JVM实现把线程分为                New ,(Running不存在的), Runnable; Blocked、Waiting、Timed_Waiting; Terminated。


Blocked,Waiting和Waiting-Timed.其实对应的都是操作系统理论的阻塞。
众所周知,阻塞态是因为等待事件发生才从运行态转为阻塞态的。
众所周知,阻塞态是因为   事件发生才从阻塞态转为就绪态的。所以这三个东西分别等待什么事件的发生呢?
Blocked等待monitor lock,
Waiting等待 notify,
Waiting-timed等待notify或者定时器数到0.



Q:还有一个问题是怎么进入这三种状态呢?
A:进入Blocked直接遇到被占用的synchronized就行;----------这个很简单,不提。
进入Waiting直接用wait()就行;
进入waiting-timed直接用sleep(Long time)就行。
Q:下次问wait()和sleep()的区别?
A:除了wait()释放锁以外,还有sleep()阻塞线程不释放锁。
wait()让线程进入无限期等待,sleep()让线程进入限时等待,佐证这一点的包括sleep()是一个有参数的方法而wait()是一个无参方法,这个参数就是给定时器设定的初值。
此外join()是一个重载方法,有没有参数决定它进入waiting或者waiting-timed!


一、操作系统理论在考虑内存调度+磁盘调度时把进程状态分为  创建,       运行,        就绪,           阻塞,      挂起                     终止。
这个jvm线程中有挂起吗?有的话他又是什么呢?suspend()&&resume()???

版权声明:本文为qq_37805900原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。