一、实验目的
用高级语言编写和调试一个进程调度程序,以加深对进程的概念 及进程调度算法的理解。
二、实验内容
设计一个有 N 个进程共行的进程调度程序。
(1)进程调度算法:采用最高优先数优先的调度算法(即把处 理机分配给优先数最高的进程)和先来先服务算法。
(2)每个进程有一个进程控制块(PCB)表示。进程控制块可 以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用11 CPU 时间、进程状态等。
(3)每个进程的状态可以是就绪 W(Wait)、运行 R(Run)或 完成 F(Finish)三种状态之一。
(4)进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。
(5)进程的到达时间为进程的输入的时间。
(6)进程的运行时间以时间片为单位进行计算。
(7)就绪进程获得 CPU 后都只能运行一个时间片。
(8)用已占有 CPU 时间加 1 来表示。
(9)如果运行一个时间片后,进程的已占有 CPU 时间已达到所 需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占 有 CPU 时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减 1(即降低一级),然后把它插入就绪队列 等待 CPU。
三、实验结果
1.实验结果
2.详细代码
#include <iostream>
#define ready 1
#define run 2
#include "malloc.h"
struct PCB
{
char name010[10]; //进程名
int priority010; //进程优先级
int state010; //进程的状态W R F
int needtime010; //进程需要的运行时间
int runtime010; //已用时间
struct PCB* next;
};
PCB *head; //进程控制块设计
/*此函数用于创建进程队列*/
void create()
{
PCB *p,*q;
int n,i;
printf("请输入要创建的进程数:");
scanf("%d",&n);
head=(PCB*)malloc(sizeof(PCB));
p=head;
for(i=1;i<=n;i++)
{
q=(PCB*)malloc(sizeof(PCB));
p->next=q;
p=q;
printf("请输入第%d个进程的进程名:",i);
scanf("%s",&q->name010);
printf("请输入进程的优先级:",i);
scanf("%d",&q->priority010);
printf("请输入进程所需的运行时间:",i);
scanf("%d",&q->needtime010);
q->state010=Wait;
q->next=NULL;
}
}
/*删除执行完毕的进程*/
void delete_(PCB *head,PCB *p)
{
PCB *q;
q = head;
while(q->next != p)
q = q->next;
q->next = p->next;
free(p);
}
/*找出执行时间最短的进程*/
PCB* getminneedtime(PCB* head)
{
PCB *p,*q;
p = head->next;
q = p->next;
while(q)
{
if(p->needtime010 > q->needtime010)
p = q;
q = q->next;
}
return p;
}
/*短作业优先*/
void SJF()
{
PCB *p, *q;
while(head->next)
{
p = getminneedtime(head);
p->state010 = Run;
printf("\n****正在运行的进程信息如下所示:\n");
printf("进程名:%s ",p->name010);
printf("进程状态:Run ");
printf("进程所需时间:%d ",p->needtime010);
printf("进程的运行时间:%d\n",p->runtime010);
q=head->next;
if(q->next != NULL)
{
printf("****现在的就绪队列信息如下:*****\n");
}
else
{
printf("****现在就绪队列为空!!!*****\n\n");
}
while(q)
{
if(q!=p)
{
printf("进程名为:%s ",q->name010);
printf("进程状态:Wait ");
printf("进程所需时间为:%d ",q->needtime010);
printf("进程运行时间为:%d\n",q->runtime010);
}
q=q->next;
}
delete_(head,p);
}
}
/*时间片轮转*/
void RR()
{
PCB *p, *q, *r;
int time;
printf("请输入时间片的大小:");
scanf("%d",&time);
p = head->next;
while(p) //找到进程链表最后一个PCB
{
r = p;
p = p->next;
}
while(head->next)
{
p = head->next;
p->state010 = Run;
printf("\n****正在运行的进程信息如下:****\n");
printf("%s ",p->name010);
printf("Run ");
printf("需要时间:%d ",p->needtime010);
printf("运行时间:%d ",p->runtime010);
printf("优先权:%d\n\n",p->priority010);
if((p->needtime010 - p->runtime010 )<= time)
{
delete_(head,p);
}
else
{
p->runtime010 = p->runtime010 + time;
head->next = p->next;
r->next = p;
r = p;
r->state010 = Wait;
r->next = NULL;
}
if(head->next == NULL)
printf("****现在就绪队列为空!!!*****\n\n");
else
{
printf("****现在的就绪队列信息如下:*****\n");
q = head->next;
while(q)
{
printf("%s ",q->name010);
printf("Wait ");
printf("需要时间:%d ",q->needtime010);
printf("运行时间:%d",q->runtime010);
printf("优先权:%d\n",q->priority010);
q = q->next;
}
}
}
}
/*找出优先级最高的进程*/
PCB* getpriority(PCB* head)
{
PCB *p, *q;
p = head->next;
q = p->next;
while(q)
{
if(q->priority010 > p->priority010)
p = q;
q = q->next;
}
return p;
}
/*优先权调度算法*/
void HPF()
{
PCB *p, *q;
while(head->next)
{
p = getpriority(head);
p->state010 = Run;
(p->runtime010)++;
(p->priority010)--;
printf("\n****正在运行的进程信息如下:****\n");
printf("%s ",p->name010);
printf("Run ");
printf("需要时间:%d ",p->needtime010);
printf("运行时间:%d ",p->runtime010);
printf("优先权:%d\n",p->priority010);
if(p->runtime010 == p->needtime010)
delete_(head,p);
q = head->next;
if(q!= NULL)
printf("****现在的就绪队列信息如下:*****\n");
else
printf("****现在就绪队列为空!!!*****\n\n");
while(q)
{
printf("%s ",q->name010);
printf("Wait ");
printf("需要时间:%d ",q->needtime010);
printf("运行时间:%d",q->runtime010);
printf("优先权:%d\n",q->priority010);
q = q->next;
}
}
}
/*输出菜单*/
void printfunc()
{
printf(" *******************\n");
printf(" * 1-创建进程 *\n");
printf(" * 2-短作业调度算法 *\n");
printf(" * 3-优先权调度算法 *\n");
printf(" * 4-时间片轮回算法 *\n");
printf(" * 0-退出 *\n");
printf(" *******************\n");
}
int main()
{
printfunc();
int choice;
do
{
printf("请输入相应的数字:") ;
scanf("%d",&choice);
switch(choice)
{
case 1:
create();
printfunc();
break;
case 2:
if(head == NULL || head->next == NULL)
printf("****现在就绪队列为空,请先创建进程*****\n");
else
{
SJF();
printfunc();
}
break;
case 3:
if (head == NULL || head->next == NULL)
printf("****现在就绪队列为空,请先创建进程*****\n");
else
{
HPF();
printfunc();
}
break;
case 4:
if (head == NULL || head->next == NULL)
printf("****现在就绪队列为空,请先创建进程*****\n");
else
{
RR();
printfunc();
}
break;
case 0:
exit(0);
}
}while(1);
}