操作系统(一个小型操作系统的设计与实现)课程设计_第1页
操作系统(一个小型操作系统的设计与实现)课程设计_第2页
操作系统(一个小型操作系统的设计与实现)课程设计_第3页
操作系统(一个小型操作系统的设计与实现)课程设计_第4页
操作系统(一个小型操作系统的设计与实现)课程设计_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、南通大学计算机科学与技术学院操作系统课程设计报告专 业: 学生姓名: 学号: 时间:操作系统模拟算法课程设计报告设计要求将本学期三次的实验集成实现:A.处理机管理;B.存储器管理;C.虚拟存储器的缺页调度。设计流程图主流程图A.处理机调度1)先来先服务FCFS先来先服务算法流程2)时间片轮转法开始输入进程总数输入各边 程信息'输出为就绪 状态的进程 的信息指针所指的进程是否结束跳过已结束 的程序更改正在运-N.行的进程的已运行时间输出此时为 就绪状态的 进程的信息*如果存在下一 个进程的话指向下一个进程N+时间片轮转算法流程图结束B.存储器管理(可变式分区管理)1)首次适应法分配流程图

2、首次适应算法回收流程图开始输入完成进程的标号在分配区表中查找释放区p下邻分区空释放区p上邻分区空前一个空闲区的后向 指针指向p的后一个 分区,p的后一个分区 的前向指针指向p的 前一个分区,且 p的 前一个分区大小更改 为加上p的大小,释 放p 前一个分区的后向指 针指向p的后一个空 闲分区,p的后一个空 闲分区的前向指针指 向p的前一个分区, 且p的后一个分区大 小更改为加上 p的大 小释放区p上下均不邻空闲区将p放在链首, 并修改其状态位 为空闲释放区p上下均邻空闲区前一个空闲区的后向指针指向 p的后一个空闲分区,p的后一 个空闲分区的前向指针指向p的前一个空闲分区,且 p的前 一个空闲分

3、区大小更改为加上 p的大小再加上 p的后一个空 闲分区的大小,合并后的这个空闲区的后向指针指向 p的下 下个分区,如果 p的下下个分 区不为空,则其前向指针指向 合并后的这个空I区,释放p和p的下一个分区2)最佳适应法回收内存流程C.虚拟存储器的缺页调度1)先进先出FIFO分配一块FIFO淘汰算法流程2) LRU实现原理LRU淘汰算法流程主界面= 回设计一个框架分别去链接处理机管理、存储器管理和缺页调度相关的程序* *C:Program FilesMicrosoft Visual StudicMyProjectscxlDebugcxl.exeh操作系统课程设计-一1.处理机管理W .存储器管理

4、3 .缺页调度A.处理机调度1)先来先服务FCFS(一)任务先来先服务的调度算法实现处理机调度。(二)要求1 .实现对FCFSB法的模拟实现2 .计算出该算法的平均作业周转时间、平均带权作业周转时间(三)原理按作业到达CPU时间先后顺序进行非剥夺式调度,先到达 CPU的作业先被执行(四)数据结构struct task_struct.进程名称*/进程编号*/到达时间*/开始运行时间*/ 运行时间*/运行结束时间*/优先级*/运行次序*/调度标志*/char name; /* int number; /* float come_time; /* float run_begin_time; /* f

5、loat run_time; /* float run_end_time; /* int priority;/*int order;/*int run_flag; /* tasksMAX;int fcfs()/*先来先服务算法*/进程名 一链接指针一到达时间 估计运行时间一进程状态 进程控制块结构(五)实现方法建立一个链表按照到达CPUK时间从小到大排列,只需从第一个作业(头结点) 依次调度到最后一个作业(尾结点)。作业名到达时间运行时间A028B09C03(六)运行界面 测试数据:执行FCF就法如下:, -'CzXPi ogi dm Filf叁'Mici"口4口ft

6、 ViStudioMyProj-cctacmlD&L?ugcxIsfxt?":墀作系统课程设计工-处理机管5理 2 一存储器管理三一缺页调度1.先率先服务篝法2.时间片轮转菖法”返回开始菜单作业名 到达时间 运行口寸间 开始口寸间 停止口寸间 运行次序 周愫时间自528533128n?¥2371C83424S337聿驾罂蓊曾翰寸献33331 -处理机管理工-存储器管理21.缺页调度2)时间片轮转法(一)任务只对进程的运行模拟,将其运行时间加一,判断要求运行时间与已运行时间 是否相等,若相等则表示进程结束,进程退出调度,释放资源。(二)要求1 .实现对RR算法的模拟实

7、现2 .显示执行完一个时间片的结果。(三)原理时间片轮转算法中,系统将所有的就程序按先来先服务的原则排成一个队歹I,每次调度时,把CPU配给队首进程,并令其执行一个时间片。当执行 的时间片用完时,调度程序停止该进程的执行,并将它送往就绪队列的末尾; 然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时 问片。(四)数据结构temp->state='R' /初始状态每个进程均为运行态temp->allocation=0;/初始时进程均不占用cpunum+=temp->need_time; / 用 num#限制循环的次数(五)实现方法处理器调度总是选

8、择标志单元指示的进程运行。执行:已运行时间+1来模拟进程的一次运行,表示进程已经运行过一个单位的时间。 当一个进程 被选中运行时,必须设置该进程可以运行的时间片值, 以及恢复进程的现场,让 它占有处理器运行,直到出现等待事件或运行满一个时间片进程运行一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。同时,应判断该进程的要求运行时间与已运行时间,若该进程的要求运行时间"已运行时间,则表示它尚未执行结束,应待到下一轮 时再运行。若该进程的要求运行时间=已运行时间,则表示它已经执行结束,应 指导它的状态修改成“结束”且退出队列。此时,应把该进程的进程控制块中

9、的 指针值送到前面一个进程的指针位置。进程名链接指针到达时间估计运行时间 进程状态进程控制块结构(六)运行界面 测试数据:作业号执行时间/sA1B2C1执行时间片轮转算法RW口下:C:Progiam FilesMicroscift Visual StudioMyProjectscxlDebugcxI,exe处理机管理2 ,存储器管理 ”缺页调度1 乙先来先服务算法以时间片轮转算法2.返回开始菜单2MKKMMKMMMKMMJOIMMMMM:* 日寸间 片 丰色岩调占用CX时间 Bs030S占用Rtl时间 03Ptsle占用cpu时间占用时间181S1S占用cpu时间一处理机管理2-存喷器管理3

10、一缺页调度B.存储器管理(可变式分区管理)1)首次适应法(一)任务通过采用首次适应算法实现内存的分配与回收,并可以查看和显示当前内存现 状。(二)要求1 .实现对FF算法的模拟实现2 .输入要进行分配内存的进程ID和相应所需内存大小,回收内存时输入已运行 的进程ID。(三)原理FF算法要求空闲链已地址递增的次序连接。分配内存时,从链首开始顺序查找, 直到找到第一个满足要求的空间并分配给进程,把分配后余下的空间仍然留在链表中。若从链首至链尾都不满足要求,则分配失败。该算法倾向于优先使用低地 址的空间。(四)数据结构int const MEMO=256; 初始化常类型 MEMO用MEM法示内存大小

11、(常类型的 变量或对象的值是不能被更新的)struct FreeMemoryint ID;int StartAdd;int Size;bool State;/ 定义state 为布尔型变量,其值只有真(TRUE)和假(FALSE) FreeMemory* Next;FreeMemory* AllocTable=new FreeMemory;/ 建立全局管理表用于内与回收 FreeMemory* PtrforCycleFit=AllocTable;为循环首次适应定义的指针,止匕指针用于指向当前查找的起始地址;/初始化内存函数void MemoryInit(FreeMemory* &tem

12、pAdd)tempAdd->ID=0;/初始化当前进程为空tempAdd->Size=MEMO;/初始化可分配空间为内存大小tempAdd->StartAdd=0;/ 初始化起始地址为0tempAdd->State=false;/ 初始化状态为未分配 tempAdd->Next=NULL;/初始化下一个进程也为空 /反馈内存现态void DispMemory()FreeMemory* temp=AllocTable;/全局管理表反映内存状态cout<<"系统总内存:"<<MEMO<<endl;for(;tem

13、p;temp=temp->Next)cout<<”进程 ID: "<<temp->ID<<" "<<"大小:"<<temp->Size<<" "<<" 起始地址:"<<temp->StartAdd<<" "<<"是否已分配:"<<temp->State<<endl;/输出内存的各个变量(五)实现

