操作系统课程设计Word文档下载推荐.docx
- 文档编号:22144364
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:31
- 大小:518.84KB
操作系统课程设计Word文档下载推荐.docx
《操作系统课程设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计Word文档下载推荐.docx(31页珍藏版)》请在冰豆网上搜索。
张琳(进程管理)
许婷婷(文件管理与用户接口)
郭娜娜(设备管理)
编程语言:
C#
1.5论文结构安排
论文主要分为四部分内容:
(1)引言,主要说明本次操作系统课程设计的性质、目的、内容要求以及论文的结构安排;
(2)需求分析,主要阐述系统的主要功能模块以及每个模块计划采用的实现方法和原理;
(3)总体设计及实现,通过流程图等工具描述主要模块的实现流程;
(4)结束语,主要书写已经实现的本系统存在的不足、改进方案和在课程设计中的实际感受。
二、需求分析
2.1整体架构
文件管理与用户接口部分实现的主要是单用户的磁盘文件管理部分,包括文件的逻辑结构、物理结构、目录、磁盘分配回收、文件的保护和用户接口的实现。
2.2具体分析
2.2.1文件的逻辑结构
文件的逻辑结构采用流式结构;
文件均采用文本文件;
系统中有两种文件,一种是存放任意字符的文件,一种是可执行文件。
可执行文件的内容就是模拟系统内进程的程序体。
文件中要有一种特定命令的“可执行”文件,文件中的命令非常简单,包括:
x=?
;
给x赋值一位数
x++;
x加1
x--;
x减1
;
第一个?
为A,B,C中某个设备,第二个?
为一位数,表示使用设备的时间(由于没有实际设备,所以无法知道设备何时工作完成,所以假定一个数,这个数随着系统时间增加而递减,减到0时,认为是设备工作完成);
end.表示文件结束,同时将结果写入文件out,其中包括文件路径名和x的值。
2.2.2文件的物理结构
文件的物理结构采用索引文件,每个文件分配一个索引块(存放索引的盘块)把分配给该文件的所有盘块号都记录在该索引块中,按照这种分派方式存储的文件就是索引文件。
由于索引块就是一个存放许多盘块号的盘块,因此,为使系统能找到文件存放的地址,文件目录项记录该文件索引块的盘块号和文件长度。
为一个大文件分配磁盘空间时,如果所分配除去盘块的盘块号,已经装满一索引块时,便需再为该文件分配另一个索引块,用于将以后继续分配给该文件的盘块号记录其中,以此类推。
同时,应为这些索引块再建立一级索引,即系统再分配一索引块,作为一级索引块的索引块,将第一块、第二块、第三块、……索引块的盘块号写入此索引块中,这样便形成了二级索引的分配方式,如果文件非常大的时候,还可以用三级、四级索引分配方式。
本系统实现二级索引,如图2-1所示:
图2-1文件索引分配方式
2.2.3目录结构
目录结构采用树形目录结构,根目录项既可以表示一个普通文件,也可以是下一级目录的目录文件的一个说明项,如此层层类推,形成一个树形层次结构,如图2-2所示:
图2-2树形目录结构
2.2.4磁盘分配与回收
磁盘分配:
磁盘的分配采用链接结构(显式链接)的分配。
系统采用文件分配表方式记录磁盘空间的使用情况和链接结构的指针。
磁盘回收:
每删除一个文件则释放一个盘块,该盘块由蓝色变为灰色。
磁盘使用情况用空闲块成组链接法来记录:
把空闲块分成若干组,把指向一组中各空闲块的指针集中在一起,每一组的第一个空闲块中登记下一组空闲块的块号和空闲块数,余下不足一组块数的空闲块的块号级快数登记在一个专用块中,这样既可方便查找,又可减少为修改指针而启动的磁盘的次数,在本系统中将第0块作为专用块,如图2-3是空闲块成组链接示意图:
图2-3空闲块成组链接示意图
2.2.5 用户接口
用户接口提供用户命令接口,具体实现以下命令:
1.创建文件:
create文件名
2.拷贝文件:
copy源文件名目标文件名(拷贝文件可同名拷贝,也可更名拷贝)
3.删除文件:
delete文件名
4.移动文件:
move源文件名目标文件名(磁盘内和磁盘间文件移动不同,磁盘内的移动实际只是目录的改变,并不需要真的移动文件;
磁盘间的文件移动实际上是先拷贝文件到目标磁盘,然后再删除源文件。
)
5.显示文件:
type文件名(仅仅是显示文件内容)
6.编辑文件:
edit文件名(此命令完成对文件的编辑,只读文件不可以修改。
7.改变文件属性:
change文件名属性(将文件在只读和非只读、隐藏和非隐藏之间转换。
8.磁盘格式化命令:
format
9.建立目录:
makdir目录名(建立目录,若有同名目录存在,则建立失败。
10.删除空目录:
rdir目录名(只能删除空目录,非空目录不能删除)
11.删除目录:
deldir目录名(既可以删除空目录,又可以删除非空目录,对与非空目录,首先要删除其下文件和目录,然后才能删除其本身。
2.2.6屏幕显示
屏幕显示要求包括:
用户命令接口,用于系统运行时用户输入命令;
磁盘目录显示,要求显示磁盘的树型目录结构;
磁盘使用情况,显示磁盘每一个磁盘块的空间是占用还是空闲。
三、系统实现
3.1磁盘管理
3.1.1磁盘的创建
磁盘的创建主要采用的文件流的方式,采用了二位byte数组进行储存。
3.1.2磁盘的分配
空闲块的分配和回收都是针对专用块来操作的,没分配一块后,把空闲块数减1,但要把一组中的第一个空闲块分配除去之前应该把登记在该块中的下一组的块号及块数保存到专用快中(原专用块中的信息已经无用,因为它指示的一组空闲块都已被分配),如图3-1-2所示:
图3-1分配一个磁盘块的流程图
3.1.3磁盘的回收
当归还一块时,只要把归还块的块号登记到专用块的当前组中且将空闲块数加1,如果当前组已经满10块,则把专用块中的内容写到归还的那块中,该归还块作为新组的第一块,如图3-2所示:
图3-1-3回收一个磁盘块的流程图
3.1.4磁盘状态的显示
磁盘的状态在每次分配和回收磁盘块的函数过程中实现,绿色表示系统占用的磁盘,每分配一个空闲块,将相应lable灰色改为蓝色,表示该磁盘块已经被占用;
每回收一块磁盘块的时候,将相应Label由蓝色改为灰色,表示该磁盘块空闲。
3.2目录结构的实现
3.2.1创建目录
建立目录首先要找到建立目录的位置(父目录),然后查找该目录是否存在,如果父目录不存在,不能建立,如果存在,查找是否存在同名目录,存在,不能建立,不存在,则查找一个空目录项,,为该目录项申请一个盘块,并填写目录内容,如图3-2-1所示:
图3-2-1创建一个目录的流程图
实现创建目录功能的代码如下:
#regionCreateMenu(建立目录)
publicvoidCreateMenu(stringpathname,stringharddisk)
{
intsearchresult=Search(pathname,harddisk);
if(searchresult==1)
MessageBox.Show("
文件路径不存在!
"
"
注意"
MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
return;
}
elseif(searchresult==0)
string[]pnames=pathname.Split(newchar[]{'
\\'
});
//分割路径
stringhalfpathname=pathname.Remove(pathname.Length-4);
//去掉最后一个目录名
UTF8Encodingutf=newUTF8Encoding();
intdisknum=FindFAT(harddisk);
bytedisknumber=Convert.ToByte(disknum);
if(halfpathname.Length!
=2)
if(FindNullItem(Search(halfpathname,harddisk),harddisk)==0)//没有空目录项
目录已满!
);
WriteFile(Search(halfpathname,harddisk),FindNullItem(Search(halfpathname,harddisk),harddisk),CreateFCB(utf.GetBytes(pnames[pnames.Length-1]),0,8,disknumber,Convert.ToChar(0)),harddisk);
RecordMenuFAT(disknum,harddisk);
else
if(FindNullItem(3,harddisk)==0)//没有空目录项
WriteFile(3,FindNullItem(3,harddisk),CreateFCB(utf.GetBytes(pnames[pnames.Length-1]),0,8,disknumber,Convert.ToChar(0)),harddisk);
}
文件存在!
"
MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
#endregion
创建目录过程截图:
创建目录过程截图
3.2.2删除空目录
删除空目录首先要找到该目录,如果目录不存在,删除失败;
如果存在,但是,是非空目录,显示不能删除,操作失败;
若是空目录,将目录在树形目录和磁盘中删除,如图3-2-2所示:
图3-2-2删除空目录的流程图
实现判断空目录功能的代码:
#regionFindNullItem(判断是否为空目录项)
publicintFindNullItem(intdnum,stringharddisk)
FileStreamDisk=newFileStream(harddisk,FileMode.Open);
intn=0;
intflag=0;
for(inti=0;
i<
8;
i++)
Disk.Seek(64*(dnum-1)+4+n,SeekOrigin.Begin);
//读fcb中的attribute
if(Disk.ReadByte()==0)
flag=i+1;
break;
n=n+8;
Disk.Close();
returnflag;
3.2.3删除目录
删除目录是在删除空目录的基础上增加了删除非空目录的功能。
首先检查要删除的目录是否为空,若为空,调用删除空目录的函数,将其删除;
若不为空,深度优先遍历以该目录为根节点的子树,将其孩子节点依次都删除,最后调用删除空目录的函数,将该目录删除,就完成了删除目录的工作。
具体流程如图3-2-3所示:
图3-2-3删除空目录的流程图
实现删除目录功能的代码如下:
#regionDeleteMenu(删除目录)
publicvoidDeleteMenu(stringpathname,stringharddisk)
if(Search(pathname,harddisk)==1)
文件路径不正确!
elseif(Search(pathname,harddisk)==0)
文件不存在!
'
.'
intlastdnum=Search(pathname,harddisk);
intattribute;
byte[]bytename=newbyte[3];
UTF8Encodingutf8=newUTF8Encoding();
intn=0;
for(inti=0;
i<
8;
i++)
Disk.Seek(64*(lastdnum-1)+n,SeekOrigin.Begin);
Disk.Read(bytename,0,3);
Disk.Seek(1,SeekOrigin.Current);
attribute=Disk.ReadByte();
if(attribute==8)
pathname=pathname+'
+utf8.GetString(bytename);
DeleteMenu(pathname,harddisk);
elseif(attribute==2||attribute==3||attribute==4||attribute==5)
if(attribute==2||attribute==3)
+utf8.GetString(bytename)+"
.e"
DeleteFile(pathname,harddisk);
.t"
n=n+8;
intdisknum;
if(pnames.Length==2)//c:
\aaa
disknum=3;
disknum=Search(halfpathname,harddisk);
byte[]name=utf.GetBytes(pnames[pnames.Length-1]);
intitem=FindItem(disknum,name,Convert.ToChar(8),harddisk)[0];
//目录项
intaddress=FindItem(disknum,name,Convert.ToChar(8),harddisk)[1];
//目录起始盘块号
//byteaddr=Convert.ToByte(address);
DeleteFCB(disknum,item,harddisk);
//删除FCB
byte[]delcontent=newbyte[64];
for(intk=0;
k<
64;
k++)
delcontent[k]=0;
FileStreamDisk1=newFileStream(harddisk,FileMode.Open);
Disk1.Seek(64*(address-1),SeekOrigin.Begin);
Disk1.Write(delcontent,0,64);
Disk1.Seek(address-1,SeekOrigin.Begin);
//记录FAT为
Disk1.WriteByte(0);
Disk1.Close();
3.3文件
对于文件的很多操作,如:
创建文件、拷贝文件、删除文件、编辑文件等等。
3.3.1创建文件
实现了建立目录,只需要调用建立目录函数,建立文件目录,然后,将该文件插入到打开文件表中就完成了一个文件的建立,具体流程如图3-3-1所示:
图3-3-1创建文件流程图
实现创建文件功能的代码如下:
#regionCreateFile(建立文件)
publicvoidCreateFile(stringpathname,byteattribute,byteaddress,charlength,stringharddisk)
if(attribute==3||attribute==5)
只读性质,建立失败!
if(searchresult==1)
elseif(searchresult==2)
else//写FCB
stringhalfpathname=pathname.Remove(pathname.Length-6);
//去掉文件名和扩展名
charchtype=Convert.ToChar(pnames[pnames.Length-1]);
//扩展名转换为char
bytebytype=Convert.ToByte(chtype);
//char再转换成byte
if(FindNullItem(searchresult,harddisk)==0)//没有空目录项
WriteFile(searchresult,FindNullItem(searchresult,harddisk),CreateFCB(utf.GetBytes(pnames[pnames.Length-2]),bytype,attribute,address,length),harddisk);
创建文件前后截图:
注:
创建文件aaa前,C盘中只有系统占用的磁盘(绿色部分),其他均为未使用的磁盘(灰色部分);
创建文件aaa后,C盘中除了系统占用的磁盘(绿色部分),还有文件占用的磁盘(蓝色不分),剩余的均为未使用的磁盘(灰色部分)。
截图如下图:
3.3.2保存文件
保存文件的过程就是将文件内容写入特定磁盘块的过程,动态申请一块磁盘块,将内容写入磁盘,如果内容已经写完,结束,如果一块不够,则要再申请一块磁盘,依次类推,直至把全部的内容都写到磁盘为止,就完成了保存文件的工作,程序结束。
此模拟操作系统设定的为在写入磁盘的同时自动存储。
具体实现代码如下:
publicvoidsaveFile(Stringtext,DirEntryde){
DiskServiceds=newDiskService();
BlockServicebs=newBlockService();
bs.freeBlock(de);
byte[]b=text.getBytes();
intnum=b.length/128+1;
if(num>
1){
//申请索引块
intindex=bs.getFreeBlock();
int[]position=bs.getDirEntryPosition(de,Explorer.getCDB());
de.setIndexAddress((short)index);
de.setDirAddress((short)0);
ds.writeTODisk(de,position[0],position[1]);
for(inti=0;
num-1;
i++){
intblockNum=bs.getFreeBlock();
bs.addBlockToIndex(blockNum,index);
byte[][]block=Disk.getDisk().getBlock();
for(intj=0;
j<
128;
j++){
block[blockNum][j]=b[i*128+j];
}
ds.writeTODisk(bloc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计