模拟实现单级目录、单级索引的索引文件系统

合集下载

计算机操作系统文件系统基础知识了解文件系统的基本概念和组织方式

计算机操作系统文件系统基础知识了解文件系统的基本概念和组织方式

计算机操作系统文件系统基础知识了解文件系统的基本概念和组织方式计算机操作系统中的文件系统是管理计算机存储设备上数据的一种组织方式。

它负责文件的存储、访问和管理,是操作系统中非常重要的一部分。

本文将介绍文件系统的基本概念和组织方式。

一、文件系统的基本概念文件系统是操作系统中的一个模块,它提供了一种机制来访问和组织计算机存储器中的文件。

文件系统通过使用文件名和文件目录来组织和管理文件。

1. 文件文件是计算机存储设备中存储的最基本的信息单元。

文件可以包含文本、图像、音频、视频等各种类型的数据。

在文件系统中,文件通过唯一的文件名进行标识,用户可以通过文件名来访问文件。

2. 文件名文件名是文件系统中用来标识文件的字符串。

文件名一般由文件的逻辑名和扩展名组成,如“document.txt”。

文件名的组成方式和长度限制根据不同的文件系统而有所不同。

3. 文件目录文件目录是文件系统中用来组织和管理文件的一种方式。

文件目录是一个层次结构,它由多个目录和文件组成。

通过文件目录,用户可以方便地查找和管理文件。

4. 文件路径文件路径是指文件在文件系统中的位置。

文件路径由目录名和文件名组成,以斜杠或反斜杠分隔各个部分。

例如,“/home/user/document.txt”是一个文件的路径。

二、文件系统的组织方式文件系统的组织方式决定了文件在存储设备上的物理位置以及文件间的关系。

常见的文件系统组织方式有顺序文件系统、索引文件系统和树形文件系统等。

1. 顺序文件系统顺序文件系统是指文件在存储设备上按照顺序存放的一种组织方式。

文件按照创建的顺序存放在磁盘上,需要顺序扫描才能找到对应的文件。

顺序文件系统的优点是存取速度较快,但是删除和插入操作比较困难。

2. 索引文件系统索引文件系统是指为每个文件建立一个索引表,通过索引表来管理和访问文件的一种组织方式。

索引表中记录了文件的物理位置信息,用户可以通过索引表进行文件的定位和访问。

索引文件系统的优点是查找速度较快,但是需要额外的空间来存储索引表。

文件系统管理阶段的特征

文件系统管理阶段的特征

文件系统管理阶段的特征1.引言1.1 概述文件系统是计算机操作系统中的一个重要组成部分,负责管理和组织计算机的文件和目录。

文件系统管理阶段可以理解为对文件系统的不同方面进行管理和操作的阶段。

文件系统管理涉及到物理存储管理、文件目录管理以及文件访问与权限管理等各个方面。

在物理存储管理阶段,主要考虑如何进行存储资源的分配和管理。

文件目录管理阶段则关注如何组织和管理文件和目录的结构。

文件访问与权限管理阶段旨在保护文件的安全性,确保只有授权用户可以进行访问和操作。

在物理存储管理方面,我们需要考虑存储的分配和空间的管理。

存储的分配方式可以分为连续分配、链接分配和索引分配。

连续分配方式将文件连续地存储在存储介质上,链接分配方式则通过链接的方式将文件的不同部分组合在一起,索引分配方式则使用索引表进行存储位置的管理。

另外,还需要考虑如何管理和分配存储空间,一种常见的方式是使用位图法和空闲链表法进行空间的管理。

文件目录管理方面主要关注文件和目录的组织和管理。

单级目录结构将所有的文件和目录都放置在一个层次上,多级目录结构则通过层次结构的方式进行组织,树状目录结构则使用树的方式进行管理,而图状目录结构则使用图的方式进行管理。

每种目录结构都有其优点和缺点,根据实际需求选择合适的目录结构。

文件访问与权限管理是保护文件和信息安全的关键环节。

用户身份验证可以确保只有合法的用户可以进行访问和操作,文件权限控制则可以控制各个用户对文件的访问权限。

这些机制可以帮助保护个人和敏感信息的安全性。

综上所述,文件系统管理阶段涉及到物理存储管理、文件目录管理以及文件访问与权限管理等多个方面。

不同的管理策略和技术可以满足不同的需求和场景,同时也面临着各种挑战和发展趋势。

在未来的研究中,我们可以进一步探索新的管理思路和技术,以提高文件系统的效率和安全性。

文章结构部分的内容如下:1.2 文章结构本文主要探讨文件系统管理阶段的特征。

文章分为以下几个部分:引言:介绍文件系统管理阶段的重要性和研究背景。

第6章 文件系统

第6章 文件系统

