从操作系统内核看设计模式--linux内核的facade模式
linux的内核当中处处充满了设计模式,本文先讨论一下外观模式。外观模式就是将客户和子系统解耦,为客户将复杂的子系统进行封装,从而使得客户可以使用简单易用的接口。
众所周知,linux和unix是十分的相似以至于很多人都把linux当作unix的一种,实际上他们一点也不同,一个linux程序员可以毫不费力的 转到unix下编程不是因为这个人水平多高,而是因为linux和unix遵循了几乎相同的接口,而程序员只需要和接口打交道,所以一切变得容易,这种接 口在某种意义上可以认为就是posix。
我来说一下linux内核中用到外观模式的一些例子。
1.文件读写接口
考虑一个读文件的过程,必须有文件名,然后有文件存储的介质,这样才可以将文件读出,用户要使用这种方式读文件的话,就必须自己动手去访问磁盘,显然就要对磁盘很了解,这是不现实的,这个过程起码涉及到缓存管理子系统,磁盘存储子系统,但是linux并没有苛求用户去直接操作这两个子系统而是为之代劳了,提供给用户的就是简单的,容易理解的read和write还有上述二者之前的open。外观模式使得子系统的更改不用通知用户,linux内核做到了,从 0.01到2.6.27,要读一个文件几乎都是在用一样的接口,但是底层的子系统实现却更变了很多,几乎一次又一次得被重写,用户一点也没有感觉到(当然能被感觉到,比如速度快了,所以这里的用户指的是程序员编程的过程)。好了,用户层的我们说完了,那么进入了系统,看以下代码:
asmlinkage ssize_t sys_write(unsigned int fd, const char __user * buf, size_t count)
{
...
ret = vfs_write(file, buf, count, &pos);
...
}
第四行的vfs_write里面调用了具体文件系统的file_operations的write方法,这又是一个外观,可以这么说,一直到最底层的磁盘,外观模式一直在起着用,这样就使得一个系统作为客户只需要和这个外观交互而不用管这个外观之下到底是什么。
2.等等等等
我为何如此不负责任呢?不是不负责任,而是根本没有办法再寄一个具体的例子了,通读源码,你会发现所有的子系统和该子系统用到的孙系统,在这一棵内核大树下,都在使用外观模式,比如缺页中断处理只是调用通用的缺页入口程序,具体怎么处理缺页就涉及到不同的子系统是怎么实现的,通用处理作为客户就此撒手将任 务交给这个外观,然后等待结果;再比如内存分配;还有网卡的流量控制;还有磁盘调度;....
外观模式重要的不是接口本身而使接口如何设计,如何将用户对若干子系统的交互进行汇总从而实现一个汇总后的操作,该操作可以代替那若干个操作,这在很多时候是一种提取公因子的操作,而在另一些时候缺失一个定限的工作,比如内核根本不允许的操作不能放到这个“外观”中,当然可以反着理解,如果你不希望内核的 “外观”干涉你的事物,那么就不要把你的事物放到和这个外观关联的子系统内,因为外观模式中,外观是明确定限的。举个例子可能会好一些,linux内核的 内存回收策略是lru,内核会定期检查规定好的lru链表然后将一些位于其上的内存释放掉,这里的外观就是内核的回收策略,而子系统就是lru链表,如果你不想内核释放你的内存,那么很简单,不要将你的内存页面加入到lru链表就可以了,内核中是严格模块化的,高度低耦合的,往往一个外观只和确定的子系统交互。
http://blog.csdn.net/dog250/article/details/5303231
从操作系统内核看设计模式--linux内核的facade模式的更多相关文章
- 操作系统内核Hack:(四)内核雏形
操作系统内核Hack:(四)内核雏形 在本系列的前一篇文章<操作系统内核Hack:(三)BootLoader制作>中,我们制作出了一个两阶段引导BootLoader,并进入了一个内核的空壳 ...
- 从操作系统内核看Java非阻塞IO事件检测
非阻塞服务器模型最重要的一个特点是,在调用读取或写入接口后立即返回,而不会进入阻塞状态.在探讨单线程非阻塞IO模型前必须要先了解非阻塞情况下Socket事件的检测机制,因为对于非阻塞模式最重要的事情是 ...
- linux 内核的链表操作(好文不得不转)
以下全部来自于http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/index.html 无任何个人意见. 本文详细分析了 2.6.x 内 ...
- Java线程与Linux内核线程的映射关系[转]
Linux从内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上还轻量级进程. Java里的线程是由JVM来管理的,它如何对应到操作系统的线程是 ...
- 【转】Java线程与Linux内核线程的映射关系
Linux从内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上还轻量级进程. Java里的线程是由JVM来管理的,它如何对应到操作系统的线程是 ...
- Java线程与Linux内核线程的映射关系
Linux从内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上还轻量级进程. Java里的线程是由JVM来管理的,它如何对应到操作系统的线程是 ...
- 1、话说linux内核
1.内核和发行版的区别 到底什么是操作系统 linux.windows.android.ucos就是操作系统 操作系统本质上是一个程序,由很多个源文件构成,需要编译连接成操作系统程序(vmlinz.z ...
- 【操作系统】二、JVM线程与Linux内核线程的映射
Linux从内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上还轻量级进程. Java里的线程是由JVM来管理的,它如何对应到操作系统的线程是 ...
- [转帖]Linux内核为大规模支持100Gb/s网卡准备好了吗?并没有
Linux内核为大规模支持100Gb/s网卡准备好了吗?并没有 之前用 千兆的机器 下载速度 一般只能到 50MB 左右 没法更高 万兆的话 可能也就是 200MB左右的速度 很难更高 不知道后续的服 ...
随机推荐
- 环境变量、system(day10)
一.环境变量 bash下的环境变量. 每个进程都默认从父进程继承环境变量 bash本身就是一个程序,这个程序运行的时候,bash进程 可以定义只能之自己这个进程中使用的变量,这种变量称为自定义变量. ...
- 洛谷P1601 A+B Problem(高精)
题目描述 高精度加法,x相当于a+b problem,[b][color=red]不用考虑负数[/color][/b] 输入输出格式 输入格式: 分两行输入a,b<=10^500 输出格式: 输 ...
- Python学习笔记之模块与包
一.模块 1.模块的概念 模块这一概念很大程度上是为了解决代码的可重用性而出现的,其实这一概念并没有多复杂,简单来说不过是一个后缀为 .py 的 Python 文件而已 例如,我在某个工作中经常需要打 ...
- PAT 1072. Gas Station
A gas station has to be built at such a location that the minimum distance between the station and a ...
- 邓_ Phpcms·二次开发
PHPCMS V9产品介绍 PHPCMS V9(简称V9)采用PHP5+MYSQL做为技术基础进行开发.V9采用OOP(面向对象)方式进行基础运行框架搭建.模块化开发方式做为功能开发形式.框架易于功能 ...
- Unity 利用FFmpeg实现录屏、直播推流、音频视频格式转换、剪裁等功能
目录 一.FFmpeg简介. 二.FFmpeg常用参数及命令. 三.FFmpeg在Unity 3D中的使用. 1.FFmpeg 录屏. 2.FFmpeg 推流. 3.FFmpeg 其他功能简述. 一. ...
- NodeJS的安装与使用
Node.js 就是运行在服务端的 JavaScript.越来越多的人在使用它,通过他我们可以用JavaScript来构建后台.对于前端程序员而言,不言而喻这是一条多么令人振奋的消息.对于后台程序员而 ...
- RedisTemplate Api总结
RedisTemplate 使用总结 最近在做一个项目,考虑到有累计,排行,缓存等功能:而Redis是一个基于内存的数据库,而且提供了 字符串(String), 哈希(Map), 列表(list), ...
- SWT中嵌入Swing的JTextFeild却不能编辑
SWT中嵌入Swing的JTextFeild却不能编辑 学习了:http://www.iteye.com/problems/49487 膜拜一下 org 竟然有这样的坑,需要在中间添加一个JApp ...
- Heat-AutoScaling
在openstack的I版本号中,Heat中加入了对于AutoScaling资源的支持,github上也提供了相应的AutoScaling的模板,同一时候也支持使用ceilometer的alarm来触 ...