您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 操作系统动动态分配管理系统
淮北师范大学《操作系统设计实验报告》题目——动态分区分配管理系统班级:09非师设计者:曹严严指导老师:周影时间:2012/03/14---2012/03/15目录1程序设计的内容和相关的要求-----------------------------------2程序总的功能说明----------------------------------------------3程序的模块的说明----------------------------------------------4程序设计的流程图----------------------------------------------5程序的操作说明及运行结果-------------------------------------6源程序的清单--------------------------------------------------7心得体会------------------------------------------------------1程序设计的内容和相关的要求课程设计的目的:操作系统课程设计是计算机学院重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。进一步巩固和复习操作系统的基础知识。培养学生结构化程序、模块化程序设计的方法和能力。提高学生调试程序的技巧和软件设计的能力。提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能力。实现的任务:编写一个动态分区分配程序。设计内容:用高级语言编写和调试一个动态分区内存分配程序,演示实现下列两种动态分区分配算法1.首次适应算法2.循环首次适应算法设计要求:1.内存中有0-100M的空间为用户程序空间,最开始用户空间是空闲的;2.作业数量、作业大小、进入内存空间、运行时间需要通过界面进行输入;3.可读取样例数据(要求存放在外部文件夹中)进行作业数量、作业大小、进图内存时间、运行时间的初始化;4.根据作业进图内存的时间,采用简单的先进先出原则进行从外村到内存的调度,作业具有等待(从外存进入内存执行)、装入(在内存可执行)、结束(运行结束,退出内存)三种状态。(为了简化,不考虑cpu的调度与切换,运行时间为作业在内存中驻留的时间);5.能够自动进行内存分配与回收,可根据需要自动进行紧凑与拼接操作,所有过程均有动态图形变化的显示;6.采用可视化界面,可随时暂停显示当前内存分配和使用情况图。2程序总的功能说明:本程序可以从界面直接输入作业并进行动态的内存分配,也可以自动地生成作业文件并自行调度进行内存分配,每次分配可以选择两种算法(首次适应算法和循环首次算法)中的一种,每次作业结束后可以进入操作主界面进行再次作业的操作。3程序各模块的功能说明:(1)界面显示函数:showInterface(PLp,Jobjob);显示操作界面showJob(Jobjob);显示作业链表;showPartitiion(PLpl)显示分区链表(2)执行练习的功能函数:copyJob(Jobp);作业链表复制函数函数InitpartitionList(PL&p);链表初始化分区函数函数CreateJoblist(Job&job,intcount);创建作业链表函数InsertNode(Jobp,Job&job);按时间顺序创建链表函数InitpartitionList(PL&p);初始化分区链表函数(3)文件函数openFile();打开文件函数ReadFile();读取文件函数RandomParameter();随即参数读入文件函数main()///主函数4程序设计的流程图:总体设计流程图:动态分区分配界面作业生成退出操作界面输入自动生成文件生成方式123分配方式首次适应循环首次适应应123作为一个整体首次适应算法:开始接受作业作业n--执行·进入内存回收释放空间结束Intime==timeWaitingjobstate(0或1)空闲分区状态(0或1)n=0作业等待序列YNYNY0010回收函数:5程序操作说明书及结果在vc++6.0环境中运行本程序,先进行编译,然后再进行链接,在进行执行将会出现显示界回收函数回收区在空闲分区前不连接回收连接回收回收区在空闲分区间回收区在空闲分区后面。按照显示界面上显示的提示进行操作,就可以实现相应的功能:1.运行进入操作主界面:6源程序清单#includetime.h#includeconio.h#includestdio.h#includestdlib.h#includewindows.h#defineMemorySize100//为空闲分区分配的最大空间(按题目要求)intworkload;//输入作业的数量;typedefstructjobList{intid;//作业的nameintsize;//作业大小(需要的存储空间大小)intintime;//进入时间intruntime;//运行时间intstate;//作业的状态(0表示等待,1表示执行,2表示结束并释放)structjobList*next;//作业链表指针}*Job;typedefstructpartitionList{intid;intstartAddress;//分区起始地址intsize;//分区大小intstate;//分区的状态structpartitionList*prior;structpartitionList*next;//分区链表指针}*PL;FILE*fp;/************************打开文件***************************/voidopenFile(){if((fp=(fopen(D:\\作业文件.txt,w)))==NULL){printf(无法打开文件!\n);exit(0);}}/************************读取文件****************************/voidReadFile(){if((fp=(fopen(D:\\作业文件.txt,r)))==NULL){printf(无法打开文件!\n);exit(0);}}/************将随机产生进程的参数写入文件********************/voidRandomParameter(){openFile();for(inti=0;iworkload;i++){fprintf(fp,%d%d%d%d%d\n,i+1,rand()%80,rand()%20,rand()%10+1,0);}fclose(fp);}/**********************显示分区函数**********************/voidshowPartitiion(PLpl){printf(\t***************************************\n);printf(\t*StartAddr\tid\tsizestate*\n);printf(\t***************************************\n);while(pl){printf(\t*%d\t\t%d\t%d\t%d*,pl-startAddress,pl-id,pl-size,pl-state);printf(\n);pl=pl-next;}printf(\t***************************************\n);Sleep(1000);if(kbhit()==1)system(“pause”);}/******************按进入时间顺序创建一个作业链表*********************/voidInsertNode(Jobp,Job&job)//将创建的新结点插入到链表中{Jobq1,q2;q1=job;q2=job-next;inti=0;if(!q2){p-next=q2;q1-next=p;}while(q2!=NULL&&q2-intimep-intime){q1=q2;q2=q2-next;i=1;}if(!q2&&i==1){p-next=q2;q1-next=p;}if(q2!=NULL&&p-intime=q2-intime){p-next=q2;q1-next=p;}}JobCreateJoblist(Job&job,intcount)//创建作业链表{job=(Job)malloc(sizeof(jobList));if(!job)exit(0);job-next=NULL;Jobp;printf(id\tsize\tintime\truntime\n);for(inti=0;icount;i++){p=(Job)malloc(sizeof(jobList));if(!p)exit(0);scanf(%d\t%d\t%d\t%d,&p-id,&p-size,&p-intime,&p-runtime);p-state=0;if(p-size100){printf(作业过大不能为之分配内存,请重新输入的作业:\n);scanf(%d\t%d\t%d\t%d,&p-id,&p-size,&p-intime,&p-runtime);p-state=0;InsertNode(p,job);}elseInsertNode(p,job);}returnjob;}/******************从外部文件读入数据并进行作业初始化*****************/JobReadInitJob(Job&job){ReadFile();job=(Job)malloc(sizeof(jobList));if(!job)exit(0);job-next=NULL;Jobp;for(inti=0;iworkload;i++){p=(Job)malloc(sizeof(jobList));if(!p)exit(0);fscanf(fp,%d%d%d%d%d,&p-id,&p-size,&p-intime,&p-runtime,&p-state);InsertNode(p,job);}returnjob;}/*********************初始化分区链表***********************/PLInitpartitionList(PL&p){p=(PL)malloc(sizeof(partitionList));if(!p)exit(0);p-size=MemorySize;printf(输入分区首地址:);scanf(%d,&p-startAddress);p-state=0;p-id=0;p-next=NULL;p-prior=NULL;returnp;}/*************将一个作业链表复制到另一个链表***************/JobcopyJob(Jobp){Jobq,L,s=p,r;L=(Job)malloc(sizeof(jobList));L-next=NULL;r=L;s=s-next;while(s){q=(Job)malloc(sizeof(jobList));q-id=s-id;q-state=0;q-intime=s-intime;q-runtime=s-runtime;q-size=s-size;r-next=q;q-next=NULL;r=q;s=s-next;}returnL;}/*************将一个分区链表复制到另一个链表***************/PLcopypartition(PLp){PLq,L,s=p,r;L=(PL)malloc(sizeof(partitionList));
本文标题:操作系统动动态分配管理系统
链接地址:https://www.777doc.com/doc-3836463 .html