• 目的: • (1)提高存储空间的利用率 • (2)提高文件的访问速度
6.3.1
连续分配
• 每个文件分配一组相邻接的盘块,也称物理 顺序文件。 • 主要问题:随着使用,磁盘碎片增多,性能 下降,需要磁盘整理。 • 优点:顺序访问速度快,定位容易,只需记 录第一个簇的位臵。可以通过紧缩 (compact)将外存空闲空间合并成连续的区 域。 • 缺点:需要连续的空间,当文件长度变化难 于处理,即必须事先知道文件的长度。
• (2) 假设索引表采用如下结构:第0~7字节 采用<起始块号,块数>格式表示文件创建 时预分配的连续存储空间,其中起始块号占 4B,块数占2B;剩余504B采用直接索引结 构,一个索引项占6B,则可支持的单个文件 最大长度是多少?为了使单个文件的长度达 到最大,请指出起始块号和块数分别占用字 节数的合理值并说明理由。 • 块数占2B,单个文件的最大长度 • 216×1KB + 504/6 ×1KB=65620KB • <4,4> <1,7> <2,6> <3,5> • 只要块数在4B以上就可以表示连续232个块, 使文件达到最大4TB。
• 关闭:将内存中对应的文件表目复制到外存 目录表中,从内存打开文件表中删除对应的 目录项。 • 3. 其它文件操作 • 以系统调用的形式提供给用户,有: • 1)关于文件属性的操作:改变文件名、改 变文件所有者、改变文件的访问权限等。 • 2)有关目录操作的:创建目录、删除目录 等。 • 3)实现文件共享的操作
索引分配
• 例:某文件系统的最大容量为4TB,以磁盘 块为基本分配单位,盘块大小为1KB。FCB 包含一个512B的索引表区。 • (1)假设索引表区采用直接索引,索引表 区存放文件占有的磁盘块号。索引表项中块 号最少占用多少字节?可支持的单个文件的 最大长度是多少字节? • 磁盘最多盘块数:4TB / 1KB =2 32 • 所以需要4字节存放盘块号。 • 文件最大长度 512/4 ×1KB = 128KB

模拟UNIX文件系统的设计及实现操作系统大作业

模拟UNIX文件系统的设计及实现操作系统大作业

模拟UNIX文件系统的设计及实现操作系统大作业UNIX文件系统是一种常见的操作系统文件系统,它提供了一种以层次结构组织文件和目录的方式来管理存储设备上的数据。

为了完成这个大作业,我们需要设计并实现一个简化版的UNIX文件系统,包括文件和目录的管理、文件的读写操作、文件权限的管理等。

首先,我们需要设计文件系统的存储结构。

文件系统可以在硬盘上以一个分区的形式存在,我们可以使用一个整数数组来表示硬盘,每个数组元素表示硬盘上的一个块。

我们还可以使用一个超级块来记录文件系统的信息,例如文件系统的状态、块的总数、块的使用情况等。

此外,我们还需要设计并实现一个索引节点表,用于保存文件或目录的元数据信息,例如文件的大小、权限、创建时间等。

接下来,我们需要实现文件和目录的管理功能。

文件和目录可以通过其在索引节点表中的索引来标识。

我们可以使用一个数组来表示目录,数组的每个元素都是一个目录项,记录了文件或子目录的名字和索引节点的索引。

我们还可以使用一个栈来保存当前目录的路径,方便用户在不同目录之间切换。

为了支持目录的嵌套,我们可以在目录项中添加一个指向父目录的索引。

在文件和目录的管理基础上,我们还需要实现文件的读写操作。

文件可以通过其索引节点的索引来标识。

当用户要读取文件时,我们需要根据文件的索引节点找到文件的块地址列表,然后将列表中的块读取到内存中。

当用户要写入文件时,我们需要找到文件的块地址列表中最后一个块,如果该块已满,则需要申请一个新的块,并将新块的地址添加到块地址列表中。

同时,我们还需要更新文件的大小和修改时间等元数据信息。

最后,我们还需要实现文件权限的管理功能。

文件的权限信息可以通过文件的索引节点来保存。

我们可以使用一个整数来表示文件的权限,例如八进制数,每一位代表一个权限,例如读取权限、写入权限和执行权限等。

当用户要访问文件时,我们需要根据用户的权限和文件的权限来判断用户是否具有相应的权限。

总结起来,要完成这个大作业,我们需要设计并实现一个模拟UNIX文件系统,包括文件和目录的管理、文件的读写操作、文件权限的管理等。

操作系统第6章 文件管理(文件目录与目录文件)

操作系统第6章 文件管理(文件目录与目录文件)

具有相似的结构,它由用户所有文件的文件控制块组成。此外,
在系统中再建立一个主文件目录MFD(Master File Directory); 在主文件目录中,每个用户目录文件都占有一个目录项,其目录 项中包括用户名和指向该用户目录文件的指针。如图2所示:
2015/11/7
15
一 文件目录管理
图2
2015/11/7
●缺点:查找速度慢;文件不能重名。不便于实现文件共享。
文件名 文件名 1 文件名 2 … 物理地址 文件说明 状态位
2015/11/7
表1 单级目录
14
一 文件目录管理
【七】二级目录
●为了克服单级目录所存在的缺点,可以为每一个用户建立一个单 独的用户文件目录UFD(User File Directory)。这些文件目录
二级目录结构示意图
16
一 文件目录管理
●两级目录结构基本上克服了单级目录的缺点,并具有以下优点:
1) 提高了检索目录的速度。如果在主目录中有n个子目录,采用两 级目录可使检索效率提高n/2倍。
2) 在不同的用户目录中,可以使用相同的文件名。
3) 不同用户还可使用不同的文件名来访问系统中的同一个共享文件。 但当多个用户之间要相互合作去完成一个大任务,且一用户又需 去访问其他用户的文件时,这种隔离便成为一个缺点,因为这种 隔离会使诸用户之间不便于共享文件。
2015/11/7 11
一 文件目录管理
●当文件被打开时,要将磁盘索引结点拷贝到内存的索引结点中,便于
以后使用。在内存索引结点中又增加了以下内容: 1. 索引结点编号,用于标识内存索引结点。 2. 状态,指示i结点是否上锁或被修改。 3. 访问计数,每当有一进程要访问此i结点时,将该访问计数加1, 访问完再减1。 4. 文件所属文件系统的逻辑设备号。 5. 链接指针。设置有分别指向空闲链表和散列队列的指针。

