陈莉君

陈莉君的博客

她的个人主页  她的博客

机制与策略

陈莉君  2009年10月21日 星期三 08:48 | 8661次浏览 | 23条评论

Unix/Linux的接口设计有一句通用的格言“提供机制而不是策略”。区别对待机制(mechanism)和策略(policy)是Unix设计中的一大亮点。大部分的编程问题都可以被切割成两个部分:“需要提供什么功能”(机制)和“怎样实现这些功能”(策略)。如果由程序中的独立部分分别负责机制和策略的实现,那么开发软件就更容易,也更容易适应不同的需求。

Unix/Linux 的接口设计有一句通用的格言“提供机制而不是策略”。   区别对待机(mechanism)和策略(policy)是Unix设计中的一大亮点。大部分的编程问题都可以被切割成两个部分:“需要提供什么功能”(机制)和“怎样实现这些功能”(策略)。如果由程序中的独立部分分别负责机制和策略的实现,那么开发软件就更容易,也更容易适应不同的需求。

   开源 - 展现在我们面前的是数以千计的代码,在那一行行的代码背后,到底蕴藏着怎样的设计思想,高手们曾怎样苦思冥想。在一堆堆的代码面前,有时候,我们很容易迷失曾经进来的入口,而掉入符号,变量以及函数堆积成的沼泽地。


  操作系统的本质是什么?管理者?亦或服务者?但,归根结底,它是一个执行者:执行用户程序 - 所谓为用户服务;执行中断- 所谓为外设服务;执行系统调用 - 所谓解放程序员(姑且说它为广大的程序员服务,因为程序员不再与繁杂的硬件打交道了);执行内核线程-为操作系统自身服务。而这所有执行的核心,无非是在恰当的时机,让哪个对象(程序,线程,中断服务程序,中断的下半部,系统调用)占有CPU 。换句话说, Unix/Linux 抽象出对这些对象的执行机制:
  •   程序的执行机制 - 进程
  •   内核函数的执行机制 - 线程
  •   中断服务程序的执行机制 - 中断信号触发
  •   中断下半部的执行机制 -softirq tasklet ,工作队列
  •   系统调用的执行 - 软中断( int $0x80 触发)
  
  从机制和策略的角度看问题,也许,你对曾经困惑的问题有赫然开朗之感。

  如果说机制是一种框架,那么,策略就是填充框架的一个个具体实体。机制提供的是一种开放而宽松的环境,而策略就是在这个环境下赖以生存的生命个体。比如,我们编写的一个程序,fork()以后,就成为一个个进程的生命个体。而操作系统所提供给我们创建、执行以及结束进程的各种原语-fork(),exex()和exit()等是统管各种进程的机制。我们所创建进程的死活并不会影响机制本身。

 如此看来,也许我们对原理之困惑有所醒悟。我们任何人在任何时候都可以调用fork()创建N多进程。这样一个简单的fork()壳,想追根溯源者,剥开这个壳,可以看到其五脏六腑。fork()如果出现任何一个小bug,直接影响到我们任何人和任何进程。

如此看来,也许我们对开发者所承担的角色有所感悟。系统分析员和设计人员,任重而探究的路漫漫兮。说到此,设计模式等系列书,对有志于从编码走向设计的开发者或许有所启发。

 

 

评论

我的评论:

发表评论

请 登录 后发表评论。还没有在Zeuux哲思注册吗?现在 注册 !
KellyZu

回复 KellyZu  2013年10月07日 星期一 16:06

面向对象的方法应该提供了比较完善的方法学方面的支持吧。Booch的思想

0条回复

Alex.Tang

回复 Alex.Tang  2009年10月29日 星期四 09:49

超赞

0条回复

潘多

回复 潘多  2009年10月22日 星期四 15:44

原来陈老师也在哲思,不知道会不会也看到王老师的身影

1条回复

李登

回复 李登  2009年10月22日 星期四 00:45

西邮传奇人物 向陈老师问个好!

1条回复

邱旭培

回复 邱旭培  2009年10月21日 星期三 22:38

主题那句话说的很经典

0条回复

Alex Lau

回复 Alex Lau  2009年10月21日 星期三 22:21

"怎样实现这些功能" 我认为可以写成 "怎样满足用户需求"更清椘一点

0条回复

太然

回复 太然  2009年10月21日 星期三 21:30

依稀有些感觉,但是还没有完全明白。 继续阅读《深入理解linux内核》

0条回复

翁伟

回复 翁伟  2009年10月21日 星期三 20:19

很赞同这一条……

不过我《Unix编程艺术》中所描述的machanism & policy跟你所描述的:
需要提供什么功能”(机制)和“怎样实现这些功能”(策略)。
不一样。

按我的理解,更加类似于:
需要提供什么功能”(机制)和“怎样 使用 这些功能”(策略)。”业务逻辑是经常改变的,但是功能本身可以相对固定。
用户升级是一个机制;但用户什么时候可以升级是一个策略。可以是用户经验值到了,也可以是春节礼包大放送
究竟是哪个,这就要看策略了

0条回复

電波系山寨文化科学家

回复 電波系山寨文化科学家  2009年10月21日 星期三 14:25

火星贴,鉴定完毕。

0条回复

张宇杰

回复 张宇杰  2009年10月21日 星期三 12:46

不懂

0条回复

达伦王

回复 达伦王  2009年10月21日 星期三 12:19

战略,战术的问题?!

1条回复

冯莹

回复 冯莹  2009年10月21日 星期三 12:11

赞!

0条回复

谢路云

回复 谢路云  2009年10月21日 星期三 10:42

我怎么感觉“需要提供什么功能”是策略问题,而“怎样实现这些功能”是机制问题呢?

3条回复

  • 陈莉君

    回复 陈莉君  2009年10月21日 星期三 14:37

    你这样感觉也没有关系,只要在你设计的时候能把二者分开就是。其实,从用户角度来看,操作系统提供的是机制,可是,从操作系统与硬件的接口来看,操作系统提供的是策略,它屏蔽了硬件的细节,给予具体的实现。

    1条回复

      • 数学狗

        回复 数学狗  2013年12月05日 星期四 17:44

        我想,机制在汉语中的意思是指事物的内因,而我认为在这里用机制这个词来形容不是很合适,如果不考虑术语与普通语言的一致性,怎么表述确实无所谓,但是我觉得保持认知的一致性总是好的,所以对于机制这个概念,我更倾向于用封装和透明性的的角度去理解他,类似瀑布模型的感觉,对于接触不同层面的用户,我们把对于相应用户的底层封装起来,实现底层对上层用户的透明化。所谓机制与策略的关系,说白了就是对于不同层级用户的底层与用户层的关系。

        0条回复

  • 孙敬越

    回复 孙敬越  2009年10月21日 星期三 11:07

    看一下陈老师翻译的<<深入理解Linux内核>>

    0条回复

aboost

回复 aboost  2009年10月21日 星期三 10:32

赞,Unix编程艺术

0条回复

孔志奎

回复 孔志奎  2009年10月21日 星期三 10:17

赞一个!

0条回复

仲光泽

回复 仲光泽  2009年10月21日 星期三 09:24

还在理解。。。。囧

0条回复

雷振林

回复 雷振林  2009年10月21日 星期三 09:10

很受启发!

0条回复

暂时没有评论

Zeuux © 2024

京ICP备05028076号