时间片轮转课程设计讲解

合集下载

时间片轮转法

时间片轮转法

轮转法调度
思考
假如在实际情况下,时间片大小为20ms,作业间调度花 费时间为5ms,则CPU的损耗率为20%,对每一个作业, 都有高达20%的损耗率是不可忍受的。而且时间片越小 损耗率越大,怎么办?
自然而然的,想到增大时间片的大小,例如增大到 500ms,则CPU损耗率只有1%,但是是否时间片越大,性 能越好?
试想,如果时间片足够大,使得所有的任务都可以在一 个时间片里运行完,那么轮转法就会退化为先来先服务 法,使得性能下降。
轮转法调度
总结
对时间片轮转法来说,合理的选择时间片的大小 是非常重要的。 若时间片选择太大:轮转法就会退化为先来先服 务法; 若时间片选择太小:则就会增加作业切换频率, 使得系统开销增大。
在实际当中,时间片一般选择100ms。
CPU调度-时间片轮转法
(假设听众都学习过先来先服务法)
轮转法调度
基本原理
★ 在轮转法中,系统将所有的就绪进程按先来先服务的 原则排成一个队列,每次调度时,把CPU分配给队首 进程,并令其执行一个时间片。当执行的时间片用完 时,产生中断,将该程序送往就绪队列的队尾,并把 处理机分配给新的队首进程,同时让它也执行一个时 间片。这样就保证就绪队列中的所有进程在一给定的 时间内均能获得一时间片的处理机执行时间。
P2
2
P3
10ห้องสมุดไป่ตู้
P4
4
P5
12
P1 P2 P3 P4 P5 P1 P3 P5 P3 P5
0 4 6 10 14 18 20 24 28 30 34
分析
P1 P2 P3 P4 P5
轮转法调度
到达时间 0 0 0 0 0
开始时间 0 4 6 10 14

采用时间片轮转算法调度程序

采用时间片轮转算法调度程序

采用时间片轮转算法调度程序学号:姓名:专业:指导教师:日期:目录一、需求分析 (3)1、设计要求: (3)2、解决方案: (3)二、课程设计简介 (4)1、课程设计题目 (4)2、课程设计目的 (4)3、课程设计内容 (4)4、时间安排 (4)三、概要设计 (4)1、基本原理 (4)2、算法思想设计 (5)3、数据结构及模块说明: (5)四、主要函数及其说明 (6)五、调试分析 (7)1、调试过程及步骤 (7)2、结果分析(以三个进程数为例) (8)六、总结及参考文献 (9)1、总结: (9)2、参考文献 (9)附录:程序源代码 (9)一、需求分析1、设计要求:在多道程序或多任务系统中,系统同时处于就绪状态的进程有若干个。

为了使系统中各进程能有条不紊地进行,必须选择某种调度策略,以选择一进程占用处理机。

要求用时间片轮转算法模拟单处理机调度,以巩固和加深处理机调度的概念。

2、解决方案:(1)、假设系统有5个进程,每个进程用一个进程控制块PCB来表示。

PCB包括:进程名、链接指针、到达时间、估计运行时间和进程状态。

其中,进程名即进程标识。

链接指针指出下一个到达进程的进程控制块地址,按照进程到达的顺序排队,统设置一个队头和队尾指针分别指向第一个和最后一个进程,新生成的进程放队尾。

估计运行时间:可由设计者任意指定一个时间值。

到达时间:进程创建时的系统时间或由用户指定,调度时,总是选择到达时间最早的进程。

进程状态:为简单起见,假定进程有三种状态,就绪、等待和完成,并假定进程一创建就处于就绪状态,用R表示,当一个进程运行结束时,就将其置成完成状态,用F表示。

当一个进程未运行完成并且时间片不足时,就将其置成等待状态,用W表示。

(2)、为每个进程任意确定一个要求运行时间和到达时间。

(3)、按照进程到达的先后顺序排成一个循环队列。

再设一队首指针指向第一个到达进程的首址。

(4)、执行处理机调度时,开始选择队首的第一个进程运行。

用时间片轮转法调度虚拟进程

用时间片轮转法调度虚拟进程

《操作系统课程设计》报告学号: _____________姓名: ______________班级: ____________指导教师: ______________报告日期:、课设目的通过对操作系统课程的学习,熟悉进程的概念、进程的管理与存储、进程的调度,通过实践深入理解进程的调度算法。

