linux文件系统3:缓冲区高速缓存_茅坑_百度空间
如前所述,所有的 Linux 文件系统使用共同的缓冲区高速缓存。所有块设备的读取和写入请求通过标准的内核例程调用,以 buffer_head 数据结构的形式提交给设备驱动程序(参见本书 12.5.3 小节)。buffer_head 中包含了{wy}标识块所在设备的设备标识符,以及要读取或写入的块编号。为了加速对物理块设备的访问过程,Linux 使用了缓冲区高速缓存。在高速缓存中,任意给定的时间内,存在着来自不同物理设备的数据块,而且处于不同的状态。任何用来从块设备中读取或写入块设备的块缓冲区,都要经过缓冲区高速缓存。随着时间的流逝,缓冲区占用的缓存可能让给其他更加需要缓存的缓冲区,也有可能因为频繁访问而保持在缓存中。

                   图 13-8 缓冲区高速缓存的哈希表结构
缓冲区高速缓存分为两个功能部分。{dy}部分是空闲块缓冲区表,每个系统支持的缓冲区大小对应一个表,系统的空闲块缓冲区在{dy}次创建和{zh1}被丢弃时在这些表中排队。当前 Linux 所支持的缓冲区大小为 512、1024、2048、4096 和 8192 字节。第二部分是高速缓存本身,和 VFS 索引节点高速缓存类似,缓冲区高速缓存也是一个具有相似结构的哈希表。哈希索引由块所在的设备标识符以及块编号计算得到。图 13-8 是缓冲区高速缓存的哈希表结构。块缓冲区可能在某个空闲缓冲区表中,也有可能在高速缓存中。如果块缓冲区在高速缓存中,则这些缓冲区也在 LRU 表中排队。每个缓冲区类型具有一个 LRU 列表,当前 Linux 支持的缓冲区类型见表 13-8。
           表 13-8 Linux 的缓冲区类型

当文件系统需要从底层物理设备上读取数据块时,它首先试图从缓冲区高速缓存中读取。如果无法从缓冲区高速缓存中得到数据块,它会从适当大小的空闲缓冲区表中获得一个干净的缓冲区,并将该缓冲区放入缓冲区高速缓存。如果所需的缓冲区当前在高速缓存中,该缓冲区可能是经过更新的,也有可能不是。如果未经更新,或该缓冲区是新的块缓冲区,则文件系统必须请求设备驱动程序读取适当的数据块。
和其他的高速缓存一样,Linux 也需要维护缓冲区高速缓存,以便能够高效运行,并为不同块设备公平分配缓存项。为此,Linux 利用 bdfush 内核守护进程完成一些常务工作,而其他一些工作则随着缓存的使用而自动完成。
13.3.1 bdflush 内核守护进程
bdflush 内核守护进程是一个简单的内核线程,它可以动态地对系统中具有许多“脏”缓冲区的情形作出响应。它作为系统线程在系统启动时运行,它在系统中注册的进程名称为 kflushd。通常情况下,该进程处于休眠状态,在如下情况下,该进程被唤醒:
 分配和丢弃缓冲区时,如果系统检测到脏缓冲区的比例达到指定值。默认情况下该值为 60%。
 系统急需缓冲区时。

