操作系统 时间片轮转算法

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

进程时间片轮转调度算法

一、实验题目:

进程时间片轮转调度算法

二、实验原理:

在多道程序系统中,一个作业被提交后必须经过处理机调度后,方能获得处理机执行。对调度的处理又都可采用不同的调度方式和调度算法。调度算法是指:根据系统的资源分配策略所规定的资源分配算法。

三、实验目的:

1、加深对进程概念的理解,明确进程和程序的区别。

2、深入系统如何组织进程、创建进程。

3、进一步认识如何实现处理器调度。

4、通过对进程调度算法的设计,深入理解进程调度的原理。

5、加深对时间片轮转调度算法的理解。

四、实验要求:

用C语言编写程序完成单处理机的进程调度,要求采用时间片轮转调度算法。实验具体要求包括:首先确定作业控制块的内容和组成方式;然后完成作业调度;最后编写主函数,并对所做工作进行测试。

五、运行结果

时间片大小为1时(q=1):

时间片大小为4时(q=4):

六、代码

#include"stdafx.h"

#include

#include

#include

#include

#define OK 0

#define OVERFLOW 1

char pro[20] ; //进程

int processNum; //进程数

int timeSlice = 0; //时间片

typedef char QlemTypeChar;

typedef int QlemTypeInt;

typedef int Status;

typedef struct QNode

{

QlemTypeChar 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——完成态struct QNode *next; //链表指针

}QNode, *QueuePtr;

typedef struct{

QueuePtr 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;

return OK;

}

Status EnQueue(LinkQueue &Q, QlemTypeChar e){

QueuePtr p;

p = (QueuePtr)malloc(sizeof(QNode));

if (!p) exit(OVERFLOW);

p->data = e;

p->next = NULL;

Q.rear->next = p;

Q.rear = p;

return OK;

}

Status DeQueue(LinkQueue &Q, QlemTypeChar &e){

QueuePtr p;

if (Q.front == Q.rear) return ERROR;

p = Q.front->next;

e = p->data;

Q.front->next = p->next;

if (Q.rear == p) Q.rear = Q.front;

free(p);

return OK;

}

LinkQueue QPro;

QNode qq[10];

void ProGetFirst(){ //取出就绪队列队首进程

InitQueue(QPro);

printf("请输入要创建的进程名称:\n");

for (int i = 0; i < processNum-1; i++){

fflush(stdin);

scanf_s("%c", &pro[i]);

}

fflush(stdin);

for (int i = 0; i

qq[i].data = pro[i];

EnQueue(QPro, qq[i].data);

}

}

void scanfData(){

printf("请输入要创建的进程数目:");

scanf_s("%d", &processNum);

processNum++;

fflush(stdin);

printf("\n");

ProGetFirst();

printf("创建进程到达时间:\n");

int time_Arr[10];

for (int i = 0; i < processNum-1; i++){

scanf_s("%d", &time_Arr[i]);

}

for (int i =0; i

qq[i].timeArrive = time_Arr[i];

EnQueue(QPro, qq[i].timeArrive);

}

printf("创建进程服务时间:\n");

int time_Ser[10];

for (int i = 0; i < processNum-1; i++){

scanf_s("%d", &time_Ser[i]);

}

for (int i = 0; i

qq[i].timeService = time_Ser[i];

EnQueue(QPro, qq[i].timeService);

}

printf("请输入时间片大小::");

scanf_s("%d", &timeSlice);

printf("\n");

}

void ProOutPut1(){ //获取进程信息

printf("进程名\t 到达时间\t 服务时间\t 进程状态\t 执行次数\n");

for (int i = 0; i < processNum - 1; i++){

相关文档
最新文档