经常会有人问线程(或者进程)休眠和阻塞的区别,挂起和阻塞的区别。个人觉得不同的操作系统,会有不同的差异。本文做一个思路的介绍。
进程、线程状态
进程一般分五个状态:创建,就绪,运行,阻塞,结束
线程一般分四个状态:就绪,运行,阻塞,死亡
针对进程或线程各个状态的区别,从名字大概就可以看出来了。针对阻塞、休眠,挂起,又怎么考虑区别呢?实际使用时,经常称呼阻塞后进入挂起,因为可以认为挂起就是一个动作,进入阻塞态或休眠态。休眠和挂起并没有写入线程、进程生命周期的状态。
1、主动,被动角度
阻塞pend是被动,在访问临界资源(锁等)时,被阻塞了
休眠和挂起,一般是主动(或由父进程发起挂起),休眠在休眠时,就知道了计划休眠时长sleep(10),挂起suspend需要等待resume。
时间片到了,也会挂起线程。
2、CPU,内存角度
阻塞会释放CPU,一般不释放内存。
挂起一般会继续占用CPU,一般会释放内存,被转移到外存。
休眠一般会释放CPU,低优先级或其它优先级可以得到执行。也有说sleep()指线程被调用时,占着CPU不工作,形象的说明为“占着CPU”睡觉
3、线程锁等角度
阻塞不会释放锁
挂起会释放锁
休眠也