实验一 进程调度
一、 实验目的
在采用多道程序设计的系统中,有若干个进程同时处于就绪状态。当就绪进程个数大于处理机数时,就必须依照某种调度策略决定哪些进程可以分到处理机,本实验模拟在单处理机情况下的处理机调度。
二、实验要求
1、 设计一个进程控制块PCB
包括:进程名、进程优先数、进程所占CPU时间、还需要CPU时间、进程状态、下一列指针
2、 建立进程就绪队列:要求按照不同调度算法建立就绪队列
3、 编制两个调度算法,进程数由用户从键盘输入
(1)时间片轮转法(时间片为2)
(2)优先数算法 (优先数高优先级高)
初始优先数 = 50 - 运行时间
每运行一次优先数减3。
三、程序的数据结构设计(变量的定义和定义的含义注释)
N 50 //最大进程数+1
char name[10]; //进程名
int cputime; //CPU已运行的时间单位数
int needtime; //进程还需要运行的时间单位数
int count; //已经进行的轮数
int round; //被分配的时间片数量
char state; //状态
int pri; //优先级
int sum = 0; //完成的进程数
int num; //进程数
int T; //时间片长度
四、程序按测试文档运行后的结果截图
4.1时间片轮转法
4.1.1
4.1.2
4.2优先数算法
4.2.1
4.2.2
五、源程序
1、时间片轮转法
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 50 //最大进程数+1
struct PCB
{
char name[10]; //进程名
int cputime; //CPU已运行的时间单位数
int needtime; //进程还需要运行的时间单位数
int count; //已经进行的轮数
int round; //被分配的时间片数量
char state; //状态
int pri;
}process[N];
void in(int num,int T) //信息录入
{
int i;
printf("input name and needtime:\n");
for(i=0;i<num;i++)
{
scanf("%s %d",&process[i].name,&process[i].needtime);
process[i].cputime=0;
process[i].count=0;
process[i].round=T;
process[i].state='W';
process[i].pri=0;
}
process[0].state='R';
}
void out(int num)//输出
{
int i;
printf("name cputime needtime count pri round state\n");
for(i=0;i<num;i++)
printf("%s \t %d \t %d\t %d \t %d \t %d \t %c\n",process[i].name,process[i].cputime,process[i].needtime,process[i].count,process[i].pri,process[i].round,process[i].state);
printf("就绪队列:");
for(i=0;i<num;i++)
{
if(process[i].state=='W')
printf("%s\t",process[i].name);
}
printf("\n");
printf("完成队列:");
for(i=0;i<num;i++)
{
if(process[i].state=='F')
printf("%s\t",process[i].name);
}
printf("\n");
}
void change1(int num)
{
int i;
process[num]=process[0];
for(i=1;i<=num;i++)
process[i-1]=process[i];
}
void change2(int num,int sum)
{
int i,s;
s=num-sum;
process[num]=process[0];
for(i=1;i<s;i++)
process[i-1]=process[i];
process[s-1]=process[num];
}
void run(int num,int T)
{
int sum = 0; //完成的进程数
int i,j;
out(num);
while(sum < num)
{
if( process[0].state == 'R')
{
if(process[0].needtime<=T)
{
process[0].cputime+=process[i].needtime ;
process[0].needtime = 0;
process[0].state = 'F';
sum++;
process[0].count++;
change1(num);
if(process[0].state == 'W')
process[0].state = 'R';
}
else
{
process[0].cputime+=T ;
process[0].needtime-=T;
process[0].state = 'W';
process[0].count++;
change2(num,sum);
if(process[0].state == 'W')
process[0].state = 'R';
}
}
out(num);
}
}
main()
{
int num,T;
printf("input the number of customers:\n");
scanf("%d",&num);
printf("input the round:\n");
scanf("%d",&T);
in(num,T);
run(num,T);
}
2、优先数算法
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 50 //最大进程数+1
struct PCB
{
char name[10]; //进程名
int cputime; //CPU已运行的时间单位数
int needtime; //进程还需要运行的时间单位数
int count; //已经进行的轮数
int round; //被分配的时间片数量
char state; //状态
int pri;//进程优先数
}process[N];
void range0(int num)//初始排序
{
int i,j;
for(i = 0; i<num-1; i++)
{
for(j= num-2; j>=i; j--)
{
if (process[j].pri < process[j+1].pri)
{
process[num] = process[j];
process[j] = process[j+1];
process[j+1] = process[num];
}
}
}
}
void range(int s,int num)//排序
{
int i,j;
for(i = 0; i<s-1; i++)
{
for(j= i; j<s-1; j++)
{
if (process[j].pri < process[j+ 1].pri)
{
process[num] = process[j];
process[j] = process[j+1];
process[j+1] = process[num];
}
}
}
}
void in(int num,int T) //信息录入
{
int i;
printf("input name and needtime:\n");
for(i=0;i<num;i++)
{
scanf("%s %d",&process[i].name,&process[i].needtime);
process[i].cputime=0;
process[i].count=0;
process[i].round=T;
process[i].state='W';
process[i].pri=50-process[i].needtime;
}
range0(num);
process[0].state='R';
}
void out(int num)//输出
{
int i;
printf("name cputime needtime count pri round state\n");
for(i=0;i<num;i++)
printf("%s \t %d \t %d\t %d \t %d %d \t %c\n",process[i].name,process[i].cputime,process[i].needtime,process[i].count,process[i].pri,process[i].round,process[i].state);
printf("就绪队列:");
for(i=0;i<num;i++)
{
if(process[i].state=='W')
printf("%s\t",process[i].name);
}
printf("\n");
printf("完成队列:");
for(i=0;i<num;i++)
{
if(process[i].state=='F')
printf("%s\t",process[i].name);
}
printf("\n");
}
void change1(int num,int s)
{
int i;
process[num]=process[0];
for(i=1;i<=num;i++)
process[i-1]=process[i];
range(s,num);
}
void change2(int num,int sum)
{
int i,s;
s=num-sum;
process[num]=process[0];
for(i=1;i<s;i++)
process[i-1]=process[i];
process[s-1]=process[num];
range(s,num);
}
void run(int num,int T)
{
int sum = 0; //完成的进程数
int i,j,s;
out(num);
while(sum < num)
{
if( process[0].state == 'R')
{
if(process[0].needtime<=T)
{
process[0].cputime+=process[i].needtime ;
process[0].needtime = 0;
process[0].state = 'F';
sum++;
s=num-sum;
process[0].count++;
process[0].pri-=3;
change1(num,s);
if(process[0].state == 'W')
process[0].state = 'R';
}
else
{
process[0].cputime+=T ;
process[0].needtime-=T;
process[0].pri-=3;
process[0].state = 'W';
process[0].count++;
change2(num,sum);
if(process[0].state == 'W')
process[0].state = 'R';
}
}
out(num);
}
}
main()
{
int num,T;
printf("input the number of customers:\n");
scanf("%d",&num);
printf("input the round:\n");
scanf("%d",&T);
in(num,T);
run(num,T);
}
作者想说:
这个进程调度算法用了C语言,但没用到链表部分,直接暴力数组实现了。因此程序看上去较为冗杂。功能都能实现,没有问题。
这程序我真写了挺久。。。debug阶段着实痛苦。
觉得有用赞一个呗~&&有建议欢迎提出