进程与线程状态的区别和优劣(学习笔记)

您所在的位置:网站首页 操作系统进程和线程的区别和联系 进程与线程状态的区别和优劣(学习笔记)

进程与线程状态的区别和优劣(学习笔记)

2023-07-27 07:02| 来源: 网络整理| 查看: 265

进程:

在五状态进程模型中,进程状态被分成下列五种状态。进程在运行过程中主要是在就绪、运行和阻塞三种状态间进行转换。创建状态和退出状态描述进程创建的过程和进程退出的过程。

1)运行状态(Running):进程占用处理器资源;处于此状态的进程的数目小于等于处理器的数目。在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。

2)就绪状态(Ready):进程已获得除处理器外的所需资源,等待分配处理器资源;只要分配了处理器进程就可执行。就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排人低优先级队列;当进程由I/O操作完成而进入就绪状态时,排入高优先级队列。

3)阻塞状态(Blocked):当进程由于等待I/O操作或进程同步等条件而暂停运行时,它处于阻塞状态。

4)创建状态(New):进程正在创建过程中,还不能运行。操作系统在创建状态要进行的工作包括分配和建立进程控制块表项、建立资源表格(如打开文件表)并分配资源、加载程序并建立地址空间表等。

5)退出状态(Exit):进程已结束运行,回收除进程控制块之外的其他资源,并让其他进程从进程控制块中收集有关信息(如记帐和将退出代码传递给父进程)。

五状态进程模型中的状态转换主要包括下列几种。操作系统中多个进程的并发执行是通过调度与超时两种转换间的循环,或调度、等待事件和事件出现三种转换间的循环来描述的。

(1)创建新进程:创建一个新进程,以运行一个程序。创建新进程的可能原因包括用户登录、操作系统创建以提供某项服务、批处理作业等。

(2)收容(Admit,也称为提交):收容一个新进程,进入就绪状态。由于性能、内存等原因,系统会限制并发进程总数。

(3)调度运行(Dispatch):从就绪进程表中选择一个进程,进入运行状态。

(4)释放(Release):由于进程完成或失败而终止进程运行,进入结束状态。

为了简洁,状态变迁图中只画出了运行状态到退出状态间的释放转换;但实际上,还存在从就绪状态或阻塞状态到退出状态的释放转换。运行到结束的转换可分为正常退出(Exit)和异常退出(abort);其中异常退出是指进程执行超时、内存不够、非法指令或地址访问、I/0操作失败、被其他进程所终止等原因而退出。从就绪状态或阻塞状态到结束状态的释放转换可能是由于多种原因引发,如父进程可在任何时间终止子进程。

(5)超时(Timeout):由于用完时间片或高优先级进程就绪等原因导致进程暂停运行

(6)事件等待(Event Wait):进程要求的事件未出现而进入阻塞;可能的原因包括申请系统服务或资源、通信、I/O操作等。

(7)事件出现(EventOccurs):进程等待的事件出现;如操作完成、申请成功等。

线程:

New Thread:新建一个线程往往是通过 new Thread® 这种方法。新建一个线程并不意味着该线程就能立即进入执行状态(即使是runnable状态也不一定是正在执行),而是对线程注册一些相关信息,并等待调用该线程实例的start方法来启动该线程进入runnable状态。

Runnable Thread:当对该线程的实例调用start方法后,该线程进入runnable状态,进入runnable状态的线程并不意味着一定就在执行中(不然就叫running thread了),它可能被阻塞或者正在执行。即使处于正在执行中的runnable thread,也不一定是持续着执行一直到结束,它很可能因为操作系统所分配的时间片到期而进入中断状态,而让其他获得时间片的线程执行,当其他的线程所占据的时间片到期后,将会根据所有等待执行的线程的优先级来确定哪个线程继续(或开始)执行,所以也未必是刚刚那个被抢占的线程恢复执行。

Blocked Thread:一个线程进入阻塞状态往往由下列原因构成:

一个线程由于并执行命令Thread.sleep(DELAYS),而进入睡眠状态。只有当设定的延时DELAYS到期后,该线程才能重新回到runnable状态。 一个线程在等待I/O操作的完成而进入阻塞状态。只有当相应的I/O操作完成之后,该线程才能回到runnable状态。 由于另一个线程目前处于锁定状态中,所以这个线程无法进入runnable状态而被阻塞。只有当那个处于锁定状态的线程让出了锁定权,那么这个线程(和其他的线程)才能进入runnable状态。(一旦一个线程被锁定,那么整个系统只能等待该线程执行完了之后才能执行别的线程。) 一个线程在等待某个条件的改变而进入阻塞状态。只有当另一个线程sign the condition may have changed之后,该线程会去检查这个条件是已改变,如果确实改变了,那么该线程才能进入runnable状态。 一个线程由于执行suspend方法而被挂起,所以进入阻塞状态。只有当该线程被执行resume方法后,才能回复runnable状态。suspend和resume方法已经逐渐不再使用。 Dead Thread:一个线程死掉的原因有下面两种:

该线程的run方法执行完,并顺利返回。 run方法被异常中断。 特殊情况下可以使用stop方法来强制杀死线程,但一般不推荐。 线程的四种状态又可划分为两种:是否属于alive状态。其中runnable和blocked状态是属于alive状态的,而new和dead是 不属于alive状态的,我们可以用isAlive()方法来检查该线程是否处于alive状态。我们无法检查该线程到底是处于runnable还是blocked状态,更区分不了是正处于runnable状态的线程是否正占据着时间片而正在执行中(不过前一章告诉我们可以检测是否处于中断状态!),同样也无法检查到底是处于new还是dead状态。

线程与进程的区别

定义: 进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。

线程是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。同样多线程也可以实现并发操作,每个请求分配一个线程来处理。

进程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。 下图是使用时间片轮转法的操作系统进程的状态和它们之间的转换。 在这里插入图片描述

线程和进程各自有什么区别和优劣呢?

进程是资源分配的最小单位,线程是程序执行的最小单位。

进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。

线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。

但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。

进程状态转换与线程状态转换的区别 一、进程

进程的5种状态:创建态、就绪态、运行态、阻塞态、终止态

创建态完成创建进程的一系列工作进入就绪态。

就绪态除处理机外的其他条件都已具备,等待进程被调度则可进入运行态,若时间片已到或处理机被抢占进程将返回就绪态。

运行态中的进程用“系统调用”的方式申请系统某种资源,或等待某个事件发生时,进程进入阻塞态。该过程时进程主动行为。(运行态----->阻塞态具有单向性)

阻塞态中的进程若其申请的资源得到分配,或等待事件已发生,可重新进入就绪态(阻塞态------>就绪态具有单向性)

运行态中的进程若运行结束或运行中遇到不可修复的错误则进入终止态 在这里插入图片描述

二、线程

线程可有6中状态:新创建、可运行、被阻塞、等待、计时等待、被终止。以下图摘自《Java核心技术》。

在这里插入图片描述

参考

https://blog.csdn.net/horacehe16/article/details/90577539 https://www.cnblogs.com/lvxisha/articles/9714168.html https://blog.csdn.net/internet_register/article/details/73931167 https://www.iteye.com/blog/zydolphin-1292677



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3