线程到底有哪些状态?怎么区别呢?

飞翔的土豆 2010-02-18 05:35:13
看《windows操作系统原理》一书中说到线程有7种状态:
就绪ready
备用standby
运行running
等待waiting
转换transition
终止terminated
初始化initialized

从网上一些教程看到线程分为5种状态:
运行、挂起、睡眠、阻塞、终止。

好像还有其他叫法~~~在下小白新学windows系统原理,实在搞不清这些叫法的意思和区别了,望各位大哥给讲解下,或者开个传送门能让俺了解真相!谢谢!!
...全文
643 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞翔的土豆 2010-02-18
  • 打赏
  • 举报
回复
5楼的解释很清晰,先MARK下,回头慢慢体会
WizardK 2010-02-18
  • 打赏
  • 举报
回复
不同的平台对线程的状态定义不同,大致可以定义为运行、挂起、睡眠、阻塞、就绪、终止这六种。
运行:不用解释了,就是线程获得了CPU的控制权,正在执行计算。
挂起:一般是指被挂起,因为同一时刻,需要“同步”运行的线程不止他一个,所以基于时间片轮转的原则,他在独占了一段时间的CPU后,被挂起,线程环境被压栈。
睡眠:一般是指主动挂起,这种情况在WINDOWS平台不存在。
阻塞:与挂起和睡眠类似,都是失去CPU的控制权。与挂起更相像,也是被挂起的。不同之处在于,被挂起的线程没有额外的表示,而被阻塞的线程会被记录下来,当等待的因素就绪后,线程会转为就绪状态。例如你在线程中调用一些类似WAITFORSINGLEOBJECT的系统服务函数,会引起线程控制权的一次裁决,从而挂起本线程,造成本线程的阻塞。挂起、睡眠、阻塞看起来差不多,但其实本质上还是有以上所述的区别的。
就绪:顾名思义,就是指他准备好了,一旦轮到他,他就可以转为运行状态。
终止:这个也没啥可解释的。

就绪->运行->挂起/睡眠/阻塞->就绪->...->终止
飞翔的土豆 2010-02-18
  • 打赏
  • 举报
回复
引用 3 楼 csl312211865 的回复:
引用 2 楼 r06041210 的回复:
请问“阻塞:线程由于发生I/O或者其他的操作导致无法继续执行,就放弃处理机,转入线程就绪队列”为什么从阻塞状态下就转入就绪队列了呢?
还有就是挂起到底是进入那种状态呢?
貌似suspend和sleep两个API都有,2者又有何区别呢?从阻塞状态转到就绪,那说明I/O操作完成了,线程运行需要的数据都已准备完毕,只待获得CPU时间片,所以从阻塞到就绪。
至于挂起,一般是进入就绪状态。因为人为中断和操作系统干预线程的执行,都是在线程执行中,给他中断了,也就是说他本来可以继续运行下去,但是外界给他干预,要他停下,所以这种线程一般不缺资源,进入的是就绪状态。

阻塞的概念差不多明确了,那请问下:挂起的线程不是需要resume才会继续下去吗?如果进入了就绪状态,那岂不是会被重新调度执行了?还有就是看到书上讲线程被挂起多少次就要被唤醒多少次才能继续,这貌似也不太符合您说的那种情况??
csl312211865 2010-02-18
  • 打赏
  • 举报
回复
引用 2 楼 r06041210 的回复:
请问“阻塞:线程由于发生I/O或者其他的操作导致无法继续执行,就放弃处理机,转入线程就绪队列”为什么从阻塞状态下就转入就绪队列了呢?
还有就是挂起到底是进入那种状态呢?
貌似suspend和sleep两个API都有,2者又有何区别呢?
从阻塞状态转到就绪,那说明I/O操作完成了,线程运行需要的数据都已准备完毕,只待获得CPU时间片,所以从阻塞到就绪。
至于挂起,一般是进入就绪状态。因为人为中断和操作系统干预线程的执行,都是在线程执行中,给他中断了,也就是说他本来可以继续运行下去,但是外界给他干预,要他停下,所以这种线程一般不缺资源,进入的是就绪状态。
飞翔的土豆 2010-02-18
  • 打赏
  • 举报
回复
引用 1 楼 xsc2001 的回复:
理论上可能有那么多,但是实际程序中就有四种即:
就绪:线程分配了CPU以外的全部资源,等待获得CPU调度
执行:线程获得CPU,正在执行
阻塞:线程由于发生I/O或者其他的操作导致无法继续执行,就放弃处理机,转入线程就绪队列
挂起:由于终端请求,操作系统的要求等原因,导致挂起

请问“阻塞:线程由于发生I/O或者其他的操作导致无法继续执行,就放弃处理机,转入线程就绪队列”为什么从阻塞状态下就转入就绪队列了呢?
还有就是挂起到底是进入那种状态呢?
貌似suspend和sleep两个API都有,2者又有何区别呢?
xsc2001 2010-02-18
  • 打赏
  • 举报
回复
理论上可能有那么多,但是实际程序中就有四种即:
就绪:线程分配了CPU以外的全部资源,等待获得CPU调度
执行:线程获得CPU,正在执行
阻塞:线程由于发生I/O或者其他的操作导致无法继续执行,就放弃处理机,转入线程就绪队列
挂起:由于终端请求,操作系统的要求等原因,导致挂起

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