linux系统——机制与策略(三)
机制与策略
学习系统调用时,书上提到机制与策略,这也是陈老师与武特学长经常给我们强调的,这是一种设计模式,帮助我们理解操作系统的设计。下面的内容是从陈莉君老师的博客上copy下来的,写的很好,很通俗、透彻。
Unix/Linux的接口设计有一句通用的格言“提供机制而不是策略”。
区别对待机制(mechanism)和策略(policy)是Unix设计中的一大亮点。大部分的编程问题都可以被切割成两个部分:“需要提供什么功能(机制)”和“怎样实现这些功能(策略)”。如果程序可以由独立的部分分别完成机制与策略的实现,那么开发软件就更加容易,也更加容易适应不同的需求。
开源--展现在我们面前的是数以千计的代码,在那一行行的代码背后,到底蕴藏着怎样的设计思想,高手们曾怎样苦思冥想?在一堆堆的代码面前,有时候,我们很容易迷失曾经进来的入口,而调入符号、变量以及函数堆积而成的沼泽地。
操作系统的本质是什么?管理者?亦或服务者?但归根到底,操作系统是一个执行者。
执行用户程序--所谓为用户服务;执行中断--所谓为外设服务;所谓系统调用--所谓解放程序员(姑且说它为广大的程序员服务,因为程序员不再与繁杂的硬件打交道了);执行内核线程--为操作系统自身服务。而这些所有,它们执行的核心,无非是在恰当的时机,让哪个对象(程序、线程、中断服务程序、中断的下半部分、系统调用)占有CPU。换句话说,Unix/Linux抽象出对这些对象的执行机制:
程序的执行机制 -- 进程 ;
内核函数的执行机制 -- 线程;
中断服务程序的执行机制 -- 中断信号触发;
中断下半部的执行机制 -- softirq, tasklet, 工作队列;
系统调用的执行机制 -- 软中断(int $0x80触发)
从机制和策略的角度看问题,也许,你对曾经困惑的问题有豁然开朗之感。
如果说机制是一种框架,那么,策略就是填充框架的一个个具体的实体。机制提供的是一种开放而宽松的环境,而策略就是在这个环境下赖以生存的生命个体。比如,我们编写的一个程序,fork()以后,就成为一个个进程的生命个体。而操作系统所提供给我们创建、执行以及结束进程的各种原语--fork(),exec(),exit()等是统管各种进程的机制。我们所创建进程的死活并不会影响机制本身。
如此看来,也许我们对原理之困惑有所醒悟。我们任何人在任何时候都可一调用fork()创建n多个进程。这样一个简单的fork()壳,想追根溯源者,剥开这个壳,可以看到其本质。fork()如果出现任何一个小的bug,直接影响到我们任何程序员和任何进程。
如此看来,也许我们对开发者所承担的角色有所领悟。系统分析员和设计人员任重道远。说道此,设计模式等系列的书,对于有志于从编码走向设计的开发者或许有所启发。
来自陈老师的博文:http://www.lupaworld.com/home-space-uid-26540-do-blog-id-204505.html
linux系统——机制与策略(三)的更多相关文章
- linux系统——机制与策略(二)
策略与机制 大部分策略与机制的区别定义是,策略是描述如何实现什么功能,机制则是需要实现怎样的功能.在"The Art of Unix Programming" 中Raymond通过 ...
- Linux系统运维笔记(三),设置IP和DNS
Linux系统运维笔记(三),设置IP和DNS 手工配置静态的IP地址 也就是手工配置IP地址.子网掩码.网关和DNS. vi /etc/sysconfig/network-scripts/ifcfg ...
- 给学习Linux系统小白的两三个建议
前段时间看过一个针对国内Linux使用情况的调研表,有了不少感慨.现在听说过linux,会一点linux基本操作的人多如牛毛,然而真正能用linux做一点事情的确少之又少.无论是公司还是学校,办公基本 ...
- linux系统编程之管道(三)
今天继续研究管道的内容,这次主要是研究一下命名管道,以及与之前学过的匿名管道的区别,话不多说,进入正题: 所以说,我们要知道命名管道的作用,可以进行毫无关系的两个进程间进行通讯,这是匿名管道所无法实现 ...
- Linux系统性能测试工具(三)——内存性能综合测试工具lmbench
本文介绍关于Linux系统(适用于centos/ubuntu等)的内存性能综合测试工具-lmbench.内存性能测试工具包括: 内存带宽测试工具——mbw: 内存压力测试工具——memtester: ...
- Linux系统——机制策略(一)
机制策略(一) 形而上谓之道:形而下谓之器: ————易经 LinuxUnix设计理念提供的一种机制不是策略:1.如果说机制是一种框架,那么,策略就是填充框架的一个个具体实施.机制提供的就是一种开放而 ...
- linux系统安全设置策略
1.检查是否设置口令长度至少8位,并包括数字,小写字符.大写字符和特殊符号4类中至少2类. 在文件/etc/login.defs中设置 PASS_MIN_LEN 不小于标准值 修改/etc/pam.d ...
- Linux系统——MySQL基础(三)
### MySQL主从复制实践#### 主从复制实践准备(1)主从复制数据库实战环境准备MySQL主从复制实践对环境的要求比较简单,可以是单机单数据库多实例的环境,也可以是两台服务器,每个机器一个独立 ...
- Linux系统重要文件(三)
一系统运行级别文件 文件路径:/etc/inittab 文件作用说明:定义系统启动后,自动开启哪些软件程序系统 runlevel 查看当前运行级别 centos6系统运行级别: 7个级别 0 ...
随机推荐
- 访问虚拟机中web服务的
经常发现假如我们想弄一点小玩意或跑一些小demo,总是要不断的在自己的工作本本上搭建不同的运行环境,久而久之,本本上充斥着各种软件,速度下降了,同时管理也非常的不方便.于是想到用虚拟机来搭建运行环境, ...
- C++unsigned char和char区别
char和unsigned charchar与unsigned char都是一个字节8bit,唯一的区别是,char的最高位为符号位,因此char能表示-128~127, unsigned char( ...
- primeng 中 pickList组件的使用
primeng 是为angular 开发的一个强大的组建库,有很多强大的功能,拿来即用.但要真正满足自己的业务需求,就是按自己的需求进行修改,比如默认的样式等等. 进入正题. pickList 组件的 ...
- cf492E. Vanya and Field(扩展欧几里得)
题意 $n \times n$的网格,有$m$个苹果树,选择一个点出发,每次增加一个偏移量$(dx, dy)$,最大化经过的苹果树的数量 Sol 上面那个互素一开始没看见,然后就GG了 很显然,若$n ...
- django-redis缓存记录
对于站点缓存,我们使用redis这款key-value数据库.Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径.Redis的数据类型都是基于基本数据结构的 ...
- jstl(c)标签
一.EL表达式: Expression Language提供了在 JSP 脚本编制元素范围外(例如:脚本标签)使用运行时表达式的功能.脚本编制元素是指页面中能够用于在JSP 文件中嵌入 Java 代码 ...
- Java泛型和反射
1. 字节码对象的三种获取方式 以String为例 Class<? extends String> strCls = "".getClass(); Class<S ...
- Git 内部原理之 Git 对象哈希
在上一篇文章中,将了数据对象.树对象和提交对象三种Git对象,每种对象会计算出一个hash值.那么,Git是如何计算出Git对象的hash值?本文的内容就是来解答这个问题. Git对象的hash方法 ...
- 【mysql】 数据库字符集和排序规则
库的字符集影响表和字段的字符集 数据库字符集 >表的字符集 > 字段的字符集 (从前往后优先级由低到高,从左往右继承,如果表没设置字符集,继承数据库的,如果字段没设置,继承表的) 数据库的 ...
- Python之路-基础数据类型之字符串
字符串类型 字符串是不可变的数据类型 索引(下标) 我们在日常生活中会遇到很多类似的情况,例如吃饭排队叫号,在学校时会有学号,工作时会有工号,这些就是一种能保证唯一准确的手段,在计算机中也是一样,它就 ...