OSUNIT 文件系统的实现

OSUNIT 文件系统的实现
1. 单级目录结构 文件系统中只设置一个目录,它包含了该文件系统中的所有文件的目录项,要查找任一文
件都需要在该目录中
进行线性检索。 单级目录结构的特点是实现简单,但当目录中含有大量目录项时,要查找一个文件相当费
时,且它无法解决文件重名问题,这对用户是很不方便的。因此,这种目录结构只用在单用户 环境中。
文件的物理组织 文件目录的结构 文件的共享 磁盘空间的管理 文件的访问控制 文件系统的注册与挂载 内核的文件管理机制
§1 文件的物理组织
◆连续结构 ◆链接结构 ◆索引结构
一个文件的空间在逻辑上可看成是连续的,即一个文件由若干连续的盘块所组成。但在磁 盘上可以有多种方式来组成一个文件,换言之,文件有多种物理的存储结构,常用的是:连 续结构、链接结构、索引结构。
USER2的UFD

… 图9-6 二级目录结构
普通文件 … …
一个MFD和若干并列的UFD便构成了二级目录结构。当要访问一个文件时,先根据用户名 检索MFD,找出相应的UFD;再用文件名检索UFD,找出对应的FCB,从而就可以得到文件 的具体物理地址。
二级目录结构基本上克服了单目录结构的缺点,其优点如下:
一个目录由若干等长的目录项(记录)组成,目录本身也作为文件来处理,它是一种等长 记录式文件。
目录项的组成有两种方式:FCB目录项和名号目录项。
1. FCB目录项 这是简单直观的目录项组成方式,目录项就是FCB,即一个目录由若干顺序排列的FCB所
构成。当用路径名和文件名访问某个文件时,文件系统对目录进行线性检索,找到文件名对 应的FCB,就可获取该文件的物理位置等信息,完成文件名到文件物理位置的映射。
文件的物理存储结构决定了文件的逻辑地址空间到文件的物理地址空间的映射方法。

文件管理系统实现

文件管理系统实现

第4部分、文件管理系统实现:●基本要求:利用磁盘文件实现操作系统的文件管理功能,主要包括目录结构的管理、外存空间的分配与释放以及空闲空间管理三部分。

●参考学时:16学时●实验提示:1、通过初始化操作建立一个模拟外存空间的文件,在该文件中保存目录和文件内容。

创建该文件时应创建初始的根目录内容、索引节点以及空闲空间位示图。

根目录实为一特殊文件,其内容为“.”和“..”目录项。

2、索引节点应包括类型(目录 or文件)、创建日期、大小、磁盘地址(为了简单起见,可采用单级索引方式)3、显示命令提示符“$”,并根据输入命令完成相应的文件操作:⏹MD(创建子目录):创建目录文件,并在父目录文件中增加目录项,最后修改父目录文件大小⏹CD(切换工作目录):根据当前目录切换到指定目录;⏹RD(删除子目录):搜索所要删除的目录是否为空目录,若是则删除;⏹MK(创建空文件):创建指定大小的文件(如输入命令“mk test 2000”,表示创建大小为2000字节的test文件),并在父目录中添加文件名称;还应对空闲空间位示图进行适当修改;⏹DEL(删除文件):如果所要删除的文件存在,则删除,同时修改父目录内容;还应对空闲空间位示图进行适当修改;⏹DIR:列出当前目录的所有目录项。