二、课设任务要求编写一个程序,可以创建若干个虚拟进程,并对若干个虚拟进程进行调度,调度策略为时间片轮转法,主要任务包括:进程的个数,进程的内容(即进程的功能序列)来源于一个进程序列描述文件,另外调度运行结果输出到一个运行日志文件;设计PCB适用于时间片轮转法;建立进程队列;实现时间片轮转调度算法,尽量可视化的展示调度的动态过程。

®总结程序设计的开发过程:需求分析、系统设计、系统实现及文档的收集和整理。

三、实验方法与设计分析每个进程有一个进程控制块(PCB)表示。

进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。

进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。

进程的到达时间为输入进程的时间。

进程的运行时间以时间片为单位进行计算。

每个进程的状态可以是就绪W( Wait)、运行R( Run)、或完成F(Fin ish )三种状态之一。

就绪进程获得CPU后都只能运行一个时间片。

用已占用CPU时间加1来表示。

如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1 (即降低一级),然后把它插入就绪队列等待CPU 每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。

重复以上过程,直到所要进程都完成为止四、程序流程图增加进程结束进程#in elude "stdafx.h"#in elude <stdio.h>#in elude <stdlib.h>#in elude <stri ng.h>#in elude <etype.h>#in elude <iostream>#in elude <fstream>using n amespaee std;typedef struet n odestruet node *next; /*指向下一个进程的指针 */ }PCB;PCB *fini sh,*ready,*tail,*ru n;int N; /*定义进程的数目*/void firstin( void ){if (ready!二NULL){run二ready;ready二ready->n ext;run->state二'R'run->n ext=NULL;}else{run二NULL;}}void prt1( ehar a)■:结束五、程序源代码ehar n ame[10]; /* 进程名*/intround; /* 进程分配的时间片*/inteputime; /* 进程消耗的CUP寸间*/in t needtime;/* 进程需要的CUP寸间*/in t eount;/* 进程运行时间*/ehar state; /* 进程的状态:'R':运行:W:等待,'F':结束*/ofstream myfile( "bb.txt" ,ios::app||ios::tr un e);/*指向三个队列的队首的指针,tail为就绪队列的队尾指针*/<< " needtime" <<" count " <<" round" <<" state" <<endl; cputime" ;myfile << " needtime"" <<p->state<<endl;myfile<<p->state<<endl;void prt( char algo){PCB *p;prt1(algo);if (run!=NULL){prt2(algo,run);}p=ready;while (p!=NULL){prt2(algo,p);p=p->next;}p=finish;while (p!=NULL){prt2(algo,p);p=p->next;}getchar();}void insert(PCB *q){tail->next=q;tail=q;q->next=NULL;}void rcreate_task( char algo)PCB *p;void myfile<< " count " ;myfile<< " round" ;myfile<< " state" <<endl; prt2( char a,PCB *p) cout<<p->name<< " <<p->cputime<< " <<p->needtime<< " <<p->count<< " <<p->round<< "cout<< "name" << " cputime"myfile<< "name" ;myfile<<myfile<<p->name<< ";myfile<<p->cputime<< ;myfile<<p->needtime<< myfile<<p->count<<;myfile<<p->round<<int n,time;char na[10];ready=NULL;finish=NULL;run=NULL;cout<< " 请输入进程数目 N: ";cin>>N;for (n=0;n<N;n++){p=(PCB*)malloc( sizeof (PCB)); cout<< "Enter the name of process:" cin>>na;cout<< "Enter the time of process:" cin>>time;strcpy(p->name,na);p->cputime=0;p->needtime=time;p->count=0;p->state= 'W' ;p->round=2;if (ready!=NULL){insert(p);}else{p->next=ready;ready=p;tail=p;}}run=ready;ready=ready->next;run->state= 'R' ;cout<< "创建成功。

操作系统实验(时间片轮转)

操作系统实验(时间片轮转)

操作系统实验报告实验名称:时间片轮转调度班级:姓名:学号:实验目的:用高级语言编写和调试一个简单的时间片轮转调度程序,算法要求使用高优先权优先来进行进程调度。

实验内容:(1)用户输入进程名和优先级,并发执行的进程调度程序,每一个进程用一个进程控制块PCB 来代表。

