开发流程
基本原则
根据图1可知,确定性调度的三个核心要素是确定的计算资源、确定的事件调度器和确定的业务执行。其中确定的事件调度器可由平台和操作系统保证,而确定的计算资源需要根据实际业务场景做好分配和预留、确定的业务执行需要根据业务实际诉求做相应的适配和改造。
- 确定的计算资源
计算资源包括CPU资源、内存资源、双倍数据速率(Double Data Rate,简称DDR)带宽资源,以及AI Core、AI Vector Core、DVPP等硬件加速器资源。若分配给确定业务的计算资源超过预期的占有率,应当扩充计算资源或者限制输入。
- 确定的业务执行
现有的Linux系统是一个基于时间片轮转的公平调度系统,为了保证任务的执行时间是确定的,就需要确保任务的执行过程不会被打断。当前事件调度采用了如下策略:
- 事件调度器确保某个CPU核上只有一个就绪任务,使得操作系统无法切换到其他任务。
- 调度过程中不会抢占已分配给CPU的任务,保证已运行的任务不会被打断。
事件调度器和操作系统调度在调度策略上保证了任务不会被切换后,任务自身还需保证不会主动出让CPU,因此业务代码需保证:
- 没有主动sleep。
- 避免信号量等待。
- 没有其他可能陷入内核态的系统调用。
此外,业务代码在排除主动出让CPU的可能后,还需尽量减少单次执行的时间(暂定不超过10ms),以便其他任务有机会执行。对于业务自己创建的线程,默认归属操作系统调度,不在确定性调度框架范围,因此如需保证确定性,业务需要去除线程,采用OpenHiva接口通信及调度。对于时延敏感的业务(如需确保10ms的间隔),业务需调用OpenHiva的实时定时器接口,并分配独立的CPU资源。
父主题: OpenHiva简介