//package osDemo;import java.io.Serializable;import java.util.Calendar;public class FCB implements Serializable{private String name;int type;int size;String cal;int firstblock;public FCB(String name) {if(name.getBytes().length>=6) {=name.substring(0, 6);}else {while(name.getBytes().length<6) {name+='\u0000';}=name;}// =name;}public String getName() {return name;}public void setName(String name) { = name;}public int getType() {return type;}public void setType(int type) {this.type = type;}public int getSize() {return size;}public void setSize(int size) {this.size = size;}public String getCal() {return cal;}public void setCal(String cal) {this.cal = cal;}public int getFirstblock() {return firstblock;}public void setFirstblock(int firstblock) {this.firstblock = firstblock;}}//package osDemo;import java.io.BufferedReader;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.ObjectOutputStream;import java.io.RandomAccessFile;import java.util.Calendar;class OS {static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));static String current_directory="";final static int EMPTY_BLOCK=0xFFFE;final static int LAST_BLOCK =0xFFFF;final static int BLOCK_SIZE=1024;static int firstblock=0;static int blockcount;static String filename="";static RandomAccessFile raf1;static ObjectOutputStream oos;static FileOutputStream fos;static DataOutputStream dos;static File file;static int f=0;//fat表中的块号static int block=0;//写块号与md mk FCB写入块中static int blockno=0;//读块号static int times=0;public static void main(String[]args)throws Exception {while(true) {String cmd="";System.out.print(current_directory);System.out.print("$:");try {cmd=br.readLine();if((cmd.indexOf("exit"))!=-1) {break;}else if(cmd.indexOf("dir")!=-1) {dir(cmd);}else if(cmd.indexOf("md")!=-1) {md(cmd);}else if(cmd.indexOf("cd")!=-1) {cd(cmd);}else if(cmd.indexOf("rd")!=-1) {rd(cmd);}else if(cmd.indexOf("mk")!=-1) {mk(cmd);}else if(cmd.indexOf("del")!=-1) {del(cmd);}else if(cmd.indexOf("format")!=-1) {format(cmd);}else if(cmd.indexOf("fat")!=-1) {fat();}else if(cmd.indexOf("info")!=-1) {String str=cmd.substring(5);int i=Integer.parseInt(str);info(i);}else if(cmd.indexOf("help")!=-1) {help();}else if(cmd.indexOf("exit")!=-1) {exit();}else {System.out.println("error command!");}}catch(Exception e) {System.out.println(e);}}}public static void dir(String cmd) throws Exception { int i=current_directory.length();String str="";if(i>0) {str=current_directory.substring(0,i-1);StringBuffer sb=new StringBuffer(str);int j=stIndexOf("/");String s1=str.substring(j+1);}// System.out.println("blockno========"+blockno);raf1=new RandomAccessFile(file,"r");raf1.seek(blockno*1024+blockcount*2);// System.out.println("-------------"+(blockno*1024+16));byte[]b=new byte[6];byte[]b1=new byte[14];int ByteCount=0;while(true) {raf1.read(b);String s2=new String(b);if(ByteCount!=1024) {// System.out.println(judge(b));// System.out.println(s2);if(!judge(b)) {int type=raf1.readInt();int size=raf1.readInt();// System.out.println("size======"+size);raf1.read(b1);String s3=new String(b1);int firstblock=raf1.readInt();// System.out.println("tyep======"+type);// System.out.println("firstblock========"+firstblock);System.out.println(s3+" "+"<DIR>"+" "+size+" "+s2); // System.out.println("ByteCount======"+ByteCount);}else {raf1.skipBytes(26);}ByteCount+=32;}else {break;}}}public static boolean judge(byte[]b) {for(int i=0;i<b.length;i++) {if(b[i]!=0) {return false;}else {continue;}}return true;}public static void md(String cmd) {String str=cmd.substring(3);try {//System.out.println("strr==========="+str);byte[]by={(byte)0xFFFF};raf1=new RandomAccessFile(file,"rw");raf1.seek(blockno*1024+block);// System.out.println(!sameName(str,blockno*1024+block));//int n=blockno*1024+16;if(!sameName(str,blockno*1024+blockcount*2)) {// System.out.println("blcok====="+(blockno*1024+block));block+=32;FCB fcb=new FCB(str);Calendar cal=Calendar.getInstance();fcb.type=1;fcb.size=1024;Stringstr1=cal.get(Calendar.YEAR)+""+(cal.get(Calendar.MONTH)+1)+""+cal.get(Calendar.DAY_OF_MONTH)+""+cal.get(Calendar.HOUR_OF_DAY)+""+cal.get(Calendar.MINUTE)+"-"+cal.get(Calendar.SECOND );if(str1.length()>14) {str1=str1.substring(0,14);}while(str1.getBytes().length<14) {str1+='\u0000';}//System.out.println(str1.length());fcb.cal=str1;fcb.firstblock=firstblock;// System.out.println("first======"+firstblock);++firstblock;// System.out.println("sencond++=="+firstblock);// oos.writeObject(f);raf1.write(fcb.getName().getBytes());raf1.writeInt(fcb.getType());raf1.writeInt(fcb.getSize());//System.out.println("fcb.getCal().getBytes().length"+fcb.getCal().getBytes().length);raf1.write(fcb.getCal().getBytes());// System.out.println("fcb.getCal().getBytes()====="+fcb.getCal().getBytes().length);raf1.writeInt(fcb.getFirstblock());++times;raf1.seek(f);raf1.write(by);raf1.write(by);f+=2;// System.out.println(f);raf1.close();System.out.println("创建成功");}else {System.out.println("此文件已经存在,请换个名字创建");return;}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static boolean sameName(String str,int n) {try {RandomAccessFile raf2=new RandomAccessFile(file,"r");int ByteCount=0;byte[]b=new byte[6];raf2.seek(n);while(true) {raf2.read(b);String s=new String(b);// System.out.println("str========"+str);// System.out.println("s======="+s);// System.out.println(str+" ="+str.length());// System.out.println(s+"="+s.length());// System.out.println("BYcoutn========="+ByteCount);// System.out.println(compare(str,s));if(ByteCount!=1024) {if(compare(str,s)) {return true;}else {raf2.skipBytes(26);ByteCount+=32;}}else {return false;}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return false;}public static void cd(String cmd) throws Exception {String str=cmd.substring(3);raf1=new RandomAccessFile(file, "r");//raf1.skipBytes(blockcount*2-1);//String s1="";byte[]b=new byte[6];String s4="";if(str.equals("/")||str.equals("..")) {blockno=0;current_directory="";block=findBlock()*32+blockcount*2;// System.out.println(block);times=0;return;}int a=blockno*1024+blockcount*2;raf1.seek(a);while(true) {raf1.read(b);//System.out.println("blockcount====="+blockcount*2);String s1=new String(b);if(s1.indexOf(str)!=-1) {raf1.skipBytes(22);int c=raf1.readInt();blockno=c;// System.out.println("blockno======="+blockno);current_directory+=str;current_directory+="/";block-=times*32;times=0;// System.out.println("hello i am in here");break;}//raf1.seek(blockcount*2+32);raf1.skipBytes(26);}}}public static int findBlock()throws Exception {RandomAccessFile raf2=new RandomAccessFile(file,"rw");raf2.seek(blockcount*2);byte[]b=new byte[6];int block1=0;while(true) {raf2.read(b);String str=new String(b);// System.out.println("str="+str);// System.out.println("block1="+block1);// System.out.println(judge(b));if(!judge(b)) {raf2.skipBytes(26);++block1;}else {return block1;}}}public static void rd(String cmd) throws Exception {String str=cmd.substring(3);raf1 =new RandomAccessFile(file,"rw");raf1.seek(blockno*1024+blockcount*2);byte[]b=new byte[6];byte[]b1=new byte[14];byte[]b2={0};int ByteCount=0;// int time=0;// System.out.println(blockno*1024+16);while(true) {raf1.read(b);String s2=new String(b);// System.out.println(s2.indexOf(str)!=-1);if(ByteCount!=1024) {if(s2.indexOf(str)!=-1) {// if(compare(s2,str)) {int type=raf1.readInt();if(type==1) {int size=raf1.readInt();raf1.read(b1);String s3=new String(b1);int firstblock=raf1.readInt();if(isHave(firstblock)) {System.out.println(s2+"不是空目录,不能删除");return;}writeFat(firstblock*2,1);// System.out.println(blockno*1024+blockcount*2+ByteCount);//times+=2raf1.seek(blockno*1024+blockcount*2+ByteCount);for(int i=0;i<32;i++) {raf1.write(b2);}//deleteEmptyList(blockno,str);//System.out.println("type="+type+" "+"size"+size+" s3="+s3+" firstblock="+firstblock);System.out.println("删除文件夹成功");break;}else {System.out.println("删除文件,请用del");break;}}else {// ++time;ByteCount+=32;raf1.skipBytes(26);}}else {System.out.println("你要删除的文件夹未找到");break;}}}public static boolean compare(String str1,String str2) {for(int i=0;i<str1.length();i++) {if(str1.charAt(i)!=str2.charAt(i)) {//if(str1.charAt(i)!=str2.charAt(i)) {return false;}else {continue;}}return true;}public static boolean isHave(int firstblock) throws Exception {raf1=new RandomAccessFile(file,"rw");raf1.seek(firstblock*1024+blockcount*2);int ByteCount=0;byte[]b=new byte[6];boolean isExit=false;while(true) {raf1.read(b);if(ByteCount!=1024) {if(!judge(b)) {isExit=true;return isExit;}ByteCount+=32;}else {return isExit;}}}public static void deleteEmptyList(int blockNum,String str) throws Exception { RandomAccessFile raf2=new RandomAccessFile(file,"rw");byte[]b={0};byte[]b1=new byte[6];int i=0;raf2.seek(blockNum*1024+blockcount*2);int ByteCount=0;//System.out.println("blockNum*1024+16====="+(blockNum*1024+16));while(true) {raf2.read(b1);String s2=new String(b1);// System.out.println("s2="+s2);// System.out.println("str="+str);// System.out.println(s2.indexOf(str)!=-1);if(ByteCount!=1024) {if(s2.indexOf(str)!=-1) {raf2.seek(blockNum*1024+blockcount*2+ByteCount);for(i=0;i<32;i++) {raf2.write(b);}break;}else {ByteCount+=32;raf2.skipBytes(26);}}else {break;}}// raf2.seek(blockNum);// for(i=0;i<32;i++) {// raf2.write(b);// }}public static void mk(String cmd) {byte[]by={(byte)0xFFFF};String[]g=cmd.split(" ");String s1=g[1];int s2=Integer.parseInt(g[2]);int i=s2/1024;try {raf1=new RandomAccessFile(file,"rw");//System.out.println("block==="+block);raf1.seek(blockno*1024+block);if(!sameName(s1,blockno*1024+blockcount*2)) {block+=32;FCB fcb=new FCB(s1);Calendar cal=Calendar.getInstance();fcb.type=0;fcb.size=s2;Stringstr1=cal.get(Calendar.YEAR)+""+(cal.get(Calendar.MONTH)+1)+""+cal.get(Calendar.DAY_OF_MONTH)+""+cal.get(Calendar.HOUR_OF_DAY)+""+cal.get(Calendar.MINUTE)+"-"+cal.get(Calendar.SECOND );if(str1.length()>14) {str1=str1.substring(0,14);}while(str1.getBytes().length<14) {str1+='\u0000';}fcb.cal=str1;fcb.firstblock=firstblock;// System.out.println("first======"+firstblock);++firstblock;//System.out.println("sencond++=="+firstblock);// oos.writeObject(f);raf1.write(fcb.getName().getBytes());raf1.writeInt(fcb.getType());raf1.writeInt(fcb.getSize());raf1.write(fcb.getCal().getBytes());raf1.writeInt(fcb.getFirstblock());++times;raf1.seek(f);// System.out.println("f=========="+f);for(int j=0;j<i;j++) { //f=4 i=1;f=raf1.write(0);// System.out.println("firstblock========="+firstblock);raf1.write(firstblock);++firstblock;f+=2;}raf1.write(by);raf1.write(by);f+=2;System.out.println("创建成功");raf1.close();}else {System.out.println("此文件已经存在,请换个名字创建");return;}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static void del(String cmd) throws Exception {String str=cmd.substring(4);raf1 =new RandomAccessFile(file,"rw");int position=blockno*1024+blockcount*2;raf1.seek(position);int time=0;byte[]b=new byte[6];byte[]b1=new byte[14];byte[]b2={0};int ByteCount=0;while(true) {raf1.read(b);String s2=new String(b);// // System.out.println("s2========"+s2);// System.out.println(s2.length());// System.out.println("========="+str);// System.out.println(str.length());// System.out.println("b=========="+judge(b));// System.out.println("str.w"+str.equals(s2));// System.out.println(compare(str,s2));if(ByteCount!=1024) {if(s2.indexOf(str)!=-1) {// System.out.println("------------");int type=raf1.readInt();if(type==0) {int size=raf1.readInt();int num=size/1024+1;raf1.read(b1);String s3=new String(b1);int firstblock=raf1.readInt();writeFat(firstblock*2,num);raf1.seek(position+time*32);// System.out.println("type="+type+" "+"size"+size+" num="+num+" s3="+s3+" firstblock="+firstblock);for(int i=0;i<32;i++) {raf1.write(b2);}System.out.println("删除文件成功");break;}else {System.out.println("你输入的是文件夹名,不能使用del删除,请使用rd");break;}}else {++time;ByteCount+=32;raf1.skipBytes(26);}}else {System.out.println("你要删除的文件未找到");break;}}}public static void writeFat(int bloNo,int num) throws Exception { RandomAccessFile raf2=new RandomAccessFile(file,"rw");raf2.seek(bloNo);byte[]b={0};for(int i=0;i<num*2;i++) {raf2.write(b);}}public static void format(String cmd) {int i,j;int k=0;// byte[]b=new byte[1024];byte[]b={0};byte[]by={(byte)0xFFFF};System.out.print("Virtual disk filename:");try {filename=br.readLine();System.out.print("Block count:");blockcount=Integer.parseInt(br.readLine());block=blockcount*2;file=new File("c:\\"+filename);fos=new FileOutputStream(file);raf1=new RandomAccessFile(file,"rw");for(i=0;i<blockcount*2;i++) {// raf1. write(by);fos.write(b);}for(i=0;i<blockcount;i++) {for(k=0;k<BLOCK_SIZE;k++) {// raf1.write(by);fos.write(b);}}// fos.write(by);fos.close();raf1.seek(0);raf1.write(by) ;raf1.write(by) ;f+=2;// System.out.println(f);++firstblock;raf1.close();}catch(Exception e) {System.out.println(e);}}public static void fat() throws Exception {int j,k;FileInputStream fis=new FileInputStream(file);String hex ="";for(j=0;j<blockcount/8;j++) {for(k=0;k<16;k++) {//hex = String.format("%02X", raf2.readByte());// 0 1 2 3 4 5 6 7hex=String.format("%02X", fis.read());//System.out.print(" "+hex);if(k%2==1) {System.out.print(hex);}else {System.out.print(" "+hex);}}System.out.println();}//raf2.close();fis.close();}public static void info(int size) throws IOException {int i,j;FileInputStream fis=new FileInputStream(file);String hex="";for(i=0;i<size/16;i++) {for(j=0;j<16;j++) {hex=String.format("%02X", fis.read());//System.out.print(" "+hex);if(j%2==1) {System.out.print(hex);}else {System.out.print(" "+hex);}}System.out.println();}}public static void exit() {System.exit(0);}public static void help() {System.out.println("dir :列出目录内容");System.out.println("format :格式化创建虚拟磁盘");System.out.println("cd :切换目录,返回根目录用cd / 或者cd ..");System.out.println("rd :删除空目录");System.out.println("mk :创建文件,如mk test 2000");System.out.println("md :创建文件夹,如md test");System.out.println("del :删除文件");System.out.println("help :显示帮助内容");System.out.println("info :显示磁盘内容,如info 1024");System.out.println("fat :仅显示FAT表");System.out.println("exit :退出程序");}}。