PCB中应包含下列信息:进程名、进程优先数、进程需要运行的时间、占用CPU的时间及进程的状态等,各进程的优先数以及进程运行需要地时间片数,由用户输入。

(2)根据先来先服务原则,执行进程,每执行一次,需要时间减1,CPU时间片加1,在进程运行结束后,会显示进程的周转时间;(3)每个进程处于运行R、就绪W和完成F 三种状态之一,假定初始状态都为就绪状态W。

(4)系统能显示或打印各进程状态和参数的变化情况。

实验步骤:一、输入运行进程数目(测试数据为3);二、输入选择项(选择时间片轮转调度R);三、输入进程名称和服务时间;实验结果:小结:在这次试验中,主要掌握的是时间片轮转算法的执行过程,按照先来先服务原则,将进程排成一个队列,进程在所分配的时间片内运行的时候,修改自己的状态位,还有计数器加1操作,所需时间减1操作,时间片用完后,排在进程执行队列的尾部,处理机进行切换。

在进程运行结束后打印周转时间。

在最初实现算法的时候,没有添加计算周转时间的函数,后来通过在修改状态位的循环中添加计数器的累加语句,实现了在进程将状态位修改为“F”的时候系统输出周转时间。

源码:#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct node{char name[20]; /*进程的名字*/int prio; /*进程的优先级*/int round; /*分配CPU的时间片*/int cputime; /*CPU执行时间*/int needtime; /*进程执行所需要的时间*/char state; /*进程的状态,W--就绪态,R--执行态,F--完成态*/int count;/*记录执行的次数*/int count2; /*周转时间*/struct node *next; /*链表指针*/}PCB;PCB *ready=NULL,*run=NULL,*finish=NULL; /*定义三个队列,就绪队列,执行队列和完成队列*/int num;void GetFirst(); /*从就绪队列取得第一个节点*/void Output(); /*输出队列信息*/void InsertPrio(PCB *in); /*创建优先级队列,规定优先数越小,优先级越高*/void InsertTime(PCB *in); /*时间片队列*/void InsertFinish(PCB *in); /*时间片队列*/void PrioCreate(); /*优先级输入函数*/void TimeCreate(); /*时间片输入函数*/void Priority(); /*按照优先级调度*/void RoundRun(); /*时间片轮转调度*/int main(void){char chose;printf("请输入要创建的进程数目:\n");scanf("%d",&num);getchar();printf("输入进程的调度方法:(P/R)\n");scanf("%c",&chose);switch(chose){case 'P':case 'p':PrioCreate();Priority();break;case 'R':case 'r':TimeCreate();RoundRun();break;default:break;}Output();return 0;}void GetFirst() /*取得第一个就绪队列节点*/{run = ready;if(ready!=NULL){run ->state = 'R';ready = ready ->next;run ->next = NULL;}}void Output() /*输出队列信息*/{PCB *p;p = ready;printf("进程名\t优先级\t轮数\tcpu时间\t需要时间\t进程状态\t计数器\t周转时间\n"); while(p!=NULL){printf("%s\t%d\t%d\t%d\t%d\t\t%c\t\t%d\t%d\n",p->name,p->prio,p->round,p->cputime,p-> needtime,p->state,p->count,p->count2);p = p->next;}p = finish;while(p!=NULL){printf("%s\t%d\t%d\t%d\t%d\t\t%c\t\t%d\t%d\n",p->name,p->prio,p->round,p->cputime,p-> needtime,p->state,p->count,p->count2);p = p->next;}p = run;while(p!=NULL){printf("%s\t%d\t%d\t%d\t%d\t\t%c\t\t%d\n",p->name,p->prio,p->round,p->cputime,p->needt ime,p->state,p->count,p->count2);p = p->next;}}void InsertPrio(PCB *in) /*创建优先级队列,规定优先数越小,优先级越低*/{PCB *fst,*nxt;fst = nxt = ready;if(ready == NULL) /*如果队列为空,则为第一个元素*/{in->next = ready;ready = in;}else /*查到合适的位置进行插入*/{if(in ->prio >= fst ->prio) /*比第一个还要大,则插入到队头*/{in->next = ready;ready = in;}else{while(fst->next != NULL) /*移动指针查找第一个别它小的元素的位置进行插入*/{nxt = fst;fst = fst->next;}if(fst ->next == NULL) /*已经搜索到队尾,则其优先级数最小,将其插入到队尾即可*/{in ->next = fst ->next;fst ->next = in;}else /*插入到队列中*/{nxt = in;in ->next = fst;}}}}void InsertTime(PCB *in) /*将进程插入到就绪队列尾部*/{PCB *fst;fst = ready;if(ready == NULL){in->next = ready;ready = in;}else{while(fst->next != NULL){fst = fst->next;}in ->next = fst ->next;fst ->next = in;}}void InsertFinish(PCB *in) /*将进程插入到完成队列尾部*/ {PCB *fst;fst = finish;if(finish == NULL){in->next = finish;finish = in;}else{while(fst->next != NULL){fst = fst->next;}in ->next = fst ->next;fst ->next = in;}}void PrioCreate() /*优先级调度输入函数*/{PCB *tmp;int i;printf("输入进程名字和进程所需时间:\n");for(i = 0;i < num; i++){if((tmp = (PCB *)malloc(sizeof(PCB)))==NULL){perror("malloc");exit(1);}scanf("%s",tmp->name);getchar(); /*吸收回车符号*/scanf("%d",&(tmp->needtime));tmp ->cputime = 0;tmp ->state ='W';tmp ->prio = 50 - tmp->needtime; /*设置其优先级,需要的时间越多,优先级越低*/tmp ->round = 0;tmp ->count = 0;tmp ->count2 = 0;InsertPrio(tmp); /*按照优先级从高到低,插入到就绪队列*/}}void TimeCreate() /*时间片输入函数*/{PCB *tmp;int i;printf("输入进程名字和进程时间片所需时间:\n");for(i = 0;i < num; i++){if((tmp = (PCB *)malloc(sizeof(PCB)))==NULL){perror("malloc");exit(1);}scanf("%s",tmp->name);getchar();scanf("%d",&(tmp->needtime));tmp ->cputime = 0;tmp ->state ='W';tmp ->prio = 0;tmp ->round = 1; /*假设每个进程所分配的时间片是1*/tmp ->count = 0;tmp ->count2 = 0;InsertTime(tmp);}}void Priority() /*按照优先级调度,每次执行一个时间片*/{int flag = 1;GetFirst();while(run != NULL) /*当就绪队列不为空时,则调度进程如执行队列执行*/{Output(); /*输出每次调度过程中各个节点的状态*/while(flag){int count3;run->prio -= 2; /*优先级减去2*/run->cputime++; /*CPU时间片加一*/run->needtime--;/*进程执行完成的剩余时间减一*/run ->count2++;count3 = run ->count2;if(run->needtime == 0)/*如果进程执行完毕,将进程状态置为F,将其插入到完成队列*/{run ->state = 'F';run->count++; /*进程执行的次数加一*/run ->count2=count3;InsertFinish(run);flag = 0;}else /*将进程状态置为W,入就绪队列*/{run->state = 'W';run->count++; /*进程执行的次数加一*/run->count2++;InsertTime(run);flag = 0;}}flag = 1;GetFirst(); /*继续取就绪队列队头进程进入执行队列*/}}void RoundRun() /*时间片轮转调度算法*/{int flag = 1;GetFirst();while(run != NULL){Output();while(flag){int count3;run->count++;run->cputime++;run->needtime--;run->count2++;count3 = run ->count2;if(run->needtime == 0) /*进程执行完毕*/{run ->state = 'F';run ->count2++;run ->count2=count3;// printf("进程运行结束,shijian %d\n",&count2);InsertFinish(run);flag = 0;}else if(run->count == run->round)/*时间片用完*/{run->state = 'W';run ->count++;run ->count2++;//run->count++;// run->round++;/*计数器清零,为下次做准备*/InsertTime(run);flag = 0;}}flag = 1;GetFirst();}}。

