从操作系统内核看设计模式--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左右的速度 很难更高 不知道后续的服 ...
随机推荐
- UOJ #214 合唱队形 (概率期望计数、DP、Min-Max容斥)
9个月的心头大恨终于切掉了!!!! 非常好的一道题,不知为何uoj上被点了70个差评. 题目链接: http://uoj.ac/problem/214 题目大意: 请自行阅读. 题解: 官方题解讲得相 ...
- 【ACM】nyoj_540_奇怪的排序_201308050951
奇怪的排序时间限制:1000 ms | 内存限制:65535 KB 难度:1描述 最近,Dr. Kong 新设计一个机器人Bill.这台机器人很聪明,会做许多事情.惟独对自然数的理解与人类不一样, ...
- 洛谷—— P2014 选课
https://www.luogu.org/problem/show?pid=2014 题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课 ...
- 获取Class对象方式
在java中,每个class都有一个相应的Class对象,当编写好一个类,编译完成后,在生成的.class文件中,就产生一个Class对象,用来表示这个类的类型信息.获得Class实例的三种方式: 1 ...
- Node.js具体解析
介绍 JavaScript 高涨的人气带来了非常多变化.以至于现在使用其进行网络开发的形式也变得截然不同了.就如同在浏览器中一样,现在我们也能够在server上执行 JavaScript ,从前端跨越 ...
- hdoj 3488 Tour 【最小费用最大流】【KM算法】
Tour Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total Submi ...
- Object类方法简介二
在学了Object类前面的三个常用方法后,又遇到它的另外三个方法——clone().finalize().getClass(),这三个方法不经常使用,但因为在学习过程遇到了,就简单的对它们的使用做一个 ...
- instanceof运算符的使用
在之前的学习中,经常遇到instanceof运算符,对于它的用法总感觉理解不到位,所以专门总结一下它的用法加深理解. instanceof主要用来判断一个类是否实现了某个接口,或者判断一个实例对象是否 ...
- xcode Could not launch "" ; has denied the launch request
xcode Could not launch "" ; “”“ has denied the launch request (注意,这种方式不能调试) 1.编辑scheme 2 ...
- 2016.04.18,英语,《Vocabulary Builder》Unit 15
term/termin, comes from the Latin verb terminare, 'to limit, bound, or set limits to', or the relate ...