计算头条:华为的鸿蒙操作系统为什么比安卓速度快60%

7月5日,华为创始人任正非接受法国著名新闻周刊《观点》专访。在长达15页的专访报道中,任正非谈到了许多问题,比如5G技术发展、中美关系、中欧关系和地缘政治等,其中还包括大家非常关注的鸿蒙系统。《观点》以“这个人将改变历史”为标题刊登了任正非的肖像照,并以长达15页的篇幅,对任正非本人以及华为进行了详细的专题报道,内容涉及了5G技术发展、中美关系、中欧关系以及地缘政治等问题。任正非在专访中介绍了自己的个人经历以及华为的发展历程和方向。同时,他就西方国家在华为与国家安全方面的担忧和质疑,做出了回应。

 

在专访中,任正非透露,华为自主研发的操作系统“鸿蒙”旨在应用于多种设备,这也证实了此前的传言。任正非表示:“我们正在研发的操作系统能够与印刷电路板、交换机、路由器、智能手机以及数据中心等兼容。”


对于鸿蒙系统,任正非表示,“该系统的处理延迟小于5毫秒。它将完美地适应物联网,还能够应用于自动驾驶。”任正非指出:“我们构建这个系统,为的是能够同步连接所有对象。这就是我们走向智能社会的方式。”

华为的鸿蒙操作系统为什么比安卓速度快60%?现在从程序角度去看:

 

1.鸿蒙OS的调度模块
与一般操作系统一样,鸿蒙也将任务状态通常分为以下三种:
  • 就绪(Ready):

    该任务在就绪列表中,只等待CPU。

 
  • 运行(Running):

    该任务正在执行。

 
  • 阻塞(Blocked):

    该任务不在就绪列表中。

    包含任务被挂起、任务被延时、任务正在等待信号量、读写队列或者等待读写事件等。

 

 

 

 

其代码位置在los_task.c,以任务恢复函数LOS_TaskResume为例,其代码如下:

 
LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskResume(UINT32 uwTaskID)
{
    UINTPTR uvIntSave;
    LOS_TASK_CB *pstTaskCB;
    UINT16 usTempStatus;
    UINT32 uwErrRet = OS_ERROR;

    if (uwTaskID > LOSCFG_BASE_CORE_TSK_LIMIT)
    {
        return LOS_ERRNO_TSK_ID_INVALID;
    }

    pstTaskCB = OS_TCB_FROM_TID(uwTaskID);
    uvIntSave = LOS_IntLock();
    usTempStatus = pstTaskCB->usTaskStatus;

    if (OS_TASK_STATUS_UNUSED & usTempStatus)
    {
        uwErrRet = LOS_ERRNO_TSK_NOT_CREATED;
        OS_GOTO_ERREND();
    }
    else if (!(OS_TASK_STATUS_SUSPEND & usTempStatus))
    {
        uwErrRet = LOS_ERRNO_TSK_NOT_SUSPENDED;
        OS_GOTO_ERREND();
    }
    //以上为任务状态检查
    pstTaskCB->usTaskStatus &= (~OS_TASK_STATUS_SUSPEND);//清除任务的suspend标志位置
    if (!(OS_CHECK_TASK_BLOCK & pstTaskCB->usTaskStatus) )//若任务的还自在阻塞状态则变为就绪状态 ,并调用 LOS_Schedule()进行调度
    {
        pstTaskCB->usTaskStatus |= OS_TASK_STATUS_READY;
        LOS_PriqueueEnqueue(&pstTaskCB->stPendList, pstTaskCB->usPriority);
        if (g_bTaskScheduled)
        {
            (VOID)LOS_IntRestore(uvIntSave);
            LOS_Schedule();
            return LOS_OK;
        }
        g_stLosTask.pstNewTask = LOS_DL_LIST_ENTRY(LOS_PriqueueTop(), LOS_TASK_CB, stPendList); /*lint !e413*/
    }

    (VOID)LOS_IntRestore(uvIntSave);
    return LOS_OK;

LOS_ERREND:
    (VOID)LOS_IntRestore(uvIntSave);
    return uwErrRet;
}
 我们看到这个函数的处理过程基本分为三步:
  • 任务合法性(TaskId)及任务状态校验:判断任务序号以及任务当前状态是否确实为挂起。

 
  • 改变任务状态:将任务的suspend状态位清掉

 
  • 起用任务调度:如果任务被阻塞,则调起LOS_Schedule进行调度。

 
