1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,6.5实例研究:,Linux,的文件管理,6.5.1,Linux,文件管理概述,6.5.2,Linux,文件系统安装,6.5.3 虚拟文件系统,VFS,6.5.4,文件系统管理的缓冲机制,6.5.5 系统打开文件表和主要文件操作,6.5.6,EXT2,文件系统,6.5.1,Linux,文件管理概述(1),Linux,支持多种不同类型的文件系统,包括,EXT、EXT2、MINIX、UMSDOS、NCP、ISO9660、HPFS、MSDOS、NTFS、XIA、VFAT、PROC、NFS、SMB、SYSV、AFF
2、S,以及,UFS,等。,演变:,Minix,文件系统(64,Mb),EXT(Extended file system),文件系统(2,Gb,),Xia,文件系统(2,Gb,),EXT2(Second Extended file system),文件系统(4,Tb),Linux,文件系统概念(2),6.5.2,Linux,文件系统安装(1),文件系统通过文件类型注册链表来描述,向系统注册文件系统类型的途径,Linux,文件系统安装(2),文件系统注册表的数据结构,file_systems,指向文件系统注册表,每个文件系统类型在注册表中有一登记项,记录类型名,name、,支持该文件系统的设备,re
3、quires_dev、,读出该文件系统在外存超级块的函数,read_super,等,。,函数,register_,filesystem,用于注册一个文件系统类型,函数,unregister,_,filesystem,用于从注册表中卸装一个文件系统类型。,file_system_type,name,requires_dev,read_super,next,file_systems,file_system_type,name,requires_dev,read_super,next,file_system_type,name,requires_dev,read_super,next,Linux,文
4、件系统安装(3),Linux,文件系统安装(4),Linux,不通过设备标识访问具体文件系统,是通过,mount,命令把它安装到文件系统树的某一个目录节点,该文件系统的所有文件和子目录就是该目录的文件和子目录,直到,用,umount,命令显式的撤卸该文件系统。,Linux,自举时,先装入根文件系统,然后根据/,etc/,fstab,中的登记项使用,mount,命令自动逐个安装文件系统。,用户也可显式地通过,mount,和,umount,命令安装和卸装文件系统。,Linux,文件系统安装(5),6.5.3 虚拟文件系统,VFS(1),什么是,VFS?,VFS,的功能包括:,记录可用的文件系统类型
5、把设备与对应的文件系统联系起来。,处理面向文件的通用操作。,涉及具体文件系统的操作时,把它们映射到与控制文件、目录以及,inode,相关的物理文件系统。,虚拟文件系统,VFS(2),EXT FS,VFS,inode,cache,VFS directory cache,EXT2 FS,MSDOS FS,MINIX FS,VFS,buffer cache,buffer cache,虚拟文件系统,VFS(3),VFS,主要数据结构(1),超级块(,superblock,),存储被安装的文件系统信息,超级块中包含文件系统控制块。,索引节点(,inode,),存储通用的文件信息,一般指磁盘上的文件控
6、制块,每个,inode,有惟一的,inode,号,并通过,inode,号标识每个文件。,虚拟文件系统,VFS(4),VFS,主要数据结构(2),系统打开文件表(,file),存储进程与已打开文件的交互信息,这些信息仅当进程打开文件时才存于内核空间中。,目录项,dentry,(directory entry),存储对目录的连接信息,包含对应的文件信息。,超级块(,super block),struct,super_block,kdev,_t s_dev;,/*,该文件系统的主次设备号*/,unsigned long s_,blocksize,;,/*,块大小*/,unsigned char s_
7、blocksize,_bits;/*,以2的幂次表示块大小*/,unsigned char s_lock;/*,锁定标志,置位表示拒绝其他进程访问*/,unsigned char s_rd_only;/*,只读标志*/,unsigned char s_dirt;,/*,已修改标志*/,struct,file_system_type*s_type;/*,指向文件系统类型注册表相应项*/,struct,super_operations*s_op;/*,指向一组操作该文件系统的函数*/,struct dquot,_operations*,dq,_op;,unsigned long s_flags;
8、unsigned long s_magic;,unsigned long s_time;,struct inode,*s_covered;,/*,指向安装点目录的,inode,*/,struct inode,*s_mounted;/*,指向被安装文件系统的第一,个,inode,*/,struct,wait_queue*s_wait;/*,在该超级块上的等待队列*/,union,各个物理文件系统超级块的结构类型,u;,;,inode,(1),struct inode,kdev,_t i_dev;/*,该文件系统的主次设备号*/,umode,_t i_mode;/*,文件类型以及存取权限*/,u
9、link,_t i_,nlink,;/*,连接到该文件,的,link,数*/,uid,_t i_,uid,;,gid,_t i_,gid,;,kdev,_t i_,rdev,;/*,该文件系统的主次设备号*/,off_t i_size;/*,文件长度*/,time_t i_,atime,,i_,mtime,,i_,ctime,;,unsigned long i_,blocksize,,i_blocks;/*,字节/块为单位的文件长度*/,unsigned long i_version;,unsigned long i_,nrpages,;/*,文件所占的内存页数*/,struct,semaph
10、ore i_,sem,;,struct inode,_operations*i_op;/*,指向一组针对该文件的操作函数*/,struct,super_block*i_,sb,;/*,指向内存中的,VFS,超级块*/,struct,wait_queue*i_wait;/*,在该文件上的等待队列*/,struct,file_lock*i_flock;/*,操作该文件的文件锁链表的首地址,*/,inode,(2),struct vm,_area_,struct,*i_,mmap,;,struct,page*i_pages;/*,文件所占页面构成的单向链*/,struct dquot,*i_,dqu
11、ot,MAXQUOTAS;,struct inode,*i_next,*i_,prev,,*i_hash_next,*i_hash_,prev,,*i_bound_to,*i_bound_by;,struct inode,*i_mount;/*,指向下挂文件系统的,inode,的根目录*/,unsigned long i_count;/*,引用计数,0表示空闲*/,unsigned short i_flags;,unsigned short i_,writecount,;,unsigned char i_lock;/*,inode,的锁定标志*/,unsigned char i_dirt;/*
12、已修改标志*/,unsigned char i_pipe,i_sock,i_seek,i_update,i_condemned;,union,各个物理文件系统,inode,的结构类型,u;,;,dentry,(1),Struct dentry,atomic-t d-count;/*,当前,dentry,引用数*/,unsigned,int,d-flags;/*,识别,dentry,状态的标志*/,struct inode,d-,inode,;,/,*,此,dentry,对应,的,inode,*/,struct dentry,d-parent;,/,*,父目录的,dentry,结构,struc
13、t,list-head d-hash;/*,链入,dentry,的哈希表*/,struct,list-head d-,lru,;/*,引用数为0的,dentry,构成的双向链表*/,struct,list-head d-child;/*,此,dentry,的兄弟,dentry,双向链表*/,dentry,(2),struct,list-head d-,subdirs,;/*,此,dentry,的子目录双向链表*/,struct,list-head d-alias;/*,硬链接时,指向同一个,inode,的,dentry,链表*/,int,d-mounted;/*,此,dentry,被安装次数*
14、/,struct qstr,d-name;/*,此,dentry,的名称及哈希值*/,unsigned long d-time;/*,记录时间用*/,struct dentry,-operations*d-op;,/,*,一组,dentry,的操作函数*/,struct,super-block*d-,sb,;/,*,此,dentry,超级块指针*/,unsigned char d-,iname,DNAME-INLINE-LEN;/*,文件名前16个字符*/,;,6.5.4文件管理的缓冲机制(1,),Linux,既支持多种类型的文件系统,又保持了很高的性能。探究其原因,除了,VFS,以外,多种复
15、杂,的,cache,起到了关键作用。,文件管理的缓冲机制(2),VFS,inode,cache(1),为提高对,first_,inode,链表进行线性搜索的速度,,,VFS,为已经分配,的,inode,构造,了,cache,和,hash,表。,VFS,访问,inode,时,首先根据,hash,函数计算,出,h,,找到对应,的,hash_tableh,指向的双向链表,通过,i_hash_next,和,i_hash_,prev,进行查找。,文件管理的缓冲机制(3),VFS,inode,cache(2),updating,inode,hash_table,updating,inode,updatin
16、g,inode,inode,inode,inode,文件管理的缓冲机制(4),VFS directory cache(1),Linux,维护了表达路径与,inode,对应关系,的,VFS directory cache。,被访问过的目录将会被存入,directory cache,,这样当同一目录被再次访问时就可以快速获得。,directory cache,由,level1_cache,和,level2_cache,组成,采用指针构成包含128个节点的双向循环链表,使用,LRU,算法增删节点。,level1_cache,和,level2_cache,各有分工,新增加的目录存放,在,level1_
17、cache,尾部;查询信息命中后则放在,level2_cache,尾部。为提高效率,还为建立了,hash,表。,文件管理的缓冲机制(5),VFS directory cache(2),文件管理的缓冲机制(6),Buffer cache,为加快对物理设备的访问,,Linux,维护一组数据块缓冲区,称为,Buffer cache(,主存缓冲区),它独立于任何类型的文件系统,被所有的物理设备所共享。,文件管理的缓冲机制(7),Buffer cache,被设计成,hash,表和,buffer,链表,最近最少用链表,空闲链表,未使用链表,重用链表,6.5.5系统打开文件表和主要文件操作,系统打开文件表记
18、录系统已经打开的文件,用于文件的读写操作。系统打开文件表是一张,以,file,结构作为节点的双向链表,表头指针,为,first_file,,每个节点对应一个已打开的文件,包含了此文件的,inode,、,操作函数,对文件的所有操作都离不开它。,File(1),struct,file,mode_t f_mode;,loff,_t f_pos;,unsigned short f_flags;,unsigned short f_count;,off_t f_,reada,;,struct,file *f_next,*f_,prev,;,int,f_owner;,struct inode,*f_,ino
19、de,;,struct,file_operations *f_op;,unsigned long f_version;,void *private_data;,;,File(2),每个进程,PCB,包含一个打开文件表,结构如下:,struct,files_,struct,int,count;,/*,引用计数器*/,fd,_set close_on_exec;,/*,系统调用,exec,时关闭的文件的屏蔽字数组*/,fd,_set open_,fds,;,/*,对所有文件描述字,fd,的屏蔽字数组*/,struct,file *,fd,NR_OPEN;,/*,进程打开文件数组*/,;,Linux
20、进程文件数据结构关系,task-,struct,fs,files,fs,-,struct,count,umask,*root,*,pwd,inode,根目录,inode,inode,工作,目录,inode,files-,struct,count,max-,fd,*,fd,file,*,f-next,*f-,pprev,*,dentry,*f-op,f-mode,f-pos,Linux,主要文件操作,1文件的打开,2文件的关闭,3文件指针移动,4读文件,5写操作,6文件属性控制,7文件上锁,8文件的,I/O,控制,9各种其他文件操作,6.5.6,EXT2,文件系统(1),EXT(1992,年)
21、和,EXT2(1994,年)是专,为,Linux,设计的可扩展文件系统。,在,EXT2,中,文件系统组织成数据块的序列,数据块的长度相同,块大小在创建时被固定下来。,EXT2,把它所占用的磁盘逻辑分区划分为块组,每个块组依次包括超级块、组描述符表、块位图、,inode,位图,、,inode,表以及数据块。,EXT2,文件系统(2),块位图集中了本组各数据块的使用情况;,inode,位图记录了,inode,表中,inode,的使用情况。,inode,表保存了本组所有,的,inode,,,inode,用于描述文件,一个,inode,对应一个文件和子目录,有一个唯一,的,inode,号,并记录了文件
22、在外存的位置、存取权限、修改时间、类型等信息。,EXT2,文件系统(3),文件系统结构,块组0,块组1,块组,n,引导块,超级块,组描述符表,块位图,inode,位图,inode,表,数据块,EXT2,的超级块(1),EXT2,的超级块用来描述目录和文件在磁盘上的静态分布,包括尺寸和结构。每个块组都有一个超级块,一般来说只有组0的超级块才被读入内存超级块,其它块组的超级块仅仅作为备份。,EXT2,的超级块(2),EXT2,的超级块包括,inode,数量、块数量、保留块数量、空闲块数量、空闲,inode,数量、第一个数据块位置、块长度、片长度、每个块组块数、每个块组片数、每个块,组,inode,
23、数,以及安装时间、最后一次写时间、安装信息、文件系统状态信息等内容。,EXT2,的组描述符,每个块组都有一个组描述符,记录该块组的块位图位置、,inode,位图位置、,inode,节点位置、空闲块,数、,inode,数、目录数等内容。,所有组描述符构成了组描述附表。同超级块一样,组描述符表在每个块组中都有备份,这样,当文件系统崩溃时,可以用来恢复文件系统。,EXT2,的,inode,inode,用于描述文件,一个,inode,对应一个文件和子目录,有一个唯一,的,inode,号,并记录了文件的类型及存取权限、用户和组标识、修改/访问/创建/删除时间、,link,数、文件长度和占用块数、在外存的
24、位置、以及其他控制信息。,EXT2,的目录文件,目录是保存对文件系统中的文件的存取路径的特殊文件,它是一个目录项的列表。目录项的数据结构如下:,struct,ext2_dir_entry,_u32,inode,;/*,该目录项的,inode,号*/,_,u16,rec,_,len,;/*,目录项长度*/,_,u16 name_,len,;/*,文件名长度*/,char nameEXT2_NAME_LEN;/*,文件名*/,;,Linux,数据块分配策略(1),EXT2,采用两个策略减少文件碎片,原地先查找策略:为文件分配数据块时,尽量在文件原有数据块附近查找。先试探紧跟文件末尾的数据块,然后试探位于同一个块组相邻的64个数据块,接着在同一个块组中寻找其他空闲数据块;实在不得己才搜索其他块组,且首先考虑8个一簇的连续的块。,Linux,数据块分配策略(2),预分配策略:引入预分配机制,就从预分配的数据块取一块来用,紧跟该块后的若干个数据块空闲的话,也被保留,保证尽可能多的数据块被集中成一簇。,数据结构中包含属性,prealloc,_block,和,prealloc,_count,,前者指向可预分配数据块链表中第一块的位置,后者表示可预分配数据块的总数。,






