阅读 742

从鸿蒙到操作系统的常识性总结

鸿蒙科普

美国遏制中国高科技的起因

  • 中国在某些科技水平上单个点上已经超越美国,甚至超越西方
  • 其中有个重要的点,就是以华为为首的5G技术
    • 目前5G在全球大面积铺开的也就中国一家

    • 当然韩国也有

      • 但是,他的影响力没有那么大,他市场也没那么大,他人数也没有这么多,所以能对西方产生巨大压力的,就只有中国
    • 可以这么说,中国5G出来以后,5G到6G,是整个历史上颠覆人类生活的一次革命

      • 我是热烈期盼这有这么一天的到来,最起码对我的工作来说,他的带宽特别宽,而且实时性特别好,那么对我来说,我完全就可以不用非得坐在办公室工作,我可以到海边度个假,然后在海边坐着聊工作,海边呆腻了可以开着车去新疆玩,开车的路上工作,因为只要有网络存在,并且这个网络很稳定还很实时,我在哪进行会议其实并不重要

      • 5G除了这个,还有很多新的应用,会给整个人类社会带来很大进步,大家拭目以待,等待这一天,5G+人工智能,这应该是人类生活上的一次大颠覆

对于鸿蒙很多人还是有很多误解的

  • 鸿蒙刚出来的时候,很多人跟打了鸡血似的,我要拳打微软脚踢谷歌,把苹果挤一边去。这个是对鸿蒙有一定的误解
  • 首先,鸿蒙不是跟Windows竞争的,竞争也竞争不过,他也不是跟Linux竞争,也不是跟Android竞争,也不是跟Mac竞争
  • 鸿蒙的意义在于万物互联
    • 尤其有一个场景叫车联网,将来人们的车就是一个小小的生活平台,就跟现在的手机一样
    • 是在车联网、智能家居发力,发力点在IoT(Internet of Things物联网)
    • 并不是要争夺桌面的操作系统,也不是说要争夺服务器的操作系统,也并不是说在手机上要干过谁谁谁
  • 很多市场被站住以后,后来者是很难追上的
    • PC阶段:Windows+Intel
    • 移动阶段:ARM+Android
    • 很多时候是很难绕开他们的,将来的万物互联,希望 ” 鸿蒙+麒麟 “ 能占有一席之地。
    • 时代的发展,这个时代你占先,但是物联网的时代到来的时候,尤其是5G物联网、AI的到来,并且老外那边,你没有5G的时候,我不相信你还能领先。下次领先的,目前看来,中国的产品,大有希望

