从操作系统内核看设计模式--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左右的速度 很难更高 不知道后续的服 ...
随机推荐
- [bzoj3029] 守卫者的挑战 (概率期望dp)
传送门 Description 打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜寻着关押applepi的监狱的所在地.突然,眼前一道亮光闪过."我,Nizem,是黑魔法圣殿的守 ...
- 修改layui的后台模板的左侧导航栏可以伸缩
原生的左侧导航栏代码: <div class="layui-side layui-bg-black"> <div class="layui-side-s ...
- 【Zoj 4061】Magic Multiplication
[链接] 我是链接,点我呀:) [题意] [题解] /* for a[1] from 1~9 1*1=1 2*1=2 3*1=3 1*2=2 2*2=4 3*2=6 1*3=3 2*3=6 3*3=9 ...
- HDU 4906 Our happy ending (状压DP)
HDU 4906 Our happy ending pid=4906" style="">题目链接 题意:给定n个数字,每一个数字能够是0-l,要选当中一些数字.然 ...
- [Javascript] IntersectionObserver -- Lazy Load Images on a Website
When it comes to websites performance is king. How long it takes for a page to load can mean the dif ...
- WIN7通过批处理开启/禁用无线网卡
哥比較懒,直接上步骤: 1.看自己的电脑是否有devcon.exe 这个软件,能够直接在WINDOWS文件夹的SYSTEM32文件夹下面搜索.也能够通过命令行RUN-----------CMD---- ...
- 判断是否是pc,获取屏幕宽度
$(function(){ var w=document.documentElement?document.documentElement.clientWidth:document.body.clie ...
- 贪吃蛇c++实现
近期没事翻了一下曾经写的程序.真是不堪入目.曾经真是什么都不懂.只是有一个程序倒是挺有意思的,大二的时候写的一个贪吃蛇游戏.尽管程序非常难看,还有非常多漏洞.但也是这个程序让我真正開始喜欢上了编程.不 ...
- Fitnesse安装
Fitnesse安装比较简单 1.确保机器上已经安装了java环境
- MySQL数据库管理(二)单机环境下MySQL Cluster的安装
上文<MySQL数据库管理(一)MySQL Cluster集群简单介绍>对MySQL Cluster集群做了简要介绍.本文将教大家一步步搭建单机环境下的MySQL数据库集群. 一.单机环境 ...