实验2进程调度源代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验2 进程调度
(一) 目的和要求
进程调度是处理机管理的核心内容。本实验要求用高级语言编写和调试一个简单的进程调度程序。通过本实验可以加深理解有关进程控制块、进程队列的概念,并体会和了解优先数和时间片轮转调度算法的具体实施方法。
(二) 实验内容
(1) 设计进程控制块PCB结构,分别适用于优先数调度算法和循环轮转调度算法。
PCB结构包括以下信息:进程标识符,进程优先数(或轮转时间片),进程所占用的CPU时间、进程状态,当前队列指针等。根据调度算法不同,PCB结构的内容可适当做增删。
(2) 建立进程就绪队列。对两种不同算法编制入链子程序。
(3) 编制两种进程调度算法:1)优先数调度; 2)循环轮转调度。
(三) 实验环境
用BORLAND C语言
(四) 范例说明
采用C语言编写程序,选用优先数法或简单轮转法对五个进程进行调度,每个进程处于运行(RUN),就绪(READY)和完成(FINISH)三种状态之一,并假定起始状态为就绪状态。
1.数据结构
PCB结构如下:
NAME 进程标识符
PRIO / ROUND 优先数 / 时间片
CPUTIME 进程已占用的CPU时间
NEEDTIME 进程到完成还需要的CPU时间
NEXT 处于同一状态的下一进程的地址
STATUS 进程所处的状态
“R” 进程处于运行状态
“W” 进程处于就绪状态
“F” 进程处于完成状态
2.程序说明
(1) 在优先数算法中,进程每执行一次,优先数减3,CPU时间片加1,进程还需要的时间片数减1。在轮转法中,采用固定时间片,时间片数为2,进程每执行一次,CPU时间片数加2,进程还需要的时间片数减2,并排在就绪队列的队尾。
(2) 程序结构说明如下:
① INSERT1:把未完成且优先数小于别的进程的进程PCB按进程优先数的顺序插入到就绪队列中。
② INSERT2:轮转法中使用的过程,将执行一个单位时间片数(为2)且还未完成的进程的PCB插入到就绪队列队尾。
③ FIRSTIN:将就绪队列中的第一个进程投入运行。
④ PRINT:打印每执行一次后的所有进程的状态。
⑤ CREATE:创建新进程,即创建进程的PCB,并将此PCB链入到就绪对列中去。
⑥ FRISCH:按优先数算法调度进程。
⑦ ROUNDSCH:按时间片轮转法调度进程。
(五) 程序清单
#include "string.h"
#include "stdio.h"
#define NUMBER 5
#define NULL 0
#define PCBSTRUCT struct PCBSTR
typedef PCBSTRUCT* PCB;
enum Algorithm {PR,RR};
char Means[2];
char b;
PCBSTRUCT
{
char Name[10];
int Proi;
int Round;
int CpuTime;
int NeedTime;
int Count;
char
State;
PCBSTRUCT* Next;
};
PCB Finish,Ready,Tail,Run;
void FirstIn()
{
Run = Ready;
Run->State = 'R';
Ready = Ready->Next;
}
void Print1()
{
if ((strcmp(Means,"PR")==0) || (strcmp(Means,"pr")==0))
printf("\n Name CpuTime NeedTime Prioprity State\n");
else
printf("\n Name CpuTime NeedTime Count Round State\n");
}
void Print2(PCB temp)
{
if ((strcmp(Means,"PR")==0) || (strcmp(Means,"pr")==0))
printf("%8s %6d %8d %10d %8c\n",temp->Name,temp->CpuTime,
temp->NeedTime,temp->Proi,temp->State);
else
printf("%8s %6d %8d %8d %8d %8c\n",temp->Name,temp->CpuTime,
temp->NeedTime,temp->Count,temp->Round,temp->State);
}
void print()
{
PCB p;
Print1();
printf("It's the Run queue\n");
if (Run != NULL)
Print2(Run);
p = Ready;
printf("It's the Ready queue\n");
while (p != NULL)
{
Print2(p);
p = p->Next;
}
printf("It's the Finished queue\n");
p = Finish;
while (p != NULL)
{
Print2(p);
p = p->Next;
}
printf("\n\n");
}
void Insert1(PCB q)
{
//请编写程序
}
void Insert2(PCB p2)
{
Tail->Next = p2;
Tail = p2;
p2->Next = NULL;
}
void Create(enum Algorithm alg)
{
PCB p;
int i,time;
char Na[10];
Ready = NULL;
Finish = NULL;
Run = NULL;
if (alg == PR)
{
//请编写程序
}
else
{
Ready = NULL;
for (i=0;i<5;i++)
{
scanf("%s",Na);
scanf("%d",&time);
p = (PCB)malloc(sizeof(PCBSTRUCT));
strcpy(p->Name,Na);
p->CpuTime = 0;
p->NeedTime = time;
p->Count = 0;
p->State = 'W';
p->Round = 2;
if (Ready != NULL)
Insert2(p);
else
{
p->Next = Ready;
Ready = p;
Tail = p;
}
}
}
if (alg == PR)
printf("Output Of Priority:\n");
else
printf("Output of RoundRobin:\n");
Run = Ready;
Ready = Ready->Next;
Run-> State = 'R';
}
void PriSch()
{
//请编写程序
}
void RoundSch()
{
while (Run != NULL)
{
Run->CpuTime = Run->CpuTime + 1;
Run->NeedTime = Run->NeedTime - 1;
Run->Count = Run->Count + 1;
if (Run->NeedTime == 0)
{
Run->Next = Finish;
Finish = Run;
Run->State = 'F';
Run = NULL;
if (Ready != NULL)
FirstIn();
}
else if (Run->Count == Run->Round)
{
Run->Count = 0;
if (Ready != NULL)
{
Run->State = 'W';
Insert2(Run);
FirstIn();
}
}
print();
getch();
}
}
void main()
{
printf("Type then Algorithm:(Priority/RoundRobin)");
scanf("%s",Means);
printf("\nInput Name and NeedTime\n");
if ((strcmp(Means,"PR")==0) ||(strcmp(Means,"pr")==0))
{
Create(PR);
PriSch();
}
else if ((strcmp(Means,"RR")==0) || (strcmp(Means,"rr")==0))
{
Create(RR);
RoundSch();
}
else
printf("
Invalid Input!");
printf("\nIt's Finished!");
g
etch();
}
(六) 参考书目
① 郭浩志 《计算机软件实践教程》
② 庞丽萍 《计算机操作系统》