文章转载自:liangkz
写完上一篇《
Hi3861的SAMGR--系统服务框架子系统-4-面向服务架构的实现》后,基本上就转入Hi3516工程去扩大范围继续理解鸿蒙系统的samgr子系统了,但走了一些弯路。
一开始是在通过HPM下载和安装的Hi3516工程代码上进行加log分析samgr的,但是某次代码对比中,发现Hi3516工程中的samgr与release分支上的代码差别较大,然后就仔细整理和对比了一下两者的代码,果然发现掉进坑里了!
如上图,左边是HPM下载的Hi3516工程代码,右边是Release分支的代码,组件名字、文件名、结构体定义、API定义等等,都有很大的差别,去gitee上查看 //foundation/distributedschedule/ 目录下相关代码仓库的提交记录:
显然,是release分支发布前的 2021/03/11 的这次提交,大改了 samgr 的代码,distributedschedule_dms_fwk_lite 仓库的改动则更大。
HPM 安装的工程代码,远远早于这个日期,后来也没有同步这些更改,所以才会有上面的代码那么大的差异。【可惜我之前是那么信任HPM安装的工程了~~】
所以,HPM安装的Hi3516工程代码用来分析 samgr,肯定是不合适的了!!!需要另起炉灶,重新开始。
新发布的canary版本代码我还没仔细研究,简单对比一下distributedschedule目录,除了新增三个目录外,已有三个仓库的代码与release分支基本上差别不大,所以就在release分支上去分析小型系统的samgr了,免得一头扎进canary中迷失自我。
经过这些天的梳理和分析,来回折腾,终于对小型系统的samgr有了个大致的框架性的理解,主要还是在上面的 safwk_lite/samgr_lite 两个目录内,dmsfwk_lite还没大规模涉及。
别看 safwk_lite 只有一个 main.c 文件,但是它可是个大家伙,它就是fundation进程,前面的文章《鸿蒙系统框架层的启动细节》有做过一些分析说明,现在回过头来看一下,那些分析简直是皮毛而已,真的详细说起来,需要单独的篇章,下一篇就从它开始。
主要的分析工作,还是在 samgr_lite 目录内,在一头扎进去之前,最好先回顾一下《
Hi3861的SAMGR--系统服务框架子系统-1》系列文章中提到的内容,也要重新整理一下Hi3861(轻量系统)和Hi3516(小型系统)之间的一些重大差异。
1. 轻量系统上,只支持线程概念,没有进程概念。
所以你在Hi3861工程代码上是找不到进程Process相关的东西的,各种服务和程序,都是以线程(task/thread)的形式在跑,比如系统启动时,每个service是一个线程,开发者自己编写的程序,在SYS_RUN的时候,也是一个或多个线程。线程间通过消息队列方式进行通信,消息的发送者和接收者,虽属不同的线程,但实际它们还共享着相同的地址空间,仔细跟踪一下Request/Response结构体中的 void *data 的使用,你就可以理解了。
2. 小型系统中,支持线程和进程概念。
每个服务都需要一个守护进程在后台支持,一个或多个线程在前台提供具体的service/feature。不同的进程(Process)独享各自的地址空间,进程间通过IPC共享内存机制进行通信,同一个进程的不同线程间,仍是通过消息队列方式进行通信,中间引入了router、endpoint等概念,实现了一整套相当复杂但也很高效的通信机制。
3. 轻量系统上,SamgrLiteImpl g_samgrImpl 是全局唯一的老大,记录了系统中的service/feature,provider向它注册服务,consumer向它查询服务。
4. 小型系统上,SamgrLiteImpl g_samgrImpl 不再是老大地位了,老大地位被另外一个 SamgrServer g_server 占据了。它们之间的关系,我们后面会详细分析,这也解决了《Hi3861的SAMGR--系统服务框架子系统-2》中提出的疑问。
5. 轻量系统上的SOA的实现,可以说是相当的简单和容易理解了,看前文《Hi3861的SAMGR--系统服务框架子系统-4-面向服务架构的实现》的图片就不难理解。
6. 小型系统上的SOA的实现,可就复杂很多了,因为涉及到跨进程通信,provider和consumer都需要通过代理机制来实现远程(跨进程)接口的调用,这时候《Hi3861的SAMGR--系统服务框架子系统-2》所分析的对“
IUnknown 接口类及其相关定义”的理解,就显得非常重要了,要是不理解IUnknown接口的概念,那真的不好理解小型系统上的SOA的实现。
更多的细节,就在接下来的文章中一一剖析了。