搜索引擎概论

搜索引擎概论

DI的运行
主目录: /home/work/search/ 程序位置:bin/di/di_r 默认的参数位置:conf/di.conf 索引库目录:db/gi/data/ 运行参数:
-v :检查版本号 -d :设置配置参数的目录 -f :设置配置参数的文件
五、搜索引擎相关性介绍
PS 许冬亮 2008年6月17日
时效性子系统:WDN
时效性的需求 时效性问题的分解
如何筛选时效性种子——易变索引页 如何频繁更新和及时抓取——高优先级设置、 时效性小环 如何挑选结果建库——结合前链、链接深度、 页面类…
LINK库配合时效性的演化方向
死链子系统:Deadsite&DLC
死链的两种类型 死站点检查和大Spider的耦合 死站点检查的应用 前端降权和屏蔽
执行bin目录下的apachectl 参数:start表示启动,stop表示结束
UI简介
Transmit
用户
BWS
UI
AS
BS/DI
BS/DI …… …… ……
BS/DI
库 库 库 库 库

UI实际的连接
PP
TB
IK
EC
BWS
UI
AS
NS
RS
CA
UI相关名词解释
计费名、用户名、策略名、模板名 摘要:
Monsite:站点质量控制子系统
为何引入Monsite Monsite的主要功用
垃圾站点去除 站点收录控制 站点选取配置 站点抓取配置
Spider统计监控
Spider统计监控的重要性 监控的不同层次
存在性监控 正确性监控
监控的架构
四、检索端体系架构
目的和重点目的增进对搜索引擎的理解 了解各个模块的功能
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计报告课程名称操作系统课程设计课题名称模拟实现单级目录、单级索引的索引文件系统专业计算机科学与技术班级学号姓名指导教师周铁山2012年1 月6日湖南工程学院课程设计任务书课程名称操作系统课程设计课题模拟实现单级目录、单级索引的索引文件系统专业班级学生姓名学号指导教师周铁山审批任务书下达日期2013 年 1 月 2 日任务完成日期2013年 1 月 6 日计算机10级《操作系统课程设计》任务书一、课程设计的性质和目的操作系统课程设计是计算机专业的专业课程,通过课程设计使学生进一步巩固课堂所学知识,全面熟悉、掌握操作系统的基本设计方法和技巧,进一步提高分析问题、解决问题及上机操作能力,为将来从事计算机工作打下一定的专业基础。

