C语言实现操作系统时间片轮转+优先数算法

作者 : admin 本文共4922个字,预计阅读时间需要13分钟 发布时间: 2024-01-16 共1人阅读

大家可以参考以下内容,好好的去理解以下这两个操作系统的算法哦,第一次开始写文章,初衷就是想要记录下自己做过的一些东西,并且发布出来和大家一起讨论一起进步,如果可以的话,希望大家可以点点赞点点关注啊!!!

一、实验要求

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("
");
}

四、结果

1.时间片

C语言实现操作系统时间片轮转+优先数算法插图

C语言实现操作系统时间片轮转+优先数算法插图(1)

C语言实现操作系统时间片轮转+优先数算法插图(2)

2.优先数

C语言实现操作系统时间片轮转+优先数算法插图(3)

C语言实现操作系统时间片轮转+优先数算法插图(4)

C语言实现操作系统时间片轮转+优先数算法插图(5)

本站无任何商业行为
个人在线分享 » C语言实现操作系统时间片轮转+优先数算法
E-->