03 你可以把Linux内核当成一家软件外包公司的老板

【其中S表示原文,A表示我的个人解释】

【请注意,这里面充满大量不成熟的、主观推测的看法】

【大家可以去极客时间支持各位老师的专栏,都是很不错的内容】

S1:操作系统其实就像一个软件外包公司,其内核就相当于这家外包公司的老板。

A1:我个人认为,如果按照作者文章的上下文来看,一家软件外包公司最核心的接项目和做项目,这个项目被作者比喻为程序或者说软件项目,那么按他的比喻来看,操作系统最核心的就是程序,无论是它关于硬件的管理还是关于软件的管理,最后都是要服务于程序的运行。公司老板一般来说都是把握公司大局的存在,那么内核也可以按照他的理解是把握操作系统大局的存在,但这种说法又似乎太宽泛而不具体,应该说内核是调度协调各种资源来服务于程序运行的核心存在。所以它存在的最终目标是使程序更有效能的运行。

S2:鼠标和键盘是计算机的输入设备。大部分的普通用户想要告诉计算机应该做什么,都是通过这两个设备。例如,用户移动了一下鼠标,鼠标就会通过鼠标线给电脑发消息,告知电脑,鼠标向某个方向移动了多少距离。如果是一家外包公司,怎么才能知道客户的需求呢?你需要配备销售、售前等角色,专门负责和客户对接,把客户需求拿回来,我们把这些人统称为客户对接员。你可以跟客户说,有什么事儿都找对接员。屏幕,也就是显示器,是计算机的输出设备,将计算机处理用户请求后的结果展现给客户,要不然用户无法知道自己的请求是不是到达并且执行了。显示器上面显示的东西是由显卡控制的。无论是显示器还是显卡,这里都有个“坐标”的概念,也就是说,什么图像在哪个坐标,都是定义好了才画上去的。本来在某个坐标画了一个鼠标箭头,当接到鼠标移动的事件之后,你应该按相同的方向,按照一定的比例(鼠标灵敏度),在屏幕的某个坐标再画一个鼠标箭头。作为外包公司,当客户给你提了需求,不管你做还是不做,最终做成什么样,你都需要给客户反馈,所以你要配备交付人员,将做好的需求展示给他们看。在操作系统中,输入设备驱动其实就是客户对接员。有时候新插上一个鼠标的时候,会弹出一个通知你安装驱动,这就是操作系统这家外包公司给你配备对接人员呢。当客户告诉对接员需求的时候,对于操作系统来讲,输入设备会发送一个中断。这个概念很好理解。客户肯定希望外包公司把正在做的事情都停下来服务它。所以,这个时候客户发送的需求就被称为中断事件(Interrupt Event)。显卡会有显卡驱动,在操作系统中称为输出设备驱动,也就是上面说的交付人员。

A2:个人感觉在这里,行文似乎有矛盾之处。鼠标和键盘这类输入设备不应该看作是客户对接员,它们应该看做是客户向外包公司发出需求的工具,而操作系统的输入设备驱动才是客户对接员,同样,显示屏这里输出设备也不应该被看作是交付人员,而应该视作客户查看外包公司反馈结果的工具,而操作系统的显卡驱动才是交付人员。合格流程应该是:操作系统启动->接受输入设备驱动接收到的输入设备内容->中断处理->具体程序运行->由输出设备驱动发送反馈内容到输出设备。

S3:运行 QQ 是一件大事,因为将来的一段时间,用户要一直和 QQ 进行交互。这就相当于你们公司接了一个大单,而不是处理零星的客户需求,这个时候应该单独立项。一旦立了项,以后与这个项目有关的事情,都由这个项目组来处理。立项可不能随便立,一定要有一个项目执行计划书,说明这个项目打算怎么做,一步一步如何执行,遇到什么情况应该怎么办等等。换句话说,对 QQ 这个程序来说,它能做哪些事情,每件事情怎么做,先做啥后做啥,都已经作为程序逻辑写在程序里面,并且编译成为二进制了。这个程序就相当于项目执行计划书……硬盘是个物理设备,要按照规定格式化成为文件系统,才能存放这些程序。文件系统需要一个系统进行统一管理,称为文件管理子系统(File Management Subsystem)。对于你们公司,项目立得多了,项目执行计划书也会很多,同样需要有个统一保存文件的档案库,而且需要有序地管理起来。当你从资料库里面拿到这个项目执行计划书,接下来就需要开始执行这个项目了。项目执行计划书是静态的,项目的执行是动态的。同理,当操作系统拿到 QQ 的二进制执行文件的时候,就可以运行这个文件了。QQ 的二进制文件是静态的,称为程序(Program),而运行起来的 QQ,是不断进行的,称为进程(Process)。

A3:个人认为,要分开项目执行书与项目执行组,项目执行书可以类比程序,但又有所不同,程序在被执行时,在硬盘上的本体并不移动,而是先“拷贝”指令到内存处,再由CPU“拷贝”具体指令以执行,项目执行书则是直接被项目执行组从档案库拿出,没有使用副本这一说(或者在实际工作中有,这是另说)。而项目执行组个人感觉要和项目的执行分开,项目执行组应该泛指实施这个项目所需要的一切的资源,但唯独不是这个项目本身,就如同执行一个程序要用到许多资源,这些资源就是项目执行组,但进程本身不是这些资源。进程应该和项目的执行类比在一起,项目的执行应该看做是项目执行组根据项目执行书完成项目这一个过程以及其中产生的中间资料的集合。而不是项目执行书本身,同样的,进程也应该看做是计算机资源在调度下执行程序这一个过程以及其中产生的中间结果的集合,而不是程序本身。

