你好,游客 登录 注册 搜索
阅读新闻

读了鸿蒙 OS 的代码后我发现优秀项目都有这个共性!

[日期:2019-09-09] 浏览次数:

  最近有人在Github上开源了鸿蒙OS(实际上是LiteOS,LiteOS!)()并且累计获得了一万多颗Star。

  从华为的官方宣传中就提到了“安卓总代码超过一亿行,其中内核代码超过2000万行,实际用到的不过8%,如此庞大和冗余的这种设计,实际上很难保证流畅度,使用效率很低。”

  而笔者之前介绍过的TDengine()做为一个数据库项目更是仅用1.5M安装包就能搞定,代码效率高的惊人。

  不过这两个项目开源后都引发了一些争议,比如鸿蒙开源当天就有人发微博说华为只是做了个安卓的定制版,质量甚至还不如MIUI,笔者的这位创造Github冠军项目的老男人,10年Java工程师100行代码分享学习心得 小白听了很快就入门!,堪称10倍程序员本尊发布后,也有人在评论说TDengine的consumer-productor实现无法通过code review。

  但是仔细阅读这些评论可以发现,这些批评其实都不是基于代码的。笔者做为一名程序员奉行“Talk is cheap,show me the code的理念,老公和我亲热时总是喜欢放些性感美女视频或者就是性感美女的图片。所以我利用周末时间阅读了这两个项目的代码,发现了很多值得学习的设计亮点。

  尤其是鸿蒙OS做为操作系统项目而Tdengine做为数据库项目,比较他们两者在同一模块上的设计异同,非常有收获,下面给各位读者分享一下,如有意见欢迎留言。

  我们知道完整的LINUX内核是支持将任务指定在某个CPU上运行的,不过鸿蒙OS做为一个微内核的移动操作系统没有继承这些复杂的功能,直接做了减法,实现一个最简模型。

  而对比TDengine的调度模块tsched.c,可以看到TDengine更是放弃了任务优先级调度功能,因为做为时序数据库其数据全是按照生成时间排序处理入库的,所以他的只将任务调度模块,仅实现了以下四个功能

  从其循环处理任务的函数(taosProcessSchedQueue),可以看出它只是队尾不断取出任务进行循环处理,而没有优化级调整排序的过程。

  软件定时器,是基于系统Tick时钟中断且由软件来模拟的定时器,当经过设定的Tick时钟计数值后会触发用户定义的回调函数。定时精度与系统Tick时钟的周期有关。

  硬件定时器受硬件的限制,数量上不足以满足用户的实际需求,因此为了满足用户需求,最准单双王最快最准!提供更多的定时器,Huawei LiteOS操作系统提供软件定时器功能。软件定时器扩展了定时器的数量,允许创建更多的定时业务。

  软件定时器是系统资源,在模块初始化的时候已经分配了一块连续的内存,系统支持的最大定时器个数可以在los_config.h文件中配置。

  软件定时器使用了系统的一个队列和任务资源,软件定时器的触发遵循队列规则,先进先出。 定时时间短的定时器总是比定时时间长的靠近队列头,满足优先被触发的准则。

  软件定时器以Tick为基本计时单位,当用户创建并启动一个软件定时器时,Huawei LiteOS会根据当前系统Tick时间及用户设置的定时间隔确定该定时器的到期Tick时间,并将该定时器控制结构挂入计时全局链表。

  当Tick中断到来时,在Tick中断处理函数中扫描软件定时器的计时全局链表,看是否有定时器超时,若有则将超时的定时器记录下来。

  Tick处理结束后,软件定时器任务(优先级为最高)被唤醒,在该任务中调用之前记录下来的超时定时器的处理函数。

  如果官方文档的说明没看懂,可以直接查阅其源代码,具体位置在los_swtmr.c

  首先明确鸿蒙的定时器是为了节省硬件定时器资源而设计的。 由于硬件定时器往往数量有限而系统实际运行中,对于定时器的需求往往高于硬件定时器的数量,所以操作系统都会实现软件定时器以满足用户需求。

  先启动硬件定时器,注册硬件定时器的tick事件,也就是硬件定时器到时发生tick时会调用软件定时器的处理函数。

  在硬件产生tick事件时,取出当时到期的定时器列表,并顺序调起链表内所有到时定时器的处理函数。

  其实Tdengine的timer我之前已经做过解读了,200行代码为大家解读这个Github冠军项目背后的定时器。就不加赘述了,这里把鸿蒙和Tdengine的timer做一下简单的对比:

  节约关键资源:由于每个操作系统的timer都需要一个线程进行回调处理,这对于Tdengine这种数据库动辙几万个timer的应用来说是不可接受的,所以为了节省线程资源,Td要用自己实现的timer之所以要实现自己的定时器是为了节省线程资源。而鸿蒙实现timer则是为了节约硬件定时器资源。

  最简化设计:两个timer都没有优先级的设定。其中鸿蒙OS做为移动操作系统直接将timer的精度值也舍弃了。

  使用双链表提高效率:两个timer都使用双链表来存储同一时刻到期的定时器,这样能节省遍历和移动的时间,大大提高效率。

  从上面这两个简单的模块中我们也看到这些优秀的项目都使用最精简的设计,紧贴需求、甩掉包袱、轻装上阵才能回归本质取得成功。

  无论是TdEngine取消任务调度的优先级排序,还是鸿蒙放弃对定时器精度的支持,都是看来出乎意料,实则颇具内涵的减法操作。真正优秀的项目都是敢于做减法的,只有减掉那些看似高大上的设计,才能向着有取有舍,大道至简的境界迈进。

25777摇钱树论坛| 黄大仙资料| 财神爷心水| 一肖中特| 王中王开奖结果| 开奖结果| 118kjcom开奖| 香港刘伯温| 34123香港马会| 香港马会| 229900夜明珠| 黄大仙提供管家婆挂牌| 金财神高手论坛| 香港大赢家| 311211黄大仙|