鸿蒙 和 Fuchsia OS,你更期待谁?
大家好,我是小 Bob,一个关注软件领域而又执着于计算机底层的开发者~
在月初,华为的鸿蒙系统 HarmonyOS 2.0 已发布,给我最直接的感受便是真正的万物互联离我们不远了。
先说说小编对于操作系统的看法,对于计算机,我们都知道是由硬件和软件共同组成的,两者缺一不可。那么操作系统在硬件和软件中起着连接作用,操作系统通过对硬件系统的调用来提供资源给软件系统。
那么在相同的硬件和软件系统下,对于用户的感受来说,电脑和手机最直接的体验便是操作系统的不同了,在我所认识的朋友中,也有相当一部分人在买手机时是非常关注手机自带系统的,毕竟它反映了对于用户的真实感受。比如在当我和朋友的手机在硬件差不多时,就会互相体验各自不同的系统,比如各自的消息推送和隐私以及权限管理,我们会相互比较并提出各自的建议。
那么对于华为的鸿蒙 HarmonyOS2.0 以及在它之前一周左右 Google 推出的 Fuchsia OS 到底有什么新的 Idea 呢?
两者都有抛弃了安卓而自立门户,且都带有物联网的基因,那么小编便针对于两者的技术进行简单分析。
华为之鸿蒙
首先,对于华为的鸿蒙 HarmonyOS2.0,按照百度的说法:华为鸿蒙系统是一款全新的面向全场景的分布式操作系统,创造一个超级虚拟终端互联的世界,将人、设备、场景有机地联系在一起,将消费者在全场景生活中接触的多种智能终端实现极速发现、极速连接、硬件互助、资源共享,用合适的设备提供场景体验。
通过华为最新的视频我们也可以看到鸿蒙将手机、电脑、平板、智能家居进行实时同步,不得不说,还是挺震撼的。据华为说鸿蒙是基于微内核开发,面向 5G、面向全场景的分布式系统。那么问题来了,什么是微内核呢?它和安卓的底层有什么不同吗?
什么是微内核呢?
在计算机业界的说法来看,微内核是一种内核的设计架构,由尽可能精简的程序所组成,以实现一个操作系统所需要的最基本功能,包括了底层的寻址空间管理、线程管理、与进程间通信。
微核心的设计理念:
是将系统服务的实现,与系统的基本操作规则区分开来。它实现的方式,是将核心功能模块化,划分成几个独立的进程,各自运行,这些进程被称为服务。所有的服务进程,都运行在不同的地址空间。只有需要绝对特权的进程,才能在具特权的运行模式下运行,其余的进程则在用户空间运行。
微内核的基本原理:
只有最基本的操作系统功能才放入内核中。非基本的服务和应用程序在内核之上构建,并在用户模式下运行。关于什么功能应该放入微内核,不同的设计有不同的方式,但是共同特点是许多传统上属于操作系统一部分的功能现在都是外部子系统,包括设备驱动程序,文件系统,虚存管理程序,窗口系统和安全服务,它们可以和内核交互,也可以相互交互。
摘录一张经典的对比操作系统微内核和宏内核的图示:
比如我们经常使用的 Windows,便是采用的混合内核。
微内核结构使用一个水平分层代替传统的纵向分层,所有微内核之外的操作系统构件都被当作服务进程来实现,它们可以通过微内核传递消息来实现相互之间的交互。因此,微内核还可以验证消息并授权访问硬件,而且微内核还执行保护功能,阻止非法的信息等。
例如,应用程序如果要打开一个文件,则它发送消息给文件系统服务,如果他想创建一个进程或线程,则它发送消息给进程服务进程。每个服务进程之间可以相互通信,并可以调用微内核中的功能。
微内核的性能:
通过微内核构造和发送消息,比直接进行一次系统调用发花费更多时间。一种解决方式是将一些关键服务和驱动程序重新放回内核中,可以减少用户-内核模式以及进程间的切换次数,但是这是以牺牲微内核的设计强度为代价;另一种解决方式是通过正确的设计,构造一个非常小的内核,可以消除消除性能损失并提高灵活性。
微内核设计:
低级存储器管理:微内核必须控制硬件上的地址空间,使得操作系统可以在进程级进行保护。微内核只负责把每个虚页映射到一个物理页帧,而存储管理部分则在内核外实现,包括保护一个进程的地址空间不被其他进程干涉,页面替换算法以及分页逻辑。例如,内核外的虚拟存储器负责何时把一个页面调入存储器或者何时换出一个页面,而内核就负责将这些页面索引映射到物理地址。
当一个应用程序发生引用了不在主存中的一页的时候,,内核发生缺页错误并执行陷阱,内核给页面管理器所在进程发送一条消息。页面管理器决定装载页面并分配一个页帧,页面管理器和内核进行交互,以把页面管理器的逻辑操作映射到物理存储器。一旦该页可用,页面管理器就给应用程序发送一条中断恢复的消息。
这种技术可以不用调用内核操作,就将文件和数据库映射到用户地址空间。微内核一共提供了三个内核操作用于支持核外的分页和虚存管理:
授权:一个地址空间的所有者可以授权其他进程使用它的某些页。内核把这些页从授权者的地址空间移出,并把它们分配给指定的进程;
映射:一个进程可以把它的任何页映射到另一个进程的地址空间,使得两个进程都可以访问这些页,就形成了共享内存。内核把这些页面分配给最初的所有者,为其他进程 提供一个映射以便访问它们;
刷新:进程可以回收授权给其他进程或者映射到另外进程的任何页面;
进程间的通信:微内核操作系统中,进程之间或者线程之间进行通信的基本方式是消息。消息包括消息头和消息体:消息头描述了发送和接受消息的进程;消息体包含数据或者指向数据的指针。
可以认为进程间通信是基于与进程相关联的端口(某个进程的消息序列),端口可以表明那些进程可以与这个进程通信。端口的标识和功能由内核维护,进程可以给内核发送一条指明新端口功能的消息,进程可以允许对自身授权新的访问。
地址空间不重叠的进程间的消息传递涉及到存储器到存储器的复制,因此受限于存储器的速度,复制的速度会远远低于处理器的速度。
I/O 和中断管理:在为内核结构中,硬件中断可能被当作消息处理。微内核可以识别中断但是不处理中断,它会产生一条消息给与该中断相关联的用户级线程。因此,当允许一个中断时,一个特定的用户级进程被指派给这个中断,并由内核维护这个映射。把中断转换为消息的工作必须由微内核完成,但是微内核并不涉及设备专用的中断处理。
落实到鸿蒙操作系统,它的存在让华为在智能手机操作系统上避免了“无米之炊”的困境,但其在推出面世之后,究竟会如何发展,又是否能够承担起当前我们的厚望,华为还需要回答很多问题,做很多工作,等待华为的依旧是万里长征。
Google 之 Fuchsia OS
谷歌近日正式面向公众推出了 Fuchsia OS,获得 Fuchsia 1.0 推送的设备是第一代 Nest Hub。
Fuchsia OS 与安卓不同的是它使用了全新的、自研的 Zircon 微内核,其采用 C++ 编写。内核的组件则使用到了 Go、Rust、Python,以及 C/C++ 等编程语言进行编写,如 USB 驱动程序使用 C++ 编写,而网络堆栈则使用了 Rust。
什么是 Zircon 呢?
Zircon 作为 uFuchsia 系统的内核。严格的讲,应该说 Zircon 是 Fuchsia 系统的核心,是 Fuchsia 系统的最底一层。它由一个微内核(/zircon/kernel)和少量的用户空间代码组成。这部分用户空间代码是一些核心的服务、驱动和类库等(/zircon/system/necessary),用于系统引导,与底层硬件交互、加载用户空间的进程等。
Zircon 对外提供系统调用,用来管理进程、线程、虚拟内存等,提供进程间通信的机制,监控内核中对象状态的改变,提供锁机制等。内核管理了大量的各种类型的对象,用户空间可以通过系统调用直接读取这些对象,这些东西通常是实现了分发接口的 C++对象。这些 C++类定义在 kernel/object 目录下,这些类大部分是一些自包含的 C++类,一部分是底层 LK(little kernel zircon 内核的内核,一个嵌入式的内核)原语的包装类。
Fuchsia OS 如何工作?
Google 在开发 Fuchsia OS 方面开辟了新天地。可以说,该公司从过去的错误中吸取了教训,尤其是在更新和修改 Android 和 Chrome OS 的局限性和问题方面。与已建立的 Google 操作系统的主要区别:Fuchsia OS 从头到尾都是模块化的。这不仅反映在模块化系统体系结构中,而且反映在对应用程序是什么的全新理解中。
模块化应用设计
Google Fuchsia 基于模块化设计,打破了应用程序的概念。软件单元称为软件包。软件包是一个被选中的文件—包括元数据、清单文件和可执行元素。后者在 Google 术语中称为组件。
Fuchsia 组件最接近我们今天所说的应用程序。每个组件执行特定任务,并且可以与其他组件组合以编程一个更复杂的应用程序。组件由清单文件以及相关的代码组成。组件始终在自己的沙箱中运行,通过名称空间访问对象,并通过导出目录发布它们。Fuchsia OS 专注于两种类型的组件:模块(modules )和代理(agents)。
agents 组件在后台工作,并为其他组件提供服务。agents 由另一个组件或系统调用-例如,响应某些触发(例如推送通知或其他屏幕处理)。
modules 是具有用户界面的组件,这些组件在前台执行,对用户可见。操作系统中的每个模块都是为特定任务而设计的,并进行了相应的标记,以便可以在需要时自动对其进行访问。这是使用模块的功能完成的,可以使用所谓的动词和名词来描述。
每个模块都包括一个 verbs 列表,表示模块可以执行的工作,以及一个 nouns 列表,表示正在使用的实体。根据谷歌术语,实体包括作为结构化数据对象存在的任何唯一可识别的人、地点、事物、事件或概念,这些数据对象可以被引用和检索、呈现、操作或共享。
因此,使用实时操作系统 Fuchsia 的方式如下:用户执行操作后,Fuchsia OS 会自动为该任务确定适当的模块。所需的动作被翻译成动词和名词的组合。然后,系统检索所有支持所需动词的模块的列表,并在下一步中根据还可以处理所需名词的模块进行过滤。
相关的模块可以分组到所谓的 stories 中。stories 根据当前的需求组合不同的动作和任务,使用户能够根据自己的想法和需求组装复杂的应用程序。
借助 Fuchsia OS 的模块化应用程序概念,Google 将重点从应用程序转移到动作和内容。Fuchsia 的任务由所谓的 stories 中的一组组件来处理,而不是当前使用的应用程序的经典操作系统,该组件通过模块访问当前所需的资源。
下图说明了 Fuchsia OS 应用程序开发背后的模块化概念。
Fuchsia OS 的应用程序开发基于模块化结构。
模块化系统架构
Fuchsia OS 的系统架构也基于模块化方法。操作系统由四个或多或少的独立级别组成,每个级别都有其自己的任务:Zircon,Garnet,Peridot 和 Topaz。
Zircon
Zircon(以前为 Magenta)是新的 Google 操作系统的基础,但严格来说,它不是 Fuchsia OS 的一部分,也可以与其他操作系统一起使用。
Zircon 包含 Fuchsia OS 的内核,设备管理器,最核心的第一层设备驱动程序以及底层系统库(如 libc 和 launchpad)。此外,Zircon 还提供 FIDL(Fuchsia 接口定义语言),这是一种用于进程间通信的协议。FIDL 是独立于编程语言的,但是与流行的编程语言(例如 C,C ++,Dart,Go 和 Rust)具有联系。
作为 Fuchsia OS 的基础,Zircon 提供了对后续级别的硬件访问,在共享硬件资源上创建了软件抽象,并充当了低级软件开发的平台。Zircon 是 Project Little Kernel(LK)的结果,该项目充当 Android 的引导程序。
Garnet
Garnet 是基于 Zircon 的第一款针对 Fuchsia 的系统层。提供了设备级别的各种系统服务以及网络,媒体和图形服务,例如,用于软件安装,系统管理以及与其他系统的通信。Garnet 包含图形渲染器 Escher,程序包管理和更新系统 Amber 以及文本和代码编辑器 Xi。
Peridot
Peridot 是 Fuchsia OS 的操作系统级别,根据当前用户要求在其上管理和编译模块化应用程序。Peridot 的核心成分是 Ledger 和 Maxwell。
Ledger:Ledger 是基于云的存储系统(分布式存储系统),它为每个 Fuchsia 组件(模块或代理)提供单独的数据存储。这在不同设备之间同步。这使用户可以在当前 Fuchsia 的设备上继续停留在其他 Fuchsia 的设备上的位置。
Maxwell:通过 Maxwell,Google 在 Fuchsia OS 中集成了一个组件,该组件将给用户提供了人工智能。就像 Fuchsia 一样,Maxwell 具有模块化设计。AI 系统由一系列代理组成,这些代理分析用户的行为及其所使用的内容,在后台确定合适的信息,并将建议转发给操作系统-例如,应加载哪些模块或故事以适合用户在特定时间的行为。
注意:到目前为止,Kronk 是 Fuchsia OS 唯一未作为开源项目开发的组件。
Topaz
Topaz 是 Fuchsia OS 的系统级别,用户可以在其中与操作系统进行交互。在此显示以下级别定义的组件的用户界面:带主屏幕的图形用户界面(取决于设备 Armadillo 或 Capybara)以及模块的可视前端。Google 的跨平台开源移动应用程序框架 Flutter 也已在此系统级别集成。因此,可以假定 Fuchsia OS 用户将来也将能够运行和使用其他系统的应用程序,例如 Android 或 iOS 应用程序。
Fuchsia OS 的四个系统级别:Zircon, Garnet, Peridot, and Topaz
最后,做为万物互联的两款新生代表,笔者还是很希望两者都能将自己的优点发挥至最大,毕竟好用即代表大部分的市场份额。
参考资料:
评论