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("\nname\tneedtime");
    printf("\n");
    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<=num-2-r;i++)
{
if (r==num-1)
{
break;
}
    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;
    y=process[i].count;
    process[i].count=process[i+1].count;
    process[i+1].count=y;
    m=process[i].p;
    process[i].p=process[i+1].p;
    process[i+1].p=m;
    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 exchange_2()
{
    int i=0,j=0,r=0,x;
    int k,l,y,m;
    char c[50],b[50];
r=count();
    if (process[num-1-r].p==0&&r>=1&&r<=num-1)
{
for (i=num-1-r;i0;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:\n");
	for(i=0;itime)
	{
		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("\nName    cputime    needtime    count    pri    state\n");
	int i=0;
	for(i=0;i=0;i--)
	{
		if(task[i].state=='F') printf("%s ",task[i].name);
	}
	printf("\n");
}

四、结果

1.时间片

2.优先数