操作系统课程设计报告-进程调度的模拟实现_第1页
操作系统课程设计报告-进程调度的模拟实现_第2页
操作系统课程设计报告-进程调度的模拟实现_第3页
操作系统课程设计报告-进程调度的模拟实现_第4页
操作系统课程设计报告-进程调度的模拟实现_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

操作系统课程设计报告专业计算机科学与技术学生姓名班级学号指导教师完成日期博雅学院题目:进程调度的模拟实现的模拟实现一、设计目的本课程设计是学习完“操作系统原理”课程后进行的一次全面的综合训练,通过课程设计,更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。在多道程序和多任务系统中,系统内同时处于就绪状态的进程可能有若干个。也就是说能运行的进程数大于处理机个数。为了使系统中的进程能有条不紊地工作,必须选用某种调度策略,选择一进程占用处理机。要求学生设计一个模拟处理机调度算法,以巩固和加深处理机调度的概念。二、设计内容1)概述选择一个调度算法,实现处理机调度。设计要求:1)进程调度算法包括:时间片轮转法,短作业优先算法,动态优先级算法。2)可选择进程数量3)本程序包括三种算法,用C或C+语言实现,执行时在主界面选择算法(可用函数实现),进入子页面后输入进程数,(运行时间,优先数由随机函数产生),执行,显示结果。2)设计原理1进程控制块的内容如下:进程名进程状态要求运行时间优先数链接指针其中优先数是赋给进程的优先级调度时总是选取优先数最大的进程优先运行2每个进程的优先数,运行时间,由程序任意指定。3为了调度方便,把进程按给定优先级(动态优先级算法中)从小到大排成一个队列。按给定运行时间(短作业优先)从小到大排成一个队列用一个变量作为队首指针,指向队列的第一个进程。4处理机调度总是选队首进程运行。由于本实验是模拟处理机调度,所以被选中的进程并不实际的启动运行,而是执行:优先数-1(动态优先级算法中)要求运行时间-1来模拟进程的一次运行。5进程运行一次后,若要求运行时间不等于0,则再将它加入队列(动态优先级算法中:按优先数大小插入。),且改变队首指针:若要求运行时间=0,则把它的状态改为完成(C)状态,且退出队列。6若就绪队列不空,则重复上述的4和5,直接所有的进程成为完成状态。7在所设计的程序中应有显示或打印语句,以显示或打印每次被选中的进程的进程名以及运行一次后进程队列的变化。3)详细设计及编码N开始初始化PCB,输入进程信息各进程按优先数从高到低排列YN就绪队列为空就绪队列首进程投入运行时间片到,运行进程已占用CPU时间加1运行进程已占用CPU时间已达到所需的运行时间使运行进程的优先数减1把运行进程插入就绪队列Y进程已完成撤销改进程结束1. 流程图如下2. 实验分析(1)PCB结构通常包括以下信息:进程名,进程优先数,轮转时间片,进程已占用的CPU时间,进程还需要的CPU时间,进程的状态,当前队列指针等。可根据实验的不同,PCB结构的内容可以作适当的增删(2)本程序用两种算法对五个进程进行调度,每个进程可有三个状态:就绪、执行、完成。并假设初始状态为就绪状态。 (3)为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。 (4)在优先数算法中,优先数可以先取值为一个常数减去进程所需要的时间片数目,进程每执行一次,优先数减3,CPU时间片数加1,进程还需要的时间片数减1。在轮转算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了2个单位),这时,CPU时间片数加2,进程还需要的时间片数减2,并排列到就绪队列的尾上。(5)对于遇到优先数一致的情况,采用FIFO策略解决。3.概要设计(1)本程序用两种算法对五个进程进行调度,每个进程可有三个状态,并假设初始状态为就绪状态。(2)为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。(3)在优先数算法中,优先数的值为50与运行时间的差值,即P_TIME-process-needtime。进程每执行一次,优先数减3,CPU时间片数加1,进程还需要的时间片数减1。在轮转算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了2个单位),这时,CPU时间片数加2,进程还需要的时间片数减2,并排列到就绪队列的尾上。(4)对于遇到优先数一致的情况,采用FIFO策略解决4.详细设计(1)struct pcb() 定义pcb块(2)Void display() 显示结果信息函数(3)int process_finish(pcb *q) 进程完成标示(4)void display_round() 显示循环轮转调度算法运行结果(5)priority_cal() 优先数调度算法(6)void cpu_round()处理器的工作状态5.源程序代码#include #include #include #include #include #include#define P_NUM 5 #define P_TIME 50 enum stateready, execute, block, finish; struct pcbchar name4; int priority; int cputime; int needtime; int count; int round; state process; pcb * next; ; pcb * get_process(); pcb * get_process() pcb *q; pcb *t; pcb *p; int i=0; coutinput name and timeendl; while (iq-name; cinq-needtime; q-cputime=0; q-priority=P_TIME-q-needtime; q-process=ready; q-next=NULL; if (i=0) p=q; t=q; elset-next=q;t=q; i+; /while return p; void display(pcb *p)coutname cputime needtime priority stateendl; while(p) coutname; cout ; coutcputime; cout ; coutneedtime; cout ; coutpriority; coutprocess) case ready:coutreadyendl;break; case execute:coutexecuteendl;break; case block:coutblockendl;break; case finish:coutfinishnext; int process_finish(pcb *q) int bl=1; while(bl&q) bl=bl&q-needtime=0; q=q-next; return bl; void cpuexe(pcb *q)pcb *t=q; int tp=0; while(q) if (q-process!=finish)q-process=ready;if(q-needtime=0)q-process=finish; if(tppriority&q-process!=finish) tp=q-priority;t=q; q=q-next; if(t-needtime!=0)t-priority-=3; t-needtime-; t-process=execute; t-cputime+; void priority_cal() pcb * p; system(cls);p=get_process(); int cpu=0; system(cls); while(!process_finish(p) cpu+; coutcputime:cpuendl; cpuexe(p); display(p); /Sleep(100);getch(); system(cls); printf(All processes have finished,press any key to exit); getch(); void display_menu() coutCHOOSE THE ALGORITHM:endl; cout1 PRIORITYendl; cout2 ROUNDROBINendl; cout3 EXITendl; pcb * get_process_round() pcb *q; pcb *t; pcb *p; int i=0; coutinput name and timeendl; while (iq-name; cinq-needtime; q-cputime=0; q-round=0; q-count=0; q-process=ready; q-next=NULL; if (i=0) p=q; t=q; else t-next=q; t=q; i+; /while return p; void cpu_round(pcb *q) q-cputime+=2; q-needtime-=2; if(q-needtimeneedtime=0; q-count+; q-round+; q-process=execute; pcb * get_next(pcb * k,pcb * head)pcb * t; t=k; do t=t-next; while (t & t-process=finish); if(t=NULL) t=head; while (t-next!=k & t-process=finish) t=t-next; return t; void set_state(pcb *p) while(p) if (p-needtime=0) p-process=finish; if (p-process=execute)p-process=ready; p=p-next; void display_round(pcb *p) coutNAME CPUTIME NEEDTIME COUNT ROUND STATEendl; while(p) coutname; cout ; coutcputime; cout ; coutneedtime; cout ; coutcount; cout ; coutround; coutprocess)case ready:coutreadyendl;break; case execute:coutexecuteendl;break; case finish:coutfinishnext; void round_cal() pcb * p; pcb * r; system(cls); p=get_process_round();int cpu=0; system(cls); r=p; while(!process_finish(p) cpu+=2; cpu_round(r); r=get_next(r,p); coutcpu cpuendl; display_round(p); set_state(p); /Sleep(100); getch();system(cls); void main() display_menu();int k; scanf(%d,&k); switch(k) case 1:priority_cal();break; case 2:round_cal();break; case 3:break; display_menu(); scanf(%d,&k); 4)结果及分析 程序主界面运用优先度调度算法的执行结果一直按回车到第38次运行结束运用循环轮转调度算法的执行结果一直按回车20次得到结果5)设计小结处理机调度问题实际上是处理机分配问题。只有那些参与竞争处理机所必须的资源都已得到满足的进程才能享受竞争处理机的资格,这时它们处于内存就绪状态。这些必须的资源包括内存、外设及有关数据结构等。作业调度程序必须先调用存储管理、外设管理,分配资源,让它们能有竞争资格。为了提高资源利用

温馨提示

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

评论

0/150

提交评论