“阻塞(pend)”与“挂起(suspend)”的区别?

 

  • 理解一:挂起是一种主动行为,因此恢复也应该要主动完成,而阻塞则是一种被动行为,是在等待事件或资源时任务的表现,你不知道他什么时候被阻塞(pend),也就不能确切的知道他什么时候恢复阻塞。而且挂起队列在操作系统里可以看成一个,而阻塞队列则是不同的事件或资源(如信号量)就有自己的队列。
  • 理解二:阻塞(pend)就是任务释放CPU,其他任务可以运行,一般在等待某种资源或信号量的时候出现。挂起(suspend)不释放CPU,如果任务优先级高就永远轮不到其他任务运行,一般挂起用于程序调试中的条件中断,当出现某个条件的情况下挂起,然后进行单步调试。
  • 理解三:pend是task主动去等一个事件,或消息.suspend是直接悬挂task,以后这个task和你没任何关系,任何task间的通信或者同步都和这个suspended task没任何关系了,除非你resume task;
  • 理解四:任务调度是操作系统来实现的,任务调度时,直接忽略挂起状态的任务,但是会顾及处于pend下的任务,当pend下的任务等待的资源就绪后,就可以转为ready了。ready只需要等待CPU时间,当然,任务调度也占用开销,但是不大,可以忽略。可以这样理解,只要是挂起状态,操作系统就不在管理这个任务了。
  • 理解五:挂起是主动的,一般需要用挂起函数进行操作,若没有resume的动作,则此任务一直不会ready。而阻塞是因为资源被其他任务抢占而处于休眠态。两者的表现方式都是从就绪态里“清掉”,即对应标志位清零,只不过实现方式不一样。
操作系统中睡眠、阻塞、挂起的区别形象解释
首先这些术语都是对于线程来说的。对线程的控制就好比你控制了一个雇工为你干活。你对雇工的控制是通过编程来实现的。
挂起线程的意思就是你对主动对雇工说:“你睡觉去吧,用着你的时候我主动去叫你,然后接着干活”。
使线程睡眠的意思就是你主动对雇工说:“你睡觉去吧,某时某刻过来报到,然后接着干活”。
线程阻塞的意思就是,你突然发现,你的雇工不知道在什么时候没经过你允许,自己睡觉呢,但是你不能怪雇工,肯定你这个雇主没注意,本来你让雇工扫地,结果扫帚被偷了或被邻居家借去了,你又没让雇工继续干别的活,他就只好睡觉了。至于扫帚回来后,雇工会不会知道,会不会继续干活,你不用担心,雇工一旦发现扫帚回来了,他就会自己去干活的。因为雇工受过良好的培训。这个培训机构就是操作系统。

 

### 关于HarmonyOS中Suspend的概念与用法 在HarmonyOS系统中,`suspend` 是一种线程状态,表示线程处于阻塞挂起的状态。这种状态下,线程不会占用CPU资源,直到特定条件满足或者被显式唤醒为止[^3]。 #### Suspend的具体含义 当提到 `suspend` 时,通常指的是线程由于某些原因而进入的一种被动等待状态。例如,在多任务环境中,如果某个线程正在等待某种同步机制(如锁、事件或信号量),它可能会进入 `pend` 或者 `suspend` 状态。具体来说: - **Pend**: 表示线程因请求锁、事件或其他同步对象未成功而导致的阻塞。 - **Suspend**: 主动挂起线程执行,通常是通过API调用来实现的。 - **Delay**: 延迟一段时间后再继续执行。 - **PendTime**: 类似于 `pend`,但带有超时机制。 这些状态都属于线程阻塞态,意味着它们暂时无法参与调度。 #### 在后台任务中的应用 对于后台任务开发而言,合理管理线程生命周期非常重要。特别是在涉及长时间运行的任务(比如音乐播放器)时,开发者可以利用 HarmonyOS 提供的相关功能来优化性能并减少不必要的资源消耗。例如,应用程序可以通过 `setAVPlaybackState` 将其音频播放状态通知给系统,从而让系统更好地协调前台和后台活动之间的切换[^2]。 另外需要注意的是,在 Stage 模型下,虽然 ServiceExtensionAbility 不允许直接由第三方调用,但是仍然存在其他方式用于构建后台服务逻辑[^4]。这表明即使不能直接操作某些受限组件,也可以借助官方推荐的方法完成类似的功能需求。 以下是关于如何处理线程暂停的一个简单例子: ```java // Java 示例:模拟线程挂起恢复过程 public class ThreadExample { public static void main(String[] args) throws InterruptedException { MyThread myThread = new MyThread(); // 启动线程 myThread.start(); // 让主线程休眠一秒再尝试停止子线程 Thread.sleep(1000); System.out.println("Main thread suspending child..."); myThread.suspend(); // 继续等待两秒后重新激活子线程 Thread.sleep(2000); System.out.println("Main thread resuming child..."); myThread.resume(); } } class MyThread extends Thread { @Override public void run() { int count = 0; while (true){ synchronized(this){ try{ notifyAll(); wait(); }catch(Exception e){} System.out.println(++count+" times running."); } } } public void suspend(){ interrupt(); // 中断线程使其退出循环体外层判断部分 } public void resume(){ synchronized(this){ this.notify(); // 唤醒此实例上的单个线程 } } } ``` 上述代码片段展示了基本的线程控制技巧,尽管实际项目里可能更倾向于采用现代并发库而非原始方法来进行此类操作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值