Unix文件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
av_back
空闲buf队列: Buf1
Buf2
Bufn
NODEV设备buf队列:
b_back
Buf1
Buf2
Bufn
读操作
所谓读操作就是将所需的字符块从指定 的设备上读入缓冲区,并传送到用户指 定的内存区 若该字符块已被读到某个缓冲区中,则 不需对物理设备进行读操作,只是将这 个缓区的信息传到指定的内存区。
安装文件系统要用到Mount命令。 文件系统的拆卸用Umount命令。
3 UNIX文件系统的索引结构
在 UNIX 索引节点中,有一个 di_addr[40] 数组, 这个数组就是一个索引表。 在这个40个字节的数组中,只用了39个字节, 分为13组(项),每项3个字节,记录一个块号, 所以一个文件系统的数据区最多有2^24个块。 设计为40个字节是为了让索引节点的大小刚好 为 64 字节,那么,一个块就能放整数个索引节 点。
块较大时,磁盘与内存之间的传输效率 将会提高。因为每寻道一次可以读取几 个扇区,从而减少寻道时间。但块较大 时,可能造成浪费。有人做过统计,当 块大小为4K时,一个实用的系统中存储 空间浪费可达45%。后来Berkeley把文 件后面的那些零头数据集中起来用某些 磁盘块存放,以减少零头造成的浪费, 实践证明,这种方法很有效。
2.4 数据区
引导块、超级块、索引节点表都是文件 系统用于管理的数据,文件的实际数据 都存放在数据区。 还有另外的一些管理用数据也放在数据 区,如文件目录表,文件索引表中的一 次、二次、三次间接块等。
在一个文件系统中,有两个参数非常关键:索 引节点表的大小、块的大小。 索引节点表的大小决定了整个文件能创建的文 件数目,因为索引节点表的每一个表目唯一地 对应一个文件。索引节点表过小,文件系统只 能创建有限的文件,可能导致数据区大量磁盘 块的浪费;而索引节点表过大,可能造成索引 节点表本身的浪费。
1.3 设备buf队列
每类块设备都有一个设备buf队列,这也 是一个双向队列
b_back
Buf1
Buf2
b_forw
Bufn
b_back
Buf1
Buf2
Bufn
1.4 缓冲区的管理
系统设置了一个特殊的设备NODEV 在系统初启时,所有空闲缓冲区的 buf 既在空 闲buf队列,又在NODEV设备的buf队列中。
2.2 超级块
该部分对文件系统具有决定意义。该结构用C语言描述如下: struct filsys { ushort s_isize; 磁盘索引节点表所占磁盘块数 daddr_r s_fsize; 整个文件系统的磁盘块数 short s_nfree; 空闲块表中的空闲块数 daddr_t s_free[100]; 空闲块表 short s_ninode; 空闲索引节点表中的空闲索引节点数 ino_t s_inode[100]; 空闲索引节点表 char s_flock; 处理空闲块表时加锁标志 char s_ilock; 处理空闲索引节点表时加锁标志
char s_fmod; 超级块被修改标志 char s_ronly; time_t s_time; 超级块上次被修改时间 short s_dinfo[4]; daddr_t s_tfree; 空闲磁盘块总数 ino_t s_tinode; 空闲索引节点总数 char s_fname[6]; 文件系统名称 char s_fpack[6]; long s_fill[13]; long s_magic; long s_type; 文件系统类型 }; 超级块在文件系统安装后常驻内存
写操作
写是指把某个内存区的信息传到缓冲区, 然后把缓冲区的信息写到指定的物理设 备去。 但当一次写操作未写满缓冲区时(小于 512字节),就采用延迟写,即不急于写 到设备去,而是把这个缓冲区的标志位 置上延迟写的标志,表示具体写操作延 迟到以后的某个时该进行。
缓冲区的分配
当读写某设备块时,系统会分配一个缓冲区 系统从自由buf队列队首取出一个空闲的buf。 将buf的标志位b_flag置为“忙” 将buf的b_dev和b_blkno设为对应的设备号和块号
在实际系统中,为了方便对大容量的磁盘进行 管理,通常将其分了几个逻辑部分,每一部分 可能建一个文件系统 同时,软盘、光盘、磁带等都有它们自己的文 件系统。 用户在这众多的文件系统中找某一文件可能是 比较费时的 在UNIX中,可将一个文件系统安装到另一个文 件系统的某一子目录上,这时前一个文件系统 就成了后一个文件系统的子目录,用户看到的 只有一个文件系统。
1.6 小结
为了使刚释放的缓冲区尽可能长地保留原来的 使用信息,每次释放缓冲区时总是将其buf 插 入到自由buf队列的队尾。 分配缓冲区时,总是从自由buf队列队首抽出 一个空闲的buf。 当有再次使用某缓冲区的需要时,就立即将该 缓冲区对应的buf从自由buf队列中抽出,使完 后释放该缓冲区,又将其buf插入到自由buf队 尾。这就保证了所有自由缓冲区中,被重分配 的是最久未使用的,精确地实现了LRU 算法。
ADDR[1l] ,即第 12 个表目登记的是二次 间接索引表的块号,二次间接索引表存 放一次间接索引块的块号。 ADDR[12],即第13个表目登记的是三次 间接索引表的块号,三次间接索引表中 存放二次间接索引表的块号。
例1
有一文件大小为16K,设一个物理块的 大小为1K,为了计算方便,设索引块中 的一个表项占2个字节,试画出文件索 引结构图。
Buf主要包括以下信息
b_addr:缓冲区内存地址 b_dev : 缓冲区对应的设备信息:高字节表示 设备类号,低字节表示同类设备的编号 b_blkno:缓冲区对应的物理块号 b_forw, b_back和av_forw,av_back:链指针, 用于连接两个双向队列。 b_flags:标志信息,反映缓冲区的使用情况。
情况分析
用户读写一个磁盘块时,系统试图分配一 个缓冲区,这时可能出现以下五种情况。 (1) 该块已在缓冲区中,且缓冲区标志 为空闲。 原因:该块以前曾访问过。 处理办法:从自由队列上取下该缓冲区并 置“忙”标志。
(2) 该块已在缓冲区中,缓冲区标志为 忙。 原因:该块正在被其它进程使用。 处理办法:请求该块的进程进入睡眠,待 缓冲区用完后再被唤醒。
这样做的好处是:
(1) 在自由 buf 队列中的缓冲区,只要未作 重新分配使用,其内容不会改变。因此 若再次使用这个缓冲区的信息,只是简 单地从自由 buf 队列中抽出相应的 buf , 仍按原状使用缓冲区中的信息,从而减 少了对设备的物理 I/O 操作,提高了 I/O 操作的速度。
(2)若将一个缓冲区移作它用时,则只需从 自由buf队列和原设备buf队列中抽出, 插入到设备buf队列。这就实现了对缓冲 区的共享。
2.5目录结构
每一目录项占16字节,其C描述如下: struct direct { ino_t d_ino; 该目录项对应的索引节点号 char d_name[14]; 该目录项对应的文件的名称 };
在UNIX中,所有目录包括根目录都是象普通文件一样 在数据区存放。
2.6 文件系统的安装和拆卸
2 UNIX文件系统的总体结构
UNIX 系统把物理设备划分为长 512
字节的盘块。每一块给一编号,从0 到N-1,共N块。如下图
引导块
超级块
索引节点表
数据区 …..
其中引导块和超级块都为1个扇区。
2.1 引导块
位于文件系统的第一个扇区,包含 OS的引导程序,但并不是每一个文 件系统都需要引导块。
索引表
ADDR[0] ADDR[1]
文件第 1 块 . . . 文件第 10 块
文件第 11 块 . . . 文件第 16 块
。。。
。。。
ADDR[9] ADDR[10] ADDR[11] ADDR[12]
索引节点的C描述
struct dinode { ushort di_mode; short di_nlink; ushort di_uid; ushort di_gid; off_t di_size; char di_addr[40]; time_t di_atime; time_t di_mtime; time_t di_ctime; }; 文件类型及访问权限标志 文件链接数 文件拥有者用户标识 文件拥有者的组标识 文件大小 文件索引表 文件最近一次访问时间 文件最近一次访问时间 文件创建时间
av_back
空闲buf队列:
Buf1
NODEV设备buf队列:
Buf2
b_back
Bufn
Buf1
Buf2Bufn来自因为buf同时存在于某个设备buf队列中(若 不是在一台具体设备的buf队列中,则必然是 在特殊设备NODEV的buf队列中),这时要从 原设备的buf队列中取出这个buf,将其插入 申请该缓冲区的设备buf队列中。 所以,当一个缓冲区刚被分配用于读、写某 块设备时,它的b_flag标志位被置为"忙",它 一定位于对应的设备buf队列中,而不在自由 buf队列中。
UNIX文件子系统
UNIX缓冲池管理 UNIX文件系统的总体结构 UNIX文件系统的索引结构 UNIX文件的访问过程 管道文件的实现
1 UNIX缓冲池管理
1.1 缓冲控制块buf 在 UNIX 缓冲池中包含若干大小相等的缓冲区, 每个缓冲区的大小均等于磁盘块的大小。
系统为每个缓冲区设置一个缓冲控制块 buf , 用来登记相应缓冲区的使用和管理等方面的信 息。 系统通过对 buf 的管理来达到管理缓冲区的目 的。
索引表有13个表目(用ADDR[0]—ADDR[12] 表示)。 ADDR[O] 至 ADDR[9] ,即前 10 个表目直接 存放文件数据块的块号。 如 果 文 件 的 长 度 超 过 10 个 数 据 块 , ADDR[10] ,即第 11 个表目登记的是一次 间接索引表的块号,在一次间接索引表 中存放文件数据块的块号。
缓冲区的释放
当一个读写操作完成后,就要求立即释放所 占用的缓冲区,把这个缓冲区的buf的标志置 为空闲,并加入自由buf队列的队尾,表示它 可以被考虑移作它用。 同时这个buf仍留在原设备buf队列中。 也就是说一个缓冲区的buf处于空闲状态时, 总是同时存在于两个队列中,一个是自由buf 队列,二是使用过该缓冲区的设备buf队列。
(5) 该块不在缓冲区中,自由队列 为空 原因:所有缓冲区正在被使用。 处理办法:本进程睡眠。释放缓冲区 时将其唤醒。
1.5 UNIX缓冲区管理的优点
UNIX 缓冲区管理得法实现了极为精确的 最久未使用算法(LRU)。 该算法中,一个空闲缓冲区既留在原设 备的 buf 队列中,又同时留在自由 buf 队 列中
2.3 索引节点表
UNIX将文件名与目录项中的其它信息分开来, 仅将文件名留在目录项中,而将其它部分称为 索引结点. 将所有从目录项中分出的索引结点集中到一起 构成一张索引结点表,并给索引结点表中的每 一个索引结点编一个号,将这一编号加入目录 项。 于是目录项中仅有两项内容:文件名、索引结 文件名 索引结点号 点编号。
(3) 该块不在缓冲区中 原因:该块没有被访问过或很久以前访问 过但该缓冲区被淘汰。 处理办法:从自由队列首取下一个缓冲区, 置忙标志。同时从其它设备队列中将其 取下。
(4) 该块不在缓冲区中,自由队列队首 缓冲区有延迟写标志。 原因:自由队列队首缓冲区中的信息没有 写到磁盘上。 处理办法:将该缓冲区写向磁盘,同时试 图分配另一个缓冲区。
1.2 自由buf队列
系统把空闲缓冲区对应的buf组成空闲buf队列, 也称为自由buf队列。 这个队列是双向循环链表结构。
av_back
Buf1
Buf2
av_forw
Bufn
为了讨论问题方便, 我们把这个双向循环链表简化为单链表
av_back
Buf1
Buf2
Bufn
对自由buf队列采用先进先出的管理方案 回收一个缓冲区时,将其插入队尾 分配缓冲区时,总是从队首摘取一个缓 冲区分配给申请者。
空闲buf队列: Buf1
Buf2
Bufn
NODEV设备buf队列:
b_back
Buf1
Buf2
Bufn
读操作
所谓读操作就是将所需的字符块从指定 的设备上读入缓冲区,并传送到用户指 定的内存区 若该字符块已被读到某个缓冲区中,则 不需对物理设备进行读操作,只是将这 个缓区的信息传到指定的内存区。
安装文件系统要用到Mount命令。 文件系统的拆卸用Umount命令。
3 UNIX文件系统的索引结构
在 UNIX 索引节点中,有一个 di_addr[40] 数组, 这个数组就是一个索引表。 在这个40个字节的数组中,只用了39个字节, 分为13组(项),每项3个字节,记录一个块号, 所以一个文件系统的数据区最多有2^24个块。 设计为40个字节是为了让索引节点的大小刚好 为 64 字节,那么,一个块就能放整数个索引节 点。
块较大时,磁盘与内存之间的传输效率 将会提高。因为每寻道一次可以读取几 个扇区,从而减少寻道时间。但块较大 时,可能造成浪费。有人做过统计,当 块大小为4K时,一个实用的系统中存储 空间浪费可达45%。后来Berkeley把文 件后面的那些零头数据集中起来用某些 磁盘块存放,以减少零头造成的浪费, 实践证明,这种方法很有效。
2.4 数据区
引导块、超级块、索引节点表都是文件 系统用于管理的数据,文件的实际数据 都存放在数据区。 还有另外的一些管理用数据也放在数据 区,如文件目录表,文件索引表中的一 次、二次、三次间接块等。
在一个文件系统中,有两个参数非常关键:索 引节点表的大小、块的大小。 索引节点表的大小决定了整个文件能创建的文 件数目,因为索引节点表的每一个表目唯一地 对应一个文件。索引节点表过小,文件系统只 能创建有限的文件,可能导致数据区大量磁盘 块的浪费;而索引节点表过大,可能造成索引 节点表本身的浪费。
1.3 设备buf队列
每类块设备都有一个设备buf队列,这也 是一个双向队列
b_back
Buf1
Buf2
b_forw
Bufn
b_back
Buf1
Buf2
Bufn
1.4 缓冲区的管理
系统设置了一个特殊的设备NODEV 在系统初启时,所有空闲缓冲区的 buf 既在空 闲buf队列,又在NODEV设备的buf队列中。
2.2 超级块
该部分对文件系统具有决定意义。该结构用C语言描述如下: struct filsys { ushort s_isize; 磁盘索引节点表所占磁盘块数 daddr_r s_fsize; 整个文件系统的磁盘块数 short s_nfree; 空闲块表中的空闲块数 daddr_t s_free[100]; 空闲块表 short s_ninode; 空闲索引节点表中的空闲索引节点数 ino_t s_inode[100]; 空闲索引节点表 char s_flock; 处理空闲块表时加锁标志 char s_ilock; 处理空闲索引节点表时加锁标志
char s_fmod; 超级块被修改标志 char s_ronly; time_t s_time; 超级块上次被修改时间 short s_dinfo[4]; daddr_t s_tfree; 空闲磁盘块总数 ino_t s_tinode; 空闲索引节点总数 char s_fname[6]; 文件系统名称 char s_fpack[6]; long s_fill[13]; long s_magic; long s_type; 文件系统类型 }; 超级块在文件系统安装后常驻内存
写操作
写是指把某个内存区的信息传到缓冲区, 然后把缓冲区的信息写到指定的物理设 备去。 但当一次写操作未写满缓冲区时(小于 512字节),就采用延迟写,即不急于写 到设备去,而是把这个缓冲区的标志位 置上延迟写的标志,表示具体写操作延 迟到以后的某个时该进行。
缓冲区的分配
当读写某设备块时,系统会分配一个缓冲区 系统从自由buf队列队首取出一个空闲的buf。 将buf的标志位b_flag置为“忙” 将buf的b_dev和b_blkno设为对应的设备号和块号
在实际系统中,为了方便对大容量的磁盘进行 管理,通常将其分了几个逻辑部分,每一部分 可能建一个文件系统 同时,软盘、光盘、磁带等都有它们自己的文 件系统。 用户在这众多的文件系统中找某一文件可能是 比较费时的 在UNIX中,可将一个文件系统安装到另一个文 件系统的某一子目录上,这时前一个文件系统 就成了后一个文件系统的子目录,用户看到的 只有一个文件系统。
1.6 小结
为了使刚释放的缓冲区尽可能长地保留原来的 使用信息,每次释放缓冲区时总是将其buf 插 入到自由buf队列的队尾。 分配缓冲区时,总是从自由buf队列队首抽出 一个空闲的buf。 当有再次使用某缓冲区的需要时,就立即将该 缓冲区对应的buf从自由buf队列中抽出,使完 后释放该缓冲区,又将其buf插入到自由buf队 尾。这就保证了所有自由缓冲区中,被重分配 的是最久未使用的,精确地实现了LRU 算法。
ADDR[1l] ,即第 12 个表目登记的是二次 间接索引表的块号,二次间接索引表存 放一次间接索引块的块号。 ADDR[12],即第13个表目登记的是三次 间接索引表的块号,三次间接索引表中 存放二次间接索引表的块号。
例1
有一文件大小为16K,设一个物理块的 大小为1K,为了计算方便,设索引块中 的一个表项占2个字节,试画出文件索 引结构图。
Buf主要包括以下信息
b_addr:缓冲区内存地址 b_dev : 缓冲区对应的设备信息:高字节表示 设备类号,低字节表示同类设备的编号 b_blkno:缓冲区对应的物理块号 b_forw, b_back和av_forw,av_back:链指针, 用于连接两个双向队列。 b_flags:标志信息,反映缓冲区的使用情况。
情况分析
用户读写一个磁盘块时,系统试图分配一 个缓冲区,这时可能出现以下五种情况。 (1) 该块已在缓冲区中,且缓冲区标志 为空闲。 原因:该块以前曾访问过。 处理办法:从自由队列上取下该缓冲区并 置“忙”标志。
(2) 该块已在缓冲区中,缓冲区标志为 忙。 原因:该块正在被其它进程使用。 处理办法:请求该块的进程进入睡眠,待 缓冲区用完后再被唤醒。
这样做的好处是:
(1) 在自由 buf 队列中的缓冲区,只要未作 重新分配使用,其内容不会改变。因此 若再次使用这个缓冲区的信息,只是简 单地从自由 buf 队列中抽出相应的 buf , 仍按原状使用缓冲区中的信息,从而减 少了对设备的物理 I/O 操作,提高了 I/O 操作的速度。
(2)若将一个缓冲区移作它用时,则只需从 自由buf队列和原设备buf队列中抽出, 插入到设备buf队列。这就实现了对缓冲 区的共享。
2.5目录结构
每一目录项占16字节,其C描述如下: struct direct { ino_t d_ino; 该目录项对应的索引节点号 char d_name[14]; 该目录项对应的文件的名称 };
在UNIX中,所有目录包括根目录都是象普通文件一样 在数据区存放。
2.6 文件系统的安装和拆卸
2 UNIX文件系统的总体结构
UNIX 系统把物理设备划分为长 512
字节的盘块。每一块给一编号,从0 到N-1,共N块。如下图
引导块
超级块
索引节点表
数据区 …..
其中引导块和超级块都为1个扇区。
2.1 引导块
位于文件系统的第一个扇区,包含 OS的引导程序,但并不是每一个文 件系统都需要引导块。
索引表
ADDR[0] ADDR[1]
文件第 1 块 . . . 文件第 10 块
文件第 11 块 . . . 文件第 16 块
。。。
。。。
ADDR[9] ADDR[10] ADDR[11] ADDR[12]
索引节点的C描述
struct dinode { ushort di_mode; short di_nlink; ushort di_uid; ushort di_gid; off_t di_size; char di_addr[40]; time_t di_atime; time_t di_mtime; time_t di_ctime; }; 文件类型及访问权限标志 文件链接数 文件拥有者用户标识 文件拥有者的组标识 文件大小 文件索引表 文件最近一次访问时间 文件最近一次访问时间 文件创建时间
av_back
空闲buf队列:
Buf1
NODEV设备buf队列:
Buf2
b_back
Bufn
Buf1
Buf2Bufn来自因为buf同时存在于某个设备buf队列中(若 不是在一台具体设备的buf队列中,则必然是 在特殊设备NODEV的buf队列中),这时要从 原设备的buf队列中取出这个buf,将其插入 申请该缓冲区的设备buf队列中。 所以,当一个缓冲区刚被分配用于读、写某 块设备时,它的b_flag标志位被置为"忙",它 一定位于对应的设备buf队列中,而不在自由 buf队列中。
UNIX文件子系统
UNIX缓冲池管理 UNIX文件系统的总体结构 UNIX文件系统的索引结构 UNIX文件的访问过程 管道文件的实现
1 UNIX缓冲池管理
1.1 缓冲控制块buf 在 UNIX 缓冲池中包含若干大小相等的缓冲区, 每个缓冲区的大小均等于磁盘块的大小。
系统为每个缓冲区设置一个缓冲控制块 buf , 用来登记相应缓冲区的使用和管理等方面的信 息。 系统通过对 buf 的管理来达到管理缓冲区的目 的。
索引表有13个表目(用ADDR[0]—ADDR[12] 表示)。 ADDR[O] 至 ADDR[9] ,即前 10 个表目直接 存放文件数据块的块号。 如 果 文 件 的 长 度 超 过 10 个 数 据 块 , ADDR[10] ,即第 11 个表目登记的是一次 间接索引表的块号,在一次间接索引表 中存放文件数据块的块号。
缓冲区的释放
当一个读写操作完成后,就要求立即释放所 占用的缓冲区,把这个缓冲区的buf的标志置 为空闲,并加入自由buf队列的队尾,表示它 可以被考虑移作它用。 同时这个buf仍留在原设备buf队列中。 也就是说一个缓冲区的buf处于空闲状态时, 总是同时存在于两个队列中,一个是自由buf 队列,二是使用过该缓冲区的设备buf队列。
(5) 该块不在缓冲区中,自由队列 为空 原因:所有缓冲区正在被使用。 处理办法:本进程睡眠。释放缓冲区 时将其唤醒。
1.5 UNIX缓冲区管理的优点
UNIX 缓冲区管理得法实现了极为精确的 最久未使用算法(LRU)。 该算法中,一个空闲缓冲区既留在原设 备的 buf 队列中,又同时留在自由 buf 队 列中
2.3 索引节点表
UNIX将文件名与目录项中的其它信息分开来, 仅将文件名留在目录项中,而将其它部分称为 索引结点. 将所有从目录项中分出的索引结点集中到一起 构成一张索引结点表,并给索引结点表中的每 一个索引结点编一个号,将这一编号加入目录 项。 于是目录项中仅有两项内容:文件名、索引结 文件名 索引结点号 点编号。
(3) 该块不在缓冲区中 原因:该块没有被访问过或很久以前访问 过但该缓冲区被淘汰。 处理办法:从自由队列首取下一个缓冲区, 置忙标志。同时从其它设备队列中将其 取下。
(4) 该块不在缓冲区中,自由队列队首 缓冲区有延迟写标志。 原因:自由队列队首缓冲区中的信息没有 写到磁盘上。 处理办法:将该缓冲区写向磁盘,同时试 图分配另一个缓冲区。
1.2 自由buf队列
系统把空闲缓冲区对应的buf组成空闲buf队列, 也称为自由buf队列。 这个队列是双向循环链表结构。
av_back
Buf1
Buf2
av_forw
Bufn
为了讨论问题方便, 我们把这个双向循环链表简化为单链表
av_back
Buf1
Buf2
Bufn
对自由buf队列采用先进先出的管理方案 回收一个缓冲区时,将其插入队尾 分配缓冲区时,总是从队首摘取一个缓 冲区分配给申请者。