资源描述:
《实验1:进程调度》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、沈阳工程学院学生实验报告(课程名称:操作系统)实验题目:进程调度班级计算机学号姓名地点F608指导教师实验日期:2017年4月11日批阅教师(签字):成绩:一、实验目的进程调度问题是OS的核心内容。本实验要求用高级语言编写和调试一个程序来模拟进程调度算法。通过本实验可以加深理解有关调度技术、进程控制块、进程队列的概念,并体会和了解进程调度算法的具体实施办法。二、实验环境硬件环境:Intel Pentium Processor 1.8G ,512M内存,windows 操作系统。软件环境:vc++6.0
2、或TurboC。三、实验内容与要求实验原理:⑴进程调度算法是指处理机的分配策略。优先数调度算法是指对每个进程确定一个优先数,进程调度总是让具有最高优先数的进程先使用处理机。如果进程具有相同的优先数,再按先来先服务的次序分配处理机。在本实例中采用动态优先数算法。时间片轮转算法是指就绪进程按就绪的先后次序排成队列,每次总是选择就绪队列中的第一个进程占用处理机,但规定只能使用一个“时间片”。⑵系统中的进程可以用进程控制块PCB来表示,PCB的结构定义如表5-8所示:表5-8PCB结构进程标识符charname
3、运行时间intcputime进程优先数intprio完成进程还需要的时间intneedtime链指针structpcb*next已经运行的时间⑶在进程调度时进程会交替的出现在运行、就绪和完成三种状态。可以定义三个链表来存放三种状态的进程。当进程运行时就把进程放入到运行链表中;当进程处于就绪状态时就将进程放入到就绪链表中;当进程运行完毕时就将进程放入到完成链表中。由于同一时刻运行的进程只能有一个,所以运行链表只能有一个结点。在实例程序中为了使程序更简洁忽略了进程的等待状态,仅运行了优先数调度算法,由于篇幅
4、有限,仅显示部分结果,对于时间片轮转调度算法,请读者自行运行。⑷主要变量及函数说明如表5-9所示:21表5-9主要变量及函数说明structpcb进程控制块结构RUN、READY、FINSH运行、就绪、完成对列voidPRINTLINK(intt)显示三个队列,t为运行的次数PCB*CPCBLINK()建立就绪队列voidJXDLPX()将队列按优先级排序voidYXS()优先数调度算法voidSJP()时间片轮转算法实验要求:设计一段程序来模拟优先级调度算法和时间片轮转算法。要求可以指定进程的数量、各
5、进程需要CPU的时间和各进程的优先级。四、实验过程及结果分析的1.优先级调度算法:流程图:21实验过程:21212.时间片轮转算法流程图:21212121代码:#include#include#include#includetypedefstructpcb{charname[20];intcputime;intprio;intneedtime;structpcb*next;/*链指针*/}PCB;PCB*RUN,*READY,*
6、RTAIL,*FINSH,*FTAIL;21voidPRINTLINK(intt){PCB*p;printf("CPU运行次数:___%d___",t);printf("______________________");printf("进程名t运行状态t运行次数t还需要运行次数");if(RUN!=NULL){printf("%st运行t%dt%d",RUN->name,RUN->cputime,RUN->needtime);}elseprintf("*运行状态为空");
7、p=READY;if(p!=NULL){while(p!=NULL){printf("%st就绪t%dt%d",p->name,p->cputime,p->needtime);p=p->next;}}elseprintf("*就绪队列为空");p=FINSH;if(p!=NULL)21{while(p!=NULL){printf("%st完成t%dt%d",p->name,p->cputime,p->needtime);p=p->next;}}elseprintf("*完成队列为
8、空");getchar();}PCB*CPCBLINK()/*建立就绪队列*/{printf("现在建立就绪队列ing");inti,n,nt,pr;PCB*p,*q,*head;n=0;while(1){printf("请输入进程的个数:");scanf("%d",&n);printf("");if(n>=1&&n<=100)break;else21printf("输入有误。请重新输入!");getchar();}he