文件系统各有不同,其最主要的目标就是解决磁盘空间的管理问题,同时提供高效性、安全性。如果在分布式环境下,则有相应的分布式文件系统。Linux上有ext系列,Windows上有Fat和NTFS。如图为一个linux下文件系统的结构。
其中VFS(Virtual File System)是Linux Kernel文件系统的一个模块,简单看就是一个Adapter,对下屏蔽了下层不同文件系统之间的差异,对上为操作系统提供了统一的接口.
中间部分为各个不同文件系统的实现。
再往下是Buffer Cache和Driver。
文件系统的结构
各种文件系统实现方式不同,因此性能、管理性、可靠性等也有所不同。下面为Linux Ext2(Ext3)的一个大致文件系统的结构。
Boot Block存放了引导程序。
Super Block存放了整个文件系统的一些全局参数,如:卷名、状态、块大小、块总数。他在文件系统被mount时读入内存,在umount时被释放。
上图描述了Ext2文件系统中很重要的三个数据结构和他们之间的关系。
Inode:Inode是文件系统中最重要的一个结构。如图,他里面记录了文件相关的所有信息,也就是我们常说的meta信息。包括:文件类型、权限、所有者、大小、atime等。Inode里面也保存了指向实际文件内容信息的索引。其中这种索引分几类:
-
直接索引:直接指向实际内容信息,公有12个。因此如果,一个文件系统block size为1k,那么直接索引到的内容最大为12k
- 间接索引
- 两级间接索引
- 三级间接索引
如图:
Directory代表了文件系统中的目录,包括了当前目录中的所有Inode信息。其中每行只有两个信息,一个是文件名,一个是其对应的Inode。需要注意,Directory不是文件系统中的一个特殊结构,他实际上也是一个文件,有自己的Inode,而它的文件内容信息里面,包括了上面看到的那些文件名和Inode的对应关系。如下图:
Data Block即存放文件的时间内容块。Data Block大小必须为磁盘的数据块大小的整数倍,磁盘一般为512字节,因此Data Block一般为1K、2K、4K。
Buffer Cache
Buffer & Cache
虽然Buffer和Cache放在一起了,但是在实际过程中Buffer和Cache是完全不同了。Buffer一般对于写而言,也叫“缓冲区”,缓冲使得多个小的数据块能够合并成一个大数据块,一次性写入;Cache一般对于读而且,也叫“缓存”,避免频繁的磁盘读取。如图为Linux的free命令,其中也是把Buffer和Cache进行区分,这两部分都算在了free的内存。
Buffer Cache
Buffer Cache中的缓存,本质与所有的缓存都是一样,数据结构也是类似,下图为VxSF的一个Buffer Cache结构。
这个数据结构与memcached和Oracle SGA的buffer何等相似。左侧的hash chain完成数据块的寻址,上方的的链表记录了数据块的状态。
Buffer vs Direct I/O
文件系统的Buffer和Cache在某些情况下确实提高了速度,但是反之也会带来一些负面影响。一方面文件系统增加了一个中间层,另外一方面,当Cache使用不当、配置不好或者有些业务无法获取cache带来的好处时,cache则成为了一种负担。
适合Cache的业务:串行的大数据量业务,如:NFS、FTP。
不适合Cache的业务:随机IO的业务。如:Oracle,小文件读取。
块设备、字符设备、裸设备
这几个东西看得很晕,找了一些资料也没有找到很准确的说明。
从硬件设备的角度来看,
-
块设备就是以块(比如磁盘扇区)为单位收发数据的设备,它们支持缓冲和随机访问(不必顺序读取块,而是可以在任何时候访问任何块)等特性。块设备包括硬盘、CD-ROM 和 RAM 盘。
- 字符设备则没有可以进行物理寻址的媒体。字符设备包括串行端口和磁带设备,只能逐字符地读取这些设备中的数据。
从操作系统的角度看(对应操作系统的设备文件类型的b和c),
# ls -l /dev/*lv
brw------- 1 root system 22, 2 May 15 2007 lv
crw------- 2 root system 22, 2 May 15 2007 rlv
-
块设备能支持缓冲和随机读写。即读取和写入时,可以是任意长度的数据。最小为1byte。对块设备,你可以成功执行下列命令:dd if=/dev/zero of=/dev/vg01/lv bs=1 count=1。即:在设备中写入一个字节。硬件设备是不支持这样的操作的(最小是512),这个时候,操作系统首先完成一个读取(如1K,操作系统最小的读写单位,为硬件设备支持的数据块的整数倍),再更改这1k上的数据,然后写入设备。
-
字符设备只能支持固定长度数据的读取和写入,这里的长度就是操作系统能支持的最小读写单位,如1K,所以块设备的缓冲功能,这里就没有了,需要使用者自己来完成。由于读写时不经过任何缓冲区,此时执行dd if=/dev/zero of=/dev/vg01/lv bs=1 count=1,这个命令将会出错,因为这里的bs(block size)太小,系统无法支持。如果执行dd if=/dev/zero of=/dev/vg01/lv bs=1024 count=1,则可以成功。这里的block size有OS内核参数决定。
如上,相比之下,字符设备在使用更为直接,而块设备更为灵活。文件系统一般建立在块设备上,而为了追求高性能,使用字符设备则是更好的选择,如Oracle的裸设备使用。
裸设备
裸设备也叫裸分区,就是没有经过格式化、没有文件系统的一块存储空间。可以写入二进制内容,但是内容的格式、其中信息的组织等问题,需要使用它的人来完成。文件系统就是建立在裸设备之上,并完成裸设备空间的管理。
CIO
CIO即并行IO(Concurrent IO)。在文件系统中,当某个文件被多个进程同时访问时,就出现了Inode竞争的问题。一般地,读操作使用的共享锁,即:多个读操作可以并发进行,而写操作使用排他锁。当锁被写进程占用时,其他所有操作均阻塞。因此,当这样的情况出现时,整个应用的性能将会大大降低。如图:
CIO就是为了解决这个问题。而且CIO带来的性能提高直逼裸设备。当文件系统支持CIO并开启CIO时,CIO默认会开启文件系统的Direct IO,即:让IO操作不经过Buffer直接进行底层数据操作。由于不经过数据Buffer,在文件系统层面就无需考虑数据一致性的问题,因此,读写操作可以并行执行。
在最终进行数据存储的时候,所有操作都会串行执行,CIO把这个事情交个了底层的driver。
分享到:
相关推荐
文件系统;逻辑卷管理;Driver & IO Channel;RAID;三分天下 适用人群:Java开发人员 使用场景:想学习JavaIO以及在IO开发中遇到瓶颈 目标:通过本教程的讨论与解析,更加深刻的理解和认识IO,熟练的操作IO,避免...
《构建仿QQ空间的说说与博客系统:基于Node.js的毕业设计实践》 在当前互联网时代,社交网络已经成为人们日常生活中不可或缺的一部分。QQ空间作为国内极具影响力的社交平台,其功能丰富、用户基数庞大,是许多...
对于读取本地文件,你可以使用`java.io.File`类来创建、读取和操作文件。例如: ```java File file = new File("/path/to/your/file"); byte[] bytes = new byte[(int) file.length()]; FileInputStream fis = new ...
在Java中,我们可以使用`java.io`包下的`FileWriter`或`BufferedWriter`类来实现文件写入。例如,要创建一个新的文件并写入数据,可以先创建一个`File`对象,然后通过`FileWriter`或`BufferedWriter`的构造函数打开...
在C#中,可以使用文件系统监控API(如FileSystemWatcher类)来实时监听文件或目录的改变,一旦有变化发生,就触发同步操作。 接着,我们讨论文件更新。文件更新是在文件已经存在的情况下,对文件内容进行修改或添加...
- **IO多路复用(IO Multiplexing)**:使用select或epoll等机制同时监控多个文件描述符。 - **信号驱动IO(Signal-driven IO)**:通过信号通知完成I/O操作。 - **异步IO(Asynchronous IO)**:提交I/O请求后,由操作...
Linux系统下你关注过哪些内核参数,说说你知道的 centos 内核配置文件为 /etc/sysctl.conf . 修改参数后启用:sysctl -p net.ipv4.tcp_tw_reuse:允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭. ...
在NIO的Demo中,可能展示了如何在Applet中利用NIO进行文件传输或网络通信,以克服传统IO的限制。 在"JAVA-NIO-DEMO"中,可能包含以下部分的示例代码: - **Channel读写**:演示如何使用FileChannel读取和写入文件...
此外,VxWorks还支持多种文件系统,如FAT、VFAT、NFS等,方便在不同环境下进行数据存储和交换。 最后,我们通过一个**实例**来实践这些概念。例如,你可以创建一个简单的项目,实现一个实时数据采集和处理的系统。...
POSIX是一个标准,包含对系统API,shell和其相关组件以及文件系统的规定。因此,我的初步计划在于重新实现与Linux内核保持高度相似的系统调用接口。在系统调用完成的基础上,实现(或适应现有的开源实现)标准C语言...
说说Java中的IO流** - **InputStream/OutputStream**:输入输出流的基类。 - **Reader/Writer**:字符流的基类。 - **FileInputStream/FileOutputStream**:文件输入输出流。 - **BufferedReader/BufferedWriter**...
1.功能:检测磁盘的FAT表、目录结构、文件系统等是否有问题,并可将检测出的问题加以修复。 2.类型:外部命令 3.格式:SCANDISK[盘符1:]{[盘符2:]…}[/ALL] 4.使用说明: (1)CCANDISK适用于硬盘和...
文件系统模拟数据库,实现增删改查,意味着我们将利用Java的文件操作功能,比如`java.nio`包提供的文件操作API,来创建、修改和删除文件,以此模拟数据库的操作。例如,可以创建一个目录结构来代表数据库表,每个...
- **物理备份**:备份实际的文件系统。 - **逻辑备份**:使用SQL语句导出数据库对象。 2. **归档是什么含义** - 归档是指将已经提交的redo log从在线日志切换到离线存储的过程。 3. **如果一个表在2004-08-04 ...
.NET的基础类库(Base Class Library, BCL)是一组广泛使用的类,提供了丰富的功能,如字符串操作、文件系统访问、网络通信等。 #### 32. foreach循环的实现原理 `foreach`循环是.NET中用于遍历集合的一种简便方法...
#### 四、系统管理类 1. **对于一个存在系统性能的系统,说出你的诊断处理思路** - **性能诊断**:使用 AWR 报告分析 CPU 和 I/O 使用情况。 - **问题定位**:通过 V$ 系统视图来追踪资源消耗大的 SQL 语句。 - ...
#### 四、系统管理类 1. **对于一个存在系统性能的系统,说出你的诊断处理思路** - **收集性能数据**: 使用 AWR 报告、性能视图等。 - **分析瓶颈**: 确定 CPU、I/O、内存等资源使用情况。 - **优化 SQL**: 优化...
- **Java7**增加了多捕获(Multi-Catch)、Diamond操作符、文件系统API(NIO.2)等改进。 14. **什么是竞态条件?举个例子说明** - 竞态条件是指当多个线程同时访问共享资源,并且至少有一个线程修改资源时,如果没有...