进程调度模拟设计——时间片轮转、优先级法

进程调度模拟设计——时间片轮转、优先级法

学号:课程设计课程名字系统软件开发实训A题目进程调度模拟设计——时间片轮转、优先级法学院专业班级姓名指导教师2014 年01 月17 日课程设计任务书学生姓名:专业班级:指导教师:工作单位:题目: 进程调度模拟设计——时间片轮转、优先级法初始条件:1.预备内容:阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有深入的理解。

2.实践准备:掌握一种计算机高级语言的使用。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.模拟进程调度,能够处理以下的情形:⑴能够选择不同的调度算法(要求中给出的调度算法);⑵能够输入进程的基本信息,如进程名、优先级、到达时间和运行时间等;⑶根据选择的调度算法显示进程调度队列;⑷根据选择的调度算法计算平均周转时间和平均带权周转时间。

2.设计报告内容应说明:⑴课程设计目的与功能;⑵需求分析,数据结构或模块说明(功能与框图);⑶源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结。

时间安排:设计安排3周:查阅、分析资料 1天系统软件的分析与建模 4天系统软件的设计 5天系统软件的实现 3天撰写文档 1天课程设计验收答辩 1天设计验收安排:设计周的第三周的指定时间到实验室进行上机验收。

设计报告书收取时间:课程设计验收答辩完结时。

(注意事项:严禁抄袭,一旦发现,抄与被抄的一律按0分记)指导教师签名: 2013 年 12 月 10日系主任(或责任教师)签名: 2013 年 12 月 10日进程调度模拟设计——时间片轮转、优先级法1设计目的1.1 阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有深入的理解,能够使用其中的方法来进行进程调度模拟设计。

1.2 练掌握并运用时间片轮转和优先级法,掌握一种计算机高级语言的使用。

2 设计要求2.1 能够选择不同的调度算法(要求中给出的调度算法);2.2 能够输入进程的基本信息,如进程名、优先级、到达时间和运行时间等;2.3 根据选择的调度算法显示进程调度队列;2.4 根据选择的调度算法计算平均周转时间和平均带权周转时间。

时间片轮转课程设计讲解

时间片轮转课程设计讲解

武汉理工大学华夏学院课程设计报告书课程名称:操作系统原理题目:时间片轮转调度算法系名:信息工程系专业班级:姓名:学号:指导教师:司晓梅2015 年 6 月 26 日武汉理工大学华夏学院信息工程系课程设计任务书课程名称:操作系统原理课程设计指导教师:司晓梅班级名称:计算机1131-2 开课系、教研室:自动化与计算机一、课程设计目的与任务操作系统课程设计是《操作系统原理》课程的后续实践课程,旨在通过一周的实践训练,加深学生对理论课程中操作系统概念,原理和方法的理解,加强学生综合运用操作系统原理、Linux系统、C语言程序设计技术进行实际问题处理的能力,进一步提高学生进行分析问题和解决问题的能力,包含系统分析、系统设计、系统实现和系统测试的能力。

学生将在指导老师的指导下,完成从需求分析,系统设计,编码到测试的全过程。

二、课程设计的内容与基本要求1、课程设计题目时间片轮转进程调度模拟算法的实现2、课程设计内容用c/c++语言实现时间片轮转的进程调度模拟算法。

要求:1.至少要有5个以上进程2.进程被调度占有CPU后,打印出该进程正在运行的相关信息提示:时间片轮转调度算法中,进程调度程序总是选择就绪队列中的第一个进程,也就是说按照先来先服务原则调度,但一旦进程占用处理机则仅使用一个时间片。

在使用完一个时间片后,进程还没有完成其运行,它必须释放出处理机给下一个就绪的进程,而被抢占的进程返回到就绪队列的末尾重新排队等待再次运行。

1)进程运行时,只打印出相关提示信息,同时将它已经运行的时间片加1就可以了。

2)为进程设计出PCB结构。

PCB结构所包含的内容,有进程名、进程所需运行时间、已运行时间和进程的状态以及指针的信息等。

3、设计报告撰写格式要求:1设计题目与要求 2 设计思想3系统结构 4 数据结构的说明和模块的算法流程图5 使用说明书(即用户手册):内容包含如何登录、退出、读、写等操作说明6 运行结果和结果分析(其中包括实验的检查结果、程序的运行情况)7 自我评价与总结 8 附录:程序清单,注意加注释(包括关键字、方法、变量等),在每个模块前加注释;三、课程设计步骤及时间进度和场地安排本课程设计将安排在第17周, 现代教育技术中心。

操作系统实验(时间片轮转)

操作系统实验(时间片轮转)

操作系统




实验名称:时间片轮转调度
班级:
姓名:
学号:
实验目的:用高级语言编写和调试一个简单的时间片轮转调度程序。

