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

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

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

首先,分层是一个纵向的概念,它承接地将一个过程分为了不同的子过程,每个层次使用下层提供的服务,并且对这些服务进行重新组合和过程分发,为上层提供一个统一的接口,从而屏蔽掉下层的异构体,每一层为上一层提供机制,而策略由上一层提供。注意,分层不是功能意义上的,也就是说,如果某个层次缺失或出错的 话,整个过程将失败。作为例子,我们来看一下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的代码,我相信比什么都强!

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

系统设计---分层,分级,分块相关推荐

  1. 程序员技能树的分层分级方法

    版本一 初级-初 掌握java基础,熟悉常用类库.理解java web中的servlet,jsp,并了解常用的框架对java web的封装原理,能够借助框架完成增删改查功能.理解数据库在web开发中的 ...

  2. 首席新媒体黎想教程:浅谈用户运营中的用户分层

    其实是一种类似于价格歧视的策略,针对不同的用户采取不同的策略,最终达到提升用户价值,提升用户ARPU值的作用. 这也就是为什么在不同的手机和账号下看到的商品价格是不一样的原因,大数据杀熟就是这么来的! ...

  3. 对软件体系结构的认识

    一 . 软件体系结构(架构) 软件体系结构的定义 通常,软件体系结构通常被称为架构,指能够预制和可重构的软件框架结构.架构尚处在发展期,对于其定义,学术界尚未形成一个统一的意见,而不同角度 的视点也会 ...

  4. 隐私计算 — 联邦学习 — Overview

    目录 文章目录 目录 前言 联邦学习 联邦学习与分布式机器学习的区别 联邦学习的网络拓扑类型 客户端-服务器拓扑 对等网络拓扑 联邦学习的数据分区类型 横向联邦学习 纵向联邦学习 联邦迁移学习(Fed ...

  5. 1.3 常规信息系统集成技术

    系统集成是指将计算机软件,硬件,网络通信等技术和产品集成为能够满足用户特定需求的信息系统,包括总体策划,设计开发,实施,服务及保障. 1.3.1 网络标准与网络协议 网络协议是为计算机网络中进行数据交 ...

  6. 各大厂商企业级BOM解决方案PK

    传统的PDM对于静态的BOM数据管理不再有意义,真正有业务价值的系统应该做到让和产品信息相关的参与者和数据都与业务流程紧密结合,使得利益相关者对于产品的构成.产品的状态.产品如何设计.产品如何制造.所 ...

  7. ORACLE ERP 系统架构与应用实践

    一.从ERP到EBS 从上世纪70年代晚期的物料需求计划MRP(Material Requirements Planning)到80年代的MRP II,再到90年代的企业资源计划ERP(Enterpr ...

  8. WEBGIS开发 数据处理软件CesiumLab学习使用总结

    介绍: 不论是智慧城市.数字孪生.指控系统.边海防管控.智慧军营.遥感图像识别等等,基于地图的相关可视化开发越来越重要了.对于我们Web端地理信息系统开发来说,GIS数据来源不一,结构各异,首先要去处 ...

  9. 对比ThinkPHP和Drupal看中外软件业现状

    住房.结婚.医疗.教育.养老每一个都是一座大山,"搞钱"必须是头等重要的大事,谁有空搞开源?于是仅两个核心开发者打造的ThinkPHP成为了很多人的希望,而另外一边,没有" ...

  10. 广州“1中心3平台”智能交通大数据体系实践

    摘要 为了构建现代化交通治理体系,提升品质交通服务能力,亟须构建强驱动与可持续的城市智能交通大数据体系.首先回顾了城市交通大数据研究的应用现状,然后分析了城市交通大数据的发展需求与目标,最后以广州市城 ...

最新文章

  1. Leangoo Talk第一期——Scrum与OKR融合实践
  2. 配置管理之PackageProvider接口
  3. VC++图片框控件静态和动态加载位图
  4. 华为发布会: 牛逼鸿蒙,吹水的大会
  5. mycat读写分离部署步骤
  6. 白盒测试六种方法案例分析
  7. js中去掉字符串中的某个指定字符
  8. Array和ArrayList的区别与联系
  9. JavaFX之3 动画与事件处理
  10. 路径规划算法学习Day4-Astar算法
  11. 【材料力学回顾】弯曲正应力公式
  12. OpenAI怎么写作「谷歌小发猫写作」
  13. 通俗易懂的TextCNN
  14. 计算机电子智能化贰级,电子与智能化工程专业承包资质分为一级、二级。
  15. 5W1h分析法分析---play框架
  16. 按键精灵文字识别插件_按键精灵课程学习目录
  17. vue提示音_VueJS 实现管理后台新订单的语音提醒
  18. excel 永久保存宏命令
  19. 一个小游戏的代码(猜数字)
  20. 用腾讯云COS制作个人图床

热门文章

  1. 【知识碎片】JavaScript篇
  2. 【博客之星】帮我投一票吧,谢谢
  3. 输入字符串按照单词逆序输出
  4. 贡献一个新浪的幻灯片(javascript)
  5. linux下批量查找UTF-8的BOM文件,并去除BOM
  6. 2017-07-08 前端日报
  7. [数据集]新浪微博数据集MicroblogPCU
  8. 解决Eclipse出现的Failure to transfer ... jar问题
  9. 再续2014年网页设计趋势
  10. 关于使用FMDB往数据库里插入空字符串@后,再读出来是什么东西的问题