利用 update 命令,可查看并控制许多和该守护进程相关的值:
# update -d
bdflush version 1.4
0:    40 Max fraction of LRU list to examine for dirty blocks
1:   500 Max number of dirty blocks to write each time bdflush activated
2:    64 Num of clean buffers to be loaded onto free list by refill_freelist
3:    64 Dirty block threshold for activating bdflush in refill_freelist
4:    15 Percentage of cache to scan for free clusters
5: 3000 Time for data buffers to age before flushing
6:   500 Time for non-data (dir, bitmap, etc) buffers to age before flushing
7: 1884 Time buffer cache load average constant
8:     2 LAV ratio (used to determine threshold for buffer fratricide).
#
当缓冲区因为写入数据而变脏时,这些缓冲区被链接到 BUF_DIRTY LRU 表中。bdflush 会试图将合理数量的脏缓冲区写入磁盘,这一数量默认为 500,该参数也可以通过 update 命令查看和修改。
13.3.2 update 进程
update 不仅是一个命令,而且也是一个守护进程。该守护进程一般在系统初始化时以超级用户身份运行,它周期性地把所有老的脏缓冲区刷新到磁盘上。它通过调用一个类似 bdflush 的系统服务完成刷新任务。当缓冲区变脏时,系统以系统时间作标记,表明该缓冲区应当刷新到磁盘。每次 update 运行时,它在系统的脏缓冲区中查找已到达刷新时间的缓冲区,每个到达刷新时间的缓冲区都会被写入磁盘。
13.4 /proc 文件系统
和其他文件系统不同的是,/proc 文件系统并不是一个真正存在于块设备上的文件系统。这正表明了 Linux 虚拟文件系统的强大功能。在系统的初始化过程中,/proc 文件系统在 VFS 中注册。当 VFS 需要打开其中的目录或文件时,它利用内核信息建立这些文件和目录。
/proc 文件系统为用户提供了一个查看内核内部工作情况的窗口。
13.5 特殊设备文件
和所有的 UNIX 版本一样,Linux 利用特殊文件代表系统的硬件设备。设备文件实际并不占用任何文件系统的空间,它只是作为访问设备驱动程序的入口。Ext2 文件系统和 VFS 文件系统将设备文件作为特殊索引节点实现。设备分为块设备和字符设备两种。设备文件的索引节点中包含对应设备的主设备号和次设备号,分别标识设备类型以及该设备在同类设备中的编号。
13.6 相关系统工具和系统调用
13.6.1 Linux 支持的文件系统
由于 Linux 采用了虚拟文件系统,从理论上讲,Linux 可以支持所有的文件系统。表 13-9 给出了 Linux 所支持的重要文件系统。
表 13-9 Linux 支持的重要文件系统
MINIX MINIX 操作系统使用的文件系统,Linux 最初使用该文件系统开发。是最老的、也是最可靠的文件系统。但该文件系统的能力受到一定限制,例如,省略了某些时间戳,文件名程度不能超过 30 个字符等。
xia MINIX 文件系统的更新版,突破了部分限制,但没有新的功能特色。
Ext2 功能强大的 Linux 土生土长的文件系统。
ext Ext2 文件系统的老版本。该文件系统可转换到 Ext2 文件系统。
msdos 和 MS-DOS 兼容的 FAT 文件系统。
umsdos 对 Linux 中 msdos 文件系统驱动程序的扩展,以便能够支持长文件名、所有者、许可、链接和设备文件。它使得通常的 msdos 文件系统可以当作 Linux 固有的文件系统一样使用。
vfat Microsoft 对原 fat 文件系统的扩展,可以支持长文件名。
iso9660 该文件系统是标准的 CD-ROM 文件系统。对该标准更加流行的 Rock Ridge 扩展允许长文件名的自动支持。
nfs 允许在多台计算机之间共享文件系统的网络文件系统。
hpfs 高性能文件系统,是 OS/2 的文件系统。
ntfs Windows NT 的文件系统。
sysv System V/386、Coherent 和 Xenix 的文件系统。

