怎样理解线程的睡眠,挂起,和阻塞?

本文详细解析了线程的五种状态:新建、就绪、运行、阻塞和死亡,并通过生动的例子阐述了线程的挂起、睡眠和阻塞的区别。帮助读者更好地理解操作系统中线程管理的概念。

怎样理解线程的睡眠,挂起,和阻塞?


线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。

下图是使用时间片轮转法的操作系统进程的状态和它们之间的转换。

 

挂起和睡眠是主动的,挂起恢复需要主动完成,睡眠恢复则是自动完成的,因为睡眠有一个睡眠时间,睡眠时间到则恢复到就绪态。而阻塞是被动的,是在等待某种事件或者资源的表现,一旦获得所需资源或者事件信息就自动回到就绪态。

睡眠和挂起是两种行为,阻塞则是一种状态。

操作系统中睡眠、阻塞、挂起的区别形象解释:

首先这些术语都是对于线程来说的。对线程的控制就好比你控制了一个雇工为你干活。你对雇工的控制是通过编程来实现的。

挂起线程的意思就是你对主动对雇工说:“你睡觉去吧,用着你的时候我主动去叫你,然后接着干活”。

使线程睡眠的意思就是你主动对雇工说:“你睡觉去吧,某时某刻过来报到,然后接着干活”。

线程阻塞的意思就是,你突然发现,你的雇工不知道在什么时候没经过你允许,自己睡觉呢,但是你不能怪雇工,肯定你这个雇主没注意,本来你让雇工扫地,结果扫帚被偷了或被邻居家借去了,你又没让雇工继续干别的活,他就只好睡觉了。至于扫帚回来后,雇工会不会知道,会不会继续干活,你不用担心,雇工一旦发现扫帚回来了,他就会自己去干活的。因为雇工受过良好的培训。这个培训机构就是操作系统。


参考文献

链接https://www.zhihu.com/question/42962803/answer/120217624

<think>嗯,用户想了解线程挂起阻塞的区别,我之前记得系统级指令里要求要用中文回答,并且要结构清晰。首先,我需要确认这两个概念的定义。根据引用[1],睡眠挂起阻塞是三种不同的行为。挂起会让线程进入挂起状态,恢复之后继续执行,期间线程被转移到外存。而阻塞则是线程暂停执行,但线程还在内存中等待。 那它们的资源占用情况呢?挂起线程被移到外存,所以不占内存资源,而阻塞还在内存里。资源释放方面,挂起需要手动干预才能恢复,而阻塞通常是自动的,比如I/O操作完成或锁被释放。 应用场景的话,引用[4]提到阻塞队列自动管理线程阻塞唤醒,可能阻塞常用于等待资源可用。挂起可能用于系统需要释放内存时,比如长时间不活动的线程。 另外,引用[2][3]提到WAITINGBLOCKED状态的区别,BLOCKED是在临界区外等待锁,而WAITING是在内部等待notify。不过用户的问题是关于挂起阻塞,可能需要区分这两者的状态转换。 要注意用户可能混淆挂起其他等待状态,比如睡眠阻塞。需要明确挂起是主动由系统或程序触发,而阻塞通常是被动的,比如等待I/O或锁。 可能还需要比较它们的恢复方式,挂起需要显式恢复,而阻塞可能自动恢复。例如,阻塞在锁的线程会在锁释放时被唤醒,而挂起线程可能需要管理员或调度器干预。 然后,生成相关问题时,要考虑用户可能进一步想了解如何实现挂起阻塞,或者它们的性能影响。比如,如何手动挂起线程,或者阻塞队列的工作原理。 最后,确保引用正确,每个引用对应到正确的部分,比如引用[1]说明挂起阻塞的资源位置,引用[3]提到parkunpark方法,可能挂起有关。引用[5]中的blocker参数可能阻塞的原因分析有关,可以提到定位问题时的区别。 总结回答的结构应该是:定义区别、资源占用、触发原因、恢复方式、应用场景,然后相关问题可以涉及实现方法、状态监控、优化策略等。</think>### 线程挂起 vs 线程阻塞 区别详解 #### 1. **定义与核心区别** - **线程挂起**:指线程被**主动暂停执行**,且其状态(如内存数据)会被转移到外存(如硬盘),直到被显式恢复[^1]。例如,通过`LockSupport.park()`或操作系统调度策略触发。 - **线程阻塞**:指线程因**等待资源或事件**(如I/O完成、锁释放)而暂停执行,但线程仍驻留在内存中,等待条件满足后自动恢复[^1][^2]。例如,调用`Object.wait()`或线程尝试获取锁失败时。 #### 2. **资源占用与状态** | **特性** | **线程挂起** | **线程阻塞** | |----------------|----------------------------------|----------------------------------| | **内存占用** | 不占用内存(移至外存) | 占用内存(保持驻留) | | **资源释放** | 需手动干预恢复(如`unpark`)[^3] | 自动恢复(条件满足时)[^2][^4] | | **触发原因** | 主动调度或内存优化 | 被动等待资源(锁、I/O等)[^2][^4]| #### 3. **典型场景** - **挂起的应用**: - 系统需要释放内存资源时,将长时间不活跃的线程挂起。 - 手动控制线程执行流程(如调试工具暂停线程)[^3]。 - **阻塞的应用**: - 线程等待同步锁(`synchronized`块)或I/O操作完成。 - 使用阻塞队列(`BlockingQueue`)实现生产者-消费者模型。 #### 4. **恢复机制对比** - **挂起恢复**:需外部调用恢复操作(如`LockSupport.unpark()`或信号量),且需重新加载线程状态到内存[^3]。 - **阻塞恢复**:条件满足时自动触发(如锁释放后唤醒等待线程),无需手动干预。 #### 5. **性能影响** - **挂起**:因涉及内存与外存交换,**恢复开销较大**,适用于低频操作[^1]。 - **阻塞**:线程驻留内存,**恢复速度快**,但可能因长时间等待导致资源浪费[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值