从操作系统内核看设计模式--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左右的速度 很难更高 不知道后续的服 ...
随机推荐
- echarts在地图上绘制散点图(任意点)
项目需求:在省份地图上绘制散点图,散点位置不一定是哪个城市或哪个区县,即任意点 通过查询官网文档,找到一个与需求类似的Demo:https://www.echartsjs.com/gallery/ed ...
- nyoj29-求置转换问题
求转置矩阵问题 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 求一个三行三列的转置矩阵. 输入 第一行一个整数n<20,表示有n组测试数据,下面是n组数据;每组测 ...
- ExtJs之Ext.view.View
要注意MODEL的定义和实例化的代码,注释掉的是老式的不兼容4.0以上的.而下面的定义才是新推荐的. 我网上可是查的了.是书上的代码老了. <!DOCTYPE html> <html ...
- 开源工作流BPM软件JFlow安装配置视频教程
上周上传了一次,被抽了.刚開始不知道CSDN没有视频许可.造成一些爱好者无法下载,对此感到羞愧. 在下载后,依照文档内的连接,直接取出来就能够了,包括文档说明.视频教程两部分. http://down ...
- PHP图像操作类
基于已给出的各种图像操作方法,这里我总结出了PHP图像操作的一个类,包含给图像加入文字水印.图像水印和压缩图片. 读者可自行加入功能. <? php class Image { private ...
- 自定义django的Template context processors
简要步骤: 1.编辑一个函数: def media_url(request): from django.conf import settings return {'media_url': settin ...
- Nginx实战系列之功能篇----后端节点健康检查
目前,nginx对后端节点健康检查的方式主要有3种,这里列出: 1.ngx_http_proxy_module 模块和ngx_http_upstream_module模块(自带) 官网地址: ...
- html页面、canvas导出图片
背景:项目现场提出将一个html做的图形页面导出为一张图片的需求,在网上搜了一下,发现都不是很全面,所以综合了很多大神的帖子,自己再次封装,以适用项目需求. 所需js库:html2canvas.js( ...
- SQL Server的自动备份设置及排错记事
1.启动 SQL Server Management Studio管理器,登录进去. 2.在左侧可以看到这个,我们展开“管理”. 3.展开“管理”后,我们在“维护计划”项目上单击右键,在弹出菜单里选择 ...
- 134. Gas Station leetcode
134. Gas Station 不会做. 1. 朴素的想法,就是针对每个位置判断一下,然后返回合法的位置,复杂度O(n^2),显然会超时. 把这道题转化一下吧,求哪些加油站不能走完一圈回到自己,要求 ...