从操作系统内核看设计模式--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左右的速度 很难更高 不知道后续的服 ...
随机推荐
- 洛谷P1316 丢瓶盖【二分+递推】
陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢? 输入输出格式 输入 ...
- mysql deadlock、Lock wait timeout解决和分析
项目上线 线上遇到大量的deadlock 和wait timeout 但是看程序没什么问题 问dba也不能给出很好的解决方案!最终自己去了解mysql锁 以及看mysq锁日志 如果了解mysql锁的机 ...
- JAVA接口的简单实现
感觉越来越强烈, 我的心在跳~~~,我的宝剑在嘟~~ Flyer.java package cc.openhome; public interface Flyer{ public abstract v ...
- POJ 1329
模板题,注意一下输出就可以. #include <iostream> #include <cstdio> #include <cmath> #include < ...
- 初探BurpSuite
BurpSuite这套渗透软件.或者已经能够说是渗透攻击平台了吧,玩的好.确实非常方便. 就像是玩英雄联盟的ADC,一開始玩VN.感觉非常难上手,玩多了肯定会爱上VN(啊,貌似提到了什么奇怪的东西). ...
- quick-cocos2d-x游戏开发【9】——单点触摸
quick的触摸机制,我想廖大已经在这篇文章里说的非常清楚了.我们这些小辈们就是在他的基础上完备一下,说说使用方法就能够了.嘿嘿. 在2.2.3之前的版本号(不包含2.2.3).触摸机制和廖大在那篇文 ...
- CF D. Beautiful numbers (数位dp)
http://codeforces.com/problemset/problem/55/D Beautiful Numbers : 这个数能整除它的全部位上非零整数.问[l,r]之间的Beautifu ...
- POJ3204 Ikki's Story - Road Reconstruction 网络流图的关键割边
题目大意:一个有源有汇的城市,问最少增加城市中的多少道路可以增加源到汇上各个路径上可容纳的总车流量增加. 网络流关键割边集合指如果该边的容量增加,整个网络流图中的任意从原点到汇点的路径的流量便可增加. ...
- Ubuntu使用ssh方法连接不上
查看远程机器是否安装ssh服务(ubuntu 没有默认安装ssh) 命令:ssh host (图中没有安装) 安装ssh 命令 sudo apt-get install openssh-serve ...
- The Triangle--nyoj 18
The Triangle 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure ...