(论文)进程调度算法的模拟操作系统 课程设计最新优秀毕业论文资料搜集呕血奉献_第1页
(论文)进程调度算法的模拟操作系统 课程设计最新优秀毕业论文资料搜集呕血奉献_第2页
(论文)进程调度算法的模拟操作系统 课程设计最新优秀毕业论文资料搜集呕血奉献_第3页
(论文)进程调度算法的模拟操作系统 课程设计最新优秀毕业论文资料搜集呕血奉献_第4页
(论文)进程调度算法的模拟操作系统 课程设计最新优秀毕业论文资料搜集呕血奉献_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

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

文档简介

目录目录课题1: 进程调度算法的模拟51设计目的52任务及要求52.1设计任务及要求53算法及数据结构53.1算法的总体思想(流程)53.2数据结构模块63.2.1功能63.2.2数据结构63.3随机数字产生方法模块63.3.1功能63.3.2算法63.4先到先服务(FCFS)模块73.4.1功能73.4.2数据结构73.4.3算法73.5SJF(最短作业优先)调度算法模块73.5.1功能73.5.2数据结构83.5.3算法83.6优先级调度算法模块103.6.1功能103.6.2数据结构103.6.3算法103.7RR时间片轮转调度算法模块123.7.1功能133.7.2数据结构133.7.3算法133.8主函数模块143.8.1功能143.8.2数据结构143.8.3算法143.9进程的初始化模块163.9.1功能163.9.2数据结构163.9.3算法164实验结果及分析174.1实验结果174.1.1先到先服务算法演示:174.1.2SJF(最短作业优先)调度算法演示:194.1.3优先度调度算法演示:204.1.4RR(轮转法)调度算法演示:254.2结果分析27课题2: 系统动态分配资源的模拟301设计目的302任务及要求302.1设计任务及其要求303算法及数据结构303.1算法的总体思想(流程)303.2数据结构模块313.3随机数字产生方法模块324.2.1功能324.2.2数据结构324.2.3算法323.4用户自定义模块323.4.1功能323.4.2数据结构323.4.3算法323.5打印系统现在状态模块343.5.1功能343.5.2数据结构343.5.3算法343.6打印系统安全状态变化模块353.6.1功能353.6.2数据结构353.6.3算法363.7进程申请资源模块373.7.1功能373.7.2数据结构373.7.3算法373.8选择菜单模块413.8.1功能413.8.2数据结构413.8.3算法413.9系统自动生成系统状态模块423.9.1功能423.9.2数据结构423.9.3算法423.10主函数模块433.10.1功能433.10.2数据结构433.10.3算法434实验结果及分析444.1实验结果444.1.1用户自定义演示444.1.2系统自动生成504.2结果分析50课题3:内存的置换算法演示511设计目的512任务及要求512.1设计任务及其要求513算法及数据结构513.1算法的总体思想(流程)513.1.1先进先出页面置换算法(FIFO)513.1.2最近最少使用算法(LRU)513.1.3最佳置换算法(OPT)523.1.4最近最不经常使用置换算法(NUR)523.2先进先出的算法(FIFO)523.2.1功能523.2.2数据结构523.2.3算法523.3最近最少使用算法(LRU)543.3.1功能543.3.2数据结构543.3.3算法543.4最佳淘汰算法(OPT)563.4.1功能563.4.2数据结构563.4.3算法563.5最近最不经常使用算法(NUR)583.5.1功能583.5.2数据结构583.5.3算法583.6主函数模块603.6.1功能603.6.2数据结构603.6.3算法604实验结果及分析614.1实验结果614.1.1先进先出的算法(FIFO)614.1.2最近最少使用算法(LRU)634.1.3最佳淘汰算法(OPT)654.1.4最近最不经常使用算法(NUR)664.2结果分析6868进程调度算法课题1: 进程调度算法的模拟1 设计目的同时通过用C语言编程实现进程调度的算法,更好地掌握操作系统的原理及实现方法2 任务及要求2.1 设计任务及要求1用语言来实现对n个进程采用不同调度算法的进程调度。2每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:(1)进程编号ID,其中0为闲逛进程,用户进程的标识数为1,2,3。(2)进程优先级Priority,闲逛进程(idle)的优先级为0,用户进程的优先级大于0,且随机产生,优先数越大,优先级越高。(3)进程占用的CPU时间CPUtime,进程每运行一次,累计值等于4。(4)进程总共需要运行时间Alltime,利用随机函数产生。(5)进程状态,0:就绪态;1:运行态;2:阻塞态。(6)队列指针next,用来将多个进程控制块PCB链接为队列。3优先数改变的原则(1)进程在就绪队列中每呆一个时间片,优先数增加1。(2)进程每运行一个时间片,优先数减3。4在调度前,系统中拥有的进程数PCB_number由键盘输入,经初始化后,所有的进程控制块PCB链接成就绪队列。3 算法及数据结构3.1 算法的总体思想(流程)对于先到先服务算法,只需要给定每个进程的进程号,然后依次顺序执行就可以了。对于SJF(最短作业优先)调度算法需要判断作业的alltime时间,alltime最小的最先执行,依次按照时间的从小到大执行进程。对于优先度调度算法,需要先判断优先度的大小,优先度最大的先执行,进程运行完毕以后,按照优先数的改变的原则进行改变,然后继续判断所有的优先数的大小,依旧是优先数最大的先执行,直到执行完毕。对于RR时间片轮转调度算法,需要依次执行时间片用完即阻塞,转交给下一个进程执行,直到所有进程运行完毕。3.2 数据结构模块3.2.1 功能进程的结构体声明与函数的声明3.2.2 数据结构struct Processint Pro_Id; /进程编号IDint Priority; /进程优先级,随机产生int CPUtime; /进程占用的CPU时间CPUtimeint Alltime; /进程共需运行时间 ,随机产生int State; /进程状态struct Process * Next;/*函数声明*/intrandom_num();/随机数字产生struct Process * INITIAL(int *n);/进程的初始化int printall(struct Process * P1 );/打印所有进程的具体信息int get_maxpri(struct Process * P1);/获取优先度最高的进程号int get_mintime(struct Process * P1); /获作业时间最短的进程号void alert_status(struct Process * P1,int m);/修改进程的状态void alert_pri(struct Process * P1,int m); /修改进程的优先度void FCFS(struct Process * Head); /先来先服务算法void Priority(struct Process *Head,int n); /优先级调度算法struct Process * alert_sjf(struct Process *P2,int m);/修改sjf算法状态void SJF(struct Process *Head,int n) ; /SJF调度算法void RR(struct Process *Head,int n); /RR时间片调度算法3.3 随机数字产生方法模块3.3.1 功能随机产生数字,用于进程初始化时的优先度与alltime赋值3.3.2 算法/*随机数字产生方法*/int random_num()int m;m=rand()%100;if (m=0)m=1; return m;/随机数函数结束3.4 先到先服务(FCFS)模块3.4.1 功能模拟进程的先到先服务调度算法,按照进程编号依次运行。3.4.2 数据结构void FCFS(struct Process * Head); /先来先服务算法printall(struct Process * Head);/打印所有进程信息3.4.3 算法/*先来先服务算法*/void FCFS(struct Process * Head) struct Process * P1,*P2; P1=Head; while(P1!=NULL) P1-State=1; /printf(%3d n,P1-State); P2=Head; printall(P2);printf(按任意键,继续演示.n);getchar(); P1-CPUtime=P1-Alltime; P1-State=3; /printf(%3d号进程运行完毕n,P1-Pro_Id); / Sleep(1000+P1-Alltime*10); P1=P1-Next; /while P2=Head; printall(P2); printf(演示结束,谢谢。n);/FCFS结束3.5 SJF(最短作业优先)调度算法模块3.5.1 功能将每个进程与其下一个CPU区间段相关联。当CPU为可用时,它会赋给具有最短后续CPU区间的进程。如果两个进程具有同样长度的CPU区间,那么可以使用FCFS调度来处理。3.5.2 数据结构void SJF(struct Process *Head,int n)SJF的主函数,用于调度SJF算法int get_mintime(struct Process * P1)获取所有进程中最小时间的进程,返回进程号struct Process * alert_sjf(struct Process *P2,int m)进程运行以后,修改进程的状态3.5.3 算法/*SJF调度算法*/void SJF(struct Process *Head,int n) int m; int i; struct Process *P2,*P; P=NULL; for(i=0;iState=3;P-CPUtime=P-Alltime;P=NULL;printf(按任意键,继续演示.n);getchar();P2=Head;printf(n所有进程运行结束。nn);printall(P2);printf(SJF算法演示完毕,谢谢使用n);/*获取进程最短时间*/ int get_mintime(struct Process * P1)int k,m;k=1001;m=0;while(P1!=NULL)if(k P1-Alltime &P1-State!=3)k=P1-Alltime;m=P1-Pro_Id;/ifP1=P1-Next;/whilereturn m;/*修改sjf算法状态*/struct Process * alert_sjf(struct Process *P2,int m)struct Process *P1,*P;int k=0;P1=P2;P=NULL;while(1)if(P1-Pro_Id=m)P1-State=1;P=P1;k=1;/ifelseP1=P1-Next;if(k=1)break;/whilereturn P; 3.6 优先级调度算法模块3.6.1 功能1.每个进程被赋予一个优先级数字(优先权)2.CPU分配给优先权高的进程(优先级数字越小,则优先权越大)3.6.2 数据结构void Priority(struct Process *Head,int n)优先度调度算法主函数,用于优先度算法的调度;int get_maxpri(struct Process * P1)获取进程中最大优先度的进程,并返回进程号void alert_pri(struct Process * P1,int m)程序运行以后,修改进程的信息优先度,按照以下规则:1.进程在就绪队列中每呆一个时间片,优先数增加1。2.进程每运行一个时间片,优先数减3。void alert_status(struct Process * P1,int m)程序运行以后修改进程的状态3.6.3 算法/*优先级调度算法*/void Priority(struct Process *Head,int n) struct Process *P1,*P2; int key=0; int m; P1=Head; P2=Head; /printf(%dn,n); /printf(%dn,key); while(key Priority;m=P1-Pro_Id;while(P1-Next!=NULL)if(k Next-Priority)k=P1-Next-Priority;m=P1-Next-Pro_Id;/ifP1=P1-Next;/whilereturn m;/*修改进程的优先度*/void alert_pri(struct Process * P1,int m)struct Process * P2;int k;k = 0;P2 = P1;while(P2 != NULL)if(P2-Priority0)if(P2 - Pro_Id != m)P2 - Priority = P2 - Priority + 1;/ifelseP2 - Priority = P2 - Priority - 3;/elseif(P2-PriorityPriority=0;P2-State = 3;/if/ifP2=P2-Next;/while/修改进程优先度函数结束/*修改进程的状态*/void alert_status(struct Process * P1,int m)struct Process * P2;/int status;P2=P1;while(P2!=NULL)if(P2-Pro_Id=m)P2-State=1;/ifelseif(P2-State=1)P2-State=2;/elseP2=P2-Next;/while/修改进程状态结束3.7 RR时间片轮转调度算法模块3.7.1 功能如果就绪队列中有n个进程,且时间片为q,则每个进程会得到1/n的CPU时间,每个长度不超过q时间单元。每个进程必须等待CPU的时间不会超过(n-1)q个时间单元,直到它的下一个时间片为止3.7.2 数据结构void RR(struct Process *Head,int n)RR调度算法的主函数,用于RR调度的算法3.7.3 算法/*RR时间片调度算法*/void RR(struct Process *Head,int n)struct Process *P2,*P1;int m=n;P2=Head;printall(P2);printf(按任意键,继续演示.);getchar();P2=Head;P1=Head;while(1)while(P1!=NULL)if(P1-State!=3)P1-State=1;printall(P2);printf(按任意键,继续演示.n);getchar();P2=Head;if(P1-CPUtime+4 Alltime)P1-State=2;P1-CPUtime=P1-CPUtime+4;elseP1-CPUtime=P1-Alltime;P1-State=3;printf(%d号进程已经运行完毕!nn,P1-Pro_Id);m-;/else/ifP1=P1-Next;/whileif(m=0)break;elseP1=Head;P2=Head;printall(P2);printf(时间片轮转算法演示结束,谢谢使用。n);3.8 主函数模块3.8.1 功能用于程序与用户的交互操作,由用户选择模拟实验的算法,并执行相应的算法。3.8.2 数据结构int main()3.8.3 算法/*主函数*/int main()struct Process *Head,*P1;int a;int k=1;/int m;int n;n=0;while(k=1)system(cls);P1=NULL;Head=NULL;srand(int)time(NULL);/该语句只需要一次递交种子就可以printf(*实验模拟开始*n);printf(n);printf(n);printf(n);printf( 1.先到先服务调度算法;n);printf( 2.SJF(最短作业优先)调度算法;n);printf( 3.优先度调度算法;n);printf( 4.RR(轮转法)调度算法;n);printf( 5.退出;n);printf(n);printf(n);printf(n);printf(*n);printf(请输入您的选择:);scanf(%d,&a);while(a!=1 & a!=2 & a!=3 & a!=4 & a!=5)printf(对不起,您的选择有误,请重新选择);scanf(%d,a);/whileif(a=1|a=2|a=3|a=4)P1=INITIAL(&n);Head=P1;printall(P1);printf(初始化进程已完成.n);printf(n按任意键实验开始演示:);getchar();getchar();switch (a)case 1 :FCFS(Head);break; case 2 : SJF(Head,n); break;case 3 :Priority(Head,n);break;case 4 :RR(Head,n);break;case 5 :printf(感谢您使用该系统.再见n);k=0;break;/switchprintf(n);printf(n);printf(n);if(a=1|a=2|a=3|a=4)printf(按任意键回到主菜单.);getchar();/while/main3.9 进程的初始化模块3.9.1 功能用于由用户输入进程数以后,对进程的初始化,并利用随机函数,随机生成进程的优先度与alltime,并赋值。3.9.2 数据结构struct Process * INITIAL(int *n)3.9.3 算法/*进程的初始化*/struct Process * INITIAL(int *n)struct Process *P1,*Head,*P2;int a=0;int i=0;P1=P2=Head=NULL;/*进程的输入*/doprintf(please input PCB_number(请输入进程数):n);scanf(%d,&a);while(a=0);/do.while/*/P1 = (struct Process *)malloc(sizeof(struct Process);Head = P1;for(i = 1 ; i Pro_Id=i;P1-Priority=random_num();P1-CPUtime=0;P1-Alltime=random_num();P1-State=0;if(i=a)break;P2=(struct Process *)malloc(sizeof(struct Process);P1-Next=P2;P1=P2;/forP1-Next=NULL;*n=a;return Head;/初始化函数结束4 实验结果及分析4.1 实验结果4.1.1 先到先服务算法演示:4.1.2 SJF(最短作业优先)调度算法演示:4.1.3 优先度调度算法演示:4.1.4 RR(轮转法)调度算法演示:4.2 结果分析1.int random_num()/*随机数字产生方法*/int m;srand(int)time(NULL);m=rand()%100; /*/return m;这个函数导致随机数产生以后,所有 的随机数都是一个数。问题原因是:随机种子是传递给操作系统的,不是传递给函数的,所以,不必多次调用。在一个程序中,种子只产生一次即可。也就是说:srand(int)time(NULL);这句只出现在main函数里一次就可以修改后运行结果:2.进程开始执行以后当所有进程都结束后。程序一直在运行,结束不了。加入变量key表示已经完成的进程作为解决办法,但是当用指针处理的时候,发现打印出的是key的地址,但是用的是*key,最后只能用printall返回一个值表示有进程完成。解决了问题,不明白为什么用*key不能打印出数字而是地址。修改加入变量后结果是:3.再次选择优先度算法时,运行输入一个进程的时候发现直接没有运行提示程序运行完毕原因是第一次运行完成后,没有把key置0导致第二次运行的时候出现key=n,不执行while循环。修改后执行:4.实现第二个调度方法(优先度调度算法)的时候,一直是按照优先度为零的时候结束程序,后来发现矛盾,。应该是cputime=alltime的时候结束进程。需要修改,但是问题又来了。设计要求是优先级要大于0,如果优先级等于0时,cputime!=alltime怎么办?暂时按照优先级等于零为运行结束。系统动态分配资源模拟课题2: 系统动态分配资源的模拟1 设计目的在计算机操作系统中,最有代表的避免死锁的算法,是Dijkstra银行家算法。这是由于该算法能用于银行系统现金贷款的发放而得名的。为了加深对该算法的认识和掌握,进而在计算机上实现。为了实现银行家算法,系统中必须设置若干数据结构。2 任务及要求2.1 设计任务及其要求编程序模拟银行家算法,要求能体现算法的全过程3 算法及数据结构3.1 算法的总体思想(流程)1 银行家算法中的数据结构(1) 可利用资源向量Available.这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变.(2) 最大需求矩阵Max.这是nm的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求.(3) 分配矩阵Allocation.这也是一个nm的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数.(4) 需求矩阵Need. 这也是一个nm的矩阵,用以表示每一个进程尚需的各类资源数.上述三个矩阵间存在下述关系:Needi,j=Maxi,j-Allocationi,j2 银行家算法设Requesti是进程Pi的请求向量,如果Requestij=K,表示进程Pi需要K个Pj类型的资源.当Pi发出资源请求后,系统按下述步骤进行检查:(1) 如果Requestij=Needi,j,便转向步骤2;否则认为出错,因为它所需要的资源数已超出它所宣布的最大值.(2) 如果Requestij=Availablei,j, 便转向步骤3;否则,表示尚无足够资源, Pi须等待.(3) 系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值: Availablej:= Availablej- Requestij;Allocationi,j:= Allocationi,j+ RequestijNeedi,j:=Needi,j-Requestij;(4) 系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态.若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待.3 安全性算法系统所执行的安全性算法可描述如下:(1) 设置两个向量: 1 工作向量Work:它表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行安全算法开始时, Work:=Available;2 Finish:它表示系统是否有足够的资源分配给进程,使之运行完成.开始时先做Finishi:=false;当有足够资源分配给进程时,再令Finishi:=true.(2) 从进程集合中找到一个能满足下述条件的进程:1 Finishi:=false;2 Needi,j= Workj;若找到,执行步骤3,否则,执行步骤4.(3) 当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行: Workj:= Workj+ Allocationi,j; Finishi:=true;go to step2;(4) 如果所有进程的Finishi:=true都满足,则表示系统处于安全状态;否则,系统处于不安全状态.3.2 数据结构模块#include #include #include #include #include #include /*定义全局变量*/int Available10; /可使用资源向量int Max1010=0; /最大需求矩阵int Allocation1010=0; /分配矩阵int Need1010=0; /需求矩阵int Work10; /工作向量int Finish10; /状态标志int Request10; /进程申请资源向量int n=3; /系统资源总数int m=5;/总的进程数int pro10;/进程的顺序/*函数声明*/int check_request(int Request,int k);int check_request1(int Request,int c);3.3 随机数字产生方法模块4.2.1 功能生成随机数4.2.2 数据结构int random_num()4.2.3 算法/*随机数字产生方法*/int random_num()int m;m=rand()%10;if (m=0)m=1; return m;/随机数函数结束3.4 用户自定义模块3.4.1 功能用于用户自定义系统状态3.4.2 数据结构void user_initial()int check_request(int Request,int k)int check_request1(int Request,int c)3.4.3 算法void user_initial()int i;int j;printf(请输入系统总共有的资源数:);scanf(%d,&n);printf(请输入总共有多少个进程:);scanf(%d,&m);for(i=0;in;i+) printf(系统中%c类资源可用的资源实例:,i+65); scanf(%d,&Availablei);for(i=0;im;i+)for(j=0;jn;j+)printf(进程P%d对%c类资源的最大需求量:,i,j+65);scanf(%d,&Maxij);for(j=0;jn;j+)printf(该进程已经拥有的%c类资源数:,j+65);scanf(%d,&Allocationij);Needij=Maxij-Allocationij;int check_request(int Request,int k)int j; for(j=0;jn;j+) if(Requestj=Needkj) ;/当 RequestjNeedcj时,所需的资源已经超过它宣布的最大值 break; return 1;int check_request1(int Request,int c) int j;int count=0;for(j=0;jn;j+)if(Requestj=Availablej)count+;elsereturn 0;break;if(count=m)for(j=0;jm;j+)/试探性分配Availablej=Availablej-Requestj;Allocationcj=Allocationcj+Requestj;Needcj=Needcj-Requestj; return 1;3.5 打印系统现在状态模块3.5.1 功能打印系统现在状态3.5.2 数据结构void printall()3.5.3 算法void printall()int i;int j;int k;printf(n系统进程信息:nn);printf(-目前占有资源-最大需求资源量-尚需资源-n);printf(n进程 | );for(j=1;j4;j+)for(i=0;in;i+)printf(%c类 ,i+65);printf( | );printf(n);for(k=0;km;k+)printf(P%d,k);printf( | );for(j=0;jn;j+)printf(%-2d ,Allocationkj);printf( | );for(j=0;jn;j+)printf(%-2d ,Maxkj);printf( | );for(j=0;jn;j+)printf(%-2d ,Needkj);printf( | );printf(n);printf(n系统剩余资源: );for(i=0;in;i+)printf(%-2d ,Availablei);3.6 打印系统安全状态变化模块3.6.1 功能打印系统安全状态变化3.6.2 数据结构void printall_work()3.6.3 算法void printall_work()int i;int j;int k;printf(n系统进程信息:nn);printf(-Work-Need-Allocation-Work+Allocation-Finish-n);printf(n进程 | );for(j=1;j5;j+)for(i=0;in;i+)printf(%c类 ,i+65);printf( | );printf(n);for(k=0;km;k+)printf(P%d,k);printf( | );for(j=0;jn;j+)printf(%-2d ,Workj);printf( | );for(j=0;jn;j+)printf(%-2d ,Needkj);printf( | );for(j=0;jn;j+)printf(%-2d ,Allocationkj);printf(

温馨提示

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

评论

0/150

提交评论