资源描述
高档操作系统实验报告
姓 名:
学 号:
专 业:
任 课 教 师:
01 月18
目 录
一、课程设计题目和目 1
二、课程设计规定 1
三、程序设计思想 1
四、文献系统实现 2
1.数据构造设计 2
2.程序功能图 3
3.实体关系图 3
4.数据流图 4
5.程序流程图 5
(1) .建立文献:create(文献名,记录长度) 6
(2) .写文献:write(文献名,开始位置,字符串) 7
(3) .读文献:read(文献名,开始位置,长度) 8
(4) .显示文献所有内容 type(文献名) 8
(5) .删除文献delete(文献名) 9
(6) .重命名文献ren(文献名,新文献名) 10
(7) .查询文献属性ask(文献名) 11
(8) .关闭文献close(文献名) 12
五、程序运营成果及分析 13
六、课程设计总结 15
七、参照文献 16
八、附录 17
一、课程设计题目和目
通过模仿文献系统实现,进一步理解操作系统中文献系统理论知识,加深对教材中重要算法理解。同步通过编程实现这些算法,更好地掌握操作系统原理及实现办法,提高综合运用各专业课知识能力。
二、课程设计规定
通过组长分工,我重要完毕了如下几种功能操作:
1.创立文献:从命令中得到文献名,得到该文献文献长度,建立文献。修改目录表。
4.读文献:read [文献名] [显示开始字节] [显示字节数] ,直接显示所需要字节数。
5.写文献:write [文献名] [插入位置] [插入内容]
6.修改属性:修改文献属性 文献名,文献权限,文献长度等。
三、程序设计思想
阅读操作系统方面书籍,理解操作系统文献系统原理。结合分析课程设计规定,拟定实体以及它们之间关系。实体关系有三张表(磁盘空间分派表、文献表、打开文献表)、一种模仿磁盘数组、命令服务和顾客构成。顾客负责输入命令。命令服务实现命令解释、命令检查、命令协助以及调用有关模块执行相应命令功能。
文献夹打开是则把文献夹名称及其地址压入打开文献夹栈,文献关闭则把文献夹名称及其地址从打开文献夹栈中抛出。
文献打开则把文献名称及其父指针写到文献列表同步置文献打开标志为1,文献关闭则把文献从打开列表中删除,同步置文献打开指针为0,文献读取和写入都要检查文献与否在文献打开列表中,未打开文献不能读写,只读文献不能写,只写文献不能读。
文献夹和文献创立,文献夹和文献创立一方面检查目录与否为空,为空则把文献夹或文献连接到该目录下,不为空则把检查目录下与否有同名文献夹或文献,有则提示创立不成功,没有则把文献夹或文献连接到该目录下最后一种子节点,作为它兄弟节点。
文献夹和文献删除,文献夹下没有打开文献或文献没有打开才干删除,否则删除失败,删除文献夹时运用了中序历遍来删除子树。
四、文献系统实现
1.数据构造设计
通过度析课程设计规定,详细设计出如下数据构造:
① typedef struct uof //文献属性
{
char filename[14]; //文献名字
int mode; //文献权限0-readonly;1-writeonly;2-read/write
int length; //文献长度
int addr; //物理块号
int state; //0-建立,1-建立
int readptr;
};
通过构造体,将文献名字、文献在磁盘开始位置、文献长度、文献最大长度、文献类型、创立时间结合在一起。文献类型,本模仿程序使用txt类型。设立一种线性表来存储文献。
2.程序功能图
模仿文献系统
创立文献
删除文献
条件读取
写入文献
查询属性
显示内容
显示目录
重命名文献
关闭文献
文献系统提供文献操作有建立文献(create)、删除文献(delete)、条件读取文献(read)、写入文献(write)、查询文献属性(ask)、显示文献所有内容(type)、重命名文献(ren)、关闭文献(close)。可以通过键盘输入命令来模仿文献操作。通过exit命令退出程序。
3.实体关系图
用 户
命令服务
模仿磁盘
磁盘空间分派表
文献表
打开文献表
命令服务使得顾客可以输入命令,在需要时提供命令协助。同步可以分析命令,调用相应命令模块对模仿磁盘、磁盘空间分派表、文献表、打开文献表进行操作。磁盘空间分派表记录模仿磁盘使用状况。文献表记录文献信息和在磁盘里位置等信息。打开文献表记录已打开文献,相应文献表中文献信息,和文献表里文献节点类似,记录了文献在模仿磁盘中信息。
4.程序流程图
模仿文献系统提供文献操作有建立(create),读取(read),显示(type),删除(detele),写入(write),关闭(close),重命名(ren)和查询(ask)。在模仿程序中可从键盘上输入文献操作命令来模仿各顾客程序中所调用各种文献操作,用一种结束命令(exit)停止程序执行。
开始
系统格式化
Y/N
/
输入命令
命令表中有该命令?
分析命令
显示:命令协助
无
创立
删除
读取
显示
重命名
写入
查询
列表
关闭
退出程序(exit)
执行命令
执行命令
(1) .创立文献:create(文献名,记录长度)
模仿文献系统进行“创立文献”解决流程如下:
开始
查询文献表
文献表中有名字?
返回
有
显示重命
申请磁盘空间
空间申请成功?
显示失败
否
返回
无
在磁盘分派表中登记
登记:长度=0,最大长度=申请长度,开始位置=申请节点位置
空闲状况=占用
在文献表中登记
登记:长度=0,最大长度=建立长度,开始位置=分派位置
文献类型=txt,时间=当前时间
在打开文献表中登记
登记:信息和文献表中类似
显示创立成功
返回
(2) .写文献:write(文献名,开始位置,字符串)
模仿文献系统进行“建立文献”解决流程如下:
开始
查询打开文献表
查询文献表
在打开文献表里?
不在
在文献表里?
显示无文献
返回
不在
写进模仿磁盘
在
在
读取文献记录
write参数合法?
合法
显示成功
返回
显示参数非法
非法
(3) .读文献:read(文献名,开始位置,长度)
模仿文献系统进行“读取文献”解决流程如下:
开始
查询文献表
在打开文献表里?
不在
在文献表里?
显示无文献
返回
不在
在
在
读取文献记录
read参数合法?
非法
显示参数非法
返回
依照参数读取模仿磁盘里记录
返回
合法
五.实验程序阐明:
1.创立文献:
2.打开文献:
3.写文献:
4.修改文献属性:
六、课程设计总结
通过本次课程设计,使我可以对的运用操作系统课程中所学基本理论和知识,加深了对文献系统基本概念理解,以及磁盘文献系统文献操作。尚有让我感受挺深是对软件工程办法应用。设计一种软件,先要做好需求分析,这一点很重要,如果没有分析好需求,到软件设计最后,发现所做功能不符合规定,那么一切都得重做,前面所有努力都付诸东流。在程序设计开始,由于分析工作做得不够进一步和细致,吃了点小苦头。对于这样一种小设计来说,都会吃苦头,要是大工程更是无法想像,有也许会项目失败。后来得加强对软件工程学习。此外在运用C语言时候,感觉有点生疏,在组织语言时时而出错,在编程和调试过程中,经常会浮现意想不到问题,并非每个问题都可以从有关资料中找到解决办法,有些问题是无法预料到,这就需要通过自己理性分析得出问题解决方案。
在设计过程中,查询了不少有关资料,不断发现问题、提出问题、解决问题。在对自己所编写源程序段纠错过程中,使我更好理解了操作系统中文献系统理论知识,同步在编程时用到了模块化设计思想,这种编程办法可以使咱们编程变更简朴,可以使咱们查错与纠错变更以便。总来说通过这次设计学习使我学到了诸多在平时学习中学不到诸多东西,通过这次课程设计,使我对操作系统和编程产生兴趣,我想我会在这条路上继续迈进下去。我相信,只要不断严格规定自己,注意培养自己思维能力,就一定会有更大更辉煌发展和提高。
七、参照文献
[1][美]Abraham Silberschatz Peter Baer Galvin Greg Gagne 郑扣根 译.OPERATING SYSTEM CONCEPTS[Sixth Edition] 操作系统概念.高等教诲出版社,,01
[2](美)Roger S.Pressman 著 梅宏 译.软件工程-实践者研究办法.机械工业出版社,,09
[3]蔡启先.C语言程序设计教程(第二版).重庆大学出版社,,07
[4]朱战立.数据构造.西安电子科技大学出版社,,05
八、附录
1.程序源代码及注释
////////////////////////////////////////////////////////////
// 编译工具:Visual c++ 6.0 //
// //
// 作者:~小楚*smill~ 、蓝色天空 //
// 邮件: //
// //
// 复制、传播请保存作者信息,谢谢! //
// //
////////////////////////////////////////////////////////////
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
void fileCreate(char *fileName,int fileLenght); //创立文献
void fileDel(char *fileName); //删除文献
void fileRead(char *fileName,int postion,int lenght);
void fileWrite(char *fileName,int position,char *s); //函数声明
void fileAsk(char *fileName); //查询文献属性
void fileType(char *fileName); //显示文献内容
void fileRen(char *fileName,char *newName); //重命名文献
void fileDir(); //列出所有文献
void fileClose(char *fileName); //关闭一种文献
int requestDisk(int *startPosition,int *maxLength);//分派磁盘空间
/////////////////////////////////
//模仿磁盘空间
char disk[10000];
///////////////////////////////
//磁盘空间管理
struct freeDiskTable
{
int start; //开始位置
int length; //占用长度
int maxLength; //最大长度
int useFlag; //使用标志,1为占用,0为空闲
};
//////////////////////////////////
//文献表
struct fileTable
{
char fileName[20]; //文献名字
int start; //开始位置
int length; //文献长度
int maxLength; //最大长度
char fileKind[8]; //文献种类,此默以为txt
struct tm *timeinfo;//文献创立时间
};
////////////////////////////////
//打开文献表
struct openFileTable
{
char fileName[20]; //文献名字
char fileKind[8]; //文献类型
int start; //文献开始位置
int length; //文献长度
int maxLength; //最大长度
int openCount; //打开文献进程数
struct tm *timeinfo;//文献创立时间
};
//////////////////////////////
typedef struct freeDiskTable LinDataType;//定义链表数据类型
#include "LinList.h" //链表操作集合
SLNode *freeDiskTableHead; //定义磁盘分派表链表 头指针
#define MaxSize 100 //定义线性表 最大长度
typedef struct fileTable SeqDataType;//定义线性表数据类型
#include "SeqList.h" //线性表操作集合
SeqList L;//文献表,模仿文献操作嘛,文献数不多,故可以用 线性表,简化操作^_^
struct openFileTable OFT[10]; //打开文献表数组
int OFT_count=0; //打开文献表占用长度
void main()
{
struct orderTable //命令表
{
char name[8];
};
char orderInput[30]; //存储顾客输入命令字符串
char orderName[8]; //命令名字
char fileName[20]; //命令参数1,是文献名字
char parameter2[6]; //命令参数2,是个数字
char parameter3[30]; //命令参数3,是字符串或数字
struct orderTable u[9]; //命令表
int i=0;
int flag=0; //顾客输入串 读写位置 标志
int flagOrder=-1;
/////////////////////////////////////
LinListInitiate(&freeDiskTableHead);//磁盘空间分派键表初始化
struct freeDiskTable temp;
temp.length=0;
temp.maxLength=10000;
temp.start=0;
temp.useFlag=0;
if(!LinListInsert(freeDiskTableHead,0,temp))
{
printf("初始磁盘空闲表失败!");
system("pause");
exit(0);
}
/////////////////////////////////////
//文献表初始化
SeqListInitiate(&L);//初始化 文献表
/////////////////////////////////////
for(i=0;i<2;i++)
for(int j=0;j<2;j++)
{
system("color fc");
printf("\n\n\n\n\n\n\n\n\n 计 046 何珠举 操作系统课程设计\n");
for(int k=0;k<30000000;k++);
system("cls");
system("color f3");
printf("\n\n\n\n\n\n\n\n\n 计 046 何珠举 操作系统课程设计\n");
for(k=0;k<30000000;k++);
system("cls");
}
system("color 17"); //设立背景色 和 前景色
////////////////////////////////////////////////////////////
//初始化命令表
strcpy(u[0].name,"create");
strcpy(u[1].name,"delete");
strcpy(u[2].name,"read");
strcpy(u[3].name,"write");
strcpy(u[4].name,"ask");
strcpy(u[5].name,"type");
strcpy(u[6].name,"ren");
strcpy(u[7].name,"dir");
strcpy(u[8].name,"close");
////////////////////////////////////////////////////////////
while(1)
{
printf("\n");
printf("|******************************************************|\n");
printf("|* create-创立 delete-删除 read-读取 write-写入 *|\n");
printf("|* ask-查询 type-显示 ren-重命名 dir-显示文献 *|\n");
printf("|* close-关闭文献 *|\n");
printf("|* 输入'命令 ?'获得协助,例如'create ?',exit-退出程序 *|\n");
printf("|******************************************************|\n");
printf("请输入命令:>");
fflush(stdin); //清空缓冲区
gets(orderInput); //获取顾客输入串
if(!strcmp(orderInput,"exit"))exit(0);//当顾客输入 exit 退出程序
system("cls"); //清屏
for(i=0;orderInput[i]!=' '&&orderInput[i]!='\0';i++)//以空格为界 分解顾客输入串
{
orderName[i]=orderInput[i];
}
flag=i;//保存读写指针
if(flag>6) //命令名长度 不大于6
{
printf("输入命令有误,请重新输入!\n");
continue ;
}
orderName[i]='\0';
flagOrder=-1; //初始化标志位,flagOrder 指明命令在命令表中位置
for(i=0;i<9;i++)
{
if(!strcmp(orderName,u[i].name))
{
flagOrder=i; //记录命令位置,以便访问
break;
}
}
if(flagOrder==-1)
{
printf("你输入命令有误!请重新输入!\n");
continue ;
}
/////////////////////////////////////////////////////
//以空格为界,分解字符串,分解出第一种字符串放到fileName中
for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='\0';i++)
{
fileName[i-flag-1]=orderInput[i];
}
fileName[i-flag-1]='\0';//为字符串数组 置一种结束标志
/////////////////////////////////////////////////////
flag=i; //下一种字符串 读写指针
if(!strcmp(fileName,"?")) //显示命令协助
{
switch(flagOrder)
{
case 0:
printf("创立一种文献 格式 create [filename][filelength]\n");
printf("例如:create a1 1000 ,将创立名为a1,长度为1000字节文献\n");
break;
case 1:
printf("删除一种文献 格式 delete [filename] \n");
printf("例如:delete a1,将删除名为a1文献\n");
break;
case 2:
printf("读取一种文献 格式 read [filename][postion][length]\n");
printf("例如:read a1 8 3,从a1文献第8个字节开始,显示3字节内容\n");
break;
case 3:
printf("写一种文献 格式 write [fileName][postion][conten] \n");
printf("例始:write a1 15 test,从a1文献第15字节开始写入 test 字符串\n");
break;
case 4:
printf("显示文献属性,格式 ask [filename]\n");
printf("例如 ask a1 ,将显示文献 a1属性\n");
break;
case 5:
printf("显示文献所有内容,格式 type [filename]\n");
printf("例如 type a1,将显示文献 a1所有内容\n");
break;
case 6:
printf("重命名一种文献,格式 ren [oldFileName][newFileName]\n");
printf("例如ren a1 b1 ,将a1改名为b1\n");
break;
case 7:
printf("显示所有文献,例如 dir,将显示所有文献\n");
break;
case 8:
printf("关闭文献,格式 close [fileName]\n");
printf("例如,close a1,将关闭文献a1\n");
break;
default:
printf("命令错误");
}
getch();
}
else
{
switch(flagOrder)//对相应命令 进行参数解决
{
case 0:
{
int Temp[4]={1,10,100,1000};
int sum=0;
int len=0;
for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='\0';i++)
{
parameter2[i-flag-1]=orderInput[i];
}
parameter2[i-flag-1]='\0';//为字符串数组 置一种结束标志
flag=i;
len=strlen(parameter2);//求字符串数组长度
for(i=0;i<len;i++) //把第二个参数 字符串变成整数
sum=sum+((int)parameter2[len-i-1]-48)*Temp[i];
fileCreate(fileName,sum);//将命令和参数 传给建文献模块执行
}
break;
case 1:
fileDel(fileName);//删除文献
break;
case 2:
{
int Temp[4]={1,10,100,1000};
int sum=0;
int len=0;
int sum2=0;
//////////////////////////////////////////////////////////
for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='\0';i++)
{
parameter2[i-flag-1]=orderInput[i];
}
parameter2[i-flag-1]='\0';
flag=i;
len=strlen(parameter2);//求字符串数组长度
for(i=0;i<len;i++) //把第二个参数 字符串变成整数
sum=sum+((int)parameter2[len-i-1]-48)*Temp[i];
///////////////////////////////////////////////////////////
for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='\0';i++)
{
parameter3[i-flag-1]=orderInput[i];//把第三个参数变成整型
}
parameter3[i-flag-1]='\0';
flag=i;
len=strlen(parameter3);
for(i=0;i<len;i++)
sum2=sum2+((int)parameter3[len-i-1]-48)*Temp[i];
fileRead(fileName,sum,sum2);//调用读文献模块
}
break;
case 3:
{
int Temp[4]={1,10,100,1000};
int sum=0;
int len=0;
//////////////////////////////////////////////////////////
for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='\0';i++)
{
parameter2[i-flag-1]=orderInput[i];
}
parameter2[i-flag-1]='\0';
flag=i;
len=strlen(parameter2);//求字符串数组长度
for(i=0;i<len;i++) //把第二个参数 字符串变成整数
sum=sum+((int)parameter2[len-i-1]-48)*Temp[i];
///////////////////////////////////////////////////////////
for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='\0';i++)
{
parameter3[i-flag-1]=orderInput[i];//获取第三个参数,为字符串
}
parameter3[i-flag-1]='\0';
flag=i;
//////////////////////////////////////////////////////////
fileWrite(fileName,sum,parameter3);//调用写文献模块
}
break;
case 4:
fileAsk(fileName);//查询文献属性
break;
case 5:
fileType(fileName); //显示文献内容
break;
case 6:
{
for(i=flag+1;orderInput[i]!=' '&&orderInput[i]!='\0';i++)
{
parameter2[i-flag-1]=orderInput[i];
}
parameter2[i-flag-1]='\0';
flag=i;
fileRen(fileName,parameter2);
}
break;
case 7:
fileDir();
break;
case 8:
fileClose(fileName);
break;
default:
printf("错误!没有可执行命令");
}
}
}
}
//以上主函数,主函数进行数据构造定义 分析顾客输入命令。
//提供命令协助。把命令和参数,传递给执行模块
//////////////////////////////////////////////////////////////////////
void fileCreate(char *fileName,int fileLength)//没有写到打开文献表
{
int i=0;
time_t rawtime;
int startPosition=0;//文献开始位置,等磁盘分派函数 返回值
int maxLength=fileLength;
struct fileTable temp;
for(i=0;i<L.size;i++)
if(!strcmp(fileName,L.list[i].fileName)) //判断与否重名,如果重名直接返回
{
printf("文献重名,请取别名字!\n");
return ;//文献重名,退出创立函数
}
if(!requestDisk(&startPosition,&maxLength))
{
printf("申请磁盘空间失败!无法建立文献!\n");
return ;//申请磁盘空间失败,退出创立函数
}
strcpy(temp.fileName,fileName);
strcpy(temp.fileKind,"txt");//设立文献类型为 txt
temp.length=0; //创立时候,还没写入内容,是空文献,长度设为0
temp.maxLength=fileLength; //文献最大长度
temp.start=startPosition; //文献开始位置
time(&rawtime);//获取时间
temp.timeinfo=localtime(&rawtime);//把时间写到构造体里去
if(!SeqListInsert(&L,L.size,temp)) //把文献 插入到文献表
{
printf("插入文献表失败!\n");
system("pause");
exit(0);//把文献插入到 文献表,如果失败,退出程序
}
printf("成功创立文献!\n\n");
printf("===========================================\n");
printf("文献名 长度 最大长度 类型 开始位置\n");//显示刚建立文献
printf("%s ",temp.fileName);
printf("%d ",temp.length);
printf("%d ",temp.maxLength);
printf("%s ",temp.fileKind);
printf("%d ",temp.start);
printf("\n===========================================\n");
printf("create进程打开了文献%s,关闭请用close命令
展开阅读全文