当前位置: 首页 > news >正文

从Linux内核学软件设计和开发

Linux内核就像是一个大宝藏。通过开采它,你可以收获很多很多。不仅仅是某一方面的具体知识点,还有它所蕴含的很多设计思想。这些东西,也构成了Linux的设计哲学。

今天,我们就简单来总结一些,希望能够对大家有所启发。当然,内核所包含的远不止这些,大家可以独自思考,深度挖掘。本文就权当是抛砖引玉了。

学内核有三个级别:最顶级的是思想,其次是设计,最后是实现。思想指导设计,设计孵化实现。实现是最显而易见的,设计就隐藏在实现背后,不那么容易被发现。而思想,则隐匿的更靠后,更难把控。相反,如果能够掌握了,则威力也是最大的。

我们很多时候,直接接触或者学习的是实现层面的东西。比如队列是怎么实现的,锁是怎么实现的,定时器的实现,某个驱动的实现等等。再大一点的,就比如内存管理器的实现,进程的实现,进程调度的实现,中断系统的实现,甚至到某个文件系统的实现。

以上都是实现层面的内容。当然,学习这些东西的时候,也会接触到设计层面的意图,但是,可能不够系统。实现层面,可以最直接的告诉你怎么做的问题,但是,为什么这么做,就需要上升到系统设计层面。这需要了解内核的全局和子系统,并对相关系统的实现加以提炼总结。下面,我们简略叙述一些。

从全局来看,内核的结构是层次化设计。我们知道,内核划分了用户空间和内核空间,中间通过系统调用进行通信。从内部来看,内核中又主要包括进程管理,内存管理,驱动,文件系统等大的子系统设计。每个子系统又有自己的设计。比如进程管理就有进程的周期管理(创建、运行、休眠、销毁),调度管理(各种不同的调度器设计,有O(1)调度器,有完全公平调度器,有实时调度器等))。内存管理就有伙伴系统,块分配器等。驱动又分了字符设备,块设备,网络设备等。文件系统下又包括虚拟文件系统,再下面又具体包括各具特色的文件系统,比如针对内存设备的,块设备的,针对网络设备的,针对容量受限设备的,这其中还有读写特性等相关的考虑等等。

设计是怎么来的,自然是思想指导的。俗话说,理论指导实践,这里我们将设计背后的指导原则,作为思想层面来讨论。对于内核来讲,上面所述的设计里就已经包含了一些思想的东西。前面提了,思想层面的内容大多是隐含在设计里面的,不一定那么明显的看出来,需要自己感受和总结。这里举几个例子,全当是抛砖引玉了。

第一个,就是上面设计里已经提到的分层原则。其实,分层更多的是讲横向的。分层的目的主要是划分职责,通过将揉在一起的东西分层切开,弱化实践中带来的复杂度。这个思想在计算机里是广泛存在的。关于那句有名的加个层的说法我们就不再过多着墨了。可能这块大家更多的了解是网络协议的设计实现。这是典型的分层思想,每一层处理的内容都相对聚焦。操作系统的分层也是一个道理。

其次,是分模块。上面设计里面也提到了。如果将软件设计看做一个平面的话,那么分模块就是从纵向来划分了。分模块主要是从范围的角度来看。高内聚低耦合就是典型的分模块原则。一个模块只做相互关联的一些事,内核里就划分了进程、内存、驱动、文件系统等多个模块,每个模块里又有细分模块。其实,我们生活中的很多方面也是这样做的。建筑、汽车、甚至我们人体自身,也是划分为各个子系统的。

将上面两个方面结合起来,就是我们常看到的软件架构图的样子了。既有层又有块。

除了上述分层分模块外,还有一种类似的结构,就是分级结构。生活中的分级组织就是这样的典型例子。级就是层,组织就是模块。只不过这种方式的差异在于,纵向的模块,从上到下垂直方向上,是有内在关联的。

这里要提的第三个,就是抽象。基于这一点,我们的软件设计演化到了面向对象思想,并提出了抽象类的设计。

生活中各种概念的提出就是抽象的过程。内核里也是大量应用了这种设计思想。比如虚拟文件系统的设计,就是抽象的典型代表(更绝的是,Unix类操作系统践行了一切皆文件的抽象)。驱动也是这样的代表。将驱动子系统的共性抽象为设备、总线、驱动、类别等概念。除此,内核许多小模块也是大量应用了抽象的方法。典型的表现就是函数指针的使用。定义一个结构体,包含数据和函数指针,模拟一个类的设计,然后不同的对象,实现具体的接口,这样就隔离了变化。接口这个词的普遍引用,也是这种思想大量实践的表现。我们常见的各种充电接口就是这样的活生生的例子。尤其是USB,可以说是高度抽象。信息传输不就是需要一个波形吗!

如上图中的红色定义,就包含了不同具体红色。

内核与应用的系统调用也是接口应用的很好例子。接口或者抽象,其意图就是隔离变化。如果你仔细琢磨设计模式,就会发现,无非是将抽象类变为各种不同花样来应用。

第四个是机制与策略分离。这个可能大家了解不多。它跟抽象也能说在一起。机制更多的是强调通用的过程,策略则是基于机制玩的不同花样。举个例子,内核网络模块里有个网络包过滤机制,叫做netfilter,它就是一个典型的机制与策略分离的例子。我们知道,除了内核里的过滤器,还要有应用层的iptable工具来配合。过滤器提供机制,就是可以在网络包通路的各个点上可以对包进行处理。这个机制设计好后,基本都是不变的。而具体的过滤规则,就是满足什么条件去过滤,否则放行。这是应用层配置工具的职责。每个人的需求不一样,配置自然也就不同。这样,机制不用变,策略在机制的约束下应对不同的需求。

如上图,下面为通用机制表示,上面为不同的策略配置。

先简单总结这么多。其实,仔细琢磨,就会发现,这些思想虽有各自的特点,但是本质是相通的。也都是与我们生活中许多事情的做法相通的。

前面一二条主要目标是分而治之,将复杂问题简单化,便于人类分析处理。后面两条主要是提炼总结,发现现象背后的本质,以不变应万变

这只是从大的方面举了几个例子。内核里的宝藏远远不止这些。在一些相对小的子系统,也有不错的思想原则值得借鉴。像是调度模块的公平思想的应用,负载计算中衰减思想的应用等。大家可以多多总结学习!

相关文章:

  • 网站建设原因分析/上海疫情突然消失的原因
  • 创建网站需要什么平台/什么是指数基金
  • 石家庄谁会搭建网站/网站seo优化方案项目策划书
  • 北京网站制作/公众号推广接单平台
  • 太原建站一条龙/专业网络推广公司排名
  • 赣州公司做网站/排名优化方法
  • 动态内存管理【详解】
  • 从零备战蓝桥杯——动态规划(递推篇)
  • Java泛型03:通配符的使用和泛型的继承
  • java对象序列化流 将对象写入文件当中
  • Linux 虚拟化技术 KVM
  • 程序设计基础系列作业(湖南师范大学)
  • C++ Reference: Standard C++ Library reference: C Library: cstdio: tmpfile
  • 网络安全观察国外政策法规大事件
  • vue element-plus后台管理系统项目-登录、记住密码功能
  • kali工具熟悉——存活主机识别
  • 项目中使用到的Spring注解及其作用
  • vue3+Echart