14、方法可变式分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需 要,并且分区的个数是可以调整的。 当需要装入一个作业时,根据作业需要的贮 存量,查看是否有足够的空闲空间,若有,则按需求量分割一部分给作业;若无, 则作业等待。随着作业的装入、完成,主存空间被分割成许多大大小小的分区。有的分区被分配作业占用,有的分区空闲。在空闲区表中,按空闲区首地址从低 到高进行登记。当一个作业执行完成时,作业所占用的分区应归还给系统。 在归还时,要考虑相邻空间区合并问题。作业的释放区与空闲区的邻接分以下4种情况考虑:A、释放区下邻空闲区;B、释放区上邻空闲区;C、释放区上下都与空闲区邻接;D释放区上

15、邻空闲区不邻接。(六)运行界面系统总内存为256时,分别为进程1、2、3分配大小为64、128、64的内存。执行首次适应算法分配内存如下:系统总内存;256进程m 1左小I 64年卷抖.0是百旦目修大小12B 起始地址二64是查京分配二1大小;64 起始讪址:192禀否已分酣门作选择:8123Ex it分配内存 回收内存 显不内存现状若回收进程2的内存,执行结果如下:程皿3大小 祚选择.0 Exit1分配内存2向收内存3显示内存现状64 ±28649 直工:猿:止北止也d也±4.口±-4 口史A口1己已 :-0S 配八Cr已 已否否 杳香TE 是4 22 )最佳适

16、应法(一)任务通过采用最佳适应算法实现内存的分配与回收,并可以查看和显示当前内存现 状。(二)要求1 .实现对BF算法的模拟实现2.输入要进行分配内存的进程ID和相应所需内存大小,回收内存时输入需要回 收的内存块。(三)原理最佳适应算法扫描整个未分配表或链表,从空闲区中挑选一个能满足用户进程要求的最小分区进行分配。此算法保证不会分割一个更大的区域,使得装入大作业的要求容易得到满足,同时,通常把空闲区按长度递增顺序排列,查找时总是从最小的一个空闲区开始,直至找到满足要求的分区为止,这时,最佳适应分配算法等同于首次适应算法。此算法的主存利用率好,所找出的分区如果最好满足要 求则是最合适的。(四)数

17、据结构int const MEMO=256;初始化常类型 MEMO,用MEMO表示内存大小(常类型的变量或对 象的值是不能被更新的)struct FreeMemoryint ID;int StartAdd;int Size;bool State;定义state为布尔型变量,其值只有真 (TRUE)和假 (FALSE)FreeMemory* Next;bool Alloc_BestFit(int id,int TrySize)查找满足此条件的x1<=TrySize<=x2的分区,然后将其放置在 x2中,并将x2拆分成两个分区SortPartition(true);/使用快速排序算法,

18、升序排序for(;temp;temp=temp->Next)/*回收操作,回收过程中,要用到三个指针,上一个 Last,当前temp,下一个temp->next 当temp指向表头或表尾时需要特殊考虑*/当要退出工作时,就要回收此退出的工作由执行函数调用void EndJob(int id)Free_Memory(id);(五)实现方法空闲区设置为双向链表,其双向链的分区格式为:0 (状态位)分区大小(N+2)大小为N的已分配区或空闲区0 (状态位)分区大小(N+2)向后指针(六)运行界面 测试数据如下:进程123456所需内存2534451213100 2址如址如此虬蜒 地地地地

19、地域M A口-J 口-4 口A口台-4 口fine 己-e Tc Tc- nc-i a A 二胃4AT1K . T A0 111* t 1 : : 己 1 :己己已tD :TC & 0S0TT ilJ ffk. hsn 3 Jzy 场已已用汨语 足75 4 S 2 3 0 1 2 3 4 1111二大大大大大大大it配收示 12 3 4 5 6 0 套Exls酮显 田»:凤D=D:D=D;»:出 0 12 3 filIllilSIlllIM执行最佳适应算法为其分配内存如下:若回收进程4,执行结果如下:一总IDID1DIDIDID1D选利 £23存 

20、3;230560.*内择:大大大大大大大起始地址二的是否已分配式 起始地址:25堡蕃已抬谕:1 起始姬岳59是杳已分配二1 起始地址:1,薨杏百分配:0 起於施址:116是否已分1己:工 起始地址壮2,是否已分配:工起始地址:139美苫已分配:0状 现 存存存 内内内 it配收示 EX分回显C.虚拟存储器的缺页调度1)先进先出FIFO(一)任务采用先进先出FIFO算法实现分页管理的缺页调度,并输出每次调入调出的页号 和运行结果。(二)要求1 .实现对FIFO算法的模拟实现2 .输出每次执行的结果。(三)原理基于程序总是按线性顺序来访问物理空间这一假设,总是淘汰最先调入主存的贡 面,即淘汰在主存

21、中驻留时间最长的页面, 认为驻留时间最长的页不再使用的可 能性较大。(四)数据结构void FIFO()int length;int fifo100=0;int pageLength;int fifoPage100=0;*先进先出算法int i,j;cout<<""<<endl;*pageLength=3;length=9;for(i=1;i<=length;i+)int flag=0;for(j=1;j<=pageLength;j+) if(fifoi=fifoPagej) flag=1; j=pageLength+1;else if(

22、fifoPagej=0) fifoPagej=fifoi; j=pageLength+1; flag=1;if(flag=1)elsecout<<"<淘汰"<<fifoPage1<<endl;for(j=1;j<=pageLength;j+)fifoPagej=fifoPagej+1;fifoPagepageLength=fifoi;(五)实现方法当采用先进先出算法时,用一个数组构成先进先出队列,数组中各个元素为进程 已在主存的页号,其队列头指针初始化为0.假设分配给每个进程的内存块数周定。当队列满需淘汰时,淘汰最先进入主存的

23、一页。若该页修改过,还有存入磁 盘。然后要把当前访问的页装入该块,并修改页表和存储分块表的对应标志。(六)运行界面测试数据:页表长度:9;页框长度:3;页面请求数列:4,4,3,5,1,1,2,3,2执行先进先出FIFO算法结果如下:2 ) LRU(一)任务采用先进先出LRU算法实现分页管理的缺页调度,并输出每次调入调出的页号和 运行结果。(二)要求1 .实现对LRU算法的模拟实现2 .输出每次执行的结果。(三)原理最近最少使用页面替换算法淘汰的页面是在最近一段时间内最久未被访问的那 一页,它是基于程序局部性原理来考虑的, 认为那些刚被使用过的页面可能还有 立即被使用,而那些在较长时间内未被使

24、用的页面可能不会立即使用。在分页虚拟存储系统中,当硬件发出缺页中断后转操作系统处理缺页中断。如果主存中已无空闲块,可采用LRU算法进行缺页处理。(四)数据结构void LRU()int length;int lru100=0;int pageLength;int lruPage100=0;int i,j;cout<<"*最近最少使用LRU 算法*"<<endl;pageLength=3;length=9;for(i=1;i<=length;i+)int flag=0;for(j=1;j<=pageLength;j+) if(lrui=lr

25、uPagej)for(int cc=j;cc>0;cc-)lruPagecc=lruPagecc-1;lruPage1=lrui;flag=1;j=pageLength+1;else if(lruPagej=0)for(int vv=j;vv>0;vv-)lruPagevv=lruPagevv-1;lruPage1=lrui;j=pageLength+1;flag=1;if(flag=1)elsef 淘汰"<<lruPagepageLength<<endl;cout<<" for(j=pageLength;j>0;j-)

26、lruPagej=lruPagej-1; lruPage1=lrui; (五)实现方法当采用LRU算法时,用一个数组构成堆栈,堆栈中各个元素为进程已在主存的贡 号,为了进行页面置换,可设置一个栈指针,初始化为0.假定分配给每个进程的内存块数固定不变。当队列满需淘汰时,操作系统选择栈底元素淘汰,其他元 素向下移一个位置,将新调入页放栈指针指示的栈顶。 当访问的页在栈中时,还 应调整页从当前位置到栈顶。(六)运行界面测试数据:页表长度:9;页框长度:3;页面请求数列:2,3,5,1,5,5,4,4,3执行最近最少使用LRU算法结果如下:'C Precjram. F lesXMkfosoft

