版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Linux Linux 操作系统操作系统信息科学与工程学院信息科学与工程学院20072007年年第五章第五章 LINUXLINUX内核简介内核简介LINUX 第九讲第九讲文件系统的注册、安装与卸载LINUX第八讲第八讲 1. 文件系统的注册文件系统的注册 在使用一个文件系统之前,必须要对该文件系统进行注册。在Linux编译的时候,可以选定支持哪些文件系统,这些编译进内核的文件系统,在系统引导的时候,就会在VFS中注册。而如果一个文件系统被编译为内核可装载模块,将在模块安装的时候进行注册,在模块卸载的时候注销。 文件系统的注册、安装与卸载LINUX第八讲第八讲 每个文件系统的初始化例程都是在 V
2、FS 中注册,并由一个 file_system_type 数据结构表,参见 fs/filesystems.c 中的sys_setup()和include/linux/fs.h 中的file_system_type 。其中包含了文件系统的名称以及一个指向对应 VFS 超块读取例程的地址。文件系统的注册、安装与卸载LINUX第八讲第八讲file_systems“iso9660”“proc”“ext2”file_system_type*read_super()namerequires_devnextfile_system_type*read_super()namerequires_devnextfi
3、le_system_type*read_super()namerequires_devnext注册的文件系统 :内核中的 file_system_type 链表,链表头由 file_systems 指定。每个 file_system_type 结构成员由表 给出。文件系统的注册、安装与卸载LINUX第八讲第八讲 file_system_type 结构成员超块读取例程 read_super 当属于该文件系统类型的实际文件系统被挂装时,VFS 调用该例程读取超块。 文件系统名称 name 文件系统的名称。例如 Ext2、vfat、iso9660等。 要求设备requires_dev 该文件系统是否
4、需要设备支持?并不是所有的文件系统都需要特定设备,例如,/proc 文件系统并不需要块设备。 文件系统的注册、安装与卸载LINUX第八讲第八讲 文件系统类型的注册和注销函数int register_filesystem(struct file_system_type * fs)int unregister_filesystem(struct file_system_type * fs)file_systemsfile_system_type file_system_type file_system_type 文件系统的注册、安装与卸载LINUX第八讲第八讲 2. 文件系统的挂装文件系统的挂装
5、要使用一个文件系统,除了注册之外,还必须挂装这个文件系统。和所有的Unix 版本一样,Linux 利用特殊文件代表系统的硬件设备。设备文件实际并不占用任何文件系统的空间,它只是作为访问设备驱动程序的入口。Ext2 文件系统和 VFS 文件系统将设备文件作为特殊索引节点实现。设备分为块设备和字符设备两种。设备文件的索引节点中包含对应设备的主设备号和次设备号,分别标识设备类型以及该设备在同类设备中的编号。 文件系统的挂装和卸装一般只能由超级用户完成。参见 fs/super.c add_vfsmnt() 。文件系统的注册、安装与卸载LINUX第八讲第八讲/binetcdevusrRoot files
6、ystem/usr filesystemComplete hierarchy after mounting /usr/binmanlib/binetcdevusrusrbinmanlib文件系统的注册、安装与卸载LINUX第八讲第八讲 用户(一般是 root)在挂装文件系统时,要指定三种信息:文件系统的名称、包含文件系统的物理块设备和文件系统在已有文件系统中的挂装点。例如: $ mount -t iso9660 /dev/hdc /mnt/cdrom 上述命令指定了要挂装的文件系统类型,文件系统所在设备以及挂装点,并将文件系统挂装为只读。如果要在系统启动时自动挂装文件系统,则可以在 /etc/
7、fstab 文件中为每种文件系统的挂装提供有关文件系统的名称、包含该文件系统的物理设备以及该文件系统的挂装点的信息。有关内容可参见 fstab 手册。文件系统的注册、安装与卸载LINUX第八讲第八讲(1)寻找对应的文件系统信息。VFS 通过 file_systems 在 file_system_type 组成的链表中根据指定的文件系统名称搜索文件系统类型信息。参见 fs/super.c中的do_mount() 和fs/super.c中的get_fs_type() 函数。(2) 如果在上述链表中找到匹配的文件系统,则说明内核具有对该文件系统的内建支持。否则,说明该文件系统可能由可装载模块支持,V
8、FS 会请求内核装入相应的文件系统模块,此时,该文件系统在 VFS 中注册并初始化。(3) 不管是哪种情况,如果 VFS 无法找到指定的文件系统,则返回错误。(4) VFS 检验给定的物理块设备是否已经挂装。如果指定的块设备已被挂装,则返回错误。文件系统的注册、安装与卸载LINUX第八讲第八讲(5) VFS 查找作为新文件系统挂装点的目录的 VFS 索引节点。该 VFS 索引节点可能在索引节点高速缓存中,也有可能需要从挂装点所在的块设备中读取。(6) 如果该挂装点已经挂装有其他文件系统,则返回错误。因为同一目录只能同时挂装一个文件系统。(7) VFS 挂装代码为新的文件系统分配超块,并将挂装信
9、息传递给该文件系统的超块读取例程。系统中所有的 VFS 超块保存在由 super_blocks 指向的 super_block 数据结构指针数组中。(8) 文件系统的超块读取例程将对应文件系统的信息映射到 VFS 超块中。如果在此过程中发生错误,例如所读取的超块幻数和指定的文件系统不一致,则返回错误。(9) 如果成功挂装,则所有已挂装的文件系统形成数据结构。文件系统的注册、安装与卸载LINUX第八讲第八讲vfsmountmnt_devmnt_devnamemnt_dirnamemnt_flagsmnt_sbnext0 x0301/dev/hda1/VFSsuper_blocks_devs_bl
10、ocksizes_types_flagss_covereds_mounted0 x03011024vfsmntlistfile_system_type*read_super()namerequires_devnext“ext2”VFSinodei_devi_ino0 x030142已挂装的文件系统数据结构已挂装的文件系统数据结构文件系统的注册、安装与卸载LINUX第八讲第八讲 从图中可看到,每个已挂装的文件系统由vfsmount 结构描述,所有的 vfsmount 结构形成了一个链表,该链表头由 vfsmntlist 指针代表。系统中还有两个指针,vfsmnttail 和 mru_vfsmnt
11、,分别指向链表尾和最近使用过的 vfsmount 结构。每个 vfsmount 结构包含保存该文件系统的块设备号,文件系统挂装点的目录名称,以及指向为该文件系统分配的 VFS 超块的指针。而 VFS 超块中则包含描述文件系统的 file_system_type 结构指针和该文件系统根节点指针。参见 fs/super.c中的add_vfsmnt() 函数。文件系统的注册、安装与卸载LINUX第八讲第八讲3. 文件系统的卸装文件系统的卸装利用 umount 命令卸装文件系统,参见 fs/super.c中的do_umount()函数和fs/super.c中的remove_vfsmnt() 函数。um
12、ount命令只需一个参数,即希望卸挂的设备或挂装点:# umount /mnt/dosd#或# umount /dev/hda5#文件系统的注册、安装与卸载LINUX第八讲第八讲3. 文件系统的卸装文件系统的卸装 如果文件系统中的文件当前正在使用,该文件系统是不能卸装的。如果文件系统中的文件或目录正在使用,则 VFS 索引节点高速缓存中可能包含相应的 VFS 索引节点。检查代码在索引节点高速缓存中,根据文件系统所在设备的标识符,查找是否有来自该文件系统的 VFS 索引节点,如果有且标志为“脏”,则说明该文件系统正在被使用,因此,文件系统不能被卸装。否则,查看对应的 VFS 超块。如果该文件系统
13、的 VFS 超块标志为“脏”,则必须将超块信息写入实际的文件系统。上述过程结束之后,对应的 VFS 超块被释放,vfsmount 数据结构从 vfsmntlist 链表中断开并释放。VFS的实现函数和数据结构LINUX第八讲第八讲 有了虚拟文件系统,文件系统的代码就分成了两部分:上层用于处理系统内核的各种表格和数据结构;下层用来实现文件系统本身的函数,并通过VFS来调用。这些函数主要包括: (1) 管理缓冲区(buffer. c)。(2) 响应系统调用fcntl() 和ioctl() (fcntl.c and ioctl.c)。(3) 将管道和文件输入/输出映射到索引节点和缓冲区(fifo.c
14、, pipe.c)。(4) 锁定和不锁定文件和记录(locks.c)。(5) 映射名字到索引节点(namei.c, open.c)。(6) 实现select( )函数(select . c)。(7) 提供各种信息(stat.c)。(8) 挂接和卸载文件系统(super.c)。(9) 调用可执行代码和转存核心(exec.c)。(10) 装入各种二进制格式(bin_fmt*.c)。 VFS的实现函数和数据结构LINUX第八讲第八讲 VFS接口则由一系列相对高级的操作组成,这些操作由和文件系统无关的代码调用,并且由不同的文件系统执行。其中最主要的结构有inode_operations 和file_o
15、perations。 file_system_type是系统内核中指向真正文件系统的结构。每挂接一次文件系统,都将使用file_system_type组成的数组。file_system_type组成的数组嵌入到了fs/filesystems.c中。相关文件系统的read_super函数负责填充super_block结构。 下面介绍在VFS中使用的几个重要的数据结构,它们是VFS实现的核心,更是与逻辑文件系统交互的接口,因此必须进行详细的分析。 VFS的实现函数和数据结构LINUX第八讲第八讲1 VFS超块及其操作超块及其操作 许多逻辑文件系统都有超块结构,超块是这些文件系统中最重要的数据结构,
16、用来描述整个文件系统的信息,是一个全局的数据结构。MINIX、EXT2等都有自己的超级块,VFS也有超级块,但和逻辑文件系统的超级块不同,VFS超级块是存在于内存中的结构,每个已挂装的文件系统由一个 VFS 超块代表。它在逻辑文件系统安装时建立,并且在文件系统卸载时自动删除。因此,VFS对于每一个逻辑文件系统,都有一个对应的VFS超级块。参见 include/linux/fs.h 。VFS 超块中包含的信息由表列出。VFS的实现函数和数据结构LINUX第八讲第八讲VFS 超块中的信息设备 包含文件系统的块设备标识符。对于 /dev/hda1,其设备标识符为 0 x301。 索引节点指针 这里包
17、含两个索引节点指针。mounted 索引节点指针指向文件系统的第一个节点;covered 指针指向代表文件系统挂装目录的节点。root 文件系统的 VFS 超块没有 covered 指针。 数据块大小 文件系统中数据块的大小,以字节为单位。 超块操作集 指向一组超块操作例程集的指针。这些例程由 VFS 用来读取和写入索引节点以及超块。文件系统类型 指向文件系统的 file_system_type 数据结构的指针。 文件系统的特殊信息 该文件系统的特殊信息。 VFS的实现函数和数据结构LINUX第八讲第八讲 在实现自己的逻辑文件系统时,必须提供一套自己的超级块操作函数。对这些函数的调用都来自进程
18、正文(process context),而不是来自在中断例程或者bottom half,在所有的方法调用时,都会使用内核锁,因此,操作可以安全地阻塞,但也要避免并发地进行访问。 VFS的实现函数和数据结构LINUX第八讲第八讲 2 VFS的文件及其操作的文件及其操作 在需要读写时使用文件对象,包括通过文件系统,或者管道以及网络等进行通讯的对象。文件对象和进程关系紧密,进程通过文件描述符(file descriptors)来访问文件。文件描述符是一个整数,Linux通过fs.h中定义的NR_OPEN来规定每个进程最多同时使用的文件描述符个数: #define NR_OPEN (1024*1024
19、) 一共有三个与进程相关的结构,第一个是files_struct,在include/linux/sched.h中定义,主要是一个fd数组,数组的下标是文件描述符,其内容就是对应的下面将要介绍的file结构。 VFS的实现函数和数据结构LINUX第八讲第八讲2 VFS的文件及其操作的文件及其操作 另外一个结构是fs_struct,主要有两个指针,pwd指向当前工作目录的索引节点;root指向当前工作目录所在文件系统的根目录的索引节点。 最后一个结构是file结构,它的作用是为了保证进程对文件的私有记录,以及父子进程对文件的共享。 在file结构中,有一个指针指向了一个文件操作集file_oper
20、ations,它在linux/fs.h中被定义。这些操作用来将VFS对file结构的操作转化为逻辑文件系统处理相应操作的函数。因此,要了解一个逻辑文件系统,就要从这些接口函数入手。VFS的实现函数和数据结构LINUX第八讲第八讲3 VFS索引节点及其操作索引节点及其操作 VFS 中的文件、目录等均由对应的索引节点代表。每个 VFS 索引节点中的内容由文件系统专属的例程提供。Linux维护了一个活动的及最近使用过的索引节点的高速缓存(cache)。VFS 索引节点实际保存于 VFS 的索引节点高速缓存中。参见 include/linux/fs.h 。有两种方法来访问这些索引节点。第一种是通过dc
21、ache。在dcache中的每一个dentry都指向一个索引节点,并且因此而将索引节点维护在缓存中。第二种方法是通过索引节点的哈希表。每一个索引节点都被基于该文件系统超级块的地址和索引节点的编号,被哈希为一个8位的数字。所有拥有同样哈希值的索引节点通过双项链表被链接在一起。 通过哈希表访问是通过函数iget而实现的。iget只被个别的文件系统实现所调用(当索引节点不再dcache中而进行查找的时候)。 VFS 索引节点中的信息由表 给出。VFS的实现函数和数据结构LINUX第八讲第八讲表VFS 索引节点中的数据域设备 包含该文件或其他任何 VFS 索引节点所代表的对象的设备标识符。 索引节点编
22、号 索引节点编号,在文件系统中唯一。设备和索引节点的组合在 VFS 中唯一。 模式 VFS 索引节点代表的对象类型,以及相应的访问权限。用户标识符所有者标识符。时间建立、修改和写入的时间。块大小数据块的大小,以字节为单位。索引节点操作集指向索引节点操作例程集的指针。这些例程专用于该文件系统,执行针对该节点的操作。计数系统组件使用该 VFS 节点的次数。计数为零,表明该节点可丢弃或重新使用。锁定该数据域用来锁定 VFS 节点。脏表明 VFS 节点是否被修改过,若如此,该节点应当写入底层文件系统。文件系统的特殊信息和文件系统相关的特殊信息。VFS的实现函数和数据结构LINUX第八讲第八讲4. VF
23、S 中文件的定位中文件的定位 为了在虚拟文件系统中定位给定文件的索引节点,VFS 必须每次分解文件路径名中的一个目录名,并依次搜索每个中间目录名的 VFS 索引节点。因为 VFS 在 VFS 超块中记录了每个文件系统根的 VFS 索引节点,因此搜索过程从根索引节点开始,具体过程和 Ext2 文件系统的文件定位过程类似。在搜索目录索引节点时,VFS 在目录高速缓存中搜索,如果能够在目录高速缓存中找到对应的索引节点编号,则在索引节点高速缓存中搜索索引节点,否则从底层文件系统中获取。高速缓存LINUX第八讲第八讲 文件和索引节点之间是通过目录入口(dentry)结构来紧密联系的。 VFS层处理了文件
24、路径名的所有管理工作,并且在底层文件系统能够看到它们之前,将其转变为目录高速缓存(dcache)中的入口(entry)。唯一的一个例外是对于符号链接的目标,VFS将不加改动地传递给底层文件系统,由底层文件系统对其进行解释。 目录高速缓存由许多目录入口结构组成。每一个目录入口都对应文件系统中的一个文件名,并且与之联系。每一个目录入口的父节点都必须存在于目录高速缓存中。同时,目录入口还记录了文件系统的装载关系。 目录高速缓存负责管理索引节点高速缓存。无论何时,只要在目录高速缓存中存在一个入口,相应的索引节点一定在索引节点高速缓存中。换句话说,如果一个索引节点在高速缓存中,它一定引用dcache中的
25、一个dentry。 文件系统分配机制LINUX第八讲第八讲1. 基于块分配基于块分配 磁盘在经过分区之后,单个的物理磁盘就被划分为多个逻辑分区,每个分区上可存在一个文件系统。块设备实际是可以包含文件系统的设备,不管块设备的具体构造如何,Linux 文件系统均将它们当作线性块的集合而访问。每个块设备驱动程序的任务,就是将逻辑块的请求转化为对应块设备可以理解的命令。类似地,对文件系统来说,不管基础的块设备是什么,它都能够进行一致的操作。利用 Linux 的文件系统,用户根本不用关心由不同硬件控制器控制的,处于不同物理介质上的不同文件系统之间的区别。如果将网络服务器的磁盘或分区挂装到本地文件系统上,
26、用户可以和操作本地文件系统一样进行操作。传统的Unix文件系统使用块(block)分配机制,并且提供一个灵活有效的块分配策略(policy)。磁盘块在被使用时分配,就是说只为文件分配一个最小的文件系统块数,以保存存储空间。 文件系统分配机制LINUX第八讲第八讲1. 基于块分配基于块分配 当文件扩展时,从一个空闲块位图中分配块,所以有时块是随机分配的。当文件扩展时,从一个空闲块位图中分配块,所以有时块是随机分配的。随机分配会导致过多的磁盘搜寻,随后从文件系统读数据会导致磁盘机制随机分配会导致过多的磁盘搜寻,随后从文件系统读数据会导致磁盘机制搜寻文件扩展期间所分配的所有随机块位置。随机块分配可以
27、通过块分配搜寻文件扩展期间所分配的所有随机块位置。随机块分配可以通过块分配策略的优化来避免,它试图分配连续序列的块。策略的优化来避免,它试图分配连续序列的块。 更小的块分配获得大的连续分配,大量减少了磁盘搜寻。然而,连续的文更小的块分配获得大的连续分配,大量减少了磁盘搜寻。然而,连续的文件系统块分配最终导致了文件系统中的文件块碎片,结果文件系统访问最件系统块分配最终导致了文件系统中的文件块碎片,结果文件系统访问最终又会回到随机的本质。终又会回到随机的本质。 块分配方案也要保存文件扩展时每个被分配的新块的位置信息,以及文件块分配方案也要保存文件扩展时每个被分配的新块的位置信息,以及文件是否是每次
28、一块的扩展。额外的磁盘是否是每次一块的扩展。额外的磁盘I/O被要求读写文件系统块结构信息。被要求读写文件系统块结构信息。文件系统块结构信息成为元数据(文件系统块结构信息成为元数据(metadata)。文件系统元数据总是同步)。文件系统元数据总是同步写入存储设备,所以对一个文件大小的改变需要等待每个元数据操作完成。写入存储设备,所以对一个文件大小的改变需要等待每个元数据操作完成。因此,元数据操作极大降低了文件系统的整体性能。因此,元数据操作极大降低了文件系统的整体性能。文件系统分配机制LINUX第八讲第八讲2. 基于范围分配基于范围分配 基于范围(基于范围(extent)的文件系统每次按一大群来
29、分配磁盘块,)的文件系统每次按一大群来分配磁盘块,因此要强制进行顺序分配。一个文件被写入时,大量块在文因此要强制进行顺序分配。一个文件被写入时,大量块在文件创建时被分配给文件;然后,可以进行大群或簇顺序块的件创建时被分配给文件;然后,可以进行大群或簇顺序块的写入。文件系统元数据在文件首次创建是写入;在块的第一写入。文件系统元数据在文件首次创建是写入;在块的第一个分配范围内的写不要求额外的元数据写,直到被分配下一个分配范围内的写不要求额外的元数据写,直到被分配下一个范围。个范围。 这种方法优化了磁盘搜寻方式,到簇的群化块写入允许文件这种方法优化了磁盘搜寻方式,到簇的群化块写入允许文件系统提交对存
30、储设备的更大的物理磁盘写入,节省了许多小系统提交对存储设备的更大的物理磁盘写入,节省了许多小SCSI转换的开销。在块分配的文件中每个逻辑块都需要有一转换的开销。在块分配的文件中每个逻辑块都需要有一个块地址号,导致每个文件有许多的元数据。在范围分配方个块地址号,导致每个文件有许多的元数据。在范围分配方法中,每个接连的数据块范围只需有起始块号和长度就够了。法中,每个接连的数据块范围只需有起始块号和长度就够了。所以包含有一些大范围块的文件只有少量的元数据。所以包含有一些大范围块的文件只有少量的元数据。 文件系统分配机制LINUX第八讲第八讲2. 基于范围分配基于范围分配 范围分配的文件系统为顺序文件
31、访问提供了更好的性能,因范围分配的文件系统为顺序文件访问提供了更好的性能,因为他的顺序分配策略以及块聚集为更大的写。然而,对于正为他的顺序分配策略以及块聚集为更大的写。然而,对于正在用来作随机在用来作随机I/O的文件系统,范围文件系统的长处往往得的文件系统,范围文件系统的长处往往得不到发体现。不到发体现。 如果想要通过一个基于范围的文件进行顺序读,只需读取起如果想要通过一个基于范围的文件进行顺序读,只需读取起始的块号和长度;然后可以继续读取此范围内的所有数据,始的块号和长度;然后可以继续读取此范围内的所有数据,这意味着在顺序读时只有很小的元数据读开销。相反,如果这意味着在顺序读时只有很小的元数
32、据读开销。相反,如果要以随机方法来读,就要先查询想要的每个数据块的块地址,要以随机方法来读,就要先查询想要的每个数据块的块地址,这相当于要处理一个基于块的文件系统。这相当于要处理一个基于块的文件系统。 块高速缓存LINUX第八讲第八讲 所有的 Linux 文件系统使用共同的缓冲区高速缓存。所有块设备的读取和写入请求通过标准的内核例程调用,以 buffer_head 数据结构的形式提交给设备驱动程序。buffer_head 中包含了唯一标识块所在设备的设备标识符,以及要读取或写入的块编号。为了加速对物理块设备的访问过程,Linux 使用了缓冲区高速缓存。在高速缓存中,任意给定的时间内,存在着来自
33、不同物理设备的数据块,而且处于不同的状态。任何用来从块设备中读取或写入块设备的块缓冲区,都要经过缓冲区高速缓存。随着时间的流逝,缓冲区占用的缓存可能让给其他更加需要缓存的缓冲区,也有可能因为频繁访问而保持在缓存中。 块高速缓存LINUX第八讲第八讲 缓冲区高速缓存的哈希表结构 b u ffe r_ h ea db_devb_blocknrb_stateb_countb_siz eb_nextb_p revb_data0 x0 3 0 14 21 0 2 4b u ffe r_ h ea db_devb_blocknrb_stateb_countb_siz eb_nextb_p revb_dat
34、a0 x0 3 0 13 91 0 2 4b u ffe r_ h ea db_devb_blocknrb_stateb_countb_siz eb_nextb_p revb_data0 x0 8 0 11 72 0 4 8h as h _ tab le块高速缓存LINUX第八讲第八讲 缓冲区高速缓存分为两个功能部分。第一部分是空闲块缓冲区表,每个系统支持的缓冲区大小对应一个表,系统的空闲块缓冲区在第一次创建和最后被丢弃时在这些表中排队。当前 Linux 所支持的缓冲区大小为 512、1024、2048、4096 和 8192 字节。第二部分是高速缓存本身,和 VFS 索引节点高速缓存类似,缓
35、冲区高速缓存也是一个具有相似结构的哈希表。哈希索引由块所在的设备标识符以及块编号计算得到。块缓冲区可能在某个空闲缓冲区表中,也有可能在高速缓存中。如果块缓冲区在高速缓存中,则这些缓冲区也在最近最少使用(Least Recently Used,LRU)表中排队。块高速缓存LINUX第八讲第八讲干净的干净的未使用的、新的缓冲区。共享的缓冲区。未使用的、新的缓冲区。共享的缓冲区。锁定的锁定的脏的缓冲区。脏的缓冲区。脏的脏的当前锁定的缓冲区,正等待写入。当前锁定的缓冲区,正等待写入。共享的共享的其中包含新的有效数据,但尚未写入块设备。其中包含新的有效数据,但尚未写入块设备。非共享的非共享的曾经被共享,
36、但当前不再共享的缓冲区。曾经被共享,但当前不再共享的缓冲区。Linux 的缓冲区类型索引节点高速缓存LINUX第八讲第八讲 VFS 索引节点实际是一个哈希表(或散列表),哈索引节点实际是一个哈希表(或散列表),哈希表的每个入口包含一个希表的每个入口包含一个 VFS 索引节点链表的头指针,索引节点链表的头指针,该链表中的每个该链表中的每个 VFS 索引节点具有相同的哈希值。节索引节点具有相同的哈希值。节点的哈希值根据文件系统所在块设备的标识符,以及索点的哈希值根据文件系统所在块设备的标识符,以及索引节点的编号计算得到。当虚拟文件系统要访问某个节引节点的编号计算得到。当虚拟文件系统要访问某个节点时
37、,它首先在点时,它首先在 VFS 索引节点中搜索。每个要搜索的索引节点中搜索。每个要搜索的 VFS 索引节点可计算得到一个对应的哈希值,然后,索引节点可计算得到一个对应的哈希值,然后,VFS 将该哈希值作为访问哈希表的索引,如果对应的将该哈希值作为访问哈希表的索引,如果对应的哈希表入口指向的索引节点链表中包含有要搜索的索引哈希表入口指向的索引节点链表中包含有要搜索的索引节点(相同的设备标识符和相同的节点编号),则说明节点(相同的设备标识符和相同的节点编号),则说明该索引节点包含在高速缓存中,这时,找到的索引节点该索引节点包含在高速缓存中,这时,找到的索引节点访问计数加访问计数加 1,否则,必须
38、寻找一个空闲的,否则,必须寻找一个空闲的 VFS 索引索引节点,并从底层文件系统中读取该索引节点。节点,并从底层文件系统中读取该索引节点。索引节点高速缓存LINUX第八讲第八讲 VFS 可选择多种方法获取空闲索引节点。如果系统可选择多种方法获取空闲索引节点。如果系统能够分配更多的能够分配更多的 VFS 节点,则节点,则 VFS 从内核中分配内存从内核中分配内存页并将其划分为新的空闲节点,然后放在节点列表中。页并将其划分为新的空闲节点,然后放在节点列表中。系统所有的系统所有的 VFS 节点保存在由节点保存在由 first_ionde 指向的链表指向的链表中。如果系统已经具备了所有可利用的索引节点
39、,则必中。如果系统已经具备了所有可利用的索引节点,则必须寻找一个可重复利用的索引节点。当前使用计数为须寻找一个可重复利用的索引节点。当前使用计数为 0 的索引节点可作为重复利用的节点,对文件系统的根节的索引节点可作为重复利用的节点,对文件系统的根节点来说(以及其他重要的节点),其使用计数始终大于点来说(以及其他重要的节点),其使用计数始终大于 0,因此不会被重复使用。如果找到可重复利用的索引,因此不会被重复使用。如果找到可重复利用的索引节点,则必须在使用之前清除该节点。如果该节点标志节点,则必须在使用之前清除该节点。如果该节点标志为为“脏脏”,则需要写回到实际的文件系统中;如果该节,则需要写回
40、到实际的文件系统中;如果该节点被锁定,则必须等待解锁。点被锁定,则必须等待解锁。索引节点高速缓存LINUX第八讲第八讲 无论利用哪种方法获得了空闲的 VFS 节点,VFS 会调用文件系统专有的例程从底层文件系统中读取信息并填充该索引节点。在该节点被填充时,这一新的 VFS 节点的使用计数为 1,同时被锁定,以免其他进程访问该节点。填充之后,节点被解锁。 为了获得实际使用的 VFS 节点,文件系统可能要访问许多其他的节点。读取目录内容时,只有最后一个目录的索引节点是实际要使用的,但同时必须读取中间目录的索引节点。内存管理概述LINUX第九讲第九讲 内存管理是操作系统中重要的组成部分。内存管理的任
41、务是方便用户使用存储资源,在有限的物理空间内使更多的用户进程高效地获得和使用尽可能多的存储空间,从而提高系统的整体性能。内存管理概述LINUX第九讲第九讲内存管理器之间的关系内存管理器之间的关系虚拟存储器的概念LINUX第九讲第九讲 虚拟存储器:操作系统提供的一个假想的特大存储器。虚拟内存不是实际的内存,它的大小比内存空间大的多;用户感觉所能使用的“内存”非常大,这是操作系统对物理内存的扩充。虚拟存储器的基本特征:LINUX第九讲第九讲虚拟扩充:不是物理上,而是逻辑上扩充了内存容量。对运行在系统中的进程而言,可用的内存总量可以超过系统的物理内存总量,甚至可以达到好几倍。运行在 i386 平台上
42、的 Linux 进程,其地址空间可达 4GB。部分装入:每个作业不是全部一次性的装入内存,而是只装入一部分。离散分配:不必占用连续的内存空间,而是“见缝插针”多次对换:所需的全部程序和数据要分多次调入内存进程保护:每个进程拥有自己的虚拟地址空间,这些虚拟地址对应的物理地址完全和其他进程的物理地址隔离,从而避免进程之间的互相影响。虚拟存储器的基本特征:LINUX第九讲第九讲内存映射。利用内存映射,可以将程序影像或数据文件映射到进程的虚拟地址空间中,对程序代码和数据的访问与访问内存单元一样。 公平的物理内存分配。虚拟内存机制可保证系统中运行的进程平等分享系统中的物理内存。共享虚拟内存。利用虚拟内存
43、可以方便隔离各进程的地址空间,但是,如果将不同进程的虚拟地址映射到同一物理地址,则可实现内存共享。这就是共享虚拟内存的本质,利用共享虚拟内存不仅可以节省物理内存的使用(如果两个进程的部分或全部代码相同,只需在物理内存中保留一份相同的代码即可),而且可以实现所谓“共享内存”的进程间通讯机制(两个进程通过同一物理内存区域进行数据交换)。虚拟内存管理机制LINUX第九讲第九讲 虚拟内存管理器主要采用了请求分页机制和交换机制。当进程运行时,不必把整个进程的映像都有放在内存中,而只需在内存中保留当前用到的那一部分页面。当进程访问到某些尚未在内存的页面时,就由核心把这些页面装入内存。分页的概念LINUX第
44、九讲第九讲(1)逻辑空间分页 将一个进程的逻辑地址空间划分若干大小相等的部分,每一部分称作页面或页。每页都有一个编号,叫做页号,页号从0开始依次编号。(2)物理空间分块 把内存也划分成与页面相同大小的若干个存储块,称作内存块。同样,他们也要进行编号,块号开始依次顺序排列:0块,1块 大小由硬件决定,一般是2的若干次幂,X86上是4K 分页的概念LINUX第九讲第九讲(3)逻辑地址表示:在页式存储管理方式中,表示地址的结构3111120页号p页内地址d如果给定的逻辑地址是A,页面大小是L,则页号p和页内地址d可以按以下公式求得:p=intA/L d=A mod L页最大为4K,最多有1M个页面分页的概念LINUX第九讲第九讲(4)内存分配原则: 在分页情况下,系统以块为单位分给作业或进程,并且一个进程的若干页可以分别装入物理上不相邻的内存块中。(5)页表:页面映象表 进程执行时,按照逻辑地址中的页号去查找页表中的对应项,可从中找到该页在内存中的物理块号。所以页表的作用是实现从页号到物理块号的地址映射。请求分页的基本思想LINUX第九讲第九讲 在简单的分页系统中,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度年福建省高校教师资格证之高等教育心理学押题练习试卷B卷附答案
- 2024年度山西省高校教师资格证之高等教育法规题库与答案
- 2024年度年福建省高校教师资格证之高等教育学能力检测试卷B卷附答案
- 2023年有机废水沼气系统投资申请报告
- 第七章 新生儿及患病新生儿的护理课件
- 五年级数学(小数四则混合运算)计算题专项练习及答案
- 体育运动教练岗位招聘面试题与参考回答2024年
- 2024年城市道路施工合作协议
- 产品代理权2024年度专享协议
- 2024专业纪实摄影师服务协议
- 人教版四年级数学上册《角的度量复习课》复习教案
- 通达OA基本功能及使用课件
- 天文学入门一
- 托管班标准化流程
- astm_b盐雾试验标准中文
- Module 5 外研版英语九(上)模块主题写作详解与训练
- 高低压配电室运行巡查表
- 竹荪种植项目可行性研究报告写作范文
- starter安装教程
- 小班综合活动《出生的秘密》
- 制程品质保证权责及工作重点
评论
0/150
提交评论