`
猪圈羊圈
  • 浏览: 37725 次
  • 性别: Icon_minigender_1
  • 来自: 四川
社区版块
存档分类
最新评论

进程与线程状态

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

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(r) 这种方法。新建一个线程并不意味着该线程就能立即进入执行状态(即使是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状态。
分享到:
评论

相关推荐

    MFC的状态 模块状态、进程状态、线程状态。

    MFC 定义了多种状态信息,这里要介绍的是模块状态、进程状态、线程状态。这些状态可以组合在一起,例如 MFC 句柄映射就是模块和线程局部有效的,属于模块-线程状态的一部分。

    2进程和线程.xmind

    进程当前状态 进程优先级 ... 资源分配清单 用于说明有关内存地址空间或虚拟空间的状况, 所打开文件的列表和所使用的输入输出设备信息 处理机相关信息 主要指处理机中个寄存器的...

    c语言多进程多线程编程.pdf

    进程是一个具有独立功能的程序关于某个数据集合的一次而可以并发执行的运行活动,是处于活动状态的计算机程序。进程作为构成系统的基本细胞,不仅是系统内部独立运行的实体,而且是独立竞争资源的基本实体。 进程是...

    易语言多线程监控进程

    易语言多线程监控进程源码,多线程监控进程,获取监视进程状态,进入监视,监视进程进入,监视进程退出,监视进程,关闭线程,发邮件A

    进程线程及堆栈关系的总结

    栈:是个线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立,因此,栈是 thread safe的。每个C ++对象的数据成员也存在在栈中,每个函数都有自己的栈,栈被用来在...

    如何理解Linux中进程,线程等概念

    线程是进程的一条执行路径,它包含独立的堆栈和CPU寄存器状态,每个线程共享其所 附属的进程的所有的资源,包括打开的文件、页表(因此也就共享整个用户态地址空间)、信号标识及动态分配的内存等等。线程和进程的...

    NtQuerySystemInformation判断线程是否被挂起/判断线程状态

    NtQuerySystemInformation判断线程是否被挂起/判断线程状态

    多进程/线程编程:哲学家问题

    多进程/线程编程:哲学家问题。... 显示进程/线程执行状态;  随着线程的执行,更新显示;  编写正确的哲学家程序,设法延迟线程的执行,使之出现死锁;  编写正确的哲学家程序,保证不出现死锁;

    操作形同实验——进程同步和互斥

    (1) 通过编写程序实现进程同步和互斥,掌握有关进程(线程)同步与互斥的原理,以及解决进程(线程)同步和互斥的算法,从而进一步巩固进程(线程)同步和互斥等有关的内容。 (2) 了解Windows2000/XP中多线程的...

    UNIX 多线程多进程编程

    说明:允许调用进程取得子进程的状态信息.调用进程将会挂起直到其 一个子进程终止. 返回值:等待到一个子进程返回时,返回值为该子进程号,否则返回值为 -1.同时stat_loc返回子进程的返回值. 例子:/*父进程*/ if (fork()...

    两篇文章了解进程与线程( 基础篇 )

    一、进程: 1. 进程概念: ...线程实际上是在进程的基础之上的进一步划分,一个进程启动后,里面的若干个程序由可以划分成若干个线程。线程:是进程的一个执行路径,共享一个内存空间,线程之间可以自由切换

    线程池使用介绍用程序可以有多个线程,这些线程在休眠状态中需要耗费大量时间来等待事件发生。其他线程可能进入睡眠状态,并且仅定期被唤醒以轮循更改或更新状态信息,然后再次进入休眠状态

    为了简化对这些线程的管理,.NET框架为每个进程提供了一个线程池,一个线程池有若干个等待操作状态,当一个等待操作完成时,线程池中的辅助线程会执行回调函数。线程池中的线程由系统管理,程序员不需要费力于线程...

    Python 多进程、多线程效率对比

    Python 界有条不成文的准则: 计算密集型任务适合多...而在 IO 密集型任务中,CPU 时常处于等待状态,操作系统需要频繁与外界环境进行交互,如读写文件,在网络间通信等。在这期间 GIL 会被释放,因而就可以使用真正的

    进程和线程的常见面试问题

    图解:要清楚的了解线程状态之间的调度运行关系 状态之间有对应的调度方法 四.线程的实现方式 建议使用实现接口的方式创建多线程 why? 因为实现Runnable接口的方式,更加的符合面向对象,线程分为两部分,一部分...

    xv6源码阅读 进程 线程

    北大 操作系统 xv6源码阅读 进程 线程 非常认真完成的报告

    打通Linux脉络系列:进程、线程和调度.pdf

    1.4 停止状态与作业控制 1.5 内存泄漏的真实含义 1.6 cpulimit 原理 2. 第二部分大纲 2.1 fork 和 vfork 区别 2.2 写时拷贝技术 2.3 Linux线程的实现本质 2.4 孤儿进程的托孤,SUBREAPER 练习题 第三部分...

    Java多线程教程吐血整理干货.md

    进程与线程最主要的区别是它们是操作系统管理资源的不同方式的体现。 准确来说进程与线程属于衍生关系。 进程是操作系统执行程序的一次过程,在这个过程中可能会产生多个线程。 比如在使用QQ时,有窗口线程, 文字...

    图解java多线程

    本文主要讲java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的线程函数用法、概述等。首先让我们来了解下在操作系统中进程和线程的区别:

    操作系统实验一 进程控制

    操作系统进程控制实验源码与...进一步理解进程生命期期间创建、变换、撤销状态变换的过程。掌握进程控制的方法,了解父子进程间的控制和协作关系。练习 Linux 系统中进/线程创建与控制有关的系统调用的编程和调试技术。

    python多线程多进程的常用操作。

    python多线程多进程的常用操作。包括 1. 调用进程 2. 进程池 3. 进程通信 Pipe,Queue 4. 调用线程 5. lock 6. threading.local() 在一个线程内,递归调用函数时,传递参数显得复杂,因此把参数保存在一个字典里,...

Global site tag (gtag.js) - Google Analytics