资源描述
湖南工业职业技术学院 操作系统实训报告题目:模拟操作系统五大功能 专业: 软件 实训老师: 完成时间: 2007-12-27 参与人员: 目 录一,设计思想和算法说明31、 进程管理32、 内存管理33、 文件管理34、 文件管理45、 设备管理5二,总功能模块图5三,流程图6CPU管理:6内存管理:6文件管理:74)设备管理:75)作业管理:8四,使用说明8五,程序清单8六,结果分析和调试19CPU管理:19内存管理:19文件管理:19设备管理:20作业管理:20七,资料来源及参考书20一,设计思想和算法说明1、 进程管理进程调度算法有FIFO,优先数调度算法,时间片轮转调度算法,分级调度算法,目前主要是考FIFO和优先数调度算法(静态优先级)。输入:进程流文件”jincheng.txt”,其中存储的是一系列要执行的进程,每个作业包括五个数据项:进程名 进程状态(1就绪 2等待 3运行) 所需时间 优先数(0级最高) 进程所占CPU的资源数。输出:进程执行流 和等待时间 平均等待时间 CPU的使用率。本程序包括:FIFO,优先数调度算法,时间片轮转调度算法2、 内存管理内存调度算法有:最先适应分配算法,最优适应分配算法,最坏适应算法用户提出内存空间的申请;系统根据申请者的要求,按照一定的分配策略分析内存空间的使用情况,找出能满足请求的空闲区,分给申请者;当程序执行完毕或主动归还内存资源时,系统要收回它所占用的内存空间或它归还的部分内存空间。1)程序运行时首先接收输入:空闲区数据文件”fqu.txt”,包括若干行,每行有两个数据项:起始地址、长度(均为整数),各数据项以逗号隔开。2)建立空闲区表并在屏幕上显示输出空闲区表内容,空闲区表中记录了内存中可供分配的空闲区的始址和长度,用标志位指出该分区是否是未分配的空闲区。3)从用户界面根据用户提示接收一个内存申请,格式为:作业名、申请空间的大小。4)按照最差(最坏)适配算法选择一个空闲区,分割并分配,修改相应的数据结构(空闲区表),填写内存已分配区表(起始地址、长度、标志位),其中标志位的一个作用是指出该区域分配给哪个作业。5)重复3)、4),直到输入为特殊字符(0)。6)在屏幕上显示输出新的空闲区表和已分配区表的内容。本程序包括:FIFO,最优适应分配算法,最坏适应算法3、 文件管理主要就是模拟操作系统中的 建立文件、打开文件、读文件、写文件、关闭文件、 、删除文件、建立目录、显示目录内容、显示文件内容、改变文件属性等操作。1 改变目录格式:CD目录名功能:工作目录转移到指定的目录下,只要求完成改变到当前目录的某一个子目录下的功能,不要求实现相对目录以及绝对目录。1)创建文件格式:CREATE文件名文件长度功能:创立一个指定名字的新文件,即在目录中增加一项,不考虑文件内容,但必须能输入文件长度。2)删除文件格式:DEL希望删除的文件名功能:删除指定的文件3)显示目录格式:LSALL功能:显示全部目录以及文件,输出时要求先输出接近根的目录,再输出子目录。4)创建目录格式:MD目录名功能:在当前路径下创建指定的目录5)删除目录格式:RD目录名功能:删除当前目录下的指定目录,如果该目录为空,则可删除,否则应提示是否作删除,删除操作将该目录下的全部文件和子目录都删除。作业调度主要有FIFO,运算时间短的作业优先,优先数调度算法,响应比最高者优先调度算法,均衡调度算法4、 文件管理1)模拟作业调度算法输入:作业流文件“zye.txt”,其中存储的是一系列要执行的作业,每个作业包括三个数据项:作业号、作业进入系统的时间(用一整数表示,如10:10,表示成1010)、估计执行时间(单位分)优先级(0级最高)2)参数用空格隔开,下面是zye.txt文件里面存放的作业:1 800 502 815 303 830 254 835 205 845 156 900 107 920 5其中调度时刻为最后一个作业到达系统的时间!输出作业号!进入内存的时间!每行输出一个作业信息本程序包括:FIFO,运算时间短的作业优先,优先数调度算法,响应比最高者优先调度算法5、 设备管理主要就是模拟操作系统中的设备分配,回收,显示三个功能。定义四个设备类,设备总数量,空闲数量,分别是:Input, 2 , 2printer, 3, 3disk, 4 , 4tape 1, 1分配一个设备,它的空闲数量就少一个,如果回收一个,它就加一个,如果全部分配出去,你在申请的话,它就提示“占时无设备,请等待.”。还加了一个输出设备表。二,总功能模块图模拟操作系统五大功能CPU管理内存管理文件管理作业管理设备管理三,流程图CPU管理:开始打开文件jincheng.txt显示进程状态结束内存管理:开始选择申请空间撤销作业显示退出打开文件fqu.txt结束文件管理:开始选择该变目录创建文件删除文件显示目录结束创建目录删除目录输入exit 否 是4)设备管理:开始选择分配回收显示退出结束5)作业管理:开始打开文件zye.txt显示作业状态结束四,使用说明1) 首先在D盘下建立三张表,表名分别是:jincheng.txt,fqu.txt,zye.txt,它们分别存放cup运行的进程,内存存储的作业,还有作业管理的作业。(1) 第一章表是进程信息表:为jincheng.txtNameztaitimeyouxianzyuanA2505B16010.(2) 第二章表内存分给作业表 fqu.txtAddresslongztai10032free .(3) 第三章表作业分配表:zye.txt IDdtimextimeyouxian18005002815301.2)运行CPU管理首先要输入进程,所以首先输入D盘下的文件jincheng.txt文件。打开它,使数据进程进入该系统里面运行。还有作业管理要输入D盘下的文件zye.txt文件。使作业数据进入系统里面,进行计算。而内存管理侧是,系统一运行,它自动打开文件。使里面的数据读入系统里面来,不用输入文件。另外文件管理就是自己在运行时,自己去创建和操作,修改。设备管理在程序里面以定义规定好,进行分配和调用。五,程序清单#include#include#include#include#include#include/文件管理/ *目录和文件的结构定义*typedef struct filenode char name50; /*目录或文件的名字*/ int type; /*0代表目录,1代表普通文件*/ struct filenode *next; /*指向下一个兄弟结点的指针*/ struct filenode *sub; /*指向第一个子结点的指针*/ struct filenode *father; /*指向父结点的指针*/ char size10; /*如果是文件则表示文件的大小*/dirfilenode;dirfilenode *workDir; /定义当前工作目录dirfilenode root; /定义根目录char path100; /定义路径信息/初始化函数void initial3() strcpy(root.name,root); root.type=0; root.next=NULL; root.sub=NULL; root.father=NULL; strcpy(root.size,文档); workDir=&root; strcpy(path,root);/初始化新结点函数dirfilenode *init5() dirfilenode *p; p=new dirfilenode; strcpy(root.name,); root.type=0; root.next=NULL; root.sub=NULL; root.father=NULL; strcpy(root.size,存档); return p;/1 改变目录void CD(char dirName) dirfilenode *p; int flag=0; p=workDir-sub; if(p=NULL) cout错误,dirName子目录不存在type=0) if(!strcmp(p-name,dirName) flag=1; break; p=p-next; if(flag=1) workDir=p; strcat(path, ); strcat(path,p-name); cout工作目录已进入dirNameendl; elsecout错误,dirName子目录不存在name,fileName); q-sub=NULL; q-type=1; q-next=NULL; q-father=workDir; strcpy(q-size,fileSize); p=workDir-sub; if(p=NULL) workDir-sub=q; coutfileName文件创建成功type=1) if(!strcmp(p-name,fileName) flag=1; cout错误,fileName文件已存在next; if(flag=0) p=workDir-sub; while(p-next)p=p-next; p-next=q; coutfileName文件创建成功sub; if(p=NULL) cout错误,fileName文件不存在type=1) if(!strcmp(p-name,fileName) flag=1; break; p=p-next; if(flag=1) if(p=workDir-sub) workDir-sub=p-next; else q=workDir-sub; while(q-next!=p) q=q-next; q-next=p-next; delete p; coutfileName文件已删除endl; else cout错误,fileName文件不存在type=0) cout.setf(2); coutsetw(14)namesetw(12)endl; else cout.setf(2); coutsetw(14)namesetw(12)setw(10)sizenext; void dirs(dirfilenode *p,char str)/显示 char newstr100; dirfilenode *q; coutstr下子目录及文件:endl; cout名称 类型 属性sub) strcpy(newstr,); strcat(newstr,str); strcat(newstr,); strcat(newstr,q-name); dirs(q-sub,newstr); q=p; while(q-next) if(q-next-sub) strcpy(newstr,); strcat(newstr,str); strcat(newstr, ); strcat(newstr,q-next-name); dirs(q-next-sub,newstr); q=q-next; / 显示所有目录void LSALL() dirfilenode *p; cout显示所有目录结构endl-name,dirName); q-sub=NULL; q-type=0; q-next=NULL; q-father=workDir; strcpy(q-size, ); p=workDir-sub; if(p=NULL) workDir-sub=q; coutdirName子目录创建成功type=0) if(!strcmp(p-name,dirName) flag=1; cout错误,dirName子目录已存在next; if(flag=0) p=workDir-sub; while(p-next) p=p-next; p-next=q; coutdirName子目录创建成功sub; if(p=NULL) cout错误,dirName子目录不存在type=0) if(!strcmp(p-name,dirName) flag=1; break; p=p-next; if(flag=1) if(p=workDir-sub) workDir-sub=p-next; else q=workDir-sub; while(q-next!=p) q=q-next; q-next=p-next; delete p; coutdirName子目录已删除endl; else cout错误,dirName子目录不存在endl; void fun5() int len,flag,comm; char string50,fileSize10; char command10; char name40; char *s; initial3(); flag=1; while(flag) cout endl; cout 模拟文件管理模拟系统 endl; cout endl; cout CD 改变目录 CREATE 创建文件 DEL 删除文件endl; cout LSALL 显示目录 MD 创建目录 RD 删除目录 endl; cout 设计者:pengyingyi endl; cout #,path); gets(string); len=strlen(string); if(len=0) strcpy(command,errer); else /获得命令 s=NULL; s=strchr(string, ); if(s!=NULL) *s=0; strcpy(command,string); /测试命令类型 if(!strcmp(command,CD)|!strcmp(command,cd) comm=1; else if(!strcmp(command,CREATE)|!strcmp(command,create) comm=2; else if(!strcmp(command,DEL)|!strcmp(command,del) comm=3; else if(!strcmp(command,LSALL)|!strcmp(command,lsall) comm=4; else if(!strcmp(command,MD)|!strcmp(command,md) comm=5; else if(!strcmp(command,RD)|!strcmp(command,rd) comm=6; else if(!strcmp(command,EXIT)|!strcmp(command,exit) comm=0; else comm=100; switch(comm) case 1: /1 改变目录 coutname; CD(name); break; case 2: /2 创建文件 coutnamefileSize; CREATE(name,fileSize); break; case 3: /3 删除文件 /strcpy(name,s+1); coutname; DEL(name); break; case 4: /4 显示目录 LSALL(); break; case 5: /5 创建目录 coutname; MD(name); break; case 6: /6 删除目录 coutname; RD(name); break; case 0: /0 退出系统 flag=0; break; default: cout命令错误endl; /文件管理/作业管理/const int MAXJOB1=50; /定义最大作业/定义数据结构体typedef struct node2 int number; int reach_time; int reach_hour; int reach_minite; int need_time; int privilege; float excellent; int start_time; int wait_time; int visited;job1;job1 jobsMAXJOB1;int quantity;/初始化函数void initial2() int i; for(i=0;iMAXJOB1;i+) jobsi.number=0; jobsi.reach_time=0; jobsi.reach_hour=0; jobsi.reach_minite=0; jobsi.privilege=0; jobsi.excellent=0; jobsi.start_time=0; jobsi.wait_time=0; jobsi.visited=0; quantity=0;/重置作业数据函数void reset() int i; for(i=0;iMAXJOB1;i+) jobsi.start_time=0; jobsi.wait_time=0; jobsi.visited=0;/读入作业数据函数void readData2() FILE *fp; char fname20; int i; coutfname; if(fp=fopen(d:zye.txt,r)=NULL) cout错误,文件打不开,请检查文件名:)endl; else while(!feof(fp) fscanf(fp,%d %d %d %d,&jobsquantity.number,&jobsquantity.reach_time,&jobsquantity.need_time,&jobsquantity.privilege); jobsquantity.reach_hour=jobsquantity.reach_time/100; jobsquantity.reach_minite=jobsquantity.reach_time%100; quantity+; /输出初始作业数据 cout输出初始作业数据endl; cout-endl; cout.setf(2); coutsetw(10)作业号setw(12)到达时间setw(14) 所需时间(分)setw(14)1)endl; for(i=0;iquantity;i+) coutsetw(10)jobsi.numbersetw(12)jobsi.reach_timesetw(14)jobsi.need_timesetw(14)jobsi.privilegeendl; /FIFO算法void FIFO1() int i; int current_hour; int current_minute; int total_time=0; /输出作业流 coutendl; coutendlFIFO算法作业流endl; cout-endl; cout.setf(2); coutsetw(10)作业号setw(12)到达时间setw(12) 开始时间setw(14)周转时间(分)endl; current_hour=jobs0.reach_hour; current_minute=jobs0.reach_minite; for(i=0;iquantity;i+) jobsi.start_time=current_hour*100+current_minute; jobsi.wait_time=(current_hour-jobsi.reach_hour)*60+(current_minute-jobsi.reach_minite)+jobsi.need_time; coutsetw(10)jobsi.numbersetw(12)jobsi.reach_timesetw(12)jobsi.start_timesetw(14)jobsi.wait_timeendl; current_hour=current_hour+(jobsi.need_time+current_minute)/60; current_minute=(jobsi.need_time+current_minute)%60; total_time+=jobsi.wait_time; coutendl总周转时间:total_time 平均周转时间:total_time/quantityendl;/运算时间短的作业优先算法void shorter() int i,j,p; int current_hour; int current_minute; int current_need_time; int total_time=0; /输出作业流 coutendl; coutendl时间短作业优先算法作业流(开始调度时刻为最后一个作业到达系统的时间)endl; cout-endl; cout.setf(2); coutsetw(10)作业号setw(12)到达时间setw(14) 所需时间(分)setw(12)开始时间setw(14) 周转时间(分)endl; current_hour=jobsquantity-1.reach_hour; current_minute=jobsquantity-1.reach_minite; for(i=0;iquantity;i+) current_need_time=30000; for(j=0;jquantity;j+) if(jobsj.visited=0)&(jobsj.need_timecurrent_need_time) p=j; current_need_time=jobsj.need_time; jobsp.start_time=current_hour*100+current_minute; jobsp.wait_time=(current_hour-jobsp.reach_hour)*60+(current_minute-jobsp.reach_minite)+jobsp.need_time; coutsetw(10)jobsp.numbersetw(12)jobsp.reach_timesetw(14)jobsp.need_timesetw(12)jobsp.start_timesetw(14)jobsp.wait_timeendl; current_hour=current_hour+(jobsp.need_time+current_minute)/60; current_minute=(jobsp.need_time+current_minute)%60; jobsp.visited=1; total_time+=jobsp.wait_time; coutendl总周转时间:total_time 平均周转时间:total_time/quantityendl;/优先数调度算法void privilege() int i,j,p; int current_hour; int current_minute; int current_privilege; int total_time=0; /输出作业流 coutendl; coutendl优先数调度算法作业流(开始调度时刻为最后一个作业到达系统的时间)endl; cout-endl; cout.setf(2); coutsetw(10)作业号setw(12)到达时间setw(14) 1)setw(12)开始时间setw(14)周转时间(分)endl; current_hour=jobsquantity-1.reach_hour; current_minute=jobsquantity-1.reach_minite; for(i=0;iquantity;i+) current_privilege=30000; for(j=0;jquantity;j+) if(jobsj.visited=0)&(jobsj.privilegecurrent_privilege) p=j; current_privilege=jobsj.privilege; jobsp.start_time=current_hour*100+current_minute; jobsp.wait_time=(current_hour-jobsp.reach_hour)*60+(current_minute-jobsp.reach_minite)+jobsp.need_time; coutsetw(10)jobsp.numbersetw(12)jobsp.reach_timesetw(14)jobsp.privilegesetw(12)jobsp.start_timesetw(14)jobsp.wait_timeendl; current_hour=current_hour+(jobsp.need_time+current_minute)/60; current_minute=(jobsp.need_time+current_minute)%60; jobsp.visited=1; total_time+=jobsp.wait_time; cou
展开阅读全文