实验内容:(1)用户输入进程,每一个进程用一个进程控制块PCB 来代表。

PCB 中应包含下列信息:进程名、进程优先数、进程需要运行的时间、占用
CPU的时间及进程的状态等,各进程的优先数以及进程运行需要地时
间片数,由用户输入。

(2)根据时间片轮转调度原则,执行进程,每执行一次,需要服务时间
减1(如果时间片=1),在进程运行结束后,会显示进程的周转时间;
(3)每个进程处于运行R、就绪W和完成F 三种状态之一,假定初
始状态都为就绪状态W。

(4)系统能显示或打印各进程状态和参数的变化情况。

实验步骤:
一、输入运行进程数目(测试数据为3);
二、输入选择项(选择时间片轮转调度R);
三、输入进程名称和服务时间;
实验结果:。

操作系统课程设计时间片轮转

操作系统课程设计时间片轮转

目录一、设计目的 (1)二、设计内容 (2)三、设计原理 (2)四、算法实现 (4)五、流程图 (6)六、源程序 (7)七、运行示例及结果分析 (12)八、心得体会 (12)九、参考资料 (13)时间片轮转法进行CPU调度一、设计目的处理机调度是操作系统中非常重要的部分。

为深入理解进程管理部分的功能,设计调度算法,模拟实现处理机的调度。

本课程设计是用时间片轮转算法模拟单处理机调度。

(1)创建进程,每个进程包括三组数据:进程名,进程到达时间,服务时间。

(2)自定义模拟的进程数目。

在进程数目之内,手动输入进程(进程名、到达时间和服务时间)。

自定义时间片大小。

(3)定义一个时间轴,为参考。

(4)初始化时间轴,根据先到先服务的原则,将已到达的进程插入到执行队列。

(5)分配给执行队列的队首一个时间片,开始运行时间片减1,时间轴则向前推进1,。

时间轴每推进一秒,检索是否有新的进程到达,若有则将到达的进程插入到执行队列的队尾。

(6)进程每运行1秒,服务时间减1,同时判断该进程是否运行完(服务时间是否为零)。

运行完则退出执行队列。

若没有则等待下一次运行。

(7)当一个时间片用完时,判断所有进程是否都运行完,若有,该模拟实验结束。

(8)当一个时间片用完时,判断该队首是否运行过一个完整的时间片,没有则保持该执行队列顺序不变。

有,则将该进程插入到队尾。

分配新的时间片给队首。

系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。

时间片的大小从几ms到几百ms。

当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾:然后,再把处理机分配给就绪队列中的队首进程,同时也让它执行一个时间片。

这样就可以保证就绪队列中的所有进程在一给定的时间内获得一时间片的处理机执行时间。

换言之,系统能在给定的时间内响应所有用户的请求。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

院学学华夏武汉理工大课程设计报告书操作系统原理课程名称:时间片轮转调度算法题目:系名:信息工程系专业班级:名:姓学号:指导教师司晓梅:2015626日年月武汉理工大学华夏学院信息工程系课程设计任务书课程名称:操作系统原理课程设计指导教师:司晓梅自动化与计算开课系、教研室:班级名称:计算机1131-2机一、课程设计目的与任务操作系统课程设计是《操作系统原理》课程的后续实践课程,旨在通过一周的实践训练,加深学生对理论课程中操作系统概念,原理和方法的理解,加强学生综合运用操作系语言程序设计技术进行实际问题处理的能力,进一步提高学生进统原理、Linux系统、C行分析问题和解决问题的能力,包含系统分析、系统设计、系统实现和系统测试的能力。

学生将在指导老师的指导下,完成从需求分析,系统设计,编码到测试的全过程。

二、课程设计的内容与基本要求1、课程设计题目时间片轮转进程调度模拟算法的实现2、课程设计内容用c/c++语言实现时间片轮转的进程调度模拟算法。

要求:个以上进程5 1.至少要有后,打印出该进程正在运行的相关信息CPU.2进程被调度占有提示:时间片轮转调度算法中,进程调度程序总是选择就绪队列中的第一个进程,也就是说按照先来处理机则仅使用一个时间片。

在使用完一个时间片后,进程还没先服务原则调度,但一旦进程占用有完成其运行,它必须释放出处理机给下一个就绪的进程,而被抢占的进程返回到就绪队列的末尾重新排队等待再次运行。

