细说进程五种状态的生老病死——双胞胎兄弟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原语停止执行,然后再返回原进程继续执行。

死锁四个条件

处理死锁方法

时间: 2024-10-07 22:36:53

细说进程五种状态的生老病死——双胞胎兄弟Java线程的相关文章

java线程五种状态

java线程五种状态: 创建 -> 就绪 -> 运行 -> 销毁 创建 -> 就绪 -> 运行 -> 等待(缺少资源) -> 销毁 下图:各种状态转换

ajax readyState的五种状态详解

在<Pragmatic Ajax A Web 2.0 Primer >中对readyStae状态的介绍,摘译如下: 0: (Uninitialized) the send( ) method has not yet been invoked. 1: (Loading) the send( ) method has been invoked, request in progress. 2: (Loaded) the send( ) method has completed, entire res

Js--AJAX的小知识(一):ajax的五种状态

一.ajax的五种状态(readyState ) 0 - (未初始化)还没有调用send()方法 1 - (载入)已调用send()方法,正在发送请求 2 - (载入完成)send()方法执行完成,已经接收到全部响应内容 3 - (交互)正在解析响应内容 4 - (完成)响应内容解析完成,可以在客户端调用了 readyState 状态说明 (0)未初始化 此阶段确认XMLHttpRequest对象是否创建,并未调用open()方法进行未初始化作好准备.值未0表示对象已经存在,否则浏览器会报错--

XMLHTTP.readyState的五种状态

XMLHTTP.readyState的五种状态 https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest

ios应运程序的五种状态

ios应运程序的五种状态即转化  从apple的官方文档扣下来的 5状态: Not running The app has not been launched or was running but was terminated by the system. Inactive The app is running in the foreground but is currently not receiving events. (It may be executing other code thou

ajax的五种状态

ajax的五种状态(readyState ) 0 - (未初始化)还没有调用send()方法 1 - (载入)已调用send()方法,正在发送请求 2 - (载入完成)send()方法执行完成,已经接收到全部响应内容 3 - (交互)正在解析响应内容 4 - (完成)响应内容解析完成,可以在客户端调用了 readyState 状态说明 (0)未初始化 此阶段确认XMLHttpRequest对象是否创建,并未调用open()方法进行未初始化作好准备.值未0表示对象已经存在,否则浏览器会报错---对

git 四个区五种状态

一张图看明白Git的四个区五种状态 五种状态间的顺序操作 四个区 工作区(Working Area) 暂存区(Stage) 本地仓库(Local Repository) 远程仓库(Remote Repository) 五种状态 未修改(Origin) 已修改(Modified)&未追踪(Untracked) 已暂存(Staged) 已提交(Committed) 已推送(Pushed) 顺序操作 第零步:工作区与仓库保持一致 第一步:文件增删改,变为已修改状态 第二步:git add ,变为已暂存

程序员的五种状态

1.不爱,但是迫于生计  2.无感,反正亦步亦趋  3.热爱,但却身心俱疲  4.狂热,打了鸡血一般  5.欢喜,毕竟乐在其中   你是属于哪一种呢?  如果要我来选,我一定会选5,因为唯其如此才能获得程序人生的个中真昧,才能拥有彼此交融的内在完满.而其他的几种状态在不同程度上都是残缺的.         也许我们写程序总是不可避免的为了各种外在的目的,但是写程序时的那份小确幸的欢喜,却始终是我们精神飞鸟的栖息地. 正如孔子赞颜回——子曰∶“贤哉回也,一箪食,一瓢饮,在陋巷,人不堪其忧,回也不改

【线程系列二】线程的五种状态

线程有5种状态,分别是新建.受阻塞.运行.死亡.休眠.等待. 在api中的解释如下图1所示 图1 图2 解释一下上述图2的过程. 1.new一个线程对象,该对象的状态为"新建状态". 2.执行start(),如果cpu现在空闲,则切换到运行状态,否则切换到阻塞状态. 3.线程执行sleep(),切换到休眠状态,在休眠时间到期后,自动切换到(运行或阻塞) 4.执行wait(),切换到等待状态,如果不执行notifiy(),则一直处于等待状态. 5.在线程中的run()执行完毕后,线程切换