我们知道完整的LINUX内核是支持将任务指定在某个CPU上运行的,不过鸿蒙OS做为一个微内核的移动操作系统没有继承这些复杂的功能,直接做了减法,实现一个最简模型。
2.TdEngine的任务调度模块    
而对比TDengine的调度模块tsched.c,可以看到TDengine更是放弃了任务优先级调度功能,因为做为时序数据库其数据全是按照生成时间排序处理入库的,所以他的只将任务调度模块,仅实现了以下四个功能
  • 初始化任务队列

 
  • 加入任务

 
  • 循环处理任务

 
  • 销毁任务队列

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

 
void *taosProcessSchedQueue(void *param) {
  SSchedMsg    msg;
  SSchedQueue *pSched = (SSchedQueue *)param;

  while (1) {
    if (sem_wait(&pSched->fullSem) != 0) {
      pError("wait %s fullSem failed, errno:%d, reason:%s", pSched->label, errno, strerror(errno));
      if (errno == EINTR) {
        /* sem_wait is interrupted by interrupt, ignore and continue */
        continue;
      }
    }

    if (pthread_mutex_lock(&pSched->queueMutex) != 0)
      pError("lock %s queueMutex failed, reason:%s", pSched->label, strerror(errno));

    msg = pSched->queue[pSched->fullSlot];
    memset(pSched->queue + pSched->fullSlot, 0, sizeof(SSchedMsg));
    pSched->fullSlot = (pSched->fullSlot + 1) % pSched->queueSize;//从队尾取出消息不断处理

    if (pthread_mutex_unlock(&pSched->queueMutex) != 0)
      pError("unlock %s queueMutex failed, reason:%s\n", pSched->label, strerror(errno));

    if (sem_post(&pSched->emptySem) != 0)
      pError("post %s emptySem failed, reason:%s\n", pSched->label, strerror(errno));

    if (msg.fp)
      (*(msg.fp))(&msg);
    else if (msg.tfp)
      (*(msg.tfp))(msg.ahandle, msg.thandle);
  }
}

int taosScheduleTask(void *qhandle, SSchedMsg *pMsg) {
  SSchedQueue *pSched = (SSchedQueue *)qhandle;
  if (pSched == NULL) {
    pError("sched is not ready, msg:%p is dropped", pMsg);
    return 0;
  }

  if (sem_wait(&pSched->emptySem) != 0) pError("wait %s emptySem failed, reason:%s", pSched->label, strerror(errno));

  if (pthread_mutex_lock(&pSched->queueMutex) != 0)
    pError("lock %s queueMutex failed, reason:%s", pSched->label, strerror(errno));

  pSched->queue[pSched->emptySlot] = *pMsg;
  pSched->emptySlot = (pSched->emptySlot + 1) % pSched->queueSize;

  if (pthread_mutex_unlock(&pSched->queueMutex) != 0)
    pError("unlock %s queueMutex failed, reason:%s", pSched->label, strerror(errno));

  if (sem_post(&pSched->fullSem) != 0) pError("post %s fullSem failed, reason:%s", pSched->label, strerror(errno));

  return 0;
}
  
两个项目对于定时器(timer)的实现对比
 
1.鸿蒙的timer
在鸿蒙的官方文档中是这么介绍定时器的:
软件定时器,是基于系统Tick时钟中断且由软件来模拟的定时器,当经过设定的Tick时钟计数值后会触发用户定义的回调函数。定时精度与系统Tick时钟的周期有关。 
硬件定时器受硬件的限制,数量上不足以满足用户的实际需求,因此为了满足用户需求,提供更多的定时器,Huawei LiteOS操作系统提供软件定时器功能。软件定时器扩展了定时器的数量,允许创建更多的定时业务。
2.运作机制
  • 软件定时器是系统资源,在模块初始化的时候已经分配了一块连续的内存,系统支持的最大定时器个数可以在los_config.h文件中配置。

 
  • 软件定时器使用了系统的一个队列和任务资源,软件定时器的触发遵循队列规则,先进先出。

    定时时间短的定时器总是比定时时间长的靠近队列头,满足优先被触发的准则。

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

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

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

 
3.代码解读
如果官方文档的说明没看懂,可以直接查阅其源代码,具体位置在los_swtmr.c
下面笔者来简述一下鸿蒙定时器的工作原理。
  • 首先明确鸿蒙的定时器是为了节省硬件定时器资源而设计的。

    由于硬件定时器往往数量有限而系统实际运行中,对于定时器的需求往往高于硬件定时器的数量,所以操作系统都会实现软件定时器以满足用户需求。

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

 
  • 将在同一时刻到期的timer放在同一链表中。

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

 

 
LITE_OS_SEC_TEXT VOID osSwTmrTask(VOID)
{
    SWTMR_HANDLER_ITEM_P pstSwtmrHandle = (SWTMR_HANDLER_ITEM_P)NULL;
    SWTMR_HANDLER_ITEM_S stSwtmrHandle;
    UINT32 uwRet;

    for ( ; ; )
    {
        uwRet = LOS_QueueRead(m_uwSwTmrHandlerQueue, &pstSwtmrHandle, sizeof(SWTMR_HANDLER_ITEM_P), LOS_WAIT_FOREVER);
        if (uwRet == LOS_OK)
        {
            if (pstSwtmrHandle != NULL)
            {
                stSwtmrHandle.pfnHandler = pstSwtmrHandle->pfnHandler;
                stSwtmrHandle.uwArg = pstSwtmrHandle->uwArg;
                (VOID)LOS_MemboxFree(m_aucSwTmrHandlerPool, pstSwtmrHandle);
                if (stSwtmrHandle.pfnHandler != NULL)
                {
                    stSwtmrHandle.pfnHandler(stSwtmrHandle.uwArg);
                }
            }
        }
    }//end of for
}

