代码改变世界

阻塞 cpu占用

2011-03-16 17:29  Dirichlet  阅读(2146)  评论(0编辑  收藏  举报

请问,windowsxp系统下,有一个线程A,此线程中需要wait一个信号,我有以下观点,请大家帮我判断一下我的观点对不对,谢谢!如果我用阻塞方式,则一旦轮到这个线程执行,os只要发现这个线程所wait的信号没有到达,则立即跳转到其他线程执行,当前线程连挂起都不用,是么?。如果用非阻塞模式,则轮到这线程执行的时候,如果没有wait到这个信号,则cpu跳过wait,继续执行这个线程,直到执行到下一个阻塞点或者时间片到时,是么?谢谢!



www.cqzol.com网友回答:如果线程在等待某个事件,内核会将其放入等待列表,直到收到事件信号。操作系统在切换线程时不会考虑等待列表中的线程,只会考虑就绪列表中的线程。

 

// 问题:那么等待列表中的线程什么时候放到就绪列表中?是操作系统每次切换的时候都检查一下吗?还是用中断?

// 回答:请看下面UCOSIII解释,os里的5个默认任务之一的时钟节拍任务会检查等待列表中的线程是否可以就绪。

 

UCOSIII默认有5个系统任务:

    1、空闲任务:UCOSIII创建的第一个任务,UCOSIII必须创建的任务,此任务有UCOSIII自动创建,不需要用户手动创建。

2、时钟节拍任务:此任务也是必须创建的任务。遍历所有在等待延时结束或指定时间内等待某个内核对象的任务,及遍历节拍列表。

   ① 插入节拍列表:

      dly 为要延时或等待的时间;

      MatchValue = OSTickCtr +dly

      节拍列表下标 = MatchValue %表格长度

该表是一个环形表,取模运算时一表格长度为模,将任务插入节拍列表中,在同一下标下按照延时或等待的时间长短排序。

   ② 每个节拍中断都会给此任务一个信号让其执行,通过对OSTickCtr求模(同上),找到对应的位置,与.TickCtrMatch比较是否相同,若相同就把相应的OS_TCB从时钟列表中删除,如果是等待延时,会把它放入就绪列表中;如果是等待某一事件,还需要将其从等待列表中删除;接着继续一本下标的下一个任务控制块比较。若不同则结束返回函数。

    3、统计任务:可选任务,用来统计CPU使用率和各个任务的堆栈使用量。此任务是可选任务,由宏OS_CFG_STAT_TASK_EN控制是否使用此任务。可以统计CPU利用率

    4、定时任务:用来向用户提供定时服务,也是可选任务,由宏OS_CFG_TMR_EN控制是否使用此任务。计时减到零会调用回调函数进行一系列操作。

5、中断服务管理任务:可选任务,由宏OS_CFG_ISR_POST_DEFERRED_EN控制是否使用此任务。当ISR调用UCOS_III中的“post”函数,要发送数据的副本和发送的目的地都会存入一个特别的缓冲队列中,当ISR执行完毕后,任务切换到中断服务管理任务,该任务会把存放的信息重发给相应的任务。做额外的这一步可以减少中断关闭的时间;否则,在ISR中还需要把任务从等待列表中删除,并把任务放在就绪表中,以及一些耗时的操作。