“下午是实操环节,大家可以带着自己的问题来,我们现场调试、现场解答。”
卢为冰说完,侧身让出讲台,陈洋走上来,打开电脑,投影幕布上出现了一张深蓝色的幻灯片。
“各位好,我是陈洋。”他推了一下眼镜,目光扫过全场。
“深蓝系统从S1到S3,一共经历了一个大版本和两个小版本的迭代。我今天不讲细节,讲思路。”
他按了一下翻页笔,屏幕上出现了一张时间线图,从2008年9月到2009年10月,标记了三个关键节点。
“S1发布的时候,我们在做一件没有人做过的事,把一个智能操作系统塞进联发科mtK6225这种主频不到200mhz的芯片里。
当时市面上的主流观念是,智能机系统需要至少400mhz以上的处理器才能流畅运行。
但我们做到了,在mtK6225上跑深蓝系统1.0,第一次实现了多任务。”
台下响起一阵低低的议论声。
坐在第三排的一个天语工程师小声跟旁边同事说:“那时候我们还在用mtK做功能机,完全没想到还能跑智能系统。”
陈洋等议论声平息后,继续翻到下一页。
“S2我们换到了mtK6268,246mhz的cpU跑wcdmA协议栈,再加上深蓝系统1.5的多任务调度,这套方案在当时是唯一的。
市场上没有任何一款246mhz处理器能同时跑3G协议栈和智能操作系统,除了我们。”
“为什么能做到?”他切换了一张幻灯片,上面是一张对比表格。
“因为深蓝系统的任务调度器是事件驱动的,不是时间片轮转的。安卓的任务调度器是基于Linux内核的cFS完全公平调度器,适用于通用计算场景,但在移动设备上,这种调度器天然存在三个问题。”
屏幕上的对比表格,左边是安卓,右边是深蓝,逐行列出了差距:
“第一,响应延迟。安卓的cFS调度器为了保证公平性,会频繁进行上下文切换,每次切换都有微秒级的开销。在后台任务多的时候,前台应用的响应延迟会被拉高。
深蓝的事件驱动调度器不做时间片轮转,只响应中断和事件。没有后台任务排队的时候,前台应用能独占cpU资源,响应速度更快。
第二,内存管理。安卓应用是用Java写的,运行在dalvik虚拟机上,Gc垃圾回收机制会不定期触发。
每次Gc都会暂停所有线程几毫秒到几十毫秒不等,用户感知到的就是卡顿。深蓝应用用c/c++原生开发,没有虚拟层,没有Gc暂停,内存管理是手动控制的。
第三,电源管理。安卓的电源管理策略基于Linux内核的wakeup机制,任何一个应用都可以申请wakeup锁,后台应用锁住cpU导致耗电增加。
深蓝系统没有后台wakeup机制,所有后台任务都走推送通道,系统会在没有任务时进入深度睡眠状态。”
雷俊的手里的笔从刚才开始就没有停过,他写得很快,几个关键点在他笔记本上已经被画了圈。
安卓的调度器是公平导向的,深蓝的调度器是响应导向的。
安卓有Gc暂停,深蓝没有虚拟层。
安卓的电源管理是应用主动控制,深蓝的电源管理是系统主动控制。
这三条差异,单独看每一处都是微小的优化,但合在一起,就是深蓝系统在低端硬件上能跑得更流畅的底层原因。
而这也意味着,安卓在底层架构上就输了。
雷俊放下笔,抬起头看着投影幕布上的对比表格。
他心里很清楚,安卓2.0虽然刚刚发布,但它的底层架构并没有变,cFS调度器没改,dalvik虚拟机还在用,电源管理策略也没有本质变化。
谷歌在安卓2.0上做的优化是上层应用的,比如多点触控的支持、浏览器引擎的升级、相机接口的改进。
这些优化对于提升用户体验确实有帮助,但解决不了底层架构的先天问题。
安卓的卡顿,是刻在基因里的。
而深蓝系统的流畅,也是刻在基因里的。
他抬起头,重新看向讲台,比刚才更专注了一些。
陈洋翻了翻幻灯片,屏幕上出现了一张简单的系统架构分层图。
“接下来我快速过一下深蓝系统的分层架构。最底层是内核,基于cNm微架构自研,我们叫它深蓝内核,现在已经是第二个版本了。
第二层是硬件抽象层,包括触控、基带、音频、电源管理这些核心驱动。
第三层是系统服务层,包括推送服务、账号体系、应用商店接口。
最上层是UI桌面,图标、壁纸、过渡动画、设置面板,这一层是完全可定制的。”
他按了一下翻页笔,屏幕上出现一张更详细的分层图,每一层都用不同的颜色标注出来,旁边注明了哪些对合作厂商开放、哪些不开放。
“联盟成员能接触到的,主要是第三层的系统服务ApI和第四层的UI定制接口。
第三层的推送服务、账号体系、应用商店接口,我们以SdK的方式提供,合作厂商可以在自己的系统镜像里集成这些服务。
“重点是第四层。”他用翻页笔的红点圈了一下最上面的区域。
“桌面启动器、图标包、壁纸、锁屏界面、设置面板的样式,这些我们完全开放定制。
你们想做自己的风格,改桌面、改图标、改动画,这些都没问题。
只要不改动底层服务,不改动系统ApI,不改动推送协议,其他的都可以自己发挥。”
雷俊快速记了几笔,在旁边画了一个问号,然后举手。
“陈总,我有一个具体的问题。”他放下手。