鸿蒙的特点:

  • 鸿蒙最大的特点在于内核设计:
    • 微内核
      • 鸿蒙号称是第一款微内核的操作系统。当然这个是市场上的宣传,他的精确性存疑。
      • 很多系统都在进行这方面的研究,但是起码他是中国的第一个
      • 作为商用的微内核来说,确确实实鸿蒙不是第一也是第二
        • 鸿蒙已经在有的设备上跑了
          • 智慧屏电视
        • 这也是为什么西方要不遗余力地抑制中国高科技的发展。因为5G一旦领先了,就代表了,几百年来,有一个非西方的国家首次领先。
        • 这个事对他们来说还得适用一阵子,但是我觉得他们是挡不住的,5G这个东西,美国是没办法部署的,部署之后也盈利不了,中国有巨大的市场。就跟高铁一样,只有在中国,才有巨大的上升空间。
      • 技术说明
        • 微内核是针对于5G和万物互联的
        • 弹性部署:他对外宣称是全场景的
          • 弹性部署就是说这个操作系统可以部署在小小的芯片上,当然也可以部署在一块大的PC上
          • 他对于硬件要求并不是那么高,硬件可以非常地有弹性,硬件的内存有多大?小一些的内存我也能接受,很强的硬件我也能hold得住
        • 他是开源的
          • 跟Linux一样是开源的,提现了华为的胸怀
          • 闭源的产品,早晚会被淘汰
            • 别看windows现在如日中天,前一阵子中美打贸易战,号称老美要把中国的操作系统全部掐掉,我当时举手欢迎。不过他弄了半天也没敢,Windows一旦被掐掉,中国一堆的操作系统一定会出来。其实中国已经有一部分很好用的操作系统了,只是苦于Windows的生态太完善,大家伙不得不用他,所以我们想要抢占PC的桌面市场,太费劲了。如果老美不让用了,这机会绝对来了,那太好了。
            • 最近老美玩华为怎么玩?不给你芯片。一开始是美国厂商不让出口,现在是限制台积电,因为华为的芯片很多是台积电代工的。好啊,举双手欢迎。等他限制台积电之后,中国肯定会涌现出类似台积电的厂商。最开始可能只能做个十几纳米的,不过这东西,你台湾人能做,我不相信大陆人不能做,慢慢做几年,我们就做到7纳米,5纳米,3纳米...
            • 当然,如果大陆涌现了这些厂商之后,那之前靠大陆吃饭的厂商还能不能杀进来,那就不好说了
        • 方舟编译器
          • 和鸿蒙一起发布的还有方舟编译器
          • 他编译的东西在手机上也能跑,电脑上也能跑,在车上也能跑等等
        • 三种内核的代码
          • 由于鸿蒙是华为之前自己偷偷摸摸在做,并没有公布出来,由于中美贸易战,才不得不拿出来,他其实并不是很完善
          • 他的代码目前是三种内核的代码
            • Linux
            • LiteOS
              • 华为嵌入式操作系统的
            • Android
          • 按照余承东去年的讲法,他是说要花三年时间将三种内核合三为一,那个时候鸿蒙一定会比现在成熟地多
            • 网上有人说害怕余大嘴打嘴炮,不过你有没有注意过,余大嘴的嘴炮好像一一都实现了。前几年华为说要做手机,很多人不看好,但是华为做出来了。余大嘴说要在几年之内做到全球前三,现在已经是全球前三了

操作系统

在上面发现一个很重要的点,微内核,要了解微内核需要先补充一些操作系统的基本知识

是什么

  • 操作系统是一种特殊的软件
  • 这种软件对上服务我们用户的程序
  • 对下管理着底层的硬件
  • 就像Windows,他帮你管理你硬件,你不用自己去编程访问你的键盘,Windows已经帮你弄好了。Windows又帮你管理工作程序,你的QQ、微信、office,都是Windows帮你管。
    • 一般来讲,操作系统这门课一般都是放在编程语言后边,尤其是先学数据结构再学操作系统,因为里面有一些非常深的概念需要用到数据结构的知识

image.png

有什么用

  • 管硬件
    • 内存
    • 硬盘
    • CPU
    • 各种外设
  • 管应用
    • 进程

image.png

简要结构

  • 一般来讲有一个核心,内核,内核是管理的硬件
  • 内核的周边跑着一些其他的服务程序,来管理着我们的应用程序

内核

  • 研究内核一般以Linux为主。作为鸿蒙来说,作为安卓来说,作为苹果的操作系统来说,他的核心都是Unix类,linux也是类Unix
  • 苹果不开源,Windows不开源,所以研究那种闭源的东西没有什么意思

核心

  • cpu调度
  • 文件系统
  • 应用管理、进程调度
  • 中断处理、设备驱动
  • 内存管理

核心分类

  • 宏内核
    • 一般接触到的操作系统,都是宏内核
    • 宏内核就是,我内核管着cpu、内存、进程、中断,这些都归我管,同时我把归我管的这一部分也当做操作系统的一部分。
    • 把操作系统的核心和他管理的周边的东西合到一起当做操作系统最核心的东西。他叫做宏内核
    • 我们接触到的Linux、Windows都是这种模型

image.png

