您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 第6章Unix文件管理
5.9.3UNIX的文件系统•改进的多级文件目录,可以建立文件别名(索引结点方式和符号链接方式),有用户访问权限控制(文件的读R、写W和执行X,相应于目录的检索文件、增删文件和进入目录)–注意:如果对文件具有写权限,而对文件所在目录没有写权限,仍然可以改变该文件的长度(如添加数据),因为除文件名外的其他文件目录内容都存放在索引结点而不是在目录文件。•文件类型:常规文件(ordinaryfile)、目录文件(directory)、特殊文件(specialfile)如外设、先进先出文件(FIFO)如命名管道;返回1.概述2.磁盘文件卷结构•超级块:描述文件系统的状态,包括磁盘空闲块栈,空闲i结点栈•i节点(inodelist):存放文件说明信息,每项64字节•目录文件:每个目录项16字节。文件名区分大小写。•文件分配:直接索引,一级、二级、三级间接索引inodeTableData(File&Directory)BootRecordVolumeStructureinUNIXSector#01SuperBlock3.空闲i结点的分配和释放•每次从磁盘上寻找一批空闲i结点,把它们的编号记录在内存的空闲i结点栈中。其中“铭记”i结点(rememberedinode)是栈中编号最大的i结点。•i结点分配时,移出栈顶的i结点。若到达铭记i结点则表示栈已空,需要从磁盘上重新寻找。(铭记i结点在栈底)652...freeinodes01571566empty4922indexrememberedinodeassigninodefreeinodeInodeListinSuperBlock•structinode{•structinode*i_forw;/*内存I节点的散列队列双向循环勾连指针*/•structinode*i_back;•chari_flag;/*状态标志*/•cnt_ti_count;/*引用计数,表示该文件打开了几次*/•dev_ti_dev;/*文件所在设备号*/•inti_number;/*对应外存i节点号*/•struct{•union{•daddr_ti_a[13];/*文件索引表,存放文件的物理盘块号*/•shorti_f[26];/*管道文件的地址索引表*/•}i_p;•daddr_ti_l;/*最近一次读入的文件逻辑块,用于预读*/•}i_blk;•…•}inode[NINODE];•内存I节点数NINODE一般为100。3.内存文件控制块外索引节点•每个文件有一个存放在磁盘索引节点区的索引节点,称为磁盘索引节点,它包括以下内容:structinode{ushortdi_mode;/*文件控制模式*/shortdi_nlink;/*文件的链接数*/ushortdi_uid;/*文件主用户标识*/ushortdi_gid;/*文件主用户标识*/off_tdi_size;/*文件长度,以字节为单位*/chardi_addr[40];/*地址索引表,存放文件的盘块号*/time_tdi_atime;/*文件最近一次访问时间*/time_tdi_mtime;/*文件最近一次修改时间*/time_tdi_ctime;/*文件最近一次创建时间*/};•2.系统打开文件表一个文件可以被同一进程或不同进程,用同一或不同路径名,相同或不同的打开方式(读、写)同时打开。系统打开文件表structfile{unsignedshortf_flags;/*文件操作标志*/unsignedshortf_count;/*共享该结构体的计数值*/structinode*f_inode;/*指向文件对应的内存inode*/loff_tf_pos;/*文件的当前读写位置*/};3.空闲i结点的分配和释放4.磁盘空闲块的分配和释放•采用成组链接法,把链表和索引相结合。每一组50块,用索引表表示;各组间通过链表指针串在一起,构成链表。链表的开头是超级块中的磁盘空闲块栈,在运行时被读入到内存中。栈计数count是栈中的空闲块数目,栈中的元素是空闲块编号。链表中的每一块都存放一个类似的空闲块栈•分配过程:查看超级块中是否count==1;若不是,则弹出栈顶元素N,--count;若是,则弹出栈顶元素N,把空闲块N中的栈(包括栈计数)读入到超级块中;返回空闲块编号N•释放过程:被释放空闲块为编号N。查看超级块中是否栈已满(如count==50);若不是,则N入栈,++count;若是,则将超级块中的栈(包括栈计数)写入到空闲块N,然后把N放入超级块中的栈顶并置count为1。4.磁盘空闲块的分配和释放41350187SuperBlockcount50040400351......049count50450401...049count460......045count#350#400LastOne...成组链接4.磁盘空闲块的分配和释放成组链接法Unix对空闲块的管理借助卷资源表,在卷资源表中用于空闲块管理的项目是:s_nfree(相当于前面的count):登记空闲盘块的数目,最多100个。s_free[100]:登记空闲盘块的物理块号假定某个磁盘开始使用时,盘块共有449块(不包括0#块),索引结点表inode_list区占用10块,专用块占用1块,实际上文件所占用的空间是449-10-1=438块,这438块是可以这样分组的:第一组351~449共99块第二组251~350共100块第三组151~250共100块苇四组51~150共l00块第五组12~50共39块即从后面块向前分组,每组100块,但第一组为99块,最后的第五组不足100块,也成一组。第一组的空闲盘块的物理块号及块数登记在第二组的第一块中,第二组的空闲盘块物号及块数登记在第三组的第一块成组链接法成组链接法中;……;第四组的物理块号及块数登记在第五组的第一块中。最后一组,即第五组的空闲盘块物理块号及块数登记在卷资源表中,如下图1所示。要特别注意的是第二组的第一块(350#)中的s_free=100,而s_free[0]=0,它作为一个标志,标识整个存储空间再也没有空闲块了,即449#作为最后一个空闲块。成组链接法S_nfree:395049…...10012150[0][1][38]149…...5150#49#12#…….100250249…...151150#149#51#…….100350349…...251250#249#151#…….1000449…...351350#349#251#…….449#351#…….成组链接法(2)空闲盘块的分配。开始的卷资源表如下图(a)所示。如果某一个文件要求申请一个空闲块,将s_nfree-1=38s_free[38]即12#号块分配给申请者。如果还要申请,则继续。经过若干次申请后s_nfree=2,如图(b)所示。如果此时一个文件要申请4块,则首先可以得到s_free[0](即50#)分配给申请者,而是先将50#块中的内容读出,把50#块中的总块数成组链接法100赋给卷资源表的s_nfree,而把对应的100个物理块号复制到数组s_free[]中,如图(c)所示,然后再把50块分配给申请者,最后再将51#、52#块分配给申请者。如下图(d)所示。成组链接法S_nfree:395049…...12[0][1][38]S_nfree:25049[0][1]S_nfree:100150149…...12[0][1][99]S_nfree:98150149…...53[0][1][97](a)(b)(c)(d)成组链接法(3)空闲盘块的释放。假定有一个文件占用了三个物理块,块号吻别是180#,181#,182#。如果当时的卷资源表的状态如下图(a)所示。首先填写182#到s_nfree[65]中,然后s_nfree+1=66,同理释放181#,180#块,最后卷资源表的状况如图(b)所示。成组链接法S_nfree:65…...286[0][1][64]S_nfree:68180[0][1](a)(b)…...286182181[64][65][66][67]成组链接法卷资源表的状况如下图(a)所示。如果有一个文件释放所要占用的4块,块号分别为190#,185#,184#,170#,则首先有2块的块号170#,184#登记在卷资源表中,其状态如下图(b)所示。此时s_free=100,表示内存中登记的空闲块已经满。下面还要释放185#、190#,则系统把当前卷资源表中的空闲块数100连同100个登记项,写到1853块中,然后将s_nfree清0,再将185#、190#填入到卷资源表中,如图(c)所示。成组链接法S_nfree:98300250…...200[0][1][97]S_nfree:100300250170[0][1](a)(b)…...200184[97][98]S_nfree:2185190[0][1](c)…...[99]6.打开文件管理...5...9UserFileDescriptorsFileTable500...8...60ProcessAProcessCOffset78dup()...5...90ProcessB823193r25609rwCountRead/WriteMode./file1FileSizeInodeTable81234Countfork()•内存i结点表:空闲的内存i结点-组织成链表;占用的内存i结点-哈希表(对冲突采用链表方式解决)•进程所进入的目录:包括各个打开文件的目录路径,以及进程的当前目录–进入一个目录,如果该目录文件的内存i结点已经存在,则只需把内存i结点的引用计数加1,否则读入该目录文件的磁盘i结点并建立内存i结点。–系统起动之后,进入根目录并建立相应内存i结点,直到系统关闭–退出目录:如关闭文件或修改当前目录6.打开文件管理7.文件共享多用户基于索引节点的共享,或利用符号链接共享同一个文件。1.基于索引节点的共享方式(1)静态共享通过索引节点(inode)来实现文件共享链接的,并且只允许链接到文件,不允许链接到目录。文件链接的系统调用形式如下:link(oldnamep,newnamep);例6-9:若系统中进程A、进程B打开同一个文件,其中,进程A以“读”的方式打开文件的描述符为fp1,进程B以“写”的方式打开文件的描述符为fp3。7.文件共享7.文件共享•例6-10:若系统中进程A以“读”的方式打开了一个文件,文件的描述符为fp1;然后进程A创建了子进程B,子进程B继承了进程A有关属性。link(/usr/wangyp/myfile1.c,/usr/quanyinin/myfile1.c);link(/usr/wangyp/myfile1.c,/usr/fangmin/testfile.c);link(/usr/wangyp/myfile1.c,/usr/wangchs/yourfile.c);执行上述命令后路径名/usr/wangyp/myfile1.c、/usr/quanyinin/myfile1.c、/usr/fangmin/testfile.c和/usr/wangchs/yourfile.c指向的是同一个文件7.文件共享7.文件共享•例6-11:P1进程执行如下代码:fd1=open(″/etc/test″,o_RDONLY);/*以只读方式打开*/fd2=open(″pocal″,o_WRONLY);/*以写方式打开*/P1进程创建的子进程P2执行如下代码:fd3=open(″/etc/testexa″,o_RDONLY);/*只读方式打开*/P3进程执行如下代码:fd1=open(″/etc/test″,o_RDWR);/*以读写方式打开*/7.文件共享
本文标题:第6章Unix文件管理
链接地址:https://www.777doc.com/doc-3970668 .html