在多个操作系统共存的系统中,有时难免使用除 Ext2 之外的文件系统。如果没有这方面的需求,则应当使用 Ext2 文件系统,因为 Ext2 和 VFS 之间最接近,从而可获得{zg}的性能。
13.6.2 建立文件系统
利用 mkfs 命令建立,或初始化文件系统。实际上,每个文件系统类型对应有自己单独的初始化命令。mkfs 只是最为一个前台的程序而存在,它实际根据要建立的文件系统类型调用相应的命令,文件系统类型由 mkfs 命令的 -t 参数指定。其他常用的 mkfs 命令参数如下:
-c     检查坏块并建立相应的坏块清单
-l filename 从指定的文件 filename 中读取初始坏块。
如果要在软盘上建立一个 Ext2 文件系统,可利用如下的命令:
$ fdformat -n /dev/fd0H1440
Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB.
Formatting ... done
$ badblocks /dev/fd0H1440 1440 > bad-blocks
$ mkfs -t Ext2 -l bad-blocks /dev/fd0H1440
mke2fs 0.5a, 5-Apr-94 for Ext2 FS 0.5, 94/03/10
360 inodes, 1440 blocks
72 blocks (5.00%) reserved for the super user
First data block=1
Block size=1024 (log=0)
Fragment size=1024 (log=0)
1 block group
8192 blocks per group, 8192 fragments per group
360 inodes per group

Writing inode tables: done
Writing superblocks and filesystem accounting information: done
$
上述命令首先利用 fdformat 格式化软盘,然后利用 badblocks 命令检查坏块,并将坏块清单重定向输出到文件 bad_blocks 中。{zh1},利用 mkfs 命令建立文件系统,bad_blocks 文件作为初始的坏块清单。
如果利用 mkfs 命令的 -c 参数,可省略 badblocks 命令。但文件系统建立之后,仍有必要利用 badblocks 命令进行检查。
13.6.3 文件系统的挂装和卸装
通常来讲,文件系统的挂装和卸装只能由超级用户完成。挂装命令 mount 可如下使用:
# mount -t vfat -r /dev/hda5 /mnt/dosd
#

上述命令指定了要挂装的文件系统类型,文件系统所在设备以及挂装点,并将文件系统挂装为只读。如果要在系统启动时自动挂装文件系统,则可以在 /etc/fstab 文件中指定。有关内容可参见 fstab 手册页。
利用 umount 命令卸装文件系统,该命令只需一个参数,即希望卸挂的设备或挂装点:
# umount /mnt/dosd
#

# umount /dev/hda5
#
13.6.4 检查文件系统的完整性
利用 fsck 命令可检查文件系统中存在的错误,如果需要,可强制该命令修改错误。一般而言,文件系统经过了大量严格周密的测试,因此在正常使用情况下不会导致错误,除非因为掉电、硬件失效或操作者的失误而导致文件系统被破坏。
对于系统启动时自动挂装的文件系统,系统会自动进行检测,但是在如下情况下,不进行彻底的文件系统检测:存在 /etc/fastboot 文件;对 Ext2 文件系统,尚未达到{zd0}挂装计数。其他文件系统则需要手工检测,例如软盘。
fsck 只能检查尚未挂装的文件系统,这主要是因为该命令需要以原始方式读写磁盘。
13.6.5 检查磁盘错误
应当周期性地检查磁盘上的坏块。利用 badblocks 命令可完成坏块的检查。badblocks 会报告所有的坏块清单,将该清单传递给 fsck 后,可避免文件系统在坏块上保存数据。badblocks 和 fsck 命令的组合使用方法如下例所示:
$ badblocks /dev/fd0H1440 1440 > bad-blocks
$ fsck -t Ext2 -l bad-blocks /dev/fd0H1440
Parallelizing fsck version 0.5a (5-Apr-94)
e2fsck 0.5a, 5-Apr-94 for Ext2 FS 0.5, 94/03/10
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Check reference counts.
Pass 5: Checking group summary information.