image.png

  • 微内核
    • 微内核的内核就干一件事,进程调度,鸿蒙的核心就是这个
    • 其他的程序,你想用,挂上去,而且有可能的分布式的,他们并不一定放到一台机器上。微内核的核心可能在这块芯片上,我有内存的东西,我往另一块芯片插一张内存卡,专门来管理内存
    • 分布式的
      • 所有的用户程序想跟操作系统打交道的时候,需要先访问内核。
      • 而对于宏内核来说
        • 应用程序要想访问操作系统,操作系统对他来说就是一个黑盒子,我想要读文件,没问题,操作系统帮你全读了,这个黑盒子内部的访问是他核心的东西,你不用去理会
      • 而对于微内核
        • 用户想去访问文件系统,我得先跟内核打交道,内核帮我访问文件系统,文件系统反馈给内核,内核再返回给我;
        • 我这个应用程序要想访问另外一个应用程序,我先跟内核打交道,内核去找另外一个应用程序,应用程序返回内核,内核再返回给我:
        • 哪怕调度cpu的时候,也需要通过内核,所有的访问都要经过核心,而这个核心又特别的小,其他所有的东西都可以是分布式的,不放在一起
    • 缺点
      • 运行速度稍低,因为所有访问都需要核心转一次手
    • 优点
      • 可以做到非常灵活的部署,各种各样不同等级的资源都可以部署上去
      • 而且可以做到灵活的拆装,有些我不需要的进程我就把他拆掉:我这个不需要联网,就把网络处理的进程释放掉。
    • 微内核目前全球的大厂商都在做,微软、苹果、谷歌都在做,华为是首先推出并且商用的。在他的智慧屏里面,鸿蒙已经运用进去了
  • 外核
    • 目前没见过,只存在于概念之中,实验室里面
    • 概念
      • 内核管理着一些东西
      • 与此同时,某一种类型的运用,我专门对这种应用做内核级别的优化,当你启动这个应用的时候,我的操作系统会跟着变,专门针对这种应用做优化
      • 比如我要上网,我的操作系统就会进行变化,让我操作系统内部变得更加适合上网,就是我的外核更加贴近应用。这种叫外核

image.png

  • VMM
    • 概念
      • 现在硬件都特别牛
      • 有时候你只跑一个操作系统在上面
      • 跑多少应用程序都用不完他的资源,资源过剩
    • 怎么办
      • 加一层,这一层叫VMM
      • 现在有很多虚拟化的厂商都在做这件事。有点硬件实在太强了,见过128个CPU的机器吗?每个CPU8个核,1.5T内存,六千万一台。这样的机器就跑一个操作系统?怎么充分利用计算机的资源?

image.png

启动

  • 一个操作系统怎么启动的?
    • 一般说,当你开机,开完机以后,操作系统就掌管了整个机器的运行,剩下的你就只要跟操作系统打交道就行,你不用跟硬件打交道

image.png

  • 这个过程具体是什么样子呢?
    • 以前买电脑都是一个一个部件买过来自己组装,然后装上操作系统,最后才能跑起来
    • 按下开机键
      • 通电的同时
      • 主板上有一块芯片,叫BIOS(basic input output system)
        • 这里面是写死的程序,他干固定的事
        • 这个芯片也经过了演化,现在是UEFI,如果你用BIOS打开的话,开机是黑白的,如果你用UEFI打开的话是彩色的,他是一个BIOS升级版
        • 操作系统这个东西,我们平时安装在硬盘上,硬盘上的操作系统是怎么开始放到内存里,然后接管整个硬件的呢?
          • 这个过程,BIOS里面的小程序功不可没
          • 这个小程序只要一通电,就会自己运行,运行第一个写死的程序
            • 这个程序会检查硬件,内存条有没有插好,有没有反应不良,一般反应不良就是三长两短的叫声
            • 硬件检查没问题之后,就会加载一个叫BootLoader的引导程序到内存
              • 一个写死的程序怎么找到BootLoader?
              • BootLoader也是写死的吗?肯定不是,但他程序所在的位置是固定的
              • 什么是BootLoader?
                • 装双系统的时候,开机他会问你选择哪个系统,那个就是BootLoader的程序
                • BootLoader的程序放在了硬盘的第一个扇区
                  • 以前有一种特别剧烈的病毒CIH,就是专门入侵这一块的,这一块出问题系统永远启动不起来了
            • 这个过程会有一些问题,BIOS里面的程序是写死的
              • 有些可以进行设置的东西,开机的时候,还不接触到操作系统的时候,我设置硬盘启动,光盘启动,还是U盘启动
              • 当我把这些设置完以后,关掉电,再通电,这东西还在,说明有个地我可以写数据,而且写的数据不丢
              • 内存肯定是不行的,硬盘上也不行,那时候操作系统还没有接手,访问不了硬盘
              • 记录了开机信息的这一块叫CMOS
                • 他是另外一块芯片
                • 主板上有一块专门的电池给他通电,一般是3v的电池
                • 很多时候开机设密码,进到设置里的密码忘了以后怎么办?密码存CMOS里面,CMOS是用电池通电的,把电池扣掉,CMOS的信息就丢了
          • 写BootLoader之后,可以选操作系统,操作系统装在哪个盘上,这些都记录在BootLoader里面。
          • 操作系统一旦启动,就接管整个事件,你再也不用跟硬件打交道,只需要跟操作系统打交道

