一、Linux操作系统通俗认知
假设,我们现在正在做一家外包公司,我们的目标是把这家公司做上市。其中,操作系统就是这家外包公司的老板。我们可以把这家公司的发展阶段分为以下几个阶段:
(1)初创阶段:
我们的老板(操作系统)基于现在存在的开放的营商环境(X86体系结构),创办一家外包公司(系统的启动)。
因为一开始没有其他员工,老板需要亲自接项目(实模式)。
(2)发展阶段:
公司慢慢的越做越大,项目越接越多(保护模式、多线程),为了管理各个外包项目,公司建立了 项目管理体系(进程管理)、会议室管理体系(内存管理)、文档资料管理系统(文件系统)、售前售后体系(输入输出设备管理)。
(3)壮大阶段:
公司越来越牛,开始促进内部项目的合作(进程间通信)和 与外部公司合作(网络通信)。
(4)集团化阶段:
公司的业务越来越多,会成立多家子公司(虚拟化),或者鼓励内部创业(容器化),这个时候,公司就变成了集团。
大管家的调度能力不再局限于一家公司,而是集团公司(Linux集群),从而成功上市(从单机操作系统到数据中心操作系统)。
二、如何把Linux内核当成一家外包公司的老板
操作系统其实就像一个软件外包公司,其内核就相当于这家外包公司的老板。
现在,我们用双击“QQ”,来看操作系统的全貌。其中,这里所说到的 “用户”是指操作系统的用户,“客户”是指外包公司的客户。
1、双击“QQ”这个过程,需要用到的硬件
用户对着屏幕上的“QQ”图标进行双击鼠标。
鼠标和键盘是计算机的输入设备。大部分普通用户想要告诉计算机应该做什么,都是通过这两个设备。相应的,对于一家外包公司而言,我们需要配备销售、售前等角色去专门负责和客户对接,把客户需求拿回来,我们把这些人统称为客户对接员。
屏幕(显示器,实际上面显示的东西是由 显卡 控制的)是计算机的输出设备。它将计算机处理用户请求后的结果展现给用户,要不然用户无法知道自己的请求是不是到达并且执行了。相应的,对于一家外包公司而言,当客户给你提了需求,不管你做还是不做,最终做成什么样,你都需要给客户一个反馈,所以你需要配备 交付人员,将做好的需求展示给客户看。
在操作系统中,输入设备驱动 其实就是 客户对接员。
例如:
新插上一个鼠标的时候,会弹出一个通知你安装驱动,这就是操作系统这家外包公司给你配备对接人员。当客户告诉对接员需求的时候,对于操作系统来讲,输入设备会发送一个中断。这其实很好理解,客户肯定是希望外包公司把正在做的事情都停下来去服务它。
所以,这个时候客户发送的需求就被称为 中断事件(Interrupt Event)。
显卡会有 显卡驱动,在操作系统中称为 输出设备驱动,也就是上面说的 交付人员。
2、从点击QQ图标,看操作系统全貌
有了 客户对接员(输入设备驱动) 和 交付人员(输出设备驱动),外包公司就可以处理用户“在桌面上点击QQ图标”的事件了
首先,鼠标双击会触发一个中断,这相当于客户告知客户对接员“有了新需求,需要处理一下”。而你会事先把处理这种问题的方法教给客户对接员,在操作系统里面就是调用中断处理函数。
运行QQ是一件大事,因为用户将来的一段时间,用户要一直和QQ进行交互。这就相当于公司接了个大单,而不是处理零星的客户需求,这个时候应该单独立项(以后这个项目相关的事情都讲由这个项目组(进程)来处理)。
立项不能随便立,一定要有一个 项目执行计划书(程序),说明这个项目打算怎么做,一步步如何执行,遇到什么情况应该如何处理等。
电脑上的程序有很多,如有道云笔记、Word程序等等,它们都是以二进制文件的形式保存在硬盘上。硬盘是一个物理设备,要按照规定格式化成为文件系统,才能存放这些程序。而文件系统需要一个系统进行统一管理,称为 文件管理子系统(File Management Subsystem)。
对于公司而言,立项多了,项目执行计划书(程序)也会很多,自然也需要有个统一保存文件的档案库进行有序的管理。当你从 档案库 拿到这个项目执行计划书(静态的),接下来就是开始执行这个项目(动态的)。
同理,当操作系统拿到 QQ 的二进制可执行文件的时候,就可以运行这个文件了。QQ 的二进制文件是静态的,称为 程序(Program),而运行起来的 QQ,是动态的,称为 进程(Process)。
3、那么公司如何立项呢?
你会发现一个项目想要顺畅进行,需要用到公司的各种资源,比如:盖公章、开证明、申请会议室、打印材料等等。
这里有个两难的权衡点:
(1)资源毕竟是有限的,甚至涉及机密的,不能由项目组滥取滥用。
(2)效率,保证项目申请资源的时候只跑一次(不需要反复跑),这样才会比较高效。
那么,公司就需要有一个统一的 办事大厅(系统调用 System Call),明文列出提供哪些服务,谁需要可以来申请,然后就会有回应。
在操作系统中,也有同样的问题,如:
多个进程都要往打印机上打印文件时,如果随便乱打印,就会出现同一张纸,第一行是A进程输出的文字,第二行是B进程输出的文字,全乱套了。所以,将打印机的直接操作放在操作系统内核里面,进程不能随便操作。但是,操作系统也提供一个办事大厅,也就是 系统调用(System Call)。
系统调用同样能列出提供哪些接口可以调用,进程有需要的时候就可以去调用。其中,立项是办事大厅提供的关键服务之一(任何一个程序想要运行起来,都需要调用系统调用,创建进程)。
4、成立项目组(进程)
一个项目立项成功后,就需要去执行,那就要成立 项目组(进程),将开发人员分配到这个项目组,按照 项目执行计划书(程序)一步一步执行。
为了管理这个项目,我们还需要一个项目经理、一套项目管理流程、一个项目管理系统。如果项目多,可能一个开发人员需要同时执行多个项目,这就要考验项目经理的调度能力了。
在操作系统中,进程的执行需要分配CPU按照程序里面的二进制代码进行执行。为了管理进程,我们还需要一个 进程管理子系统(Process Management Subsystem)。如果运行的进程很多,则一个CPU会并发运行多个进程,也就需要CPU的调度能力了。
每个项目都应该有自己的私密资料,这些资料不能被其他项目组看到。执行过程中,如果不同项目的办公空间不隔离,一方面,项目的私密性得不到保证,A项目的细节,B项目也能看到;另一方面,项目之间会相互干扰,A项目组的人刚在白板上画了一个架构图,出去上个厕所,结果B项目组的人就给擦了。
如果把不同的项目组分配到不同的会议室中,就可以解决这个问题了。当然会议室也是有限的,需要有人管理和分配,需要一个 会议室管理系统。
在操作系统中,不同进程有不同的内存空间,但是整个电脑内存就那么点,所以需要统一的管理和分配,这就需要 内存管理子系统(Memory Management Subsystem)。
当用户在QQ通过键盘键入信息发送到网络上,QQ进程不能直接发送网络包,需要调用系统调用,内核使用网卡驱动程序进行发送。
这就像客户对接员接到一个需求,但是这个需求需要和其他公司沟通,这就需要依靠公司的对外合作部,对外合作部在办事大厅有专门的窗口。