unix哲学同其他哲学的比较(unix编程艺术摘录)

如果你不知道怎么表现的高人一等,找个unix用户,让他做给你看。                  

                                                                                --呆伯通讯

 

  操作系统的设计,在明显和微妙两方面, 造就了该系统下软件开发的风格。本书大部分内容描绘了此两者之间的联系:Unix操作系统设计,以及由此发展出的编程设计哲学。为了便于对照,我们不妨把经典的Unix方式和其他主要操作系统的设计和编程习俗做一番比较。

  操作系统的风格元素

  开始讨论特定的操作系统之前,我们需要一个组织框架,来了解操作系统的设计是如何对编程风格产生或健康或病态的影响。

  总的来说,于不同操作系统相关的设计和编程风格可以追溯出三个源头:a,操作系统设计者的意图 b,成本金额编程环境的限制对设计的均衡影响 c,文化随机漂移,传统无非就是先入为主。

  即使我们承认每个操作系统社区中都存在文化随机漂移现象,那么去探究一下设计者的意图和成本及环境造成的局限也能揭示一些有趣的规律,帮助我们通过比对来更好地理解Unix风格。我们可以通过分析操作系统最重要的不同之处把这些规律明确化。

  什么是操作系统的统一性理念?

  Unix有几个统一性的理念或象征,并塑造了它的API及由此形成的开发风格。其中最重要的一点应当是“一切皆文件”模型及再次基础上建立的管道概念。总的来说,任何特定操作系统的开发风格均受到系统设计者灌注其中的统一性理念的强烈的影响——有系统工具和API塑造的模型将反渗到应用编程中。

  相应的,将Unix和其他操作系统作比较时,最基本的问题是:这个操作系统存在对其开发有均有决定作用的统一性理念吗?如果有,它和Unix的统一性理念有何不同?

  彻底彻尾的反Unix系统,就是任何统一性理念,胡乱堆砌起的一些唬人特性而已。

  多任务能力

  各种操作系统最基本的不同之处之一就是操作系统支持多进程并发的能力。最低端的操作系统(如dos或者cp/m),基本上就是一个顺序的程序加载器,根本不具备多任务能力。这种操作系统在通用计算机上已经毫无竞争力。

  再往上一个层次,操作系统可具有协作式多任务能力。这种系统能够支持多个进程,但是一个进程运行前必须等待前一个进程主动放弃 占用处理器(这样一来,简单的编程错误就很容易将机器挂起)。这种操作系统风格是对一种硬件的暂时性适应,这种硬件虽然功能强大到支持并行操作,但要么缺乏周期性时钟中断,要么缺乏内存管理单元,或者两者都缺。这种系统也过时了,不再具有竞争力了。

  Unix系统拥有抢先式多任务能力。在Unix中,时间片由调度程序来分配,这个调度程序定期中断或者抢断正在运行的进程而把控制权,交给下一个进程。几乎所有的现在操作系统都支持抢占式调度。

  注意,“多任务”跟“多用户”不是一回事。一个操作系统可以进行多任务处理而只支持单用户,在这种情况下,计算机支持的是单个控制台和后台进程。真正的多用户支持需要多个用户权限域,我们将在随后讨论内部边界时进一步讨论这个特性。

  彻头彻尾的反Unix系统,就是绝无多任务处理能力——或者通过对进程管理增设诸多的规定、限制和特殊情况来消弱多任务能力——的一个废物。

  协作进程

  在Unix中,低价的进程生成和简便的进程间通讯使众多小工具、管道和过滤器组成一个均衡系统成为可能。我们将在第七章探讨这个均衡体系。在这里,我们需要指出代价高昂的进程生成和IPC会带来什么后果。

  管道虽然在技术上容易发现,但影响却很大,进程是自主计算单元的统一性记号,而金城控制是可编程的——如果没有这些概念,那么管道技术就不可能这么简单,和Multics一样,Unix的shell(外壳)只是另外一个进程;进程控制并非受JCL(作业控制语言)之赐。

  如果操作系统的进程生成代价昂贵,且/或进程控制非常困难、不灵活,后果通常是:

                 @编写怪物般巨大的单个程序成为更自然地编程方式

                 @很多策略必须在这些庞大程序中表述,这会助长使用c++金额诡异的内部代码层级,而不是c和相对平坦的内部层级。

                 @此进程不得不进行通讯是,要么只能采用笨拙、低效、不安全的机制(比如临时文件),要么就得依赖太多彼此的实现细节,要么彼此需了解对方的太多实现细节。

                 @广泛使用多线程来完成某些任务,而这些任务Unix只需用互通的多进程就能处理。

                 @必须学习和使用异步I/O

 这些就是操作系统环境的局限性所导致的常见风格缺陷(甚至应用程序编程中也样)的实例。

 管道和所有其他经典的Unix IPC方法有一个精微的性质,就是要求把程序间的通讯简化到某一程度而促使功能分离。相反地,如果没有与管道等效的机制,则程序必须在完全互相了解对方内部细节的基础上设计程序,才能实现彼此间的合作。

 一个操作系统,如果没有灵活的IPC和使用IPC的强大传统,程序间就得通过共享结构复杂的数据实现通讯。由于一旦有新的程序加入通讯全,圈子里所有的程序的通讯问题就必须重新解决,所以解决方案的复杂度与协程序数量的平方成正比。更糟糕的是,其中程序的数据结构发生变化,都说不定会给其他程序带来什么隐蔽的BUG。

(word,excel,powerpoint和其他微软程序对彼此的内部具有“密切”——有些人可能称之为“杂乱”——的了解,在Unix中,一组程序设计时不仅要尽量考虑相互协作,而且要考虑和未知程序的协作)

  彻头彻尾的反Unix系统,就是让进城的生成代价高昂,让进城的控制困难而死板,让IPC可有可无,对它不予支持或支持很少。

 

 

写的比较长了,下面的在下面再写......

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值