线程的就绪、运行、阻塞
2016-05-18 10:03
281 查看
就绪->运行:调度器选择该线程执行
运行->就绪:该线程时间片用完
就绪队列里面的线程就是在等待时间片,如果时间片轮到自己,就占用CPU;相对的是block队列,里面的线程即使有空闲的CPU也不会分配给它,因为阻塞线程是被外部其他事件所阻塞,比如等待共享锁的释放。
技术上处于等待池和锁定池中的线程都是传统意义上的阻塞状态,只不过为不同的对象所阻塞而已。
等待池是等待一个事件的发生(条件变量),比如等待磁盘I/O的完成,等I/O完成后,会通知一个或全部之前等待的线程,于是这些线程进入锁定池,同样也是阻塞状态。为什么不直接进入运行状态(已锁定)?因为所有线程共享一个mutex/lock,只有锁定池中的一个可以线程幸运的获得锁,进入已锁定状态。所以,等待池中的线程等的是条件变量的触发,锁定池中的线程等的是获得共享锁。这些都是条件变量的特点。
举个少儿不宜的例子,等待池中的线程就像爸爸身体里的上亿个精子,蠢蠢欲动等待爸爸妈妈结合的那一刻 ---> 爸爸妈妈结合的那一刻,精子们终于等到了通知,一个激动全部冲入妈妈的肚子里,此时进入等待锁定池,等待着和妈妈的卵子结合! ---> 最终只有一个幸运的精子可以得到卵子的垂青,结合在一起!此时就是已锁定状态!
运行->就绪:该线程时间片用完
就绪队列里面的线程就是在等待时间片,如果时间片轮到自己,就占用CPU;相对的是block队列,里面的线程即使有空闲的CPU也不会分配给它,因为阻塞线程是被外部其他事件所阻塞,比如等待共享锁的释放。
技术上处于等待池和锁定池中的线程都是传统意义上的阻塞状态,只不过为不同的对象所阻塞而已。
等待池是等待一个事件的发生(条件变量),比如等待磁盘I/O的完成,等I/O完成后,会通知一个或全部之前等待的线程,于是这些线程进入锁定池,同样也是阻塞状态。为什么不直接进入运行状态(已锁定)?因为所有线程共享一个mutex/lock,只有锁定池中的一个可以线程幸运的获得锁,进入已锁定状态。所以,等待池中的线程等的是条件变量的触发,锁定池中的线程等的是获得共享锁。这些都是条件变量的特点。
举个少儿不宜的例子,等待池中的线程就像爸爸身体里的上亿个精子,蠢蠢欲动等待爸爸妈妈结合的那一刻 ---> 爸爸妈妈结合的那一刻,精子们终于等到了通知,一个激动全部冲入妈妈的肚子里,此时进入等待锁定池,等待着和妈妈的卵子结合! ---> 最终只有一个幸运的精子可以得到卵子的垂青,结合在一起!此时就是已锁定状态!
相关文章推荐
- NSNotification、delegate和KVO的区别
- Android QQ第三方登录
- XListView上拉加载下拉刷新
- 如何让Eclipse高亮选中的变量
- MyEclipse连接Mysql数据库的方法(一)
- 前端试题
- NTP时间转换
- iOS tableView编辑删除(单选 多选)
- 递归类继承错误
- protocol buffer安装
- 聚类算法实践(一)——层次聚类、K-means聚类
- ninject 的 实现 的 理解
- 递归类继承错误
- 递归类继承错误
- Trap命令使用说明
- Nginx搭建反向代理服务器过程详解
- yum安装ipPBX系统
- c++ const修饰函数体,修饰返回值,修饰参数,和底层顶层指针的区别的简易
- Matlab2014b与C/C++(VS2013)混合编程
- 关于架构优化和设计,架构师必须知道的事情