你的位置:首页 > Java教程

[Java教程]细说进程五种状态的生老病死——双胞胎兄弟Java线程


java线程的五种状态其实要真正高清,只需要明白计算机操作系统中进程的知识,原理都是相同的。

 

 

系统根据PCB结构中的状态值控制进程。

 

 

单CPU系统中,任一时刻处于执行状态的进程只有一个。

进程的五种状态:初始态,执行态,等待态,就绪态,终止态。

执行状态:一个进程获得了必要资源,并且在CPU上执行时的状态。

执行态进程因为等待某种事件的发生处于等待状态。

执行态进程的时间片用完或在抢占式调度中有更高优先级的进程时变为就绪状态。

阻塞原语:一个执行进程期待某一个事件的发生,但发生条件尚不具备,该进程自己调用阻塞原语阻塞自己。

过程:执行态进程——中断处理机和保护该CPU现场——变为阻塞状态——插入等待队列——转进程调度程序选就绪进程运行。

就绪状态的进程经调度程序选中之后才可以进入执行状态。

就绪状态的进程已经获得了除处理机以外的所有资源,一旦获得处理机就可以立即执行的状态

等待状态的进程因为等待事件发生被唤醒后,不能立刻得到处理机而进入就绪状态。

唤醒进程有两种方法:系统进程唤醒和事件发生进程唤醒

就绪态与等待态的区别:当分配给该进程处理机时,该进程能否立即执行,能就是就绪态,否则就是等待态。

初始状态:进程刚被创建时,由于其他进程正占有处理机而得不到执行,处于初始状态。(被创建的进程最初处于初始状态)

终止状态:进程执行结束后,退出执行而被终止,处于终止状态。

 

 

 

 

 

进程具有独立性和异步性等并发特征。

 

进程控制是对系统中所有进程进行管理。其功能包括进程的创建,撤销,阻塞,唤醒等。(题外话,这些功能是由操作系统内核来实现的)

进程控制是通过原语来实现的。

原语:由若干条机器指令构成的一段程序,用以完成特点的功能,这段程序在执行期间不可分割。原语的执行不能被中断。

 

处理机三级调度

一个作业从提交开始直到完成要经历三级调度。

1, 高级调度(作业调度)

根据一定原则从外存上处于后备状态的作业中选择一个或多个,给他们分配内存,输出输入等必要资源,并建立相应的进程,使该作业具有获得竞争处理机的权利。作业调度运行频率低,几分钟一次。

作业被选进内存时创建相应进程

作业调度的两个问题:调度程序必须决定操作系统可以接纳多少个作业,调度程序必须决定接纳那些作业。

作业调度每次要接纳多少个作业进入内存,取决于多道程序的并发程度,即允许有多少个作业同时在内存中运行。

将那些作业从外存调入内存,取决于调度算法。

先来先到算法:最早进入外存的作业最先调入内存。

短作业优先法:将外存上执行时间最短的作业最先调入内存。

2, 中级调度

将处于外存对换区中具备运行条件的进程调入内存,或将处于内存的暂时不能运行的进程交换到外存。

3, 低级调度(进程调度)

从就绪队列中选择一个进程,将处理机分配给他。

进程调度运行频率高,几十毫秒一次。

 

作业调度和进程调度的区别:作业调度的结果是为了创建进程,而进程调度的结果是进程被执行。

 

 

进程调度(重点)

为了实现进程调度,进程管理模块必须将系统中各进程的执行情况和状态特征记录在各个进程的PCB中,根据各个进程的状态特征和资源需求等信息将进程的PCB组织成相应的队列

 

进程调度方式:当一个进程正在处理机上执行时,若某个更为重要的进程需要处理(优先级更高的进程进入就绪队列),此时应该如何分配处理器。两种方式:

抢占式:一个进程正在处理机上执行,若有某个优先级更高的进程进入就绪队列,则立即暂停正在执行的进程,将处理机分配给新的进程。

非抢占式:一个进程正在处理机上执行,若有某个优先级更高的进程进入就绪队列,仍然让正在执行的进程继续执行,直到该进程自动释放处理机(时间片用完,进入阻塞,完成),才将处理机分配给新的进程。

调度算法

先来先服务(作业,进程调度)

按照作业或进程的请求顺序进行调度。

注意,在进程调度中,一旦一个进程占用处理器,他就一直运行下去,直到该进程完成或变为等待状态(这里处理机没有分时间片,不存在执行到就绪的转换)。非抢占式。

 

短作业优先(作业,进程)

选择能最快完成的作业或进程(会出现饥饿现象)

一直独占处理机

 

优先级调度(作业,进程)

调用优先级最高的,一直独占处理机

细分为抢占式和非抢占式

 

时间片轮转法(进程)

每个进程不能一直占处理机直到完成,有执行到就绪的转换

 

 

 

 

不允许多个并发进程交叉执行的一段程序(这段程序必须一次执行完,不能中断,多线程同步代码块)称为临界部分。

 

进程同步与互斥

两种制约关系

间接制约(互斥):某一个进程要求使用某种资源,而该资源正在被另一个进程使用,并且这一个资源不允许两个进程同时使用,那么该进程只能等待已占用资源的进程释放后再使用。

互斥要求:

空闲让进:没有进程进入临界部分时,可以允许一个请求进入临界部分的进程立即进入临界区。

忙则等待:已有进程进入临界区,其他试图进入临界部分的进程必须等待。

有限等待:对要访问临界部分的进程,应保证在有限时间内进程临界部分。

让权等待:当一个进程因为某些原因不能进入临界部分时,应释放处理器给其他进程。

 

直接制约(同步):某一个进程若收不到另一进程给它提供的必要信息就不能继续运行下去。

 

P,V原语

使用信号量来管理临界区的公有资源。

信号量sem,sem>=0代表可供并发进程使用的资源实体数,sem<0代表正在等待使用临界区的进程数。

P操作sem-1,V操作sem+1.

当某个进程正在临界区执行时(处于执行状态),其他进程执行P原语(这里以前的疑惑是有进程在执行了,别的进程是不会执行的因为没有占用处理机。其实呢,这样考虑,进程执行临界区时,没有执行完,然后时间片用完,转就绪状态,然后其他进程在处理机执行P原语,发现无法进入临界区,阻塞自己,当临界区可以被执行后,从相同阻塞队列中选一个被唤醒,转就绪而被执行),则该进程会进入等待队列等待其他做V原语操作释放资源后,进入临界区,这是P原语才结束。

P原语操作:

1, sem-1

2, 若sem-1后>=0,则P原语返回表示,该进程可以继续执行。

3, 若sem-1后<0,则该进程被阻塞,进入对应阻塞队列,转进程调度,选择就绪队列一个进程进入执行状态。

V原语操作

1, sem+1

2, 相加大于0,V原语停止执行,该进程返回调用出处,继续执行

3, 相加<=0,从该信号等待队列中选择一个进程唤醒(因为负数代表等待进程数目,sem+1了,就说明等待进程少了一个),V原语停止执行,然后再返回原进程继续执行。

 

死锁四个条件

 

处理死锁方法