操作系统实习报告.docx

上传人:b****3 文档编号:3461945 上传时间:2022-11-23 格式:DOCX 页数:16 大小:235.96KB
下载 相关 举报
操作系统实习报告.docx_第1页
第1页 / 共16页
操作系统实习报告.docx_第2页
第2页 / 共16页
操作系统实习报告.docx_第3页
第3页 / 共16页
操作系统实习报告.docx_第4页
第4页 / 共16页
操作系统实习报告.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

操作系统实习报告.docx

《操作系统实习报告.docx》由会员分享,可在线阅读,更多相关《操作系统实习报告.docx(16页珍藏版)》请在冰豆网上搜索。

操作系统实习报告.docx

操作系统实习报告

操作系统实习报告

 

题目基于shell的形式来模拟文件系统

班级

学号

姓名

11学年—12学年第2学期操作系统实习报告书

专业:

班级:

姓名:

学号:

实习地点:

辅导教师:

实习内容:

基于shell的形式来模拟文件系统

实习环境:

Windows操作系统相应的开发平台和工具

实习步骤、方法、技术方案、结果、分析:

实习内容:

在一个文件中模拟文件系统如何存储文件和目录。

通过一个Shell来模拟对该文件系统中文件和目录的访问和操作。

在模拟中提供文件系统空间整理的功能。

实习要求:

文件系统的基本要求:

1、使用大小固定的文件来代表一个文件系统分区,例如,30K字节。

文件大小的固定是由程序里面自己控制的,即在给定文件大小后面不再写内容。

2、每个分区都要支持多级目录的文件组织形式,并且文件的大小可动态变化。

其中,存放的文件都为简单的TXT文本,即字符型文件。

运行程序的基本要求:

编写一个shell程序。

该程序能像cmd.exe一样,能对你所构造的文件系统进行目录和文件操作。

要求实现地功能包括:

cd、dir、mkdir,more,copy,rmdir,find,attrib,copy,del,xcopy,exit等几个ms-dos命令。

实习步骤:

1.首先理解该课程设计的要求,弄清楚shell的各种操作,查找各种资料,明白一个多级目录的文件系统是什么样的,加深理解文件系统的组成以及各种内部结构。

2.通过查找各种资料来搞清楚文件系统的存储形式,写出相关的结构体定义以及大体框架结构。

3.编写各个功能的代码函数来实现shell程序中目录与文件的操作。

在基本的功能都实现以后对写出的程序进行一些必要的调试和修改,在此过程中找出问题并改正。

4.运用学过的多线程的方法将该程序改为多线程实现的shell程序。

5.总结经验,书写相关的实习报告书

实习方法:

1.理解文件系统存储结构,查找多级存储结构文件系统的相关资料,常见的UNIX实现了层次结构化文件的系统。

在该方案中,目录中可以包含多个文件和子目录。

磁盘被分成多个区。

每个分区有自己的文件系统。

如下图所示,矩形代表目录,圆圈代表文件,在UNIX操作系统中,目录也被当作文件。

它认为目录是单个文件或多个文件。

2.UNIX文件系统的中心概念是超级块superblock,i节点inode,数据块datablock,目录块directoryblock,和间接块indirectionblock。

超级块占用第1号物理块,是文件系统的控制块,超级块包括:

文件系统的大小、空闲块数目、空闲块索引表、空闲i节点数目、空闲i节点索引表、封锁标记等。

超级块是系统为文件分配存储空间、回收存储空间的依据。

i节点包括除了名字外的一个文件的所有信息,名字与i节点数目一起存在目录中。

结合上图,可以对下图进行理解:

3.磁盘的大小是固定的并且存储是连续的,所以用一个固定大小的文本文件来代表一个磁盘分区,并通过对此文本的内容读写来模拟shell程序中该文件系统中文件和目录的访问和操作。

若不存在该文本,则必须对其初始化,形成一个根目录。

初始化的操作有:

初始化超级块(代表一个根目录)Init_SuperBlock();

初始化i结点Init_INode();

初始化数据块Init_DataBlock();

