系统设计---分层,分级,分块

在设计一个可用的系统时,往往第一步是设计结构。纵观计算机的发展史,横贯计算机科学的不同领域,有三个方法是很重要的,那就是:分层,分级,分块的思想方法。

记得上高中的时候,我们的物理老师老隔就给我们传授动态的测试方法,当时我们设计一个电路,老隔就给我们讲,要想知道设计方案如何,最好的方法就是“让电 流流一流”,现在工作了,终于明白了这是真的,为了说明问题,关键时刻就让“数据流一流”吧。另外说一下策略和机制,机制说明了事情发生的可能性,而策略描述了事物如何发生。

三个方法有个共同点,就是要达到各司其职,高内聚低耦合的目的,最终方便管理,方便升级,方便替换。但是也有不同的地方。

首先,分层是一个纵向的概念,它承接地将一个过程分为了不同的子过程,每个层次使用下层提供的服务,并且对这些服务进行重新组合和过程分发,为上层提供一个统一的接口,从而屏蔽掉下层的异构体,每一层为上一层提供机制,而策略由上一层提供。注意,分层不是功能意义上的,也就是说,如果某个层次缺失或出错的 话,整个过程将失败。作为例子,我们来看一下TCP/IP模型和现代宏内核操作系统模型。

在TCP/IP模型中,协议族把一个传输过程的路径分为5个层次,分别为物理层,链路层,网络层,传输层,网络层,从前到后,前面的为后面的屏蔽更前面 的,为后面提供传输机制和统一的接口,数据发送时从后到前经过每个层次都要打标记,策略通过填写协议字段来注册,接收是个相反的过程。如果说某一层比如网络层出错了,那么数据流就会在该层断裂,无法继续传输下去了。这么个设计方法很好,比如应用程序员只用写好应用程序并且提供好具体的策略(比如是tcp还 是udp,优先级情况等等)就可以了,同样的,协议栈实现者也不用管底层是铜线还是光纤,网络层实现者不用管下面是X.25还是以太网,而只需要提供策略 并调用下层的接口就可以了。

另外一个例子,宏内核操作系统,但为什么是宏内核操作系统而不提微内核呢,其实微内核恰恰是我们讨论的另一个问题的例子--分块。作为宏内核系统,系统本 身就是一个分层的大结构,应用程序进行系统调用,比如write,调用sys_write,然后数据到了系统调用层,接着就到了虚拟文件系统层,实际上虚 拟文件系统也是一个分层结构,为了向上提供一个统一的文件操作接口,再往下到了设备无关驱动(gendisk)层,然后到达硬件驱动,最终写入硬件,一层 一层往下,下层提供了机制使得上层的策略得以实施。作为一个补充,用户程序库的实现也是这个道理,它屏蔽了不同操作系统的实现细节,提供了用户操作的基本机制,而最终的策略都是应用程序员通过代码传往下层的。

分层的思想很博大精深,远远不止上面这些,但重点基本都说到了。机制和策略的思想和分层的想法实际上是两个独立的思想,我觉得事实上可以这么干,就将它们结合了。

现在说一下分级的思想,它在本质上也是一个纵向的概念,也是将一个过程分为不同的子过程,但是它却不是承接的,也就是说每个过程都是独立的,可有可无的,这就是全部的机制,具体策略就看什么应用,怎么配置,以及怎么实施了。作为例子我就说一下linux的流量控制系统和solaris的调度类。

linux的流控做的真的不错,它将流控分为了3个要素,一个是排队规则,一个是过滤器,一个是类,其中的类中可以实现新的排队规则,然后是过滤器,依次 类推,这就使得一个要素按照尺度和当前上下文情况实现多重受控,比如说可以设计一个设备相关的调度器,一个设备无关的调度器,后者规定入队包的个数而不管具体属于哪个设备,而前者在设备间竞争或协作,作为更现实的例子,考虑县里给了本县100个生育指标,而本县有10个村,县里只给了100个,100个指标怎么在村里分配是县里的决策,比如王村最优先给50个,霍家庄给15个...,但是王村的50个指标怎么在村内分配,县里就不管了,而交给了村支部,这是一个现实中分级调度的一个例子。

现在考虑一下solaris的调度类,实际上理解了上面那个县里发生育指标的例子后就不用看了,道理是一样的。线程先按优先级分到特定调度类里,然后按照调度类的规则进行调度(为了支持容器和区域,好几个调度类的全局优先级是重合的,这里仅讲基本思想,应用请查文档),现在linux的新内核也支持调度类了。

好了,最后一个是分块,所谓分块就是将不同功能区分开来,独立成模块,这个是纯粹策略意义上的概念,因为没有什么统一机制可言,怎么分块全看个人,人就是机制,而且分块比分层和分级更加抽象。作为例子,考虑一下微内核操作系统和面向对象系统。

微内核的内核仅仅提供最基本的机制,而所有策略和非最重要机制都留给进程模块,也就是说,宏内核是像栈一样的一摞子的话,微内核就是把这一摞子竖起来的的一排。面向对象的理论也是这样,当然它更复杂,涉及到了系统设计中的另外的概念,比如抽象,封装之类的,可是那只是过程,作为抽象封装的结果,一个模块建 立了,它是高度独立内聚的,只能通过消息传递来相互通信。

这三个思想就是这么回事,如果读一下linux和minix的代码,我相信比什么都强!

作为结束,其实还远远没有结束

你可能感兴趣的:(系统设计---分层,分级,分块)