引言
《现代操作系统原理与实现》是一本介绍操作系统相关的书籍,是以ARM平台进行演示的.目前在看过一遍之后,我觉得还是比较有意思的操作系统结构、硬件结构、内存管理、进程与线程、进程间通信、同步原语、文件系统这七个章节.
下面会依次对这些章节做相关介绍.
操作系统结构
为什么要优先介绍操作系统结构,是这个章节给我带来了极大的感悟:对于像操作系统这样庞大的系统,在良好的架构下可以很好的有序演进,这一点是很多业务系统所欠缺的.
下面将从两个方面进行介绍:设计方法、实践
设计方法
对于操作系统的设计方法或者方法论(不太喜欢’方法论’这一表述词,因为有一种’定式’的味道,现实或代码中并没有什么是固定的)来说,主要是对复杂度进行管理的一种手段;
这里介绍了一种设计方法:M.A.L.H,即模块化(modularity)、抽象(abstraction)、分层(layering)、层级(hierarchy),我对于设计简直是认同的不能在认同了.
模块化
模块化是通过‘分治法’的思想,将一个复杂系统分解为一系列有明确含义/领域能相互进行交互的小模块.模块的划分一定要具有’高内聚’和’低耦合’的特性,不能过大也不能过于小.
现代操作系统都是模块化的,以linux内核为例,可以看到分为若干模块
关于模块化还有一些学者的阐述:
抽象
抽象是在模块化的基础上,将接口与内部实现进行区分,从而使得策略与实现分离.
这也是程序设计中的一个重要的设计原则:策略与机制分离:策略表示的是"要做什么",机制表示的是"要如何做"
在操作系统中有很多抽象的例子,比如VFS、虚拟内存等就对不同硬件的抽象.
良好的模块化与抽象可以很好的将一个大型系统分解为一系列能够比较好的进行交付的模块;
分层
分层是通过将模块按照一定的规则进行层次划分,约束每一层内部模块之间的交付方式与跨层次模块之间的交互方式,从而使得整个系统的交付方式有序;通常的规则约束是:一个模块只能和同一层模块以及相邻的上下层模块进行交互,而不能跨模块进行交互.
分层是开始构建复杂系统架构的开始,通过确定层级后,先构建底层基础模块,然后在利用这些基础模提供的功能来构建应用服务.
在实际web项目中基本上都会根据controller/service/dao三层架构来进行划分,service层的扩展要稍微多一点,例如六边形架构、洋葱圈架构等.
层次
层次是模块化的另外一种表现方式,是系统对功能的抽象与组织;例如组织架构类似,在组织架构上经理岗位是负责某一部分业务的,那公司的这一部分业务就需要交给他这个岗位进行负责;这个岗位下又会在分解交给其他岗位完成一样;
层次会在完成模块化、抽象、分层后自然体现出来,它与分层概念很类似,我认为的区别在于分层关注的是交互/调用关系的维护和有序,层次是关注与功能的抽象和组织;
一些碎碎念
大多数程序员长期以来写的代码都是以实现当前需求为己任,对于代码之后的生命周期是不会去考虑的.这样的代码在过了几个月以后或者另外一位同事接手后不得不在一声声’问候’下继续做相同的事情.
我始终认为简单明了的代码是最好的代码,因为这样的可读性是最好的; 不用去追求’新’、‘奇’来体现技术能力,而是要去追求’正确性’、'可读性’来体现技术能力;
然而在实际开发中,我们往往缺少一种能够指导的方法,我认为M.A.L.H就是一种非常好的实现,M.A.L.H中隐含了一些程序设计的技巧或法则:单一职责原则、依赖倒置原则、接口隔离原则
个人理解总结下来:
是否能够模块化?
是否需要抽象?
是否能够分层?
是否体现层次?
这些表现是层层递进的一个过程.