当鸿蒙OS宣布开源的时候,各种空洞的炒作,几乎把国产操作系统的技术本质掩盖了,虽然笔者没亲眼见过鸿蒙的代码,也没用方舟成功编译什么程序,不过当华为官宣鸿蒙将使用微内核的时候其实这款OS的风格就已经确定了,因为这就是内核的价值和意义。

记得十几年前笔者刚刚毕业,初次进入嵌入式开发的圈子,那时总感觉操作系统距离我很远,甚至有些高不可攀。当时看到CSDN论坛上各种有关WINCE、MINIGUI等嵌入式OS的发贴时,那些生硬的代码真是给我当时还年轻的心灵留下了巨大的阴影,不过这十年来虽然工作和嵌入式渐行渐远,但是不断总结经验回头来看,感觉操作内核的设计并不是一个纯数学或者技术的建模过程,甚至还反应了我们日常生活中的很多道理。

在科技界有一句名言“如果你无法简洁的表达你的想法,那只说明你还不够了解它”,所以经过了这些年的沉淀,笔者尝试使用最通俗的语言来向大家解释,什么是内核、什么又是微内核,阅读本文不需要读者具备什么操作系统的知识。

宏内核vs微内核的基础逻辑

上世纪90年代,微内核操作Minix的作者Tanenbaum与微内核操作系统Linux的作者Linus,曾经有一段非常著名的论战,(具体链接: https://www.oreilly.com/openbook/opensources/book/appa.html),这里笔者无意全文翻译,只是想说即便是Linus这样的大神级人物也难免会陷入谁优谁劣的口水仗之中,而普通人士可能更难免俗,所以我们先搁置优劣的争议,先直观来感受宏内核与微内核的架构图是什么样子的。

图1. 宏内核架构图

图1. 微内核架构图

简单的讲宏内核就是操作系统是个大管家,几乎包办一切,用户应用程序的需求直接向内核提出就行;微内核更向一个代理人,几乎所有的驱动、文件系统全部运行在与用户应用程序平级的用户模式下。

内核类型的简单类比

为了让读者理解起来更方便,接下来让我们做一个比较简单的类比,如果把操作系统看成一家公司,而宏内核的特点是用户请求直达内核,内核统一安排执行,这代表此公司使用扁平化的管理架构,而微内核的操作系统中则需要设立很多如驱动,文件系统等部门,这显示公司使用制度化、等级化的管理架构。

简而之宏内核代表的是层次简单的扁平化管理风格,微内核则代表多部门的制度化管理风格。

基础概念释义

上下文上下文切换:这个名词经常出现在各类操作系统的书籍当中,还是以公司为例,上下文就代表了处理一个项目所需要的相关材料、文件,而上下文切换则代表这些材料文件在不同部门(进程)或者领导(CPU)之间的流转。

状态保持(快照)及恢复:假设这样一种场景,我正在领导的办公室中汇报工作,此时外面另一个人有更重要的事情向领导汇报,由于涉及权限问题需要我先退出他的办公室,那么我在退出前需要做一次状态快照,以便领导处理完紧急事务后可以继续处理我的工作。这就是计算机中状态保持与恢复的过程。

基本推论

 运行效率宏内核更优:相信大家都有过跑部门跑公章的经历,很多时间、精力都浪费在了部门(进程)之间的上下文切换(上文已经释义)中了,微内核在效率方面肯定是处于劣势的,所以目前的主流操作系统如Linux和Windows本质上使用的都是宏内核,当然有读者可能会提出Windows使用的是混合内核,不过这种混合内核也是以效率优先的扁平化架构,本质上还是宏内核。

宏内核vs微内核 谁更安全

有关安全性的比较,其实仅凭直觉就能得到正确结论。正如各位日常所见,正规军队采用的都是“下级服从上级、命令绝对执行”的管理方式,而只有游击队才搞会扁平化管理的。其中逻辑也不难理解,扁平化虽然能有比较高的效率,但是难免会在身份鉴别、数据传递的过程中出现纰漏,从而给入侵者可称之机。

而目前已有部分宏内核如sel4(Github地址:https://github.com/seL4/seL4)已经被形式化证明无误(论文地址:http://ts.data61.csiro.au/publications/nicta_full_text/955.pdf),

对于sel4的形式化证明笔者在这里多聊几句,从本质上来说sel4的内核代码只有1万行左右,而linux的内核代码已经突破了2000万行,所以微内核的sel4由于其代码数量较小,所以研究人员干脆将其内核抽象成一个有限状态机,进而证明在状态迁移与跃迁的过程中都不会发生会被恶意利用的漏洞,从而保证整个体系的安全。当然这个安全也有前提:

一、不有有内鬼:即生成内核的编译器、链接器与操作运行的硬件环境如DMA等设备不能被提前恶意植入后门。

二、不能有密码泄露:形式化验证只能保证制度体系本身不出问题,如果用户将自身密码泄露那系统是无法防范的。

不过我们也知道宏内核的操作系统尤其是Windows,经常会暴出安全漏洞,用户在没有泄露密码且没使用问题硬件的情况下,还是会遭到被黑客入侵。所以在安全性对比上微内核可谓优势明显。

宏内核vs微内核 谁实时性强

这个问题的答案可能与读者的第一反应不同,效率更优的宏内核在实时性方面的表现其实不如微内核。那些对于实时性要求极高的军用操作系统(如vxWorks等)使用的都是微内核架构。

请想象这样一个场景,假如我是公司的销售部负责人,正在向总经理汇报明年的销售计划,这时总经理状态一般办公室屏蔽来访,手机屏蔽来电,专门处理我的汇报,恰在此时读者做为战略部负责人带着阿里即将收购公司的消息,来到总经理办公室门口,请求汇报。假设此时有关阿里收购汇报的优先级是高于其它所有工作的优先级,所以总经理会把我汇报的内容做一下状态保持(快照),尽快安排战略部负责人进来汇报。

由于宏内核的扁平化架构,几乎所有请求都是直达总经理的,所以总经理对于来访及来电的屏蔽时间就会变得不可控而反观微内核此时多部门的制度化架构优势开始显现,因为总经理一般只要核对一下其它部门的处理过程是否合规,然后签名即可,因此微内核的最长屏蔽时间是可预期的。

So当我们在向下思考一层就会发现,制度化、流程化的微信核更能保证决策层在最短时间内就给最重要的任务予以响应。

宏内核vs微内核 谁更适合多核处理器

其实目前微内核的回归正好说明了微内核与多处理器的硬件平台配合会更好。请想象这样的场景,假如我是一家餐厅的外卖小哥,我向内核发送了回单位取餐的请求,这是内核会把这个请求拆解为两个,一是我到达单位,状态改为空闲的通知,二是帮我准备指定的菜品,如果这家餐厅规模很小只有一个总经理当然没有任何问题,不过如果餐厅有两个决策人(双核),那么我到达的通知可能先发给了总经理1,而为我准备菜品时总经理1(核心1)有其它任务了,所以需要总经理2(核心2)来安排协调了,这时就需要在总经理1和总经理2进行上下文切换才可以满足我的需求了。而微内核在内核下面设计有部门(服务进程)的架构,就几乎不存在宏内核在核心间调研上下文切换的问题。所以在总体来说,宏内核会在CPU核心间不断进行上下文切换,而微内核则不断在部门(进程)间进行上下文切换。

当然了宏内核针对多处理器时代也不是完全束手无策,比如Linux就提出了用户协议栈的概念,其本质逻辑就是成立一个直属某一总经理的特别行动小组,这一小组的所有任务全部在此总经理的领导下进行,从而避免跨总经理间的上下文切换以提高效率,其实这种方案也有一定局限性,比如出现单个总经理根本管不过来特别组的情况,该如何优化其实还是有待探索。

后记

其实本文应该是国庆当天完成的,只是笔者又花了一天时间,让妻子来读此文指出晦涩难懂的地方,修改后才最终完成的。所以自我感觉本文通俗性应该还好,如果有问题想提欢迎在文后留言,也请在我的BLINK上点赞。

前段时间鸿蒙刚出的时候引发各方论战,支持华为的说鸿蒙是创世之举,反对的则称此为PPT开源。而笔者认为口水战是没有意义的,正如此文所言,微内核和宏内核其实各有应用场景,各有优劣,谁也碾压不了谁。可能很多人觉得首先要把方向搞对,以免后面直接被淘汰。不过这些年来堪称被淘汰的技术大多是如Silver light、XNA等应用层的开发框架,而底层的操作系统内核真是应了那句“太阳底下没什么新鲜事”的谚语,几乎不会存在出现什么新理念能直接把之前的设计完全干趴的可能。

其实华为的鸿蒙LITEOS早已被放到Github上(https://github.com/Awesome-HarmonyOS/HarmonyOS)了,那么LiteOS的哪些代码是属于符合鸿蒙OS的设计理念可能会被照搬,哪些不符合需要重写,就做为思考题留给各位读者吧。

今天恰是笔者担任CSDN嵌入式大区版主的十周年纪念日,所以不再秀什么代码了,只是单纯向大家打开心扉,谈一下做为一个用惯纯C的嵌入式老兵,对于操作系统内核的一点思考,希望能给各位读者尤其是那些对于操作系统不甚了解的读者以更多收获。笔者也会观察与鼓励师一同行文效果是否会更好:)

终于鸿蒙微内核弄懂了-程序员和鼓励师的合作相关推荐

  1. 程序员邂逅鼓励师的正确姿势!

    技术创造未来,代码改变世界!低调.踏实.高智商的程序员群体正在用他们的智慧改变着我们的生活.而他们背后的付出正一点一点被大众熟知.所敬佩. 整天与需求.Bug摩拳擦掌的他们也即将迎来他们自己的节日-- ...

  2. 程序员需要鼓励师吗?我觉得写代码的时候更需要这个!

    我前几天去按摩,推拿师开始吐槽 "小姑娘年纪轻轻的,怎么脖子这么硬哦,像块铁一样" 唉,相信很多人都和我一样 每天都是埋头工作 作为程序媛的我 每天都要坐在工位上不断写着代码改bu ...

  3. 比Postman更懂中国程序员,Apipost真香!

    最近被身边几个做开发的朋友安利了一款国产的 API 开发调试神器,真的有被惊艳到!!!简直不要太好用! 没想到,中国竟然有比 Postman 还好用的软件! 这个API 开发调试神器就是 ApiPos ...

  4. 某HR自述:和高管PK了半小时,终于给一个47岁的程序员发了offer~

    总有HR因为年龄卡候选人,但也有HR愿意给大龄候选人一个机会. 一位HR自述:我和高管PK了半个小时,终于给一个47岁的程序员发了offer. 我始终坚信:与其看年龄,不如看心态! 网友问,什么行业和 ...

  5. Apipost,更懂中国程序员的接口调试神器

    Hello,大家好,我是灰小猿!一个超会写bug的程序猿! 作为一名Java后端程序猿,对接口调试简直是家常便饭,尤其是在进行接口联调的时候,往往因为和前端对接口的理解程度不同,于是乎就出现了.... ...

  6. Android从程序员到架构师之路3

    本文学习自高焕堂老师的Android从程序员到架构师之路系列教学视频 40 - 认识线程(Thread)模式a 1. 线程(Thread)概念 所谓线程(Thread) 是指一串连续的执行动作,以达成 ...

  7. 程序员到架构师,其实没那么难!

    程序员到架构师,其实很简单 很多人做java开发2,3年后,都会感觉自己遇到瓶颈.什么都会又什么都不会,如何改变困境,为什么很多人写了7,8年还是一个码农,工作中太多被动是因为不懂底层原理.公司的工作 ...

  8. 从程序员到架构师都需要经历什么?

    目录 一.内容简介 二.程序员之间的能力差异在哪里? 1.经历的场景不同 2.在同一个场景中思考问题的角度不同 3.解决问题的方法不同 三.什么是架构? 四.从实际场景中学架构 1.数据持久化层场景实 ...

  9. 程序员养成架构师之路

    原文:5ceo:洒落一地的阳光 .的---><程序员养成架构师之路> 怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是 ...

最新文章

  1. PAT(甲级)2020年春季考试 7-2 The Judger
  2. 全国大学智能车竞赛证书编号规范
  3. 浙江金华暂时停用“智能头箍”,专家:监测学生脑电违反伦理
  4. 操作多个表_8_不等值连接
  5. 一个页面是否应该全部组件化
  6. activemq网络桥接_ActiveMQ –经纪人网络解释–第5部分
  7. cass生成曲线要素文件_几种常见的CASS字体异常问题,教你如何解决
  8. 支持向量机SVM的python实现
  9. 安装Exchange 2010 时报错UserMailbox 必须强制使用 Database
  10. 关于SET ANSI_PADDING的用法
  11. 能不能翻译PHP网站源码,有朋友可以帮忙用PHP翻译一段PYTHON代码吗?
  12. Java线程经典面试题
  13. java布道师_我和 Spring 技术布道师的一天
  14. Cygwin系列(一):Cygwin是什么
  15. MLY -- 8.Establish a single-number evaluation metric for your team to optimize
  16. 有哪些电容笔值得推荐?值得买的电容笔测评
  17. 你不知道的 React 最佳实践
  18. 单词快速记忆day40
  19. 在线代码编辑器:Codeanywhere介绍
  20. 转 -- Zynga:从Amazon公共云到zCloud私有云

热门文章

  1. 多租户数据隔离的三种方案
  2. 基于AI挑战《星际争霸II(StarCraft II)》的Windows版本下载安装详细教程
  3. stm32L1151用cube配置ADC
  4. Win10设置局域网共享打印机,动态切换默认打印机总结
  5. JavaWeb-10-JavaScript高级学习笔记
  6. 计算机考试ppt应用,职称计算机考试辅导:Powerpoint使用母版
  7. 东大22春《大学英语(四)》在线平时作业1_100分答案非答案
  8. cs python课程 加州大学_如何看待Berkeley开设的CS61A:SICP in Python课程?
  9. Latex编辑论文常用package
  10. php中插入word文档,word里如何插入pdf