27、 Visual StudicMyProjectscxDebagXocl.exeHJ先进先出算法2.Lmj算法m,返回开始菜单2* !M X ME * * !M * M fcE少用 L 琳| 白 XXM:F耳时地修1 w Th, - sr ji h- -r234567引用串23515544t rg时P1F2P32目e1Hl时P1P2P332t=2时P1?2P353一淘汰2时P1P2P3153(=4时P1P2P3513时P1P2P351f淘汰3F=6时P1P2P3451(=?时P1P2P341f淘汰1F=8时P1paP334S1 一处理机管理2.存储器管理3 一缺页调度总结与体会通过本次课程设计让

28、我对于图形界面设计有了一定的思路和看法,同时我对先来先服务、时间片轮转、首次适应算法、最佳适应算法、先进先出和最近最少 使用算法有了更详尽的认识。在编程的过程中发现会用到大量的指针, 用指针来 操作大量的数据比较方便,但最后应该记得释放资源。从这次实验中我发现我对 于C+掌握也有所不足,程序经过了多次修改才得以完善,在以后应该注重编程 方面的训练。此外我还更深入的理解了各个进程调度算法,及实现过程。在编写程序时查 询了很多资料,间接提高了我的搜索能力。在此次课程设计过程中,对进程的相 关知识有了一定的加深。特别是对进程的进程控制块的存在和价值有了更进一步 的认识。在编写程序的过程之中,对进程自

29、身信息的设计和管理以及调度的算法 都有助于对书本知识的理解和掌握。特别是设计先来先服务调度算法和时间片轮 转调度算法的时候,对进程的调度算法有了更好的深入理解。 对进程管理中的等 待队列,就绪队列,时间片等概念有了更深刻的印象。在设计此模拟操作系统的课设中,也加深了对 C+知识的把握。解决了一些 以往在编程中遇到了困难。通过此次的课程设计,不仅提高了对操作系统的认知, 也在同时提高了编程的能力,加强了实践。另外,我觉得此次课程设计虽然主要 问题是在编程上,但是经过不断的去调试,还是成功的调试了出来。但是这几个 程序用了多天的时间进行分析和修改,虽然出现了不少问题,但收获颇多!源代码:#incl

30、ude<iostream> #include<cstring> #include <cstddef> using namespace std; int fcfsoutput();/*调度结果输出 int fcfsinput(); / void kaishi();#define MAX 10 struct node char name5; int need_time; int allocation; char state; node *next;struct task_struct char name; int number; float come_time;

31、 float run_begin_time; float run_time; float run_end_time; int priority; int order; int run_flag;tasksMAX;*/进程参数的初始化建立链表来存放进程数据/进程名称所需要的时间占用cpu的情况/目前的状态 R为运行,E为运行完毕链表的尾结点/*进程名称*/*进程编号*/*到达时间*/*开始运行时间*/*运行时间*/*运行结束时间*/*优先级*/*运行次序*/*调度标志*/int counter; /*实际进程个数*/int fcfs()/*先来先服务算法*/fcfsinput();float t

32、ime_temp=0;int i;int number_schedul;time_temp=e_time;for(i=0;i<counter;i+)tasksi.run_begin_time=time_temp;tasksi.run_end_time=tasksi.run_begin_time+tasksi.run_time;tasksi.run_flag=1;time_temp=tasksi.run_end_time;number_schedul=i;tasksnumber_schedul.order=i+1;fcfsoutput();return 0;int fc

33、fsinput()task_struct tt;int i,j;初始化进程数counter=3;初始化每个到达系统的时间为5、7、8e_time=rand()%9;e_time=rand()%9;e_time=rand()%9;for(i=1;i<3;i+)for(j=0;j<3-i;j+)if(e_time>tasksj+1.come_time)tt=tasksj;tasksj=tasksj+1;tasksj+1=tt;/初始化每个进程估计运行的时间 tasks0.run_time=28;tas

34、ks1.run_time=9;tasks2.run_time=3;初始化每个进程的名字='A'='B'='C'cout<<"*先 来 先 服 务* I '<<endl<<endl;for(i=0;i<counter;i+)tasksi.run_begin_time=0;tasksi.run_end_time=0;tasksi.order=0;tasksi.run_flag=0;return 0;int fcfsoutput

35、()/* 调度结果输出 */int i;float turn_round_time=0,f1,w=0;cout<<"作业名到达时间 运行时间 开始时间 停止时间运行次序 周转时间for(i=0;i<counter;i+)f1=tasksi.run_end_e_time;turn_round_time+=f1;w+=(f1/tasksi.run_time);"<<endl;cout<<" "<<<<'t'<<&q

36、uot;"<<e_time<<'t'<<"<<tasksi.run_time<<'t'<<""<<tasksi.run_begin_time<<'t'<<"<<tasksi.run_end_time<<'t'<<tasksi.order<<'t'<<f1<<'t

37、'<<endl;cout<<"平均周转时间: "<<turn_round_time/counter<<endl;cout<<"平均带权周转时间:"<<w/counter<<endl;cout<<"II.return 0;/*/int rr()int n=3,num=0;node *head=NULL;node *tail=NULL;cout<<"*时 间 片 轮 转 调 度*"<<endi<&

38、lt;endi;for(int i=0;i<n;i+) node *temp=new node;if(i=0)strcpy(temp->name,"A");if(i=1)strcpy(temp->name,"B");if(i=2)strcpy(temp->name,"C");temp->need_time=rand()%4+1;temp->state='R'初始状态每个进程均为运行态temp->allocation=0;初始时进程均不占用cpunum+=temp->nee

39、d_time;用num来限制循环的次数if(!head) tail=head=temp; elsetail->next=temp;tail=temp;tail->next=head;node *p;p=head;cout<<endl<<"初始时刻:"<<endl;cout<<"进程"<<'t'<<"剩余时间"<<'t'<<"占用 cpu 时间"<<endl; whi

40、le(p!=tail)cout<<" "<<p->name<<'t'<<" "<<p->need_time<<'t'<<'t'<<p->allocation<<'s'<<endl; p=p->next;cout<<" "<<tail->name<<'t'<<&q

41、uot; "<<tail->need_time<<'t'<<'t'<<p->allocation<<'s'<<endl;node *q;int label=1;int m=1;while(label=1&&m<=num)cout<<endl;label=0;while(!p->need_time)p=p->next;if(p->need_time)(p->need_time-;p->allo

42、cation+;if(p->need_time=0)(p->state='E')label=1;p=p->next;)cout<<"执行"<<m<<"秒后:"<<endl;q=head;cout<<"进程"<<'t'<<"剩余时间"<<'t'<<"占用 cpu 时间"<<endl;while(q!=tail)(c

43、out<<""<<q->name<<'t'<<""<<q->need_time<<'t'<<'t'<<q->allocation<<'s'<<endl;q=q->next;)cout<<""<<tail->name<<'t'<<""<&

44、lt;tail->need_time<<'t'<<'t'<<q->allocation<<'s'<<endl;m+;)cout<<endl<<""return 0;)/*/int const MEMO=256;初始化常类型 MEMO,用MEMO表示内存大小(常类型的变量或对象的值是不能被更新的)struct FreeMemory(int ID;int StartAdd;int Size;bool State;定义state为布尔型变

45、量,其值只有真 (TRUE)和假 (FALSE)FreeMemory* Next;);FreeMemory* AllocTable=new FreeMemory;/ 建立全局管理表用于内存分配与回收FreeMemory* PtrforCycleFit=AllocTable; 为循环首次适应定义的指针,此指针用于指向当前 查找的起始地址;初始化内存函数void MemoryInit(FreeMemory* &tempAdd)tempAdd->ID=0;初始化当前进程为空tempAdd->Size=MEMO;/初始化可分配空间为内存大小tempAdd->StartAdd=

46、0;/初始化起始地址为 0tempAdd->State=false;初始化状态为未分配 tempAdd->Next=NULL;/初始化下一个进程也为空/反馈内存现态void DispMemory()FreeMemory* temp=AllocTable;全局管理表反映内存状态cout<<"系统总内存:"<<MEMO<<endl;for(;temp;temp=temp->Next)cout<<”进程 ID : "<<temp->ID<<""<&l

47、t;"大小:"<<temp->Size<<" "<<"起始地址:"<<temp->StartAdd<<" "<<"是否已分配:"<<temp->State<<endl;/输出内存的各个变量/分区排序void SortPartition(bool order)/在此使用的是快速排序算法FreeMemory* temp1=AllocTable;FreeMemory* temp2=Allo

48、cTable;FreeMemory* Last1=temp1;FreeMemory* Last2=temp2;if(temp2->Next)temp2=temp2->Next;switch(order)case 1:/升序部分for(;temp1;temp1=temp1->Next)for(;temp2;temp2=temp2->Next)if(temp1->Size> temp2->Size)&&!temp1->State&&!temp2->State) 找到符合条件的,则交 换Last1->Next

49、=temp2;Last2->Next=temp1;FreeMemory* temp=temp2->Next;temp2->Next=temp1->Next;temp1->Next=temp->Next;Last2=temp2;Last1=temp1;break;case 0:/降序部分for(;temp1;temp1=temp1->Next)for(;temp2;temp2=temp2->Next)if(temp1->Size < temp2->Size)&&!temp1->State&&!

50、temp2->State)找到符合条件的,则交换Last1->Next=temp2;Last2->Next=temp1;FreeMemory* temp=temp2->Next;temp2->Next=temp1->Next;temp1->Next=temp->Next;Last2=temp2;Last1=temp1;/*内存分配*/bool Alloc_FirstFit(int id, int TrySize)/定义布尔型函数Alloc_FirstFit()/查找一个可用第一个满足分配请求的分区,如果满足将其写入内存分配表否则分配失败,返回Fr

