操作系统的四大设计原则

现在我可以开始我的Linux内核的入门教程呢,这个教程是默认给完成的路线图的朋友的,或者是说你已经有了一定的c程序的基础,如果你在学习的过程中觉得很困难,那么请去看我的c程序员路线图的文章,去把路线图完成。 虽然我可以开始做内核的教程了,但不幸的是:在开始内核的学习后,你还得边学习内核的时候,边补充一下你的汇编语言能力。(注意学习应用程序编程是不需要学习汇编语言的。只有在研究内核以后需要好好的学习汇编。)所以有两本书大家还是得去看的。 汇编的书籍: 1。 汇编语言的编程艺术 randall hyde 著 马跃 包战翻译 清华大学出版社 2。 汇编语言_基于x86处理器 [美]基普 · 欧文(kip irvine)(著) 机械工业出版社 所以说内核学习的基础是有点高的。 一谈到内核,大家可能都想到很复杂,很困难,之所以学习内核的人会有这样的想法,那是因为大多数的内核书籍把并不会去强调和系统的解释内核编程与一般应用编程的区别。只要明白这些区别,那么内核就与一般的程序没有太大的区别了。好在解释这些区别并不是那么困难,也并不是需要多么高深的技术水平,这完全在我的能力范围之内,特别是对有比较强基础的朋友去解释,这大大的减轻了我的压力了。但我担心失去了困难的压力,我会拖延甚至懒惰这个系列的教程所以我还是加紧的完成这类教程吧。有一点我比较相信就是内核与一般应用的程序的区别不会超过六个方面。这个教程讲解最重要的方面,中断。 多数的国外内核书籍都会去显示内核的复杂性,展示多个模块。但多数的内核书籍都是把中断机制当做内核的一个普通的部分去论述和解释,这种安排给初学者带来很大的困扰。因为内核与应用编程的巨大的区别就是在于内核的CPU中断机制。我在我前面的视频有讲这个问题,就是操作系统的设计严重依赖于CPU设计。cpu提出了中断的这个机制,很大程度上满足了内核发展的需要,内核的各种子模块如进程的调度,进程的切换,外部设备的响应,都需要依靠中断,甚至包括信号函数的设计和实现,内核内部的延期执行的各种机制都是依靠中断机制来实现的,所以中断才是应用程序和内核的最主要的区别,牢牢的抓住中断这个机制,就几乎解决了操作系统的一半的问题。(还有一个部分是虚拟内存机制,这本质上也是一个cpu设计。大多数的人会把虚拟内存机制认定为内核的机制,其实这种误解,恰恰忽略了cpu设计本身是为了满足内核的各种功能而发生的,我以前有在视频里说到过这个问题。这也是值得展开去解释的,应用程序的开发就是需求方与软件开发者 的沟通,是两个人的事情。而内核的开发却是cpu厂商和linux内核社区,c库函数社区,各种外设(例如数字硬盘设备厂家)开发商(他们的驱动程序要安装在内核的操作系统上),各种大型企业(如谷歌,ibm,他们在自己的软件产品中大幅使用linux内核这个平台,因此都积极的参与到内核的开发,比如android系统,还包括显卡厂商。另外内核社区是开源运动最核心的社区,因此内核社区对所有的开源社区都有指导工作的能力,对闭源软件厂商有强大的压力。) 内核的设计主要是cpu厂家,内核开发社区,c库函数社区和各个大型软件企业四个方面的沟通和协调的结果。不同的参与者的利益是不一样的。 1。 intel,arm,龙芯这些企业不能单独的卖cpu,没有操作系统就得破产,这点龙芯体会最深,所以尽可能的设计各种加速内核运行的设计是提高自己产品的竞争力的根本。cpu企业相当的重视这个事情。在邮件列表里,经常会发现linus直接和intel的人邮件沟通问是否可以有某个硬件的机制来支持内核的功能,cpu因为和内核最接近,最直接的决定内核的性能,硬件上的优化可以快1000倍,所以这是算法优化很难达到的。intel不但贴近内核开发和投钱开发工具链对内核做各种测试,linus需要什么就马上帮助他测试什么。服务的很周到的。内核最重要的功能都依赖四个机制: 1。 中断机制 2。 虚拟内存机制 3。 对外设的管理(外设的内存,设备编号,汇编指令操作外设的寄存器) 4。文件系统 (以文件访问硬盘的数据和把各种外设和管道,socket当做问文件来处理。) 那么前三种机制都是cpu提供基础的,而第四种机制是纯算法上的设计,并不是复杂的数学算法而是非常巧妙的工艺改进。多说一点内核的复杂性或者与应用编程的巨大区别,大部分是内核设计依赖cpu设计造成的,即使不了解cpu这些硬件的设计细节,只是了解这个结论都依然是非常的伟大的。评价龙芯的发展程度可以看龙芯在内核社区的参与性得到证明。  内核社区,其实虽然有几百万程序员据说,但真正的核心成员不超过1000个的,因为难,一是技术上难,二是时间上困难,很难有人能连续的投入五到八年左右的时间的。核心成员很多都有十年以上的参与经验。内核社区以前在最早的十年内是为了类似建立一个新中国一样,要解决影响内核发展的各种机制设计,各种道路的选择问题,相当于中国前三十年的道路摸索。而现在的内核在底层的设计比如我前面说的四大基础设计上是相当的稳定了,现在的内核社区就像现在的中国,经过充分的发展。怎么建设社会主义已经被公有制主导的市场经济解决了。所以现在的中央政府更多的是平衡各个利益方的诉求。对已经选择的道路做细微的修正。内核也是一样,现在更多的是在平衡各方的利益,避免内核过分的膨胀,过分的为了技术而技术的修改。同时响应软件大企业的技术需求的内核支持。比如说云计算,虚拟化之类的。这就好比中国现在要响应国际社会强加给他的所谓的国际责任。当然内核对于这些响应是很谨慎的,至少说linus是很谨慎的。很难说linus离开以后的内核会腐败和溃烂成什么样子。linus不会被商业公司所收买的,但后继者不一定。linus这种灵魂人物离开以后,内核社区会不会因为技术问题和路线产生分裂了,这些都很难说。其实你可以把linus理解成康熙那样的勤政的皇帝,而且linus不像大家想象的只处理大的困难的事情和技术,至少我发现很多琐碎而细微的事情他都在参与邮件讨论的。 写到这里发现走了好远了,对我还好,这些东西对于我这种文科生而言,是很熟悉的。我也不是太累。就继续写吧。也还好终于写教程没有那么难了,变成一个辛苦活了。 继续说下去c库函数的开源社区,显得非常的隐藏,大家对他的感知是比较弱的,但一样比较重要。他在包装系统调用,其他的更高级的库,甚至别的脚本语言都是在他的基础上工作的。他们对内核偶尔会提出一些要求,但是更多的是报告bug给内核,他们在包装内核的系统调用过程中以另外的一种形势给内核做单元测试吧。我想很多时候库函数的人实现某些多线程的机制,在内核之外把数据放在进程里,开销非常大,而这种机制又非常重要的时候,内核里的专家会用自己的方式更改内核的数据结构来实现,这样的实现往往效率非常的高,但是修改内核的代价和测试的要求很高,所以往往内核比较少的用这种方式支持库函数的发展。库函数有点冤大头的意思,往往是给内核做嫁衣,自己提出的概念或者技术会被内核消化掉,当然c库函数的人也乐于去甩脱这些包袱。 顺便说一下编译器开源社区,内核本身也是由源代码编译成内核文件的。所以内核是依赖编译器社区的,编译器社区经常会为了代码执行效率和反黑客攻击不断的演化出新的技术,也就是新的编译参数,内核社区会使用这些编译参数,设置成各种内核的宏,然后去用些脚本工具去静态的检测内核的bug问题。这是好的一面。但编译器经常会变更某些编译选项的含义,这造成了内核社区的困扰。所以说内核是个系统工程的,在世界上只有中国和全世界才有可能塑造出独立的内核,编译器,c库这种完全体系。美国的计算机的体系其实是对全世界人才的充分使用。而中国庞大的人力资源绝对具有独立打造一个计算机生态链的能力。这将大大增强中国的独立性和中国的民族自尊心。当然这个前提是要有觉醒了的中国人民,放在计算机体系里是要有觉醒了中国程序员,这也是我写这些教程根本的出发点和目的,塑造更多的内核程序员。如果内核都能搞懂,c库,编译器,甚至图形库都不是问题的。 而各种外设厂商是希望自己的硬件的驱动程序能够预装在linux内核的默认的配置里面。他们是内核里的应用程序开发者,本质上没有多少话语权。 走了很远了。但是必要的,这里必须要说明一点,内核的四大设计是多进程多设备多软件支持的操作系统出现的前提。这四个设计缺一不可。这种需要多个复杂条件才能出现的东西,就像地球上孕育生命一样有着严格的各种限制。所以庞大的宇宙里现在我们能发现就是地球这个小小星球。在这个四个设计原则被发现之前的操作系统都是在一种失败中提供设计教训,即使过去ibm的360操作系统的辉煌和现在的操作系统比起来都是显得原始的。而一旦实现了这四个原则,现代而丰富的操作系统就出现了。符合这个几个原则的操作系统又自身有一些新的设计而变得丰富多彩,而这几个最早四个设计前提就如同被呼吸的空气一样被忽略和遗忘了。于是书本里把这四个原则变成了某个简单的缓存设计一样,变成了解释代码的一部分。所以初学者反而感受不到这些设计了。于是学习的困难就马上出现了。

作者:红红火火急急急
https://www.bilibili.com/read/cv1409392
出处: bilibili
posted @ 2019-01-27 17:33  lemaden  阅读(1478)  评论(0)    收藏  举报