1、操作系统时间片轮转算法进程时间片轮转调度算法一、实验题目:进程时间片轮转调度算法二、实验原理:在多道程序系统中,一个作业被提交后必须经过处理机调度后,方能获得处理机执行。对调度的处理又都可采用不同的调度方式和调度算法。调度算法是指:根据系统的资源分配策略所规定的资源分配算法。三、实验目的:1、加深对进程概念的理解,明确进程和程序的区别。2、深入系统如何组织进程、创建进程。3、进一步认识如何实现处理器调度。4、通过对进程调度算法的设计,深入理解进程调度的原理。5、加深对时间片轮转调度算法的理解。四、实验要求:用C语言编写程序完成单处理机的进程调度,要求采用时间片轮转调度算法。实验具体要求包括:首
2、先确定作业控制块的内容和组成方式;然后完成作业调度;最后编写主函数,并对所做工作进行测试。5、运行结果时间片大小为1时(q=1):时间片大小为4时(q=4):6、代码#includestdafx.h#include#include#include#include#defineOK 0#defineOVERFLOW 1char pro20 ; /进程 int processNum; /进程数 int timeSlice = 0; /时间片 typedefcharQlemTypeChar;typedefintQlemTypeInt;typedefintStatus;typedefstructQNo
3、deQlemTypeChar data;QlemTypeInt timeArrive = 0;QlemTypeInt timeService = 0;QlemTypeInt timeCount = 0;QlemTypeInt runCount = 0;QlemTypeInt timeFinal = 0; /完成时间QlemTypeInt timeRound = 0; /周转时间float timeRightRound = 0; /带权周转时间QlemTypeChar proState = W; /进程的状态,W就绪态,R执行态,F完成态 structQNode *next; /链表指针 QNo
4、de, *QueuePtr;typedefstructQueuePtr front; /队头指针QueuePtr rear; /队尾指针LinkQueue;Status InitQueue(LinkQueue &Q)Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode);if(!Q.front) exit(OVERFLOW);Q.front-next = NULL;returnOK;Status EnQueue(LinkQueue &Q, QlemTypeChare)QueuePtr p;p = (QueuePtr)malloc(sizeof(QNo
5、de);if (!p) exit(OVERFLOW);p-data = e;p-next = NULL;Q.rear-next = p;Q.rear = p;returnOK;Status DeQueue(LinkQueue &Q, QlemTypeChar &e)QueuePtr p;if (Q.front = Q.rear) returnERROR;p = Q.front-next;e = p-data;Q.front-next = p-next;if (Q.rear = p) Q.rear = Q.front;free(p);returnOK;LinkQueue QPro;QNode q
6、q10;void ProGetFirst() /取出就绪队列队首进程InitQueue(QPro);printf(请输入要创建的进程名称:n);for (int i = 0; i processNum-1; i+)fflush(stdin);scanf_s(%c, &proi);fflush(stdin);for (int i = 0; iprocessNum-1; i+)qqi.data = proi;EnQueue(QPro, qqi.data);void scanfData()printf(请输入要创建的进程数目:);scanf_s(%d, &processNum);processNum
7、+;fflush(stdin);printf(n);ProGetFirst();printf(创建进程到达时间:n);int time_Arr10;for (int i = 0; i processNum-1; i+)scanf_s(%d, &time_Arri);for (int i =0; iprocessNum-1; i+)qqi.timeArrive = time_Arri;EnQueue(QPro, qqi.timeArrive);printf(创建进程服务时间:n);int time_Ser10;for (int i = 0; i processNum-1; i+)scanf_s(
8、%d, &time_Seri);for (int i = 0; iprocessNum-1; i+)qqi.timeService = time_Seri;EnQueue(QPro, qqi.timeService);printf(请输入时间片大小::);scanf_s(%d, &timeSlice);printf(n);void ProOutPut1() /获取进程信息printf(进程名t 到达时间t 服务时间t 进程状态t 执行次数n);for (int i = 0; i processNum - 1; i+)printf(%ctt%dtt%dtt%ctt%dn, qqi.data, q
9、qi.timeArrive, qqi.timeService, qqi.proState, qqi.runCount);void CalculatetimeFinal() /计算完成时间int timecou=0;int countTemp = 0;QlemTypeChar ee;for (int i = 0; i processNum - 1; i+)countTemp += qqi.timeService;while (timecou countTemp)for (int i = 0; i = timeSlice)timecou += timeSlice;elsetimecou += (q
10、qi.timeService - qqi.timeCount);/DeQueue(QPro, ee);if (timeSlice qqi.timeService) /时间片大小 qqi.timeService ? qqi.timeService : timeSlice;if (qqi.timeCount + timetemp) = timeSlice) qqi.timeCount += timeSlice;elseqqi.timeCount += (qqi.timeService - qqi.timeCount); elseif (qqi.timeFinal = 0) qqi.timeFina
11、l = timecou;else/时间片大小= 服务时间qqi.timeFinal = timecou; /该进程的完成时间=countfor (int i = 0; i processNum - 1; +i)qqi.timeRound = qqi.timeFinal - qqi.timeArrive;qqi.timeRightRound = (float)qqi.timeRound / qqi.timeService;void ProOutPut2() /获取进程处理后的信息printf(进程名t 到达时间 服务时间 完成时间 周转时间 带权周转n);for (int i = 0; i pr
12、ocessNum - 1; i+)printf( %ctt%dt %dt %dt %dt %.2fn, qqi.data, qqi.timeArrive, qqi.timeService, qqi.timeFinal, qqi.timeRound, qqi.timeRightRound);int_tmain(intargc, _TCHAR* argv)scanfData();ProOutPut1();CalculatetimeFinal();printf(n);printf(CPU处理中.n);printf(完成时间:);for (int i = 0; i processNum - 1; i+)printf(%d, qqi.timeFinal);printf(n);printf(周转时间:);for (int i = 0; i processNum - 1; i+)printf(%d,qqi.timeRound);printf(n);printf(带权周转时间:);for (int i = 0; i processNum - 1; i+)printf(%.2f, qqi.timeRightRound);printf(n);ProOutPut2();return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1