C语言实现操作系统时间片轮转+优先数算法
大家可以参考以下内容,好好的去理解以下这两个操作系统的算法哦,第一次开始写文章,初衷就是想要记录下自己做过的一些东西,并且发布出来和大家一起讨论一起进步,如果可以的话,希望大家可以点点赞点点关注啊!!!
一、实验要求
1、 设计一个进程控制块PCB
包括:进程名、进程优先数、进程所占CPU时间、还需要CPU时间、进程状态、下一列指针
2、 建立进程就绪队列:要求按照不同调度算法建立就绪队列
3、 编制两个调度算法,进程数由用户从键盘输入
(1)时间片轮转法(时间片为2)
(2)优先数算法 (优先数高优先级高)
初始优先数 = 50 – 运行时间
每运行一次优先数减3。
二、数据结构设计说明
时间片轮转算法:num:进程数 s:时间片大小 name:进程名 cputime 为CPU已运行的时间单位数 needtime 为进程还需要运行的时间单位数 count为已经运行的轮数 round为被分配的时间片数量 state中R代表运行,W代表等待 process[100]表示一个进程的数组,里面包含相关的信息
优先数算法:name[10]:进程名 cputime:CPU已运行的时间单位数 needtime:进程还需要运行的时间单位数 count:已经运行的轮数 pri:进程优先数 state:进程状态 counter:进程个数 time:时间片大小 countf:执行完成个数
三、代码
1.时间片算法代码
#include
int num;
int s;
struct PCB{
int cputime;
int needtime;
int count;
int round;
int flag;
int p;
char Name[300];
char state[200];
}process[100];
void input(){
int i=0;
printf("input name and needtime:");
printf("
name needtime");
printf("
");
while(i<=num-1)
{
scanf("%s %d",process[i].Name,&process[i].needtime);
i++;
}
}
int count()
{
int a=0,i;
for (i=0;i<=num-1;i++)
{
if (process[i].p==0)
{
a+=1;
}
}
return a;
}
void start(){
int i=0;
for (i=0;i<=num-1;i++)
{
process[i].cputime=0;
process[i].count=0;
process[i].round=s;
process[i].p=1;
strcpy(process[i].state,"W");
}
strcpy(process[0].state,"R");
}
void flag(){
if (process[0].p==1)
{
if (process[0].needtime-s<=0)
{
process[0].cputime=process[0].cputime+process[0].needtime;
process[0].needtime=0;
process[0].p=0;
process[0].count++;
strcpy(process[0].state,"F");
}
else
{
process[0].cputime=process[0].cputime+s;
process[0].needtime=process[0].needtime-s;
process[0].count++;
strcpy(process[0].state,"W");
}
}
else
{
strcpy(process[0].state,"F");
}
}
void exchange_1()
{
int i=0,j=0,r=0,x;
int k,l,y,m;
char c[50],b[50];
r=count();
for(i=0;i=1&&r<=num-1)
{
for (i=num-1-r;i<num-1;i++)
{
k=process[i].cputime;
process[i].cputime=process[i+1].cputime;
process[i+1].cputime=k;
l=process[i].needtime;
process[i].needtime=process[i+1].needtime;
process[i+1].needtime=l;
m=process[i].p;
process[i].p=process[i+1].p;
process[i+1].p=m;
y=process[i].count;
process[i].count=process[i+1].count;
process[i+1].count=y;
strcpy(c,process[i].Name);
strcpy(process[i].Name,process[i+1].Name);
strcpy(process[i+1].Name,c);
strcpy(b,process[i].state);
strcpy(process[i].state,process[i+1].state);
strcpy(process[i+1].state,b);
}
}
else if (r==num)
{
for (i=0;i<=num-2;i++)
{
k=process[i].cputime;
process[i].cputime=process[i+1].cputime;
process[i+1].cputime=k;
l=process[i].needtime;
process[i].needtime=process[i+1].needtime;
process[i+1].needtime=l;
m=process[i].p;
process[i].p=process[i+1].p;
process[i+1].p=m;
y=process[i].count;
process[i].count=process[i+1].count;
process[i+1].count=y;
strcpy(c,process[i].Name);
strcpy(process[i].Name,process[i+1].Name);
strcpy(process[i+1].Name,c);
strcpy(b,process[i].state);
strcpy(process[i].state,process[i+1].state);
strcpy(process[i+1].state,b);
}
}
}
void output()
{
int i,l=0,j=num-1,y=0,z=0;
if (process[0].p==1)
{
strcpy(process[0].state,"R");
}
printf("
Name cputime needtime count round state");
for (i=0;i<=num-1;i++)
{
printf("
%s %d %d %d %d %s",process[i].Name,process[i].cputime,process[i].needtime,process[i].count,process[i].round,process[i].state);
}
while(y<=num-1)
{
if (process[y].p==0)
{
j--;
}
y++;
}
printf("
就绪队列:");
for (i=0;i<j;i++)
{
printf("%s ",process[i+1].Name);
}
printf("
完成队列:");
while(z0;i--)
{
printf("%s",process[num-i].Name);
}
}
void main()
{
printf("请输入进程数:");
scanf("%d",&num);
printf("请输入时间片:");
scanf("%d",&s);
int x=0;
input();
start();
while(x!=num)
{
output();
flag();
x=count();
exchange_1();
exchange_2();
}
output();
}
2.优先数算法代码
#include
#include
#include
#define MAX 200
struct PCB//用结构体来表示进程控制块PCB
{
char name[10];//进程名
int cputime;//CPU已运行的时间单位数
int needtime;//进程还需要运行的时间单位数
int count;//已经运行的轮数
int pri;//进程优先数
char state;//进程状态
};
struct PCB task[MAX];//定义结构体数组
int counter;//进程个数
int time;//时间片大小
int countf=0;//执行完成个数
void putin();//输入进程个数、时间片大小、进程
void process();//进程处理函数
void putout();//输出函数
void change1();//进程轮换函数1(将已经运行完的进程置底)
void change2();//根据进程优先数再对进程顺序进行一个轮换
int main()
{
int i;
putin();
while(1)
{
if(countf==counter) break;
else process();
}
putout();
system("pause");
return 0;
}
void putin()
{
int i=0;
printf("input the number of tasks:");
scanf("%d",&counter);
printf("input the time:");
scanf("%d",&time);
printf("input name and needtime:
");
for(i=0;i<counter;i++)
{
scanf("%s %d",task[i].name,&task[i].needtime);
task[i].cputime=0;
task[i].count=0;
task[i].pri=50-task[i].needtime;
task[i].state='W';
}
}
void change1()
{
struct PCB t;
int i,j;
for(i=0;i<counter-1-countf;i++)
{
t=task[i];
task[i]=task[i+1];
task[i+1]=t;
}
}
void change2()
{
struct PCB t;
int i,j;
for(i=0;i<counter-1-countf;i++)
{
for(j=0;j<counter-1-countf-i;j++)
{
if(task[j].pritime)
{
task[i].needtime-=time;
task[i].count++;
task[i].cputime+=time;
task[i].pri-=3;
task[i].state='W';
change1();
}
else
{
task[i].cputime+=task[i].needtime;
task[i].needtime=0;
task[i].count++;
//task[i].pri-=3;
task[i].state='F';
change1();
countf++;
}
}
void putout()
{
printf("
Name cputime needtime count pri state
");
int i=0;
for(i=0;i<counter;i++)
{
printf(" %s %d %d %d %d %c
",task[i].name,task[i].cputime,task[i].needtime,task[i].count,task[i].pri,task[i].state);
}
printf("就绪队列:");
for(i=0;i=0;i--)
{
if(task[i].state=='F') printf("%s ",task[i].name);
}
printf("
");
}