二、设计课题课题一:模拟实现单级目录的FAT文件系统基本思路:用二进制文件空间模拟磁盘空间,用文件块操作模拟磁盘块操作。

基本设计要求:1、实现如下文件系统功能(过程或函数):a、挂载文件系统FILE *OPENSYS(char *filename);b、卸载文件系统int CLOSESYS(FILE *stream);c、显示目录void LISTDIR(void);d、建立文件int FCREA TE(char *filename);e、删除文件int FDELETE(char *filename);f、打开文件int FOPEN(char *filename);g、关闭文件int FCLOSE(int fileid);h、文件块读int FREAD(void *ptr, int n, int fileid);i、文件块写int FWRITE(void *ptr, int n, int fileid);j、判断文件结束int FEOF(int fileid);k、获取文件指针long FGETPOS(int fileid);l、设置文件指针int FSETPOS(int fileid, long offset);m、取得文件长度long FGETLEN(char *filename);2、提供文件系统创建程序3、有功能检测模块4、为简化程序设计,假定目录区域大小固定。

文件系统空间划分:可以使用的C语言文件操纵函数:FILE *fopen(const char *filename, const char *mode);int fclose(FILE *stream);int fseek(FILE *stream, long offset, int whence);long ftell(FILE *stream);size_t fread(void *ptr, size_t size, size_t n, FILE *stream);size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);课题二:模拟实现单级目录、单级索引的索引文件系统使用链接域将同一文件的各索引块按顺序连接起来;其余各项同课题一。

