阻塞:(被动) 挂起(主动) 睡眠(主动)

共同本质:

阻塞:(被动)

挂起(主动)

睡眠(主动)

共同本质:

正在执行的进程/线程,由于某些原因(主、被动)释放CPU,暂停执行

(这里讨论的均是处于运行状态的进/线程)

阻塞:(被动)

进/线程被动暂停执行,阻塞的进程仍处于内存中,OS把处理机分配给另一个就绪进程,而让被暂停的进程处于暂停状态。

(自动)阻塞恢复:需要在等待的资源得到满足(例如获得了锁)后,才会进入就绪状态,等待被调度而执行。

阻塞原因:

进程:进程由于提出系统服务请求(如I/O操作),但因为某种原因未得到操作系统的立即响应,或者需要从其他合作进程获得的数据尚未到达等原因。

线程:线程锁问题。

挂起(主动)

用户主动暂停执行进/线程,挂起的进程被换出到外存(磁盘)中。

挂起恢复:需要用户主动控制,挂起时线程不会释放对象锁。

挂起原因:

          终端用户的请求。当终端用户在自己的程序运行期间发现有可疑问题时,希望暂停使自己的程序静止下来。亦即,使正在执行的进程暂停执行;若此时用户进程正处于就绪状态而未执行,则该进程暂不接受调度,以便用户研究其执行情况或对程序进行修改。我们把这种静止状态成为“挂起状态”。

          父进程的请求。有时父进程希望挂起自己的某个子进程,以便考察和修改子进程,或者协调各子进程间的活动。

          负荷调节的需要。当实时系统中的工作负荷较重,已可能影响到对实时任务的控制时,可由系统把一些不重要的进程挂起,以保证系统能正常运行。

          操作系统的需要。操作系统有时希望挂起某些进程,以便检查运行中的资源使用情况或进行记账。

          对换的需要。为了缓和内存紧张的情况,将内存中处于阻塞状态的进程换至外存上。

睡眠(主动)

用户主动暂停执行进/线程,睡眠进/线程任存于内存。

睡眠恢复:是自动完成的,睡眠时间到了则恢复到就绪态,睡眠时线程不会释放对象锁。

eg: Thread.sleep(1000);

//将线程睡眠一秒。

你可能感兴趣的:(阻塞:(被动) 挂起(主动) 睡眠(主动))