操作系统课程设计.docx
- 文档编号:6316971
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:11
- 大小:148.59KB
操作系统课程设计.docx
《操作系统课程设计.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计.docx(11页珍藏版)》请在冰豆网上搜索。
操作系统课程设计
1 引言
操作系统是计算机科学与技术专业的主要专业基础课和主干课。
操作系统对计算机系统资源实施管理,是所有其他软件与计算机硬件的唯一接口,所有用户在使用计算机时都要得到操作系统提供的服务。
通过模拟操作系统的全部或者部分功能的实现,加深对操作系统工作原理和操作系统实现方法的理解,达到练习编程的目的,提高学生运用理论知识分析问题、解决问题的能力,为学生从事科学研究和独立负担计算机及其应用方面的工作打好扎实的基础。
2课程设计任务及要求
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磁盘模拟:
用一个文件disk模拟磁盘,磁盘的每个盘块64字节,模拟磁盘共有128块。
第0、1块存放文件分配表,第2块存放根目录,其余存放子目录和文件。
2.2.3目录结构
目录结构采用树型目录结构,目录项内容共十六个字节。
①目录项内容(8个字节):
目录名、文件名:
3个字节;
扩展名:
1个字节(可执行文件扩展名为e,目录没有扩展名);
目录、文件属性:
1字节;
起始盘块号:
1个字节;
文件长度:
2字节(目录没有长度)。
②根目录
根目录位置固定,为磁盘第2块,大小固定,共8项,占用模拟磁盘第2块;
③子目录
位置不固定,大小不固定。
2.2.4磁盘分配
磁盘的分配采用链接结构(显式链接)的分配方式。
系统采用文件分配表方式记录磁盘空间的使用情况和链接结构的指针。
因为磁盘有占用磁盘由128块,所以文件分配表中一项需要1字节,而磁盘由128块,因而需要128项,所以模拟磁盘空间中的第0、1块被用来存放文件分配表。
2.2.5用户接口
用户接口提供用户命令接口,要求实现以下命令:
创建文件:
create
拷贝文件:
copy
删除文件:
delete
移动文件:
move
显示文件:
type
编辑文件:
edit
改变文件属性:
change
磁盘格式化命令format
建立目录:
makdir
改变目录路径:
chadir
删除空目录:
rdir
删除目录:
deldir(既可删除空目录又可删除非空目录)
磁盘分区命令:
fdisk
运行可执行文件:
可执行文件的文件名(可创建进程)。
上述命令在实际系统中都是需要建立进程才可以实现的,这里由于模拟系统的能力达不到,所以除运行可执行文件需要建立进程外,其他指令执行不必在模拟系统中建立进程,可直接执行。
注意打开文件表。
2.2.6屏幕显示
如图所示,屏幕显示要求包括:
用户命令接口,用于系统运行时用户输入命令;
磁盘目录显示,要求显示磁盘的树型目录结构;
磁盘使用情况,显示磁盘每一个磁盘块的空间是占用还是空闲。
3程序设计与实现
3.1目录结构的实现
3.1.1创建目录
#regionCreateMenu(建立目录)
publicvoidCreateMenu(stringpathname,stringharddisk)
3.1.2删除空目录
删除空目录首先要找到该目录,如果目录不存在,执行指令失败;如果存在,但是根目录或非空目录显示不能删除,操作失败;若是非空子目录,则删除器目录项并回收对应空间。
删除空目录的过程和删除文件的过程相似。
3.1.3删除目录
#regionDeleteMenu(删除目录)
publicvoidDeleteMenu(stringpathname,stringharddisk)
{
if(Search(pathname,harddisk)==1)
{
MessageBox.Show("文件路径不正确!
","注意",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
3.2文件
3.2.1创建文件
#regionCreateFile(建立文件)
publicvoidCreateFile(stringpathname,byteattribute,byteaddress,charlength,stringharddisk)
{
if(attribute==3||attribute==5)
{
MessageBox.Show("只读性质,建立失败!
","注意",MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
return;
}
3.2.2拷贝文件
#regionCopyFile(复制文件,只复制FCB)
publicvoidCopyFile(stringpathname1,stringpathname2,stringharddisk)
{
string[]pnames=pathname1.Split(newchar[]{'\\','.'});
stringhalfpathname=pathname1.Remove(pathname1.Length-6);
charattribute=Convert.ToChar(pnames[pnames.Length-1]);
UTF8Encodingutf=newUTF8Encoding();
byte[]name=utf.GetBytes(pnames[pnames.Length-2]);
intdisknum;
if(pnames.Length==3)//c:
\aaa.t
{
disknum=3;
}
else
{
disknum=Search(halfpathname,harddisk);
}
intitem=FindItem(disknum,name,attribute,harddisk)[0];
FCBbuffer=ReadFCB(disknum,item,harddisk);
pathname2=pathname2+'\\'+pnames[pnames.Length-2]+'.'+pnames[pnames.Length-1];
CreateFile(pathname2,buffer.Attribute,buffer.Address,buffer.Length,harddisk);
}
#endregion
3.2.3删除文件
#regionDeleteFile(删除文件)
publicvoidDeleteFile(stringpathname,stringharddisk)
{
if(Search(pathname,harddisk)==1)
{
MessageBox.Show("文件路径不正确!
","注意",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
return;
}
elseif(Search(pathname,harddisk)==2)//文件存在
{
string[]pnames=pathname.Split(newchar[]{'\\','.'});
stringhalfpathname=pathname.Remove(pathname.Length-6);
charattribute=Convert.ToChar(pnames[pnames.Length-1]);
UTF8Encodingutf=newUTF8Encoding();
byte[]name=utf.GetBytes(pnames[pnames.Length-2]);
intdisknum;
if(pnames.Length==3)//c:
\aaa.t
{
disknum=3;
}
else
{
disknum=Search(halfpathname,harddisk);
}
intitem=FindItem(disknum,name,attribute,harddisk)[0];
intaddress=FindItem(disknum,name,attribute,harddisk)[1];
byteaddr=Convert.ToByte(address);
DeleteFCB(disknum,item,harddisk);//删除FCB
if(addr==0)
{
return;
3.2.4移动文件
#regionCutFile(移动文件)
publicvoidCutFile(stringpathname1,stringpathname2,stringharddisk)
{
CopyFile(pathname1,pathname2,harddisk);//复制FCB到新目录下
string[]pnames=pathname1.Split(newchar[]{'\\','.'});
stringhalfpathname=pathname1.Remove(pathname1.Length-6);
charattribute=Convert.ToChar(pnames[pnames.Length-1]);
UTF8Encodingutf=newUTF8Encoding();
byte[]name=utf.GetBytes(pnames[pnames.Length-2]);
intdisknum;
if(pnames.Length==3)//c:
\aaa.t
{
disknum=3;
}
else
{
disknum=Search(halfpathname,harddisk);
}
intitem=FindItem(disknum,name,attribute,harddisk)[0];
DeleteFCB(disknum,item,harddisk);//删除FCB
}
#endregion
3.2.5编辑文件
#regionWriteFile(向磁盘写入FCB)
publicvoidWriteFile(intdisknumber,intItemnumber,FCBbuffer,stringharddisk)
{
FileStreamDisk=newFileStream(harddisk,FileMode.Open);
if(disknumber>0&&Itemnumber>0)
{
Disk.Seek(64*(disknumber-1)+8*(Itemnumber-1),SeekOrigin.Begin);
Disk.Write(buffer.Name,0,buffer.Name.Length);
Disk.Seek(0,SeekOrigin.Current);
Disk.WriteByte(buffer.Type);
Disk.Seek(0,SeekOrigin.Current);
Disk.WriteByte(buffer.Attribute);
Disk.Seek(0,SeekOrigin.Current);
Disk.WriteByte(buffer.Address);
Disk.Seek(0,SeekOrigin.Current);
Disk.WriteByte(Convert.ToByte(buffer.Length));
}
Disk.Close();
}
#endregion
3.2.7显示文件
#regionReadFile(读文件画节点)
publicvoidReadFile(TreeViewtreeView,ContextMenuStripcontextMenuStrip,ImageListimageList)
{
treeView.Nodes.Clear();//删除集合中所有树节点
//重新添加树节点
treeView.ImageList=imageList;
TreeNoderoot=newTreeNode("计算机",0,0);
TreeNodenode_C=newTreeNode("本地磁盘C",4,4);
TreeNodenode_D=newTreeNode("本地磁盘D",4,4);
node_C.ContextMenuStrip=contextMenuStrip;
node_D.ContextMenuStrip=contextMenuStrip;
treeView.Nodes.Add(root);
root.Nodes.Add(node_C);
root.Nodes.Add(node_D);
DrawTree(node_C,3,"disk1.txt",contextMenuStrip);
DrawTree(node_D,3,"disk2.txt",contextMenuStrip);
treeView.ExpandAll();
}
#endregion
4.程序运行部分截图
4.1主页面
4.2创建文件
4.3编辑文件
4.4创建目录
5总结
在此系统我主要模拟的是文件部分。
通过编写此系统,采用了c#语言。
但是,在实现此系统中,一方面因为我对c#这门语言掌握的不是很熟练,另外一方面,对操作系统理解的不够深入以至于部分功能没有实现,让我发现了自己的不足,从而要在以后的学习中更加努力,不短提高自己个方面的能力。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计