- 博客(18)
- 资源 (14)
- 收藏
- 关注
原创 把脏页写入磁盘
<br />正如我们所了解的,内核不断用包含块设备数据的页填充页高速缓存。只要进程修改了数据,相应的页就被标记为脏页,即把它的PG_dirty标志置位。<br /> <br />Unix系统允许把脏缓冲区写入块设备的操作延迟执行,因为这种策略可以显著地提高系统的性能。对高速缓存中的页的几次写操作可能只需对相应的磁盘块进行一次缓慢的物理更新就可以满足。此外,写操作没有读操作那么紧迫,因为进程通常是不会由于延迟写而挂起,而大部分情况都因为延迟读而挂起。正是由于延迟写,使得任一物理块设备平均为读请求提供的服务将多
2010-08-30 22:07:00 6800 1
原创 在页高速缓存中搜索块
<br />当内核需要读或写一个单独的物理设备块时(例如一个超级块),必须检查所请求的块缓冲区是否已经在页高速缓存中。在页高速缓存中搜索指定的块缓冲区(由块设备描述符的地址bdev和逻辑块号nr表示)的过程分成三个步骤:<br /> <br />1. 获取一个指针,让它指向包含指定块的块设备的address_space对象(bdev->bd_inode->i_mapping)。<br /> <br />2. 获得设备的块大小(bdev->bd_block_size),并计算包含指定块的页索引。这需要在逻辑块
2010-08-30 22:00:00 4530 1
原创 把块存放在页高速缓存中
<br />VFS(映射层)和各种文件系统以叫做“块”的逻辑单位组织磁盘数据。在Linux内核的旧版本中,主要有两种不同的磁盘高速缓存:页高速缓存和缓冲区高速缓存,前者用来存放访问磁盘文件内容时生成的磁盘数据页,后者把通过VFS(管理磁盘文件系统)访问的块的内容保留在内存中。<br /> <br />从2.4.10的稳定版本开始,缓冲区高速缓存其实就不存在了。事实上,由于效率的原因,不再单独分配块缓冲区;相反,把它们存放在叫做“缓冲区页”的专门页中,而缓冲区页保存在页高速缓存中。<br /> <br />缓
2010-08-30 20:51:00 5790
原创 页高速缓存处理函数
<br />好了,在了解了页高速缓存相关的数据结构以后,我们来介绍一下基本的页高速缓存处理函数:<br /> <br />对页高速缓存操作的基本高级函数有查找、增加和删除页。在以上函数的基础上还有另一个函数确保高速缓存包含指定页的最新版本。<br /> 1 查找页<br /> <br />函数find_get_page()接收的参数为指向address_space对象的指针和偏移量。它获取地址空间的自旋锁,并调用radix_tree_lookup()函数搜索拥有指定偏移量的基树的叶子节点:<br />str
2010-08-23 22:42:00 6083
原创 磁盘高速缓存
<br />相信通过前面的虚拟文件系统VFS及一个具体的Ext2文件系统博文,大家对基本的VFS体系有一个大致的掌握了吧。从本章开始,我们将讨论一些VFS底层的技术细节,磁盘高速缓存就是其中一个重要的技术。磁盘高速缓存是一种软件机制,它允许系统把通常存放在磁盘上的一些数据保留在RAM中,以便对那些数据的进一步访问而不用再访问磁盘。<br /> <br />因为对同一磁盘数据的反复访问频繁发生,所以磁盘高速缓存对系统性能至关重要。与磁盘交互的用户态进程有权反复请求读或写同一磁盘数据。此外,不同的进程可能也需要
2010-08-23 22:33:00 8303
原创 Ext2数据块分配
<br />跟索引节点一样,Ext2也对磁盘数据块进行分配与释放。在详细分析相关代码之前,先引出两个重要的预备,一个是数据块寻址,一个是文件的洞<br /> <br /> 1 数据块寻址<br /> <br /> <br />每个非空的普通文件都由一组数据块组成。这些块或者由文件内的相对位置(它们的文件块号)来标识,或者由磁盘分区内的位置(它们的逻辑块号)来标识。<br /> <br />从文件内的偏移量 f 导出相应数据块的逻辑块号需要两个步骤:<br />1. 从偏移量f导出文件的块号,即在偏移量f处的
2010-08-18 23:19:00 5760 1
原创 Ext2索引节点分配
<br />文件在磁盘的存储不同于程序员所看到的文件,主要表现在两个方面:块可以分散在磁盘上(尽管文件系统尽力保持块连续存放以提高访问速度),以及程序员看到的文件似乎比实际的文件大,这是因为程序可以把洞引人文件(通过lseek ()系统调用)。<br /> <br />从本篇博文开始,我们将介绍Ext2文件系统如何管理磁盘空间,也就是说,如何分配和释放索引节点和数据块。有两个主要的问题必须考虑:<br /> <br />(1)空间管理必须尽力避免文件碎片,也就是说,避免文件在物理上存放于几个小的、不相邻的盘
2010-08-18 23:06:00 4173 2
原创 Ext2的方法总结
<br />在“VFS对象”博文中所描述的关于VFS的很多方法在Ext2都有相应的实现。因为对所有的方法都进行讨论需要整整一本书,因此我们仅仅简单地回顾一下在Ext2中所实现的方法。一旦你真正搞明白了磁盘和内存数据结构,你就应当能理解实现这些方法的Ext2函数的代码。<br /> 1 Ext2超级块的操作<br /> <br />在“Ext2的索引节点对象”我们已经分析了Ext2超级块的操作之一:ext2_alloc_inode,这里在对Ext2超级块的操作做一个综合性的总结。很多VFS超级块操作在Ext2
2010-08-18 22:56:00 2036
原创 创建Ext2文件系统
<br />在磁盘上创建一个文件系统通常有两个阶段。第一步格式化磁盘,以使磁盘驱动程序可以将块号转换成对应的磁道和扇区,从而可以读和写磁盘上的物理块。现在的硬磁盘已经由厂家预先格式化,因此不需要重新格式化;在Linux上可以使用superformat或fdformat等实用程序对软盘进行格式化。第二步才涉及创建文件系统,这意味着建立前面博文中详细描述的那些磁盘文件系统数据结构。<br /> <br />Ext2文件系统是由C程序mke2fs创建的。mke2fs采用下列缺省选项,用户可以用命令行的标志修改这些
2010-08-18 22:50:00 2521
原创 Linux x86_64与i386区别之 —— 内存寻址
1 引子毫无疑问,不管是32位,还是64位处理器,所有进程(执行的程序)都必须占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等。不过进程对这些内存的管理方式因内存用途不一而不尽相同,有些内存是事先静态分配和统一回收的,而有些却是按需要动态分配和回收的。对任何一个普通进程来讲,它都会涉及到5种不同的数据段。稍有编程知识的朋友都该能想到这几个数据段种包含有“程序代码段”、“程序数据段”、“程序堆栈段”等。不错,这几种数据段都在其中,但除了以上几种数据段之外,进程还另外包含两
2010-08-18 17:13:00 13822 3
原创 Ext2的索引节点对象
<br />上一篇博文我们详细分析了VFS如何将具体文件系统ext2的超级快对象缓存到内存中,主要是利用了ext2_sb_info数据结构。ext2_fill_super函数最后的时候,会将传入该函数的super_block类型的参数sb赋予以下的值:<br /> sb->s_op = &ext2_sops;<br /> <br />其中,ext2_sops是将super_block的super_operations初始化以下方法的集合:<br />static struct super_oper
2010-08-17 22:34:00 3199
原创 Ext2的超级块对象
<br />前面我们详细讨论了将一个磁盘分区格式化成ext2文件系统后,一个分区的布局,重点介绍了超级快、块组、位图和索引节点等内容。那么,内核如何跟这些ext2文件系统的对象打交道呢?这个,才是我们研究存储的人应该重点关注的对象,从本篇博文开始,我们就来重点讨论。<br /> <br />首先,当安装Ext2文件系统时(执行诸如mount -t ext2 /dev/sda2 /mnt/test的命令),存放在Ext2分区的磁盘数据结构中的大部分信息将被拷贝到RAM中,从而使内核避免了后来的很多读操作。那么
2010-08-17 21:17:00 5245 2
原创 适配器模式(Adapter)
<br />通常,客户类是通过另一个类提供的方法访问另一个类的服务。有时,现有的类可以提供给客户类的功能需要,但是它所提供的方法不一定是客户类所期望的。这是由于现有的方法太详细或者缺乏详细或方法的名称与客户类所查找的不同等诸多不同原因导致的。<br /> <br />在这种情况下,现有的方法需要转化为客户类期望的接口,这样保证了对现有类的重用。如果不进行这样的转化,客户类就不能利用现有类所提供的功能。适配器模式可以完成这样的转化。适配器模式建议定义一个包装类,包装有不兼容方法的对象。这个包装类指的就是适配器
2010-08-12 14:47:00 1065
原创 代理模式(Proxy)
<br />代理(Proxy)模式是一种比较有用的模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构。我们也许有代理服务器等概念,代理概念可以解释为:在出发点到目的地之间有一道中间层,意为代理。<br /> <br />《设计模式》中定义:为其他对象提供一种代理以控制对这个对象的访问。<br /> <br />代理模式的实例:<br /> <br />新建一个买车的接口:<br />public interface Buy_car_package {<br /> public void buy
2010-08-12 13:55:00 1583
原创 外观模式(Facade)
<br />外观模式的定义是,为子系统中的一组接口提供一个一致的interface接口界面。<br /> <br />外观模式是个很简单,但很重要的模式,它主要思想是将表现层和逻辑层隔离,封装底层的复杂处理,只为用户提供简单的接口,这样的例子随处可见。外观模式也叫门面模式,它很多时候更是一种系统架构的设计,在我所做的项目中,就实现了门面模式的接口,为复杂系统的解耦提供了最好的解决方案。在WEB开发中的MVC分层架构就是典型的一个外观模式,每一层将操作的具体内容隐藏起来,保留一个接口供上层调用。<br />
2010-08-12 13:43:00 1085
原创 原型模式(Prototype)
<br />原型模式定义为用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。<br /> <br />Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。<br /> <br />因为Java中的提供clone()方法来实现对象的克隆,所以Prototype模式实现一下子变得很简单。 <br /><br />原型模式很简单,就是类的复制,
2010-08-11 15:41:00 1000
原创 创建者模式(Builder)
《设计模式》上对创建者(Builder)模式的定义是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。相信大部分初学者都看不懂这句话。事实上,创建者模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们,用户不知道内部的具体构建细节。Builder模式非常类似简单工厂模式,细微的区别后面会提到。因为一个复杂的对象,不但有很多大量组成部分,如汽车,有很多部件:车轮、方向盘、发动机还有各种小零件等等,部件很多,但远不止这些。如何将这些
2010-08-11 15:20:00 1106
原创 单例模式(Singleton)
<br />单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。<br /> <br />单例模式有以下特点:<br />1、单例类只能有一个实例。<br />2、单例类必须自己创建自己的唯一实例。<br />3、单例类必须给所有其他对象提供这一实例。<br /> 1 懒汉式单例<br /> <br />在类被加载的时候,唯一实例已经被创建。这个设计模式在Java中容易实现,在别的语言中难以实现。<br />/**<br />* Created by IntelliJ IDEA.<br />* User
2010-08-11 14:44:00 1280
NFS文件系统
2012-04-08
数据结构与算法——面向对象C++设计模式
2011-11-27
高性能分布式监控系统Ganglia详解
2011-07-10
疯狂内核之——内核初始化
2011-05-30
疯狂内核之——Linux虚拟内存
2011-05-30
疯狂内核之——进程管理子系统
2011-05-30
疯狂内核之——Linux预备知识.pdf
2011-05-30
基于C++语言的GoF23种设计模式
2011-05-29
从8086到Pentium Ⅲ微型计算机及接口技术3
2010-09-24
Linux sysfs 文件系统机制详解
2009-12-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人