




已阅读5页,还剩39页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
* * * 大学操作系统实验报告学 院专 业班 级学 号姓 名学号: 姓名: 实验 一 题目 多级反馈队列调度 第 9 周星期 四 一、实验目的用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解二、实验原理(1)程序开始时设置多个就绪队列,并且各队列的优先级和进程在没一队列中执行的时间片大小也各不相同。程序规定,队列的优先权逐个降低,时间片逐步加长。(2)当一个进程进入内存后,首先把它放在第一队列的尾部,当轮到该进程执行时,若它能在该时间片内完成,即可准备撤离系统,若它在一个时间片结束时尚未完成,则将该进程插入到下一队列的尾部。依次类推。(3)当CPU运行到优先权最低的一个队列时(本实验设计的是三号队列)调度时间片轮转算法。即当三号队列中的进程在该队列的时间片结束时尚未执行完毕或者是在执行进程的过程中发生枪占,便将该进程插入到本队列的尾部。三、流程图Cpu调度进程进程i新进程插入?插入队列尾进程i移队尾CPU调新进程继续执行进程i时间片用完?进程i完成?是否是3号队列中的进程插入队尾将进程i插入下一级队列尾YNYN撤离系统YNYN四、实验说明PCB的设计写在一个结构体中!typedef structint ID;唯一的标志;int Priority;优先级我感觉没用到!int Intime;开始小时数;int fen;开始分钟数;int Alltime;完成需要的时间数。int Spare;剩余的时间CString State;当前的状态;REC;此处的就相当于;主要是个人习惯!程序模拟计算机进程调度,用户把所有进程的ID,Priority,intime,alltime等按照一定的格式写在指定的文件中,程序按照该文件中的PCB,按照各自的调度算法建立队列。程序开始时,利用函数SetTimer(2,500,null),使系统每0.5s调用一次查询程序,看看当前时刻有没有新的进程进入内存.实验的主要算法细节说明:首先从后备队列说起:在后备队列里通过setTimer(0,500,NULL);创建一个进程检查器;标号为0;0.5检查一次是否有进程到了开始时间;如果是则通过setTimer(1,500,NULL);创建一个时间计时器来模拟队列1的时间片,当时间片结束了;如果进程结束了就放到完成队列,如果没有完成就插入下一队列的队尾;如果此时队列1中还有进程,则继续这样做下去直到队列1做玩,如果做完了则时间片的使用权转到队列2。通过setTimer(2,500,NULL)来创建时间计时器,过程与队列1相似。队列3也是同样的做法。当处理器在执行队列2或时若有进程进入队列1时则停止当前执行的进程,如果当前执行的进程在队列2中则推入队列3队尾;如果当前执行的进程在队列中则同样推入队列队尾;五、源程序void CAaView:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call defaultCAaDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);switch(nIDEvent) case 0:/检查后备队列是否到时间 if(clock_fen=59) clock_time+; clock_fen=-1; if(clock_time23) clock_time=0; Look(); clock_fen+; Invalidate(); break;case 1:/队列1的控制 if(clock=1&pDoc-list_1.GetCount()!=0) pDoc-pos=pDoc-list_1.GetHeadPosition(); if(Timeslice10) Timeslice1=Timeslice1-1;pDoc-arr=pDoc-list_1.GetAt(pDoc-pos); pDoc-arr.Spare=pDoc-arr.Spare-5; pDoc-list_1.SetAt(pDoc-pos,pDoc-arr);if(pDoc-list_1.GetAt(pDoc-pos).Sparearr=pDoc-list_1.GetAt(pDoc-pos); pDoc-arr.State=已完成; pDoc-list_4.AddTail(pDoc-arr); pDoc-list_1.RemoveAt(pDoc-pos); Timeslice1=10; Invalidate(); else pDoc-list_2.AddTail(pDoc-list_1.GetAt(pDoc-pos);pDoc-list_1.RemoveAt(pDoc-pos);Timeslice1=10;Invalidate(); else clock=2; KillTimer(1); SetTimer(2,500,NULL); break; case 2:/队列2的控制 if(clock=2&pDoc-list_2.GetCount()!=0) pDoc-pos=pDoc-list_2.GetHeadPosition(); if(Timeslice20)Timeslice2=Timeslice2-1;pDoc-arr=pDoc-list_2.GetAt(pDoc-pos); pDoc-arr.Spare=pDoc-arr.Spare-5; pDoc-list_2.SetAt(pDoc-pos,pDoc-arr);if(pDoc-list_2.GetAt(pDoc-pos).Sparearr=pDoc-list_2.GetAt(pDoc-pos); pDoc-arr.State=已完成; pDoc-list_4.AddTail(pDoc-arr); pDoc-list_2.RemoveAt(pDoc-pos);Timeslice2=20; Invalidate(); else pDoc-list_3.AddTail(pDoc-list_2.GetAt(pDoc-pos);pDoc-list_2.RemoveAt(pDoc-pos);Timeslice2=20;Invalidate(); else clock=3; KillTimer(2); SetTimer(3,500,NULL); break; case 3:/队列3的控制 if(clock=3&pDoc-list_3.GetCount()!=0) pDoc-pos=pDoc-list_3.GetHeadPosition(); if(Timeslice30) Timeslice3=Timeslice3-1;pDoc-arr=pDoc-list_3.GetAt(pDoc-pos); pDoc-arr.Spare=pDoc-arr.Spare-5; pDoc-list_3.SetAt(pDoc-pos,pDoc-arr); if(pDoc-list_3.GetAt(pDoc-pos).Sparearr=pDoc-list_2.GetAt(pDoc-pos); pDoc-arr.State=已完成; pDoc-list_4.AddTail(pDoc-arr); pDoc-list_3.RemoveAt(pDoc-pos);Timeslice3=30; Invalidate(); else pDoc-list_3.AddTail(pDoc-list_3.GetAt(pDoc-pos);pDoc-list_3.RemoveAt(pDoc-pos);Timeslice3=30;Invalidate(); else KillTimer(3); break; default: break;CView:OnTimer(nIDEvent);这是对队列1中的进程进行控制的算法.每当一个进程调度,当其剩余时间0时,则表明在该队列规定的时间片内该进程没有执行完毕,则插入到下一队列的尾部. SetTimer(2,500,NULL);使系统每0.5s调用一次查询程序.pDoc-list_3.AddTail(pDoc-list_3.GetAt(pDoc-pos);pDoc-list_3.RemoveAt(pDoc-pos);对于3号队列,当一个进程运行完毕之后,程序并不将其插入到下一队列中,而是直接将它放到本队列的末尾,进行时间片轮转.六、测试方法及结果进程的信息放在一个.txt文件里面.程序运行时用户可以随时添加新的进程并且不中断当前进程的执行.系统时间设置:为了模拟方便取当前进程中最小的。At Time 1:00*前面三个进程已进入内存*ID Priority in Alltime State1 2 1:00 125 未完成2 3 1:00 50 未完成3 3 1:00 320 未完成*第一个对列的时间片是50当第4个进程进入1号队列时,3进程正在运行,2进程已运行完毕* 4进程刚进入队列的2的情况*ID Priority in spare Alltime State1 2 1:00 75 125 未完成3 3 1:00 270 320 未完成4 1 1:30 150 200 未完成* 4进程刚进入3号队列的情况*ID Priority in spare Alltime State3 3 1:00 170 320 未完成4 1 1:30 50 200 未完成*程序运行完毕的情况*ID Priority in Alltime State2 3 1:0 50 已完成1 2 1:0 125 已完成4 1 1:30 200 已完成3 3 1:0 320 已完成*学号 姓名: 实验 二 题目 主存空间的分配与回收 第 11 周星期 六 一、设计要求1、设计主存分配和回收。采用可变分区存储管理,使用最先适应算法完成设计。2、要求:采用分区说明表进行。设计一个空闲区说明表,设计一个某时刻主存空间占用情况表,作为主存当前使用基础。初始化空闲区和已分配区说明表的值。自己设计一个作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。把空闲区说明表的变化情况以及各作业的申请、释放情况显示、打印出来。二、设计分析内存分配:动态输入构造空闲区表,并显打印示构造好的空闲区表。键盘接收内存申请尺寸大小。根据申请,实施内存分配,并返回分配所得内存首址。分配完后,调整空闲区表(即扣除分配部分),并显示调整后的空闲区表。若分配失败,返回分配失败信息。内存回收动态输入构造空闲区表,并显示构造好的空闲区表。根据空闲区表,按内存回收的四种情况从键盘接收回收区域的内存首址与大小。回收区域,调整空闲区表(与前面空闲区相连、与后面空闲区相连、与前后空闲区相连则合并、与前后空闲区都不相连则插入该项),并显示调整后的空闲区表。三、实现原理 1)本实验采用可变分区管理,使用首次适应算法实现主存的分配和回收1、可变分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需求,并且分区个数是可以调整的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入,作业等待。随着作业的装入、完成,主存空间被分成许多大大小小的分区,有的分区被作业占用,而有的分区是空闲的。为了说明那些分区是空闲的,可以用来装入新作业,必须有一张空闲说明表这个空闲区表可以用数组实现,也可以用链表实现. 用数组实现的空闲区说明表格式如下:起始地址长度状态第一栏45 K20KB未 分 配第二栏110 K146 KB未 分 配空 表 目空 表 目其中,起址指出一个空闲区的主存起始地址,长度指出空闲区的大小。 长度指出从起始地址开始的一个连续空闲的长度。 状态有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的区域是空闲区;另一种是“空表目”状态,表示表中对应的登记项目是空白(无效),可用来登记新的空闲区(例如,作业完成后,它所占的区域就成了空闲区,应找一个“空表目”栏登记归还区的起址和长度且修改状态)。由于分区的个数不定,所以空闲区说明表中应有适量的状态为“空表目”的登记栏目,否则造成表格“溢出”无法登记。为避免表格的溢出,比较简单的办法是构造空闲链表,本实验采用的就是链表.2、采用最先适应算法(顺序分配算法)分配主存空间。按照作业的需要量,查空闲区说明表,顺序查看登记栏,找到第一个能满足要求的空闲区。当空闲区大于需要量时,一部分用来装入作业,另一部分仍为空闲区登记在空闲区说明表中。3. 当一个作业执行完成撤离时,作业所占的分区应该归还给系统,归还的分区如果与其它空闲区相邻,则应合成一个较大的空闲区,登记在空闲区说明表中。例如,在上述中列举的 情况下,如果作业2撤离,归还所占主存区域时,应与上、下相邻的空闲区一起合成一个大的空闲区登记在空闲区说明表中。回收作业占用的内存总共有四种情况,其中三种情况如下,:还有一种是与空闲区F1,F2都不相邻的. 四、程序流程图: 注:这个流程图是首次适应算法的雏形,当演示循环首次算法时,作业分配是从上次分配作业后指针所指的位置.五、源程序/* 使用首次适应算法的模拟,使用空闲分区链*/#include stdio.h#include conio.h#define getpch(type,size) (type*)malloc(sizeof(type)*size)#define MINSIZE sizeof(FQ)*2int memsize;/*模拟的内存大小*/char *memfirst; /*模拟的内存所占的首地址*/int frees=-1;/*free指向模拟内存的空闲分区的首地址*/struct fq/*分区链的结构*/ int link; /*指向前一个空闲分区块或者后一个空闲分区块*/ int size; /*空闲分区的大小*/*p=NULL;typedef struct fq FQ;int insert(int first,int fqsize)/*构造空闲分区时插入空闲分区*/ int tmp,tmp1,a; if(freeslink=-1; /*因为是第一个,前向指针为-1*/ p-size=fqsize; /*printf(%d,(char*)p-memfirst); */ p=(FQ*)(memfirst+first+fqsize-sizeof(FQ); /*在空闲分区的尾部来记录该空闲分区的信息和前向指针*/ p-size=fqsize; p-link=-1; /*因为是第1个,所以后向指针也为-1*/ return 1; else if(firstfrees)/*判断是否有重叠部分*/ printf(空闲分区有部分重叠!); return -1; if(first+fqsize=frees)/*要插入的空闲分区刚好可以和最前面的分区合并,就和最前面的分区合并*/ p=(FQ*)(memfirst+frees); p=(FQ*)(memfirst+frees+p-size)-1; p-size=p-size+fqsize; tmp=p-size; p=(FQ*)(memfirst+first); p-size=tmp; p-link=-1; frees=first; return 1; p=(FQ*)(memfirst+first);/*如果不能合并就把这个空闲分区插入到最前面*/ p-size=fqsize; p-link=-1; p=(FQ*)(memfirst+first+fqsize)-1; p-size=fqsize; p-link=frees; p=(FQ*)(memfirst+frees); p-link=first+fqsize-sizeof(FQ); frees=first; return 1; else/*空闲分区不是应该插入到最前面*/ tmp=frees; p=(FQ*)(memfirst+frees); p=(FQ*)(memfirst+frees+p-size)-1; tmp1=p-link; while(firsttmp1&tmp1!=-1)/*找到应该插入的位置*/ p=(FQ*)(memfirst+tmp1); p=(FQ*)(char*)p+p-size)-1; tmp=tmp1 ; tmp1=p-link; if(tmp1=-1)/*要插入的空闲分区大于所有空闲分区*/ p-link=first; tmp=(char*)p-memfirst; p=(FQ*)(memfirst+first); p-size=fqsize; p-link=tmp; p=(FQ*)(memfirst+first+p-size)-1; p-size=fqsize; p-link=-1; return 1; else if(first+fqsize=tmp1) p=(FQ*)(memfirst+tmp1); a=p-link;/*保存前一空闲分区的尾部*/ p=(FQ*)(memfirst+tmp1+p-size)-1; p-size=p-size+fqsize; fqsize=p-size;/*保存当前的大小*/ p=(FQ*)(memfirst+first); p-size=fqsize; p-link=a; p=(FQ*)(memfirst+a); p-link=first; return 1; p-link=first; tmp=(char*)p-memfirst; p=(FQ*)(memfirst+first); p-size=fqsize; p-link=tmp; p=(FQ*)(memfirst+first+p-size)-1; p-size=fqsize; p-link=tmp1; tmp=(char*)p-memfirst; p=(FQ*)(memfirst+tmp1); p-link=tmp; return 1; return -1;make()/*初始化空闲分区链*/ int first,fqsize; char yn; printf(请输入内存的空间大小(字节为单位):); scanf(%d,&memsize); memfirst=getpch(char,memsize); printf(=下面开始构造空闲分区=n); while(1) printf(请输入空闲分区的首地址:); scanf(%d,&first); if(first0)/*判断首地址是否合法*/ printf(首地址不能小于0!请重新输入!n); continue ; printf(请输入空闲分区的大小:); scanf(%d,&fqsize); if(fqsizesize)-1; next=hou-link ; while(next!=-1) printf(%dtt%dn,(char*)p-memfirst,p-size); p=(FQ*)(memfirst+hou-link); hou=(FQ*)(char*)p+p-size)-1; next=hou-link; printf(%dtt%dn,(char*)p-memfirst,p-size);int freemem()/*回收内存*/ char yn; int first,size,res; FQ *tmp1,tmp2; printf(请输入要回收的内存的首址:); scanf(%d,&first); printf(请输入要回收的内存的大小:); scanf(%d,&size); res=insert(first,size); if(res=1) printf(首址为:%d,大小为:%d有内存已成功回收!n,first,size); return 1; return -1;int requestmen()/*分配内存*/ int size; FQ *tmp,*tmp1; printf(请输入要分配的内存大小:); scanf(%d,&size); if(sizememsize) printf(要分配的内存大小太大或太小!n); return ; p=(FQ*)(memfirst+frees); tmp=p; p=(FQ*)(char*)p+p-size)-1; if(p-size=size) if(p-size-size=2*sizeof(FQ)/*如果剩余空间大于2倍的FQ的大小,就把前面部分分配出去*/ p-size=p-size-size; size=p-size;/*保存新的空闲分区大小*/ tmp1=(FQ*)(char*)(+p)-size); tmp1-size=size; tmp1-link=-1; frees=(char*)tmp1-memfirst; return (char*)tmp-memfirst; else/*如果剩余空间小于2倍的FQ的大小,就把整个空闲分区分配出去*/ frees=p-link; return (char*)tmp-memfirst; while(p-sizelink!=-1) p=(FQ*)(memfirst+p-link); tmp=p; p=(FQ*)(char*)p+p-size)-1; if(p-size=size) if(p-size-size=2*sizeof(FQ) p-size=p-size-size; size=p-size;/*保存新的空闲分区大小*/ tmp1=(FQ*)(char*)(+p)-size); tmp1-size=size; tmp1-link=tmp-link; p=(FQ*)(memfirst+tmp-link); p-link=(char*)tmp1-memfirst; return (char*)tmp-memfirst; else tmp1=(FQ*)(memfirst+tmp-link); tmp1-link=p-link; tmp1=(FQ*)(memfirst+p-link); tmp1-link=tmp-link; return (char*)tmp-memfirst; else if(p-link=-1) printf(没有足够大的内存可分配!n); return -1; return -1;main() char yn; int res; make(); display(); while(1) getchar(); printf(是否分配内存(Y/N)?); scanf(%c,&yn); if(yn=y|yn=Y) res=requestmen(); if(res=-1) printf(分配失败!n); else printf(分配成功!分配的首址为:%dn,res); display(); else getchar(); printf(是否回收内存(Y/N)?); scanf(%c,&yn); if(yn=y|yn=Y) freemem(); display(); else getchar(); printf(是否退出(Y/N)?); scanf(%c,&yn); if(yn=y|yn=Y) break; 六、实验结果:学号: 姓名: 实验 三 题目 文件系统 第 13 周星期 六 一、 实验目的1、 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。2、 要求设计一个n个用户的文件系统,每次用户可以保存M个文件。用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有create、delete、open、close、read、write等命令。二、 实验题目:采用二级目录结构实现磁盘文件操作。要求:1普通文件的目录项包括文件名,文件类型,文件长度,指向文件内容的指针内容。2目录文件的目录项包括目录名,指向下一级目录块的指针内容。假定每个目录文件最多只能占用一个块;3程序功能方面的要求: 需要实现一个命令行操作界面,包含如下命令: 4程序实现方面的要求: (1)、对于重名(创建时),文件不存在(删除时),目录不存在(改变目录时)等错误操作情况,程序应该做出相应处理并给出错误信息,但是程序不得因此而退出。 (2)、界面友好,程序强壮。 (3)、设置界面的提示符,提示的命令以及调试的方法应和前面的要求一致。不要自己设计命令或者附加不要求的功能。 三.实验源程序文件名: Filesystem_s.cpp 执行文件名: Project1.exe 四.实验分析1)总论:该系统是一个多用户、多任务的实时操作系统。对用户和用户的文件数目并没有上限。也就是说该系统允许任何用户申请空间,而且在其目录下的文件数目并不做任何的限制。该系统的操作命令如下:、 bye-用户注销命令。当使用该命令时,用户退出系统。命令格式:runbye系统注销该用户并回到登陆界面。 、 close-删除用户注册信息命令。执行该命令后,用户在系统中的所有信息,包括该用户目录下的所有文件都被删除。命令格式:runclose.完成后返回登陆界面。、 create-在当前目录下创建一个文件,且该文件不能跟系统中的文件重名。该文件的管理信息登录到用户文件信息管理模块中。命令格式:runcreatefile1。其中file1为要创建的文件名称。执行完该命令后回到执行命令行。、 delete-删除当前用户目录下的一个文件。命令格式:rundeletefile1。返回命令行。、 list-显示当前注册目录下的所有文件信息,包括文件名、文件长度、文件操作权限。命令格式:runlist。、 chmod-改变某个文件的执行权限,但前提是该文件是该用户目录下的文件。命令格式:runchmodfile1。、 open-在window界面下打开某个文件。命令格:runopenfile1。执行该命令后,文件file1将用在windows界面下的文件形式打开。用户可以在这个方式中对文件进行修改,并将修改后的内容保存。、 read-读文件信息。将文件信息读入并显示在终端。命令格式:runreadfile1。、 write-向某个文件写入新的信息。用户可以选择用覆盖原来内容的方式和在文件的末尾插入新信息的方式写入信息。 2)_系统采用二级文件目录。设置主目录(MFD)和用户文件目录(UFD),分别以文件的方式保存在磁盘中。在主目录中又注册用户的用户名和另一标志该用户目录下是否有文件的指针标记。用户文件目录用用户名作为文件名保存在磁盘,以便检索时方便对应。在用户文件目录中保存着该目录下所有的文件的文件名称、保护码、文件长度。3) 该系统大量使用高级语言中的文件操作函数,所以能实际看到文件的创建写入、读出、删除等效果。4) 实验流程图开始选项用户登录新用户注册退出程序结束在MFD中找到该用户?初始化命令关键字(keyword)显示该用户目录下的所有文件管理信息11创建文件删除文件打开文件读文件写文件改变权限显示文件保存当前主目录删除用户返回主界面输入命令五、源程序: #include#include#include#include#incl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 垃圾分类竞赛试题及答案
- 2025年大数据技术考试题及答案
- 2026届安徽省淮南市田区化学九年级第一学期期末经典试题含解析
- 2025年教师招聘之《小学教师招聘》考前冲刺练习题库及参考答案详解(巩固)
- 海尔车间安全培训资料课件
- 2025年循环定科考试题及答案
- 2025年闫河三基考试试题及答案
- 2025年教师招聘之《幼儿教师招聘》真题附参考答案详解(能力提升)
- 模拟电路竞赛试题及答案
- 童年知识竞赛试题及答案
- 融资风险评估报告
- 画法几何及土木工程制图课件
- 第2课 树立科学的世界观《哲学与人生》(高教版2023基础模块)
- 录入与排版教学计划
- 2023免拆底模钢筋桁架楼承板图集
- 云计算技术基础应用教程(HCIA-Cloud)PPT完整全套教学课件
- 呼吸衰竭小讲课课件
- 成人学士学位英语1000个高频必考词汇汇总
- 全屋定制家居橱柜衣柜整装安装服务规范
- 沥青及沥青混合料试验作业指导书
- 义务教育阶段学生艺术素质测评指标体系小学音乐
评论
0/150
提交评论