共同本质:
阻塞:(被动)
挂起(主动)
睡眠(主动)
共同本质:
正在执行的进程/线程,由于某些原因(主、被动)释放CPU,暂停执行
(这里讨论的均是处于运行状态的进/线程)
阻塞:(被动)
进/线程被动暂停执行,阻塞的进程仍处于内存中,OS把处理机分配给另一个就绪进程,而让被暂停的进程处于暂停状态。
(自动)阻塞恢复:需要在等待的资源得到满足(例如获得了锁)后,才会进入就绪状态,等待被调度而执行。
阻塞原因:
进程:进程由于提出系统服务请求(如I/O操作),但因为某种原因未得到操作系统的立即响应,或者需要从其他合作进程获得的数据尚未到达等原因。
线程:线程锁问题。
挂起(主动)
用户主动暂停执行进/线程,挂起的进程被换出到外存(磁盘)中。
挂起恢复:需要用户主动控制,挂起时线程不会释放对象锁。
挂起原因:
终端用户的请求。当终端用户在自己的程序运行期间发现有可疑问题时,希望暂停使自己的程序静止下来。亦即,使正在执行的进程暂停执行;若此时用户进程正处于就绪状态而未执行,则该进程暂不接受调度,以便用户研究其执行情况或对程序进行修改。我们把这种静止状态成为“挂起状态”。
父进程的请求。有时父进程希望挂起自己的某个子进程,以便考察和修改子进程,或者协调各子进程间的活动。
负荷调节的需要。当实时系统中的工作负荷较重,已可能影响到对实时任务的控制时,可由系统把一些不重要的进程挂起,以保证系统能正常运行。
操作系统的需要。操作系统有时希望挂起某些进程,以便检查运行中的资源使用情况或进行记账。
对换的需要。为了缓和内存紧张的情况,将内存中处于阻塞状态的进程换至外存上。
睡眠(主动)
用户主动暂停执行进/线程,睡眠进/线程任存于内存。
睡眠恢复:是自动完成的,睡眠时间到了则恢复到就绪态,睡眠时线程不会释放对象锁。
eg: Thread.sleep(1000);
//将线程睡眠一秒。
网友评论