51、eeMemory* temp=AllocTable;for(;temp;temp=temp->Next)if(TrySize<=temp->Size && !temp->State) 第一个满足条件的分区已找到if(TrySize=temp->Size)刚好和申请的大小一致temp->ID=id;保持不变 temp->Next,Size,StartAdd 都不用变temp->State=true; /值为真表示已分配else比所找到的要小,则需要将其拆分FreeMemory* NewItem=new FreeMemory;NewI

52、tem->Next=temp->Next;NewItem->ID=0;NewItem->Size=temp->Size-TrySize;NewItem->StartAdd=temp->StartAdd+TrySize;NewItem->State=false;temp->ID=id;temp->Size=TrySize;temp->State=true;temp->Next=NewItem; return true;/end for return false;bool Alloc_BestFit(int id,int Tr

53、ySize)查找满足此条件的x1<=TrySize<=x2的分区,然后将其放置在 x2中,并将x2拆分成两个分区SortPartition(true);/使用快速排序算法,升序排序FreeMemory* temp=AllocTable;if(temp->Next)temp=temp->Next;for(;temp;temp=temp->Next)if(TrySize<=temp->Size && !temp->State) 第一个满足条件的分区已找到if(TrySize=temp->Size)刚好和申请的大小一致temp-&

54、gt;ID=id;保持不变 temp->Next,Size,StartAdd 都不用变temp->State=true; /值为真表示已分配else比所找到的要小,则需要将其拆分FreeMemory* NewItem=new FreeMemory;NewItem->Next=temp->Next;NewItem->ID=0;NewItem->Size=temp->Size-TrySize;NewItem->StartAdd=temp->StartAdd+TrySize;NewItem->State=false;temp->ID=

55、id;temp->Size=TrySize;temp->State=true;temp->Next=NewItem;return true;/end forreturn false;bool Alloc_Memory(int id, int Algorithm,int TrySize)/ 对算法进行选择 switch(Algorithm)case 1: :return Alloc_FirstFit(id,TrySize);break;case 2:return Alloc_BestFit(id,TrySize);break;default:cout<<"你没有指定算法,系统将默认为首次适应算法!!”<<endl;return Alloc_FirstFit(id,Tr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论