系统编程的一些基础概念

中断

  • 定义
    • 从硬件级别来讲,我键盘敲了一下,我很希望操作系统给我一个反馈,哪怕你现在正在运行其他程序
      • 我键盘按上了ctr+alt+del,我要求你给我一个反馈,杀死某些程序,这是键盘的某些信号,他会发到机器内核上
    • 我机器内核跑得好好的,你突然过来了一个东西,我是不是得断掉一下
    • 所以这个叫中断

image.png

  • 硬件和操作系统打交道的时候是通过中断进行的
    • 硬件给操作系统发一个中断信号
    • 操作系统就被打断了
    • 然后操作系统会找到对应中断例程的处理表
    • 看看键盘对应的是哪个程序要处理
    • 不同的硬件会产生不同号别的中断
    • 这些号别的中断在操作系统中早就写好了程序
  • 除此之外,软件也会产生中断
    • 这个叫软中断
    • 软中断只有一个号0x80,0x代表16进制,也可以叫80H,简称80中断

内核态和用户态

  • 很早的时候的操作系统,比如DOS,允许应用程序直接访问硬件,可以直接把硬盘格式化
  • 没有中间层

image.png

  • 现在操作系统都把这种非常危险的操作都屏蔽了
    • 也就是说,现在的操作系统会把那些特别危险的操作,只能我自己来运行
    • 用户想访问硬盘,想访问网络,想访问各种敏感的硬件,需要通过我操作系统的内核
    • 所以现在的操作系统不容易崩溃,像原来DOS的操作系统,很轻易写个程序就把DOS弄死机了。但现在,写程序把Windows、Linux弄死机,太难了
    • 这是因为操作系统内部对于各种各样的操作,进行了分割分离
      • 操作系统自己在优先级特别高的一个等级上,对于他来说,他可以去访问硬件,可以去管理进程、可以管理线程、可以去做内存的直接访问
      • 但是用户不行,用户只能做用户分内该做的事情。这样用户要想杀死操作系统,就特别难了,所以这会的操作系统比那会安全得多
      • CPU会把指令分级别,英特尔CPU分四个级别0、1、2、3
        • 0级可以做任何操作
        • 3级很多操作必须经过0
        • 操作系统的工作是工作在0级上,这种级别叫内核态,在这种级别上他可以访问任何内存
        • 我们自己的程序跑在3这个级别上,只能访问自己所属的内存,不能访问其他进程的内存,也不能访问操作系统的内存
        • 1和2干嘛去了,Linux没有用

程序、进程、线程、协程有什么区别

