Task与小根堆timer结合
上一篇文章,我们用小根堆优化了timer设计与实现。今天阅读15-16天章节,内容为挑战多任务。通过阅读,发现多任务管理主要是基于之前实现的timer。最初的设计就是用timer计时,每隔0.02s切换一次进程,后面加入了任务优先级,任务分层优化,是的不同进程分配的运行时间不同。但归根结底,主要是基于之前实现的timer。
ok,那么我们来对比一下,我们优化后的timer和作者提供的timer。改代码,编译,排错。几轮过后,我们的timer和task系统兼容了(其实遇到了一个坑点,开机小概率黑屏,浪费了我2小时debug)
测试时,额外开启的5个进程,左为小根堆timer,右为作者timer。观察可知,除去5号进程相差无几外,其他4个进程运算速度都大幅度提高。
Task设计与实现
这个作者给出的版本,性能还是堪忧。我现在有个未经验证的想法,就是用两个链表来管理task数据。
- 双向环形链表(保存正在运行中的task数据),外加指向正在运行的task数据指针p_curRunTask。
- 单链表(保存未使用的task数据),外加表头p_unusedHead。
新建task时,可做如下操作:
p_taskToAdd
删除task时,可做如下操作:
p_taskToDelete->pre->next = p_taskToDelete->next;
p_taskToDelete->next->pre = p_taskToDelete->pre;
p_taskToDelete->next = p_unusedHead ;
p_unusedHead = p_taskToDelete;
执行task,就是循环遍历环形列表。
依照如此,设计无论新建,删除,执行task都是
,当然还需要改进来适配分层的任务。
就目前来说,由于布娃娃系统,没有过多任务需要并行,所以我还没有把这个代码合入到系统中。如果之后有空闲时间,可以合入代码并验证性能是否能够提升。