整个监控就是围绕这些状态标志和行为展开的。A任务定期修改自己的dead标志,dead是一个布尔变量,理论上只要A没有死,那么dead肯定是周期变化的(和心跳概念差不多),M需要做的就是监控dead的变化。为了避免一些偶然因素导致的误判,我们在M中设置了一些计数器和边界值(maydeadtimes和maydeadtimeout),当M发现A的可能死亡次数超过一定限制后,判断A已死亡,不在继续等待了,作为实时处理,首先注销A的实例,然后重新启动A(和我们计算机死机的复位很像),然后进入新一轮监控。
如果是因为系统偶然因素导致A死亡,那么在随后的新的任务启动过程中一般可以顺利完成。但是万一由于环境参数改变或软件升级存在版本缺陷,A可能始终会产生异常,那么M是否需要耐心地监控下去呢?一个形象的例子是:如果你连续3次开机都失败,你是否会怀疑机器有问题?当然,你会,那么M也应该会。
为了对A任务重复多次死亡有一个统计,M中又引入了另外对计数器和边界值(deadtimes和deadtimeout),和你开计算机的过程一样,如果连续n次都发现A有问题,可以基本肯定不是由于偶然因素引起的,需要对A的代码或系统的环境进行检查。M会发出告警,通知必须要对A进行审查了,然后清空A,自己自动退出。如果在核心调度程序中设置一个标志接受M们的告警,就可以有足够理由终止其他任务的执行。可以看见,在A任务发生异常期间,M承担了核心调度程序的维护功能。特别是当任务数量比较多的情况,核心调度程序只能采用排队方式处理任务异常,而且由于处理异常的复杂程度不同,无法保证对多任务异常的实时处理。
还要考虑正常情况下A和M的关系。核心调度程序通过M启动A任务后,M处于持续监控状态,当A正常结束任务后,A需要通知M结束监控,这样,当A进入休眠状态后,M也不会占用内存空间,提高了系统资源的利用率。
通过以上描述,可以看到,上述监控思想具有清晰的概念和可操作性,占用资源少,为保证系统连续稳定运行创造了条件。
具体代码实现附后。
运行结果如下:
异常情况 |
正常情况 |
i=-3: status=true M read A status = true i=-2: status=false M read A status = false i=-1: status=true M read A status = true A become Exception! M read A status = true M read A status = true M read A status = true A is deaded! M is restarting A! ____________________________ i=-3: status=false M read A status = false i=-2: status=true M read A status = true i=-1: status=false M read A status = false A become Exception! M read A status = false M read A status = false M read A status = false A is deaded! M is restarting A! ____________________________ i=-3: status=true M read A status = true i=-2: status=false M read A status = false i=-1: status=true M read A status = true A become Exception! M read A status = true M read A status = true M read A status = true Alert! A is unstable, M will stop it (结束)
|
i=1: status=true M read A status = true i=2: status=false M read A status = false i=3: status=true M read A status = true i=4: status=false M read A status = false i=5: status=true M read A status = true A is Ending M M read A status = true (结束)
| |
通过给制定任务线程增加监控线程,可以很好地解决实时多任务环境下的安全监控问题,同时避免了核心调度线程事务过分复杂的问题。实践证明,该方法复杂度小,占用资源少,运行可靠,适合复杂条件下的多任务环境。
[2]
【责编:Peng】
--------------------next---------------------