/dev/fd0H1440: ***** FILE SYSTEM WAS MODIFIED *****
/dev/fd0H1440: 11/360 files, 63/1440 blocks
$
13.6.6 碎片化问题
我们提到过,Ext2 文件系统可通过特定的数据块分配方法来避免磁盘的过分碎片化。但是,经常性的文件删除和创建操作不可避免会产生碎片,对 Ext2 文件系统,可利用专用工具进行整理。在 MS-DOS 或 Windows 95 中,有大量工具可用于 FAT 或 VFAT 文件系统的整理。在整理文件系统之前,应当首先备份磁盘上的数据,以免在整理过程中发生不可恢复的错误。
13.6.7 其他文件系统工具
df 命令可列出所有已挂装文件系统中的空闲空间。
sync 命令用于将缓冲区高速缓存中的脏数据块刷新到磁盘上。
对于 Ext2文件系统,还有一些特殊的工具。tune2fs 可调整 Ext2 文件系统的参数,其中包括{zd0}挂装计数、两次检查之间的{zd0}时间间隔、为 root 用户保留的数据块个数等;dumpe2fs 可显示大部分来自 Ext2 文件系统超块的信息;debugfs 是文件系统调试器,可用来直接访问文件系统中的数据;dump 和 restore 分别用于 Ext2 文件系统的备份和还原。
13.6.8 系统调用
表 13-10 简要列出了和文件系统相关的系统调用。标志列中各字母的意义可参见表 10-1 的说明。
    表 13-10 相关系统调用
系统调用 说明 标志
bdflush 将脏缓冲区刷新到磁盘 -c
chdir 改变工作目录 m+c
chmod 修改文件属性 m+c
chown 修改文件所有权 m+c
chroot 设置新的根目录 mc
close 关闭文件 m+c
creat 创建文件 m+c
dup 建立某文件描述符的复本 m+c
dup2 复制某文件描述符 m+c
fchdir 改变工作目录
fchmod 见 chmod mc
fchown 修改文件的所有权 mc
fclose 关闭文件 m+!c
fcntl 文件/描述符控制 m+c
flock 修改文件锁定 m!c
fpathconf 获取文件信息 m+!c
fread 读取二进制文件流数据 m+!c
fstat 获取文件状态 m+c
fstatfs 获取文件系统状态 mc
fsync 将文件高速缓存写入磁盘 mc
ftime 获取自1970.1.1以来的时区+秒数 m!c
ftruncate 修改文件大小 mc
fwrite 向文件流中写入二进制数据 m+!c
getdtablesize 获取文件描述符表的大小 m!c
ioctl 操作某个字符设备 mc
ioperm 设置某个 I/O 端口的许可 m-c
iopl 设置所有I/O 端口的许可 m-c
link 建立已有文件的硬链接 m+c
llseek 大文件的 lseek -
lseek 修改某文件描述符的当前位置指针 m+c
lstat 获取文件状态 mc
mkdir 建立目录 m+c
mknod 建立设备 mc
modify_ldt 读取或写入局部描述符表 -
mount 挂装一个文件系统 mc
open 打开一个文件 m+c
pathconf 获取文件的相关信息 m+!c
read 从文件中读取数据 m+c
readv 从文件中读取数据块 m!c
readdir 读取目录 m+c
readlink 获取符号链接的内容 mc
rename 移动/重命名文件 m+c
rmdir 删除某个空目录 m+c
select 进程休眠,直到某个文件描述符上有操作为止。 mc
setfsgid 设置文件系统的组标识符
setfsuid 设置文件系统的用户标识符
setup 初始化设备并安装 root -
stat 获取文件状态 m+c
statfs 获取文件系统状态 mc
symlink 建立文件的符号链接 m+c
sync 内存和磁盘缓冲区之间的同步 mc
sysfs 获取已配置的文件系统信息
truncate 修改文件大小 mc
ulimit 获取/设置文件限制 c!
umask 设置文件的建立掩码 m+c
umount 卸挂文件系统 mc
unlink 空闲时删除文件 m+c
utime 修改索引节点的时间项 m+c
write 向文件写入数据 m+c
writev 向文件写入数据块 m!c



郑重声明:资讯 【linux文件系统3:缓冲区高速缓存_茅坑_百度空间】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——