关于各种任务状态的实质:
1.挂起:将任务挂起的实质就是1)将当前任务控制块的状态标志改为挂起状态2)将任务就绪表中的对应位置0
3)如果是事件类型,则还会将任务加入到当前的事件等待任务列表中(和就绪表一样的位图)。
4)执行任务调度,让出cpu使用权。这里需要注意的是,任务挂起后任务不是处于占用cpu的状态,不占用CPU资源。以ucos处理为例,如果挂起的是自身任务,比如OSTaskSuspend()挂起自身,那么ucos会执行一次任务调度,因为自身就绪表位置被取消,所以无论何时cpu都不会分配给自身挂起的任务,直到自身任务变为就绪态,任务调度才可能轮到自己。这个在ucos实现挂起的接口OSMBoxPend(),OSQPend(),OSSemPend(),OSTaskSuspend(),OSTimeDly()源码都能体现,挂起自身的任务必然会伴随着下面的任务调度,让出已阻塞的任务,而OSQPend()因可以挂起其他任务,因此当挂起其他任务时不需任务调度。//不要以为阻塞状态下任务还会占用cpu,这个概念无论ucos还是linux是一致的
这里我们也体会到了阻塞和死循环的的区别了:阻塞只在多任务操作系统下能体现,阻塞状态的任务是不会占用cpu的,而死循环这种类似while(1)或者while(条件)&&条件一直不满足的下至少在任务调度之前是一直占有cpu,cpu的占用率达到100%。(时间片轮转比如linux还好些等待调度其他任务还能运行些时间,ucos这种基于优先级的如果当前任务又是最高级就完全在这个任务上了)
2.就绪:将任务改为就绪状态的实质就是将对应任务就绪表对应位置1并将任务控制块状态标志改为就绪状态。