恭喜,你发布的帖子
发布于 2022-11-17 20:06:29
17楼
Trace应用和场景分析又一例
这个例子的起因是:今天我无意中仔细看了一眼,前面在3楼发的,大量优先抢断任务的Trace图片。结果无意中瞟到了两个微小细节。这两个细节对于功能是完全无碍的,只是它们的出现超出了我的预料,需要找到原因。
所以这个例子是一个非常合适的,并非事先准备的。借此就着本帖,给大家呈现一下,我是如何结合Trace和FB的结构设计,在一个随时发生的调试场景中,步步收敛,回溯原因的过程,而不是靠脑袋干想,这样的一个真实思考过程。
刚刚分析完,原因已经找到。还是很快的,截了几张图片。就写了这个上传。
1、首先我在Trace中,再现了之前发现的那两处细节场景。
图中这两处4号温控器的执行被1号温控器抢断的场景,和其他一堆抢断情景,有一处不同,那就是:当4号温控器之后再次获得485执行权之后,它执行的任务序号,不是按照我预想的从0开始,而是接续上一次被抢断的断点之后的下一个默认顺序任务来执行的。
其实这样是没问题的,并且还有点自动接续的味道。只是它超出了我懒惰的思考,是什么原因呢?要找到。失控对设计者不是好事,这意味着浑浊和失真,而我喜欢清澈和真相。
图中显示,4号站被抢断的时候,是在它的上一个任务执行完毕之后,iJob回到了-1(看最后一行的红色箭头所指的那个一周期缝隙)。这说明优先权的切换,是按照预定的调度结构被派发出去的,上一个任务也是正确收尾的。
我在前面和在其它帖子中讲过:我的设备FB内部的调度结构是分层解耦架构的。
所以我首先想知道这个现象的紧邻原因是发生在哪一个层中,也就是哪个代码段中。
2、我在Trace增加了几个调度变量,来继续观察和捕捉,这样的场景出现和哪个调度层有关联。于是有了下面这张图片。
图中可以看到,我依然是继续触发了一大堆抢断任务。在最底下一行,我只保留了任务执行前调度这个变量。后面的原因就和它有关。
3、在前面2的Trace中,我的确又找到了两个一样的异常,并且找到了这两个异常的调度关联,与其它那一堆任务的不同之处。就在下面这张图片中。
我在其它主贴中讲过:因为通信属于公共IO资源,所以每一个使用者承担的义务,就是实时要关注别人的情况,这就是公平的代价。
落到程序中就是:在一个设备FB实例获得通信资源使用权之后,在它执行每一个任务之前,之中和之后,都要随时检查全局交互与竞争环境,知己知彼,做出恰如其分的公正判断。
尤其,通信任务都是异步的,跨多个扫描周期。而各种事件,在任一周期都随时可能出现。所以,调度结构需要尽量面面俱到,圆满无漏。这就和中国人团聚的时候,三老四少圆桌围坐,菜品高低搭配层次齐全;或者无论是建筑还是做事做人,讲究上下左右高低前后,层次和布局工整对称,一样的道理。尤其看古代精品建筑的结构,无不彰显多角度多层次观察和呈现事物的智慧,千手千眼。所谓中庸之海纳百川,也就是设计中的无为而无不为。这就是调度体系分层设计的一种理由,为了均衡。
在上图中,我发现这两处异常,和其它所有优先抢断的不同之处都有一个特点:优先权切换都是在执行前调度这个环节发生的。其它所有正常切换如预料的,都不是从这个层派发的。于是,溯源焦点被收缩到执行前这个环节。
4、执行前调度的状态,其实是和执行后调度的状态关联的。
因为下一个任务执行前的调度,一定是和上一个任务执行完毕后的调度,相关联的,那是历史信息的来源。于是,溯源焦点被转移到执行后调度这个环节。
5、在执行后调度这个层中,有一个变量,是除了iJob之外,记录下一个任务序号的。
那么这个异常的出现,一定和这个变量的使用场合有关。而这个变量就是被用在执行前调度中。于是,溯源焦点又再次被转移回执行前这个环节。
6、在执行前调度层中,在优先权切换这个调度元素中,这个变量没有被复位,这就是最终的原因。
这个变量是用来给iJob赋值的,因为没有复位,所以下一次再获得执行权的时候,iJob就会按照下一个默认次序来执行,而不是从0开始。
所以,只要在这个调度元素中,加入一个简单的赋值语句来给这个变量复位,就OK了。当然了,改不改都可以,关键是找到原因,本来也没啥影响。
那么为什么会出现这种异常呢?
首先因为:这个异常不会引起任何功能障碍,所以在使用层面觉察不到。我在调试中,很多时候也懒得去看那些不引起我注意的无关环节。
所谓分层解耦架构的意义就在这里:特定的异常,总是和特定的层与元素相关。与逻辑回溯路径相关的层,它们以外的其它层和元素,是根本不用考虑和改动的。赖人喜欢这样。
这就是我前面提到的:可能性的收窄设计,强化可溯源的因果链。效率就是这样来的。
写这段帖子,比回溯原因还费事。
-----------------------------------------------------------------------------------------------
不知道诸位看了上面分析过程的描述,是否意识到:Trace对于精雕和塑造程序员的设计风格和思考习惯,会有怎样的影响。
愚公移山,积跬步至千里。没啥特殊的,就是一锹一锹的挖。生活中,传统中华文化中,无数匠人和贤者做得好太多了。虽说是现代科技,但是跑不出五千年的长河智慧。
我英语水平还可以,有很多东西就是从英文源头学的。在我的视野和经验中,这个地球上,对于数据和结构的精准把控,玩的最好,规模最大的,就是美国人。数据和描述的精准把握,玩儿到底儿掉,非常透彻。在这方面,他们的一丝不苟和傻乎乎的经年累月的不变执行,和中国古人的理念有异曲同工。
美国是世界上最大规模的标准化国家,这个国家的运转就是一个庞大的标准化机器,欧洲远远比不了,这是我接触他们工业底层的做事细节,得出的总结。人们总关注高科技成果,那只是在大的标准化体系平台上催生的具体产品。这底蕴才是他们最大优势的根基。中国人很聪明,但是短板就在这。这世上的根技术和诸多统治性技术标准都是出自美国,是有原因的。
本来谈数据精确回溯,一堆没用的越扯越多。
后面的感想不见得完全正确哦。有些偏颇。
所谓标准的推行、应用,实际上是商家在市场博弈中,由应用市场用户决定的。
一套标准再合理、再完备,只要没有市场,那个标准就只能“束之高阁”;“5G”就是这样呀。尽管通过了,只要抑制市场,标准的用处就不大。
反观微软就很“聪明”,管它正版盗版,只要市场全面铺开了,我就是标准,尽管里面有些不合理、不完备(总要补漏)之处。
西门子也一样,只要市场做得足够大,他就是标准。
我们是快速发展的发展中国家。
在数字化过程中,一方面,时间不等人,做不到“十年磨一剑”;
另一方面,又有许许多多地方需要创新。只能加倍的努力。借鉴别人实践过的标准,站在“巨人”的肩膀上。
精华帖版主置评:这个发言真是太精彩了。kdrjl
请填写推广理由:
分享
只看
楼主