三、课程设计报告要求1、设计报告要求A4纸打印成册;2、使用学院统一的封面;3、课程设计报告每人一份,必须包含如下几个方面的内容:1)基本设计思想;2)主要数据结构;3)主要实施流程;4)所有源代码;5)课程设计总结与体会。

四、分组及选题办法1、按学号顺序一人一组,学号为奇数者为课题一,偶数者为课题二。

2、成绩考核按个人课题完成情况、设计报告质量及对课程设计的态度等综合评定。

五、设计进度安排1、讲课及上机调试时间安排:上课时间:2013.01.02~2013.01.04上机时间:2013.01.02~2013.01.042、其余时间:查阅资料,确定方案,设计课题相关程序。

3、个人答辩,交课程设计报告。

主要数据结构提示:1、单级目录FAT文件系统:1)常量#define BlockSize 512#define DirSize 322)保留扇区结构struct ReserveBlock{int sysblocknum; /*文件系统总扇区数*/int resblocknum; /*保留扇区扇区数*/int fatblocknum; /*FAT表扇区数*/int rootblocknum; /*根目录区扇区数*/char fillchar[BlockSize-4*sizeof(int)];/*填充字节*/};3)目录结构struct DirBlock{char filename[11]; /*文件名限长11个字符*/char fillchar[DirSize-4*sizeof(int)-sizeof(long int)-11]; /*填充字节*/long filelen; /*文件长度*/int year,month,day; /*日期*/int firstblockaddr; /*文件首块扇区号*/};4)FCB(文件控制块)结构struct FCBBlock{int fileid; /*文件标识*/struct DirBlock fileinfo; /*目录信息*/long filepos; /*文件读写指针*/int fdtblockaddr; /*目录项所在块号*/int fdtblockindex; /*目录项所在块内序号*/struct FCBBlock *next;/*指向下一个文件控制块的指针*/};2、单级目录单级索引文件系统:1)常量#define BlockSize 512#define DirSize 322)保留扇区结构struct ReserveBlock{int sysblocknum; /*文件系统总扇区数*/int resblocknum; /*保留扇区扇区数*/int mapblocknum; /*字节映像图扇区数*/int rootblocknum; /*根目录区扇区数*/char fillchar[BlockSize-4*sizeof(int)]; /*填充字节*/};3)目录结构struct DirBlock{char filename[11]; /*文件名限长11个字符*/char fillchar[DirSize-4*sizeof(int)-sizeof(long int)-11]; /*填充字节*/long filelen; /*文件长度*/int year,month,day; /*日期*/int firstindexaddr; /*文件首索引块扇区号*/};4)索引块结构struct IndexBlock{int dataaddr[BlockSize/sizeof(int)-1]; /*数据块块号数组*/int nextindexaddr; /*本文件下一索引块块号*/};5)索引节点结构struct IndexNode{struct IndexBlock block; /*索引块数据*/int blockaddr; /*本节点索引块块号*/struct IndexNode *nextnode; /*指向下一索引节点的指针*/ };6)FCB(文件控制块)结构struct FCBBlock{int fileid; /*文件标识*/struct DirBlock fileinfo; /*目录信息*/long filepos; /*文件读写指针*/int fdtblockaddr; /*目录项所在块号*/int fdtblockindex; /*目录项所在块内序号*/struct FCBBlock *next; *指向下一个文件控制块的指针*/struct IndexNode *firstindexnode; /*指向第一个索引节点的指针*/};目录一、程序的功能 (1)二、程序的基本设计思路 (1)三、主要的数据结构 (2)四、主要实施流程 (3)五、程序调试及其运行结果 (4)六、设计总结与心得体会 (6)七、附录(源程序清单) (6)一、程序的功能该程序主要模拟实现单级目录的FAT文件系统,该系统要求能实现对文件的创建、删除、读、写、打开、关闭以及能显示目录等操作,在创建文件时,系统首先为新文件分配所需的外存空间,并且在文件系统的相应目录中,建立一个目录项,该目录项记录了新文件的文件名及其在外存中的地址等属性。