1)进程运行时,只打印出相关提示信息,同时将它已经运行的时间片加就可以了。

1PCB结构所包含的内容,有进程名、进程所需运行时间、已运行2)为进程设计出PCB结构。

时间和进程的状态以及指针的信息等。

、设计报告撰写格式要求:31设计题目与要求2设计思想3系统结构数据结构的说明和模块的算法流程图45:内容包含如何登录、退出、读、写等操作说明使用说明书(即用户手册)运行结果和结果分析(其中包括实验的检查结果、程序的运行情况)6.7自我评价与总结8附录:程序清单,注意加注释(包括关键字、方法、变量等),在每个模块前加注释;三、课程设计步骤及时间进度和场地安排本课程设计将安排在第17周,现代教育技术中心。

具体安排如下:课程设计集中时间安排:星期三星期四星期一星期二星期五周次第3-6节第2-3节第2-3第17周第2-3节第2-3节节现教地点现教现教现教现教四、课程设计考核及评分标准课程设计考核将综合考虑学生的系统设计方案、运行结果、课程设计报告书的质量、态度、考勤、答辩情况等各因素。

具体评分标准如下:(1)设计方案正确,具有可行性、创新性;30分20)系统开发效果较好;分2(20分(3)设计报告规范、课程设计报告质量高、参考文献充分(4)课程设计答辩时,问题回答正确;20分分5()态度认真、刻苦钻研、遵守纪律;10按上述五项分别记分后求和,总分按五级制记载最后成绩。

6960格,分7970等,分8980好,分90100优秀(~)良(~)中(~)及(~分)分)59~0,不及格(.1、实验概叙1.1实验目的弄明白时间片轮转的工作流程和原理,通过实验让自己更明白切身体会的深!时间片轮转主要是解决处理机调度进程时的优化!正确理解提高处理机的利用率及改善系统性能在很大程度上取决于处理机调度性能的好坏,在操作系统中调度的实质是一种资源分配,调度算法是指根据系统的资源分配策略规定的资源分配算法,对不同的系统和系统目标,应采用不的调度算法。

在多道程序或多任务系统中,系统同时处于就绪状态的进程有若干个。

也就是说能运行的进程数远远大于处理机个数。

为了使系统中的各进程能有条不紊地运行,必须选择某种调度策略,以选择一进程占用处理机。

通过本实验,加深对处理机调度的理解。

弄明白时间片轮转的工作流程和原理,通过实验让自己更明白切身体会的深!1.2实验原理基于时间片轮转调度算法思想用C语言编程实现1.3实验环境(使用的软件)Visual C++6.02、实验思想及内容2.1设计思想按照时间片工作原理:时间片轮转的原则是系统将所有的就绪进程按照先来先服务的原则排成一个队列,每次调度时,把CPU分配对手进程,并令其执行一个时间片,当执行完时,有一个计时器发出时钟中断请求,该进程停止,并被送到就绪队列的末尾,然后再把处理机分配就绪队列的队列进程,同时也让它执行一个时间片!2.2实验原理基于时间片轮转调度算法思想用C语言编程实现2.3系统结构设计时间片大小固定,由用户输入。

进程个数由用户输入。

每个进程用一个PCB表示。

PCB包括进程名,到达时间,运行时间,剩余时间,进程状态,链接指针。

其中,进程名,到达时间和运行时间由用户输入,剩余时间的初值等于运行时间。

为简单起见,进程状态设为三种:就绪,运行和完成。

链接指针指向下一个进程的PCB;按照进程到达的先后顺序排成一个队列。

设置一个队头指针指向队列中第一个进程,并设置一个队尾指针指向队列中的最后一个进程;执行调度时,先选择队首的第一个进程运行。

另外设置一个指向当前运行进程的指针;由于本实验是模拟实验,所以对选中进程并不实际启动运行,而只是执行:被选中进程的状态置为运行态;被选中进程的剩余时间减去时间片大小;按照队列的顺序依次输出每个进程的进程名,到达时间,运行时间,剩余时间,进程状态。

用这三个操作来模拟进程的一次运行;进程运行一次后,以后的调度则将当前指针依次下移一个位置,指向下一个进程,即调整当前运行指针,以指示应运行进程。

同时还应判断该进程的剩余时间是否为0。

如果不为0,则等待下一轮的运行;如果该进程的剩余时间为0,则将该进程的状态置为完成态,并退出队列;步直到所有进程都运行完为止。

e步和第d若处于就绪态的进程不为空,则重复第2.4算法流程图开始初始化PCB,输入进程信息各进程按优先数从高到低排列就绪队列为空?结束就绪队列首进程投入运行时间片到,运行进程已占用CUP时+1间运行进程已占进程完成撤时间CPU用销该进程达到所需运行时间-1使运行进程优先数,把运行进程插入优先队列。

.实验过程(实验步骤、记录、数据、分析)2.5测试用例1:屏幕显示:Please input the process name,arrive time and run time 输入:121<enter>231<enter>322<enter>412<enter>511<enter>测试数据2:112<enter>232<enter>312<enter>431<enter>511<enter>测试数据3:111<enter>222<enter>321<enter>412<enter>511<enter>、结论(结果)33.1测试数据1的运行结果(截图)::的运行结果(截图)2测试数据 3.2.:的运行结果(截图)3测试数据 3.3.4、源程序代码:#include獜摴潩栮#include獜摴楬?屨struct stud{int name;int arrive;int run;int rest;char*state;struct stud*next;};/*pcb结构体*/struct stud*create(){int a,i;struct stud*head,*rear,*p,*q,*t;/*定义各个指针*/ head=rear=NULL;);畮扭牥尺process the input Please printf(scanf(╜層,&a);printf(\Please input the process name,arrive time and run time:\nFor example:12就湜);for(i=0;i<a;i++){p=(struct stud*)malloc(sizeof(struct stud));scanf(╜╤╤層,&p->name,&p->arrive,&p->run);p->rest=p->run;p->state=牜慥祤;if(rear==NULL)/*只有一个进程*/{head=p;p->next=NULL;rear=p;}else{t=NULL;q=head;while(q&&q->arrive<p->arrive){t=q;q=q->next;}if(q==head)/*指向头进程的下一个进程*/{p->next=head;head=p;}else if(t==rear)/*运行到最后一个进程*/{rear->next=p;p->next=NULL;rear=p;}else{t->next=p;p->next=q;}}}return head;}void output(struct stud*head){struct stud*p,*t,*r;int slice;);汳捩?the input Please printf(scanf(╜層,&slice);while(head!=NULL){r=p=head;while(p!=NULL){t=head;p->rest=p->rest-slice;/*剩余时间减去时间片*/ p->state=牜湵楮杮;if(p->rest<0)/*剩余的时间用完了*/p->rest=0;printf(屜湜???????????????????屜屮);printf(湜浡履瑜牡楲敶屜牴湵屜牴獥屴瑜瑳瑡履湜);while(t!=NULL){printf(╜層瑜搥屜?層瑜搥屜?屳湜,t->name,t->arrive,t->run,t->rest,t->state);t=t->next;}if(p->rest==0)/*判断是否删除结点*/{if(p==head){head=p->next;free(p);p=head;}/*删除头结点*/else{r->next=p->next;p=r->next;r=p;}}else{r=p;p->state=牜慥祤;/*如果不删除头结点指针指向下一个,状态变为准备*/p=p->next;}}}}void main(){struct stud*head;head=create();output(head);}5、小结实验中产生的错误及原因分析:5.1程序运行不下去:5.1.1错误分析:链表初始化排序过程中:指针p=Null时,不能执行q->arrive等命令;错误解决方法:将while(q->arrive<p->arrive&&q){t=q;q=q->next;}改为:while(q&&q->arrive<p->arrive){t=q;q=q->next;}5.1.2进程运行时间大于时间片时,程序进入死循环:当进程所需时间等于时间片时,运行结果正确:进程运行时间大于时间片时,程序进入死循环:错误分析:进程所需剩余时间计算错误;错误修改:将while(p!=NULL){t=head;p->rest=p->run-slice;p->state=牜湵楮杮;修改为:while(p!=NULL){t=head;p->rest=p->rest-slice;p->state=牜湵楮杮;实验的体会及收获:5.2通过这次试验,我对处理机的调度算法---基于时间片轮转调度算法思想有了更深的理解;另外使我对链表的知识有了更深的理解,而且锻炼了我的思维能力,使我能更全面地思考问题,以后还需要多做些这方面的练习。

相关文档
最新文档