4.模拟对磁盘的访问,通过对文件进行文件seekp定位操作来实现,固定文件的大小由起初写入的文本决定,二进制文件编码是变长的,它灵活,存储利用率高,所以以二进制读写的方式来对本文进行操作。

5.用多线程的方法来实现shell程序,第一个用来接受命令,第二个用来解析命令,第三个用来实现命令。

实现的关键点是在定义互斥量和信号量,并在三个线程中来进行所需的P、V操作。

技术方案:

1.定义相关的结构体:

//超级块

typedefstruct

{

intMaxSize;//文件系统的大小

intFirstINodeBlk;//第一个I结点块号

intFirstDBlk;//第一个数据块号

intBlockSize;//每个物理块大小

boolINodeStatus[INODES];//INode状态(空闲或占用)

boolDataBlockStatus[DATABLKS];//数据块状态(空闲或占用)

}SuperBlock;

//i结点

typedefstruct

{

intFileType;//文件类型

intINodeNumber;//i-node号

intLinksNum;//链接数

intFileSize;//文件大小

intblocks[4];//占用的数据块

}INode;

//目录结构,结构体大小为16B

typedefstructDirectoryItem

{

intINodeNumber;//INode号

charFileName[12];//文件名

}DirectoryItem;

2.声明各种函数(所实现的相关功能):

//Command.h

voidPrintCurPath();//输出当前路径

voidSplitCmd(char*Cmd,char*cmd,char*config);//对命令进行分割

voidmkdir(char*config);//新建一个目录

voidmore(char*config);//逐屏显示输出

voiddir(char*config);//显示目录中的文件和子目录

voidhelp(char*config);//帮助

voidcd(char*config);//显示或改变当前目录

voidrm(char*config);//删除一个目录

voidformat();//格式化磁盘

voidInterpretCmd();//对命令解析

//SuperBlock.h

voidInit_SuperBlock();//初始化超级块

voidWriteSuperBlock();//写超级块到文件中

voidReadSuperBlock();//从文件中读取超级块

//INode.h

voidInit_INode();//初始化i结点

intAllocINode();//申请I-结点

voidWriteINode(int,INode);//写I-结点到文件中

voidReadINode(int,INode&);//从文件中读取I-结点

voidFreeINode(int);//释放I-结点

voidSetDirINode(INode&,int,int);//初始化新建的目录I-结点

voidSetFleINode(INode&,int,int,int*,int);//初始化新建的文件I-结点

voidUpdataINode(int);//更新I-结点

//Directory.h

boolHaveSameName(char*,INode);//寻找是否有相同的文件名

boolFindDir(char*,INode,int,DirectoryItem&);//查找目录项

voidSetDirItem(char*c,int,DirectoryItem&);//初始化新建的目录项

voidWriteDir(INode,DirectoryItem,int);//写目录项

voidReadDir(int,INode,DirectoryItem&);//读目录项

//DataBlock.h

voidInit_DataBlock();//初始化数据块

intAllocDBlk();//申请数据块

voidWriteDBlk(int*,int,char*);//释放数据块

voidFreeDBlk(int);//写数据块

3.必要的初始化操作:

//初始化超级块

voidInit_SuperBlock()