而当已经不再需要某个文件时,便可以把它从文件系统中删除。

这时执行的是与创建新文件相反的操作。

系统先从目录中找到要删除的文件项,使之成为空项,紧接着回收该文件的存储空间,用于下次分配。

通过读指针,将位于外部存储介质上的数据读入到内存缓冲区这样就实现了文件的读取,通过写指针,将内存缓冲区中的数据写入到位于外部存储介质上的文件中。

在开始使用文件时,首先必须打开文件。

这可以将文件属性信息装入内存,以便以后快速查用。

在完成文件使用后,应该关闭文件。

这不但是为了释放内存空间,而且也因为许多系统常常限制可以同时打开的文件数。

当创建文件时,先在目录表中查找是否存在此文件表,若存在则表示文件同名不能创建,否则在目录表中为此文件先建立一个目录项,保存文件的一些基本属性,如创建日期、大小、文件名等,并保存文件的首索引块扇区号,对文件读写也是先在目录项里查找文件是否存在,再根据文件的首索引块扇区号,查找对应块号中的内容对其进行读写操作,删除一个文件后回收为其分配的空间,并更新目录表、修改文件控制块。

显示目录项可以显示文件名、长度以及创建日期。

二、程序的基本设计思路模拟实现单级目录、单级索引的索引文件系统基本思路:用二进制文件空间模拟磁盘空间,用文件块操作模拟磁盘块操作。

在一个文件系统中对文件进行操作,实现文件的创建、读写等等操作。

在创建文件时先在目录项中进行查找,若创建的文件已存在,文件的创建首先检验目录是否为空,为空则把文件夹或文件连接到该目录下,不为空则把检查目录下是否有同名文件夹或文件,有则提示创建不成功,而文件夹打开是则把文件夹名称及其地址压入打开文件夹栈,文件关闭则把文件夹名称及其地址从打开文件夹栈中抛出。

文件夹和文件的删除,文件夹下没有打开的文件或文件没有打开才能删除,否则删除失败,每次操作成功都要更改目录和FCB信息。

该过程都保存在文件中,是对文件的操作。

本系统建于Windows平台,开发环境为WIN-TC。

三、主要的数据结构1.常量#define BlockSize 512#define DirSize 322.保留扇区结构struct ReserveBlock{int sysblocknum; /*文件系统总扇区数*/int resblocknum; /*保留扇区扇区数*/int mapblocknum; /*字节映像图扇区数*/int rootblocknum; /*根目录区扇区数*/char fillchar[BlockSize-4*sizeof(int)]; /*填充字节*/};3.目录结构struct DirBlock{char filename[11]; /*文件名限长11个字符*/char fillchar[DirSize-4*sizeof(int)-sizeof(long int)-11]; /*填充字节*/long filelen; /*文件长度*/int year,month,day; /*定义年月日*/int firstindexaddr; /*文件首索引块扇区号*/};4.索引块结构struct IndexBlock{int dataaddr[BlockSize/sizeof(int)-1]; /*数据块块号数组*/int nextindexaddr; /*本文件下一索引块块号*/};5.索引节点结构struct IndexNode{struct IndexBlock block; /*索引块数据*/int blockaddr; /*本节点索引块块号*/struct IndexNode *nextnode; /*指向下一索引节点的指针*/};6.FCB(文件控制块)结构struct FCBBlock{int fileid; /*文件标识*/struct DirBlock fileinfo; /*目录信息*/long filepos; /*文件读写指针*/int fdtblockaddr; /*目录项所在块号*/int fdtblockindex; /*目录项所在块内序号*/struct FCBBlock *next; /*指向下一个文件控制块的指针*/struct IndexNode *firstindexnode; /*指向第一个索引节点的指针*/}四、主要实施流程用到的某些函数流程图图一、FCLOSE函数图二、FCREATE 函数图三、FDELETE函数图四、OPENSYS 函数五、程序调试及其运行结果下面是程序调试时的一些截图。

相关文档
最新文档