操作系统 时间片轮转算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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++){