{

superblock.MaxSize=240*BLKSIZE;

superblock.BlockSize=BLKSIZE;

superblock.FirstINodeBlk=FIRSTIBLK;

superblock.FirstDBlk=FIRSTDBLK;

for(inti=0;i

{

superblock.INodeStatus[i]=true;

}

for(i=0;i

{

superblock.DataBlockStatus[i]=true;

}

//0号I-结点的被根目录使用,0号数据块被根目录使用

superblock.INodeStatus[0]=false;

superblock.DataBlockStatus[0]=false;

fstreamfout;

fout.open("A.txt",ios:

:

out|ios:

:

binary);

if(!

fout)

{

cout<<"Can'topenthisfile"<

exit(0);

}

fout.write((char*)&superblock,FIRSTIBLK*BLKSIZE);

fout.close();

}

//初始化I-结点

voidInit_INode()

{

for(inti=0;i

{

inode[i].FileType=UNKNOW;

inode[i].INodeNumber=i;

inode[i].LinksNum=0;

inode[i].FileSize=0;

for(intj=0;j<4;j++)

{

inode[i].blocks[j]=-1;

}

}

//0号I-结点被根目录占用,0号数据块被根目录使用

inode[0].FileType=ISDIR;

inode[0].blocks[0]=0;

inode[0].LinksNum=2;

fstreamfout;

fout.open("A.txt",ios:

:

in|ios:

:

out|ios:

:

binary);

if(!

fout)

{

cout<<"Can'topenthisfile"<

exit(0);

}

fout.seekp(FIRSTIBLK*BLKSIZE);

for(i=0;i

{

fout.write((char*)&inode[i],sizeof(INode));

}

fout.close();

}

 

//初始化数据块

voidInit_DataBlock()

{

fstreamfout;

fout.open("A.txt",ios:

:

in|ios:

:

out|ios:

:

binary);

if(!

fout)

{

cout<<"Can'topenthisfile"<

exit(0);

}

fout.seekp(FIRSTDBLK*BLKSIZE);

//初始化根目录

DirectoryItemRootDir[2];

strcpy(RootDir[0].FileName,".");

RootDir[0].INodeNumber=0;

strcpy(RootDir[1].FileName,"..");

RootDir[1].INodeNumber=0;

for(inti=0;i<2;i++)

{

fout.write((char*)&RootDir[i],sizeof(DirectoryItem));

}

fout<

fout.close();

}

 

4.定义多线程实现的互斥量和信号量初始化互斥量与信号量:

HANDLEmutex;//一个互斥量

HANDLEghSemaphore1,ghSemaphore2,ghSemaphore3;//三个信号量

mutex=CreateMutex(NULL,FALSE,NULL);//初始化未被占用

ghSemaphore1=CreateSemaphore(NULL,1,1,NULL);//初始化最大资源值与可利用资源都为1

ghSemaphore2=CreateSemaphore(NULL,0,1,NULL);//初始化可利用资源为0,最大资源值为1

ghSemaphore3=CreateSemaphore(NULL,0,1,NULL);//初始化可利用资源为0,最大资源值为1

5.整体流程图及重要功能函数的说明和流程图

1)整体流程图:

2)创建目录:

3)删除操作del:

4)改变当前目录:

5)创建文件:

实习结果:

1.进入运行界面:

2.显示所能实现的功能

3.使用mkdir创建目录:

4.显示当前文件

5.进入yuanyuan目录

6.返回上一级:

7.删除yuanyuan目录

8.显示当前目录:

9.创建一个文件并输入内容:

10.显示当前文件的内容:

11.格式化:

12.退出程序:

实习分析:

通过本次的课程设计,使我能够正确运用操作系统课程中所学的基本理论和知识,加深了对文件系统基本概念的理解,以及磁盘文件系统的文件操作。

设计一个软件,先要做好思路分析,这一点很重要,如果没有分析好思路,那么就会觉得思维混乱且无从下手,还有比较重要的是,需要先仔细画好流程图。

在程序设计的开始,由于分析工作做得不够深入和细致,出了很多的错误。

另外在运用C++的时候,感觉有点生疏,在编程和调试的过程中,经常会出现意想不到的问题,并非每个问题都可以从相关资料中找到解决方法,有些问题是由于自己的马虎所导致的,这就需要通过仔细的分析来解决问题。

在设计过程中,查询了不少相关资料,不断的发现问题、提出问题、解决问题。

在对自己所编写的源程序段的纠错的过程中,使我更好的理解了操作系统中文件系统的理论知识,同时又把学到过的多线程加入到程序中来实现多线程方式的shell程序,让我对多线程的思想又有了更深一步的理解。

总的来说通过这次课程设计使我学到了很多在平时的学习中学不到的很多东西,通过这次课程设计,使我对操作系统和编程产生了兴趣。

我相信,只要不断的严格要求自己,注意培养自己的思维能力,就一定会有所收获和提高。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1