image.png

  • 程序
    • 硬盘上某一个可执行文件就是一个程序
    • QQ.exe放在硬盘上就是一个程序
    • 当我们双击这个文件的时候,操作系统就会启动对应的进程,再双击一下,又启一个进程,一个程序可以有好多个进程
  • 进程
    • 进程是一个程序跑起来了,放到内存里开始执行了,CPU开始一条一条执行他的指令了
    • 分配资源的单位
      • 启动一个进程的时候,是会分配内存空间的,当然这个内存是虚拟内存,虚拟内存映射到物理内存上也是会分配内存空间的
  • 线程
    • 进程里面好多工作是并行进行的,比如ui展示,接收网络传输,存盘,这些东西是并行处理的。
    • 在一个进程里面怎么进行并行任务呢?通过线程
    • 执行单位
      • 启动线程的时候不会给内存分配任何内存空间
  • 协程/纤程
    • 在一个线程里面还可以做并行任务
    • 一个线程里面不同的执行路径同时可以执行的叫协程
      • go语言里面叫coroutine
      • Java里面叫fiber
    • 简单说,就是线程里面的线程

到底什么是协程?

先补充一些知识:

  1. CPU执行程序的时候就是执行程序的主线程

image.png

  • 程序的本质
    • 一堆的指令
    • 再加一堆数据
    • CPU执行的时候
      • 寄存器里面有一个地方记录我执行到程序的哪条指令了
      • CPU执行的时候,首先找到第一条指令,把它拿过来,把它相关的数据拿到CPU里面来,计算完了之后,把它放回去,再进行下一条指令。什么时候程序结束,什么时候这次计算就算结束。
      • 程序的本质就是不断地取指令
      • 这个过程中也会记录当前线程相关的内容
        • 比如线程执行到什么位置,这些是放在CPU内部的寄存器里面
        • 和线程有关的堆栈也记录了一些信息
      • 作为CPU来讲
        • 我有好多好多任务要执行
        • 但是CPU一个核,一次只能执行一个线程
        • 跟当前线程有关的数据我要存好
        • 当我要换到另外一个线程的时候
          • A线程切换到B线程
          • A线程相关的数据,这些寄存器里面的数据,这些堆栈里面的数据,我都要保存起来
          • 然后把B拿过来执行
  1. 线程的调度,必须经过操作系统

image.png

  • 我们假设JVM里面启了两个线程,这些线程进行切换的时候务必要经过操作系统

  • 作为JVM的线程模型都对应着内核的一个内核线程

    • 操作系统能启的线程数,这是一个很宝贵的资源,他是有限的

    • Java要启一个线程的话,他实际上很重量级,因为他要经过操作系统

    • JVM是工作在用户态,我要启动线程的时候要经过操作系统,得要经过内核态的切换然后映射回来,我才能启好这个线程

    • 在JVM上启动一下线程前前后后加起来要消耗内存一兆左右

  1. 那么有没有一种轻量级的,不经过不惊动操作系统
    • 我在我的用户态里面,不经过操作系统,在我的JVM内部,模拟一些线程出来

    • 我在线程内部做好多堆栈

    • 所谓一个线程就是一些寄存器的信息和一些堆栈上的信息,就能保留这个线程的现场,保留线程的执行过程

    • 我完全可以在用户空间里面模拟出一些线程出来,这一类模拟出来的线程就是协程

  • JDK13目前不支持协程,Kotlin比Java牛的地方就在协程,其他都是一些语法糖。只要JDK14这个出来,go语言准备颤抖吧。JDK11就开始有ZGC和shenandoah,他的垃圾回收器的停顿时间最快可以控制在1ms之内,多数肯定在10ms之内,C++准备颤抖吧
  • 协程一般用在什么地方?
    • 一般用在回调函数上,用户空间的异步编程

image.png

  • 补充:为什么和内核态打交道效率低呢
    • 本质上还是80中断的问题
    • 因为和内核打交道的时候会经过这么几个过程
      • 用户程序可以向操作系统申请调用操作系统的一些函数
      • 操作系统能控制硬件的访问,比如说网络的访问,你要想系统去申请
      • 申请的过程需要报告,80中断
      • 一般来说,应用程序要想调用内核态,能够访问的内核函数有几百个
      • 你想调用哪个函数?发80中断的时候顺带着把80中断的这个id发过去,我想调用read函数,read函数的编号是2
      • 这是老的CPU,现在有一些新的CPU支持system原语,是在汇编阶段的支持
文章分类
阅读
文章标签