以上函数的运行原理动画解析如下:

4.timer之间的对比
其实Tdengine的timer我之前已经做过解读了,200行代码为大家解读这个Github冠军项目背后的定时器。就不加赘述了,这里把鸿蒙和Tdengine的timer做一下简单的对比:
节约关键资源:由于每个操作系统的timer都需要一个线程进行回调处理,这对于Tdengine这种数据库动辙几万个timer的应用来说是不可接受的,所以为了节省线程资源,Td要用自己实现的timer之所以要实现自己的定时器是为了节省线程资源。而鸿蒙实现timer则是为了节约硬件定时器资源。
最简化设计:两个timer都没有优先级的设定。其中鸿蒙OS做为移动操作系统直接将timer的精度值也舍弃了。
使用双链表提高效率:两个timer都使用双链表来存储同一时刻到期的定时器,这样能节省遍历和移动的时间,大大提高效率。

(本文由中国计算网总编栾玲编辑录入《超算AI数据库》  转载请注明出处)

 

相关新闻焦点

计算头条:华为物联网芯片专家刘石创业史

计算头条:腾讯在5G大数据时代如何影响生活

计算头条:创投人士为什么关注医疗人工智能

计算头条:蓝海创意与国家超算协同发展的生态模式很赞

计算头条:算法工程师紧缺,看看改变世界的十位算法大师

计算头条:工业专家杜玉河指出硬件需要应用创新

计算头条:融资1.5亿美金高思教育开始招骋算法工程师

计算头条:e-works黄培李培根参加2019工业APP创新应用大赛

计算头条:京东天猫流量比拼说明私域流量流行

计算头条:张云泉教授所在超算中心算力将直达全球第一

计算头条:孙家广院士指出工业APP大赛要做到“五促”

计算头条:星环科技谢皓用实例指出边缘计算的核心问题

计算头条:中国航空工业两化融合进层图解

计算头条:从谷歌新机看谷歌搜索退出中国真相

计算头条:专家黄培指明Altair技术亮点

计算头条:华为光通信将是华为5G生态的主流

计算头条:专家张云泉教授参加2019联想全球超算峰会

计算头条:专家张云泉指出超算发展模式的问题

计算头条:华为折叠手机在5G时代如何成为移动入口

计算头条:广告公司也开始探索云计算处理技术

计算头条:联发科与晨星半导体Mstar为什么合并

计算头条:华为海思芯片的深远意义

计算头条:华为、中兴与中国电信在上海世界移动大会的5G细节

计算头条:张云泉教授参加德国超算盛会并推出免费讲堂

计算头条:张云泉教授国际交流中国超算发展趋势

计算头条:张云泉教授说RDMA技术就像一块美玉

计算头条:分享通信蒋志祥混合计算成为京交会焦点

计算头条:华为手机AI算法不是噱头

计算头条:华为芯片让华为市场份额反超苹果

计算头条:中美贸易战苹果企业怎么办

计算头条:星环科技登顶数据库领域的“珠穆朗玛”

计算头条:中国智库网为什么强调中国风

计算头条:IBM芯片也是焦点

计算头条:阿里云率先进入“LoRa2.0时代”连接一切

计算头条:华为为什么推出凌霄IoT Wi-Fi芯片系列

计算头条:MSN退出后微软云计算服务为什么成为第一

计算头条:海淀将建40个智慧社区18个应用场景

计算头条:物联网中IBM解决中小城市智慧城市建设问题

计算头条:华为+智能进化智能服务器新品发布会

计算头条:IBM帮助中粮集团数字化采购加速数字化转型

计算头条:房地产用“朋友圈”进行数据营销

计算头条:CB Insights发布全球人工智能100强企业名单与25大趋势

计算头条:国家超算张云泉教授认为中国计算网看点不错

计算头条:阿里巴巴人工智能算法开始应用于奥运运动项目

计算头条:苹果取胜不在于智能手机AI芯片与算法

计算头条:张云泉出任中国大数据与智能计算产业联盟执行理事长

计算头条:滴滴算法能算头像

计算头条:华为万志重点谈智能计算领域部署

计算头条:人工智能领域中国正在奠定领导力

计算头条:Google推出数据集搜索

计算头条:中国三台E级超级计算机原型机系统完成交付

计算头条:腾讯与国泰君安探索云计算潜在应用

计算头条:苹果公司开始竞争音乐算法平台Festicket公司

计算头条:中望软件获达晨领投8000万融资

计算头条:计算生态为什么不用MATLAB而用Python

计算头条:中国芯片史中的强劲剂阿里芯片

计算头条:人工智能与音乐快讯

计算头条:小米在软件层面加入了ATW算法

计算头条:如何看待谷歌数字幸福感改变社交媒体

微信关注公众号“cncompute_com ”,为您奉上最新最热的计算头条资讯,干货满满。