S4:一个项目要想顺畅进行,需要用到公司的各种资源……这里有个两难的权衡,一方面,资源毕竟是有限的,甚至是涉及机密的,不能由项目组滥取滥用;另一方面,就是效率……保证项目申请资源的时候只跑一次,这样才能比较高效。为了平衡这一点,一方面涉及核心权限的资源,还是应该被公司严格把控,审批了才能用;另外一方面,为了提高效率,最好有个统一的办事大厅,明文列出提供哪些服务,谁需要可以来申请,然后就会有回应。在操作系统中,也有同样的问题……直接操作是放在操作系统内核里面的,进程不能随便操作。但是操作系统也提供一个办事大厅,也就是系统调用(System Call)。系统调用也能列出来提供哪些接口可以调用,进程有需要的时候就可以去调用。这其中,立项是办事大厅提供的关键服务之一。同样,任何一个程序要想运行起来,就需要调用系统调用,创建进程。

A4:一个程序的运行涉及多种资源的使用,操作系统的核心目标是服务于程序的运行,那么对于程序运行的重要参与部分——计算机资源,Linux的设计者就会考虑对其做管理。虽然我不太了解没有操作系统时,一个程序应该是如何运行的,但从计算机结构上来看的,程序首先来说通过输入设备输出到磁盘上,运行时要加载到内存供CPU执行,执行再根据指令调用其他设备,并在最后把结果返回到输出设备上。那么可以看出,这里面涉及到的核心资源有:磁盘,内存,CPU,输入输出和其他设备。除此之外,还要涉及一个前提,就是现代的计算机都是多道程序运行,程序的本体是存放在磁盘上的,那么程序的磁盘存储管理是必须的,否则A程序在区域A存储下来了,在下一秒却又被B程序覆盖了,这就会引发极大的混乱。接下来,单道程序加载到内存中,CPU开始执行它的指令,为它向各设备发出控制信号。磁盘的管理在这一阶段是必须的,但由于现代的计算机都是多道程序运行,要让CPU全力开动,尽可能在一段时间内运行更多的程序,首先涉及到的核心问题就是CPU怎样运行更多的程序,由于CPU现在服务多道程序了,所以CPU对程序的运行支持必须依循一定的调度策略,否则无法达到一段时间内运行更多程序的核心目标,那么程序的CPU调度管理也是必须的。由于CPU执行指令的前一步就是从内存加载程序,因此程序的CPU调度管理一定是以程序的内存存储管理为支撑的。由于CPU执行程序时,会使用到包括但不限于内存、磁盘、输入输出等设备,在多道程序同时段的背景下,多道程序之间必然发生资源争夺,因此,程序的资源冲突管理也是必要的。现在,经由分析可知,首先磁盘存储管理是基础、必须的,其次,CPU调度管理是核心,最后,内存存储管理和资源冲突管理是对核心起支撑作用的。然而,程序是不会自己完成这些事情,因为程序不会自己管理自己,而是需要一个管理者来统筹这一切事务,于是操作系统就诞生了,而且既然它要统筹所有事务,那么它一定居于所有程序之前开始加载执行,这样才能管理这些程序。既然操作系统统筹一切事务,那么程序就无法自己触及到磁盘管理、内存管理、CPU调度管理、资源管理这些事务,也就不应该直接触及到磁盘、内存、CPU、输入输出设备这些资源,因为如果允许程序可以触及,那么操作系统统筹一切的目标就被破坏掉了。但因为一定要能够触及这些资源,不然管理就无从谈起,因此,作为最初就执行的程序,操作系统拥有最初没有操作系统时的程序通用的能力——可以直接操作底层,在现在,为了隔绝其余程序触及计算机资源,以防止其破坏自己统筹一切的目标,它在自身的程序逻辑上就阻止了其他程序,但同时,程序的运行必然需要一些计算机资源的支持,因此,操作系统就将它操作底层的一些代码通过系统调用(但实质应该就是函数接口)的形式供其余的程序调用(这似乎与main函数调用其他函数并无二致)。这样操作系统通过首先启动,率先控制了底层,然后将自身的一部分控制代码通过函数的形式统一提供给后面的程序来控制底层,完成统筹一切事务的目标。

S5:QQ 进程是不能直接发送网络包的,需要调用系统调用,内核使用网卡驱动程序进行发送。

A5:进程离开操作系统就几乎不能做任何事情,它的每一件事情都需要使用到系统调用。从这个角度来看,程序似乎已经变成了系统调用的流程组合或者系统调用更高抽象的调用的流程组合。而系统调用又是更底层指令的流程组合。当我们看到应用程序做了某件事情时,那往往不是本质,而是它以精妙的方式整合了操作系统提供的系统调用而后向我们呈现的结果,就好比Docker的底层技术依赖于Linux操作系统提供的功能,而非它自己创造的功能。这也让我们思考,应用层面的技术究竟是什么?是组合吗?或许又不仅仅是简单的组合,更是一种基于现有技术的创新性重组和增值。那么更底层的操作系统的系统调用也是如此吗?再更底层的计算机指令呢?那么最底层的技术又是什么?它又是从什么技术上生成的呢?还是它本身就已不可再进化,而是提供一个基座,假如如此,又是什么将它生成的呢?也许不该究竟于最底层的具体指代,而是把它看成一个抽象,它的具体指代是可以被替换的,技术的进步,尤其是底层技术的革命,会促使我们重新定义“最底层”的含义。

  • 21
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值