计算机操作系统动态优先算法实验

本文档分享了一个新手使用C语言实现的动态优先权进程调度算法,包括进程结构定义、优先级规则、状态管理及调度过程的完整代码。着重展示了如何创建PCB结构并管理就绪队列和阻塞队列,适合初学者学习进程调度原理。
摘要由CSDN通过智能技术生成

新手敲的,大佬就别看了

由于时间问题,代码没有进行整理,所以比较乱,后面我提交作业之后也懒得去搞了,大家随便看看就好

最重要的就是:新手敲的!大家轻点喷!!!

1实验内容:

(1)用C语言实现对N个进程采用动态优先权优先算法的进程调度;

(2)每个用来标识进程的进程控制块PCB用结构来描述,包括如下字段:

a、进程标识数id;

b、进程优先数priority,并规定优先数越大的进程,其优先权越高;

c、进程已占用的CPU时间cputime;

d、进程还需要占用的CPU时间alltime,当进程运行完毕时,alltime变为0;

e、进程的阻塞时间startblock,表示当进程再运行startblock个时间片后,进程将进入阻塞状态;

f、进程被阻塞的时间blocktime,表示已阻塞的进程再等待blocktime个时间片后,将转换为就绪状态;

g、进程状态state

h、队列指针next,用来将PCB排成队列。

(3)优先权数改变的原则:

a、进程在就绪队列中呆一个时间片,优先数增加1;

b、进程每运行一个时间片,优先数减3

(4)假设在调度前,系统中有5个进程,自己设置其初始状态;

(5)显示调度过程,清楚显示当前调度进程,就绪队列,阻塞队列及每个进程的相应状态(即上表的动态变化输出)。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//枚举字符串
char* str1 = "ready";
char* str2 = "done";
char* str3 = "end";
// 初始进程数
int process_num = 0;

// 进程结构体
typedef struct PCB {
	int id;
	int priority;
	int cputime;
	int alltime;
	int startblock;
	int blocktime;
	char state[10];
	struct PCB* NEXT;
}PCB;
// 全局进程队列
PCB* ALL_PROCESS[100];
// 阻塞队列头节点,空数据
PCB* block_process_queue_head = (PCB*)malloc(sizeof(PCB));
// 就绪队列头节点,空数据
PCB* ready_process_queue_head = (PCB*)malloc(sizeof(PCB));


// 初始化进程
void init_process() {

	printf("输入进程的初始化信息:\n");
	PCB* before = ready_process_queue_head;
	for (int i=0; i<process_num; i++) {
		PCB* p = (PCB*)malloc(sizeof(PCB));
		// 加入全局进程队列
		ALL_PROCESS[i] = p;
		before->NEXT = p;
		scanf("%d %d %d %d %d %d %s", &p->id, &p->priority, &p->cputime, &p->alltime, &p->startblock, &p->blocktime, &p->state);
		p->NEXT = NULL;
		before = p;

	}

}
//获取优先级最高的进程
int jiba()
{
    int temp = 0;

    for(int i=0;i<process_num;i++){
        if (strcmp(ALL_PROCESS[i]->state, str1) == 0)
        {
            if(ALL_PROCESS[i]->priority>temp)
            temp = ALL_PROCESS[i]->priority;
     //       printf("temp %d\n",temp);
        }
     //   printf("第二次temp %d\n",temp);
    //    else
    //    {
    //        return -1;
    //    }
    }
    for(int i=0;i<process_num;i++){
        if (strcmp(ALL_PROCESS[i]->state, str1) == 0)
        {
            if(temp == ALL_PROCESS[i]->priority)
            {
             //   printf("找优先级 %d\n",temp);
             //   printf("i %d\n",i);
                return i;
            }
        }
    }
}

//就绪队列中的 优先级、cpu时间处理
void yxj(int b)
{
    for(int i=0;i<process_num;i++)
    {
   //     printf("b %d\n",b);
        if(b == i)
        {
            //优先级减3
            ALL_PROCESS[b]->priority -= 3;
            //已占用cpu时间加1
            ALL_PROCESS[b]->cputime += 1;
            //所需cpu时间减1
            ALL_PROCESS[b]->alltime -= 1;
            //运行多久会停
            ALL_PROCESS[b]->startblock -= 1;
      //      printf("优先数 %d\n",ALL_PROCESS[b]->priority);
            //时间变为零的话就将状态变为done
            if(ALL_PROCESS[b]->startblock == 0)
            {
                strcpy(ALL_PROCESS[b]->state,str2);
            }
            //alltime为零,表示进程已做完
            if(ALL_PROCESS[b]->alltime == 0)
            {
                strcpy(ALL_PROCESS[b]->state,str3);
            }

        }

        if (strcmp(ALL_PROCESS[i]->state, str1) == 0)
        {
            ALL_PROCESS[i]->priority +=1;
        //    printf("%d\n",ALL_PROCESS[i]->priority);
    //        ALL_PROCESS[i]->blocktime -= 1;
        }

        else
        {
            ALL_PROCESS[i]->blocktime -= 1;
            if(ALL_PROCESS[i]->blocktime == 0)
            {
                strcpy(ALL_PROCESS[b]->state,str1);
            }
        }
    }

}
//阻塞队列中的
void yxj2()
{
    for(int i=0;i<process_num;i++)
    {
        if (strcmp(ALL_PROCESS[i]->state, str2) == 0)
        {
            ALL_PROCESS[i]->blocktime -= 1;
            //时间变为零的话就将状态变为ready
            strcpy(ALL_PROCESS[i]->state, str1);
        }
    }

}

//判断进程的状态
void cxzt()
{
    for(int i=0;i<process_num;i++)
    {
        if(ALL_PROCESS[i]->blocktime == 0)
            strcpy(ALL_PROCESS[i]->state, str1);
        if(ALL_PROCESS[i]->startblock == 0)
            strcpy(ALL_PROCESS[i]->state, str2);
    }
}

//判断是否还有程序运行
int number(int num = 0)
{

    for(int i=0;i<process_num;i++)
    {
        if (strcmp(ALL_PROCESS[i]->state, str1) == 0)
        {
            num += ALL_PROCESS[i]->alltime;
        }
    }
    return num;
}

int main()
{
    printf("输入进程的个数:\n");
    scanf("%d",&process_num);
    init_process();
    while(1)
    {
        int ber = number();//判断程序
    //    printf("ber %d\n",ber);
        if(ber == -1)
        {
            printf("已完成");
            return 0;
        }
      //  int cc = number();
      //  printf("num %d",ber);
    //    printf("num 的和 %d\n",num);
        if(ber>0)
        {
            int a = jiba();//找优先级最高的
            //优先级、cpu时间处理
            yxj(a);
            yxj2();
      //      printf("优先级\n");
            cxzt();//判断进程的状态
    //        printf("进程状态\n");

            printf("  ID  PRIORITY   CPUTIME   ALLTIME   STARTBLOCK    BLOCKTIME   STATE\n");
            for(int i=0;i<process_num;i++)
            {
                printf("  %d    %d          %d         %d         %d            %d           %s\n",ALL_PROCESS[i]->id,ALL_PROCESS[i]->priority,ALL_PROCESS[i]->cputime,ALL_PROCESS[i]->alltime,ALL_PROCESS[i]->startblock,ALL_PROCESS[i]->blocktime,ALL_PROCESS[i]->state);
            }
            printf("---------------------------------------------------------------------------\n\n");
        //    int cc = number();
        //    printf("num %d",cc);
        }
        else
        {
            printf("  ID  PRIORITY   CPUTIME   ALLTIME   STARTBLOCK   BLOCKTIME   STATE\n");
            for(int i=0;i<process_num;i++)
            {
                printf("  %d    %d          %d         %d         %d            %d           %s\n",ALL_PROCESS[i]->id,ALL_PROCESS[i]->priority,ALL_PROCESS[i]->cputime,ALL_PROCESS[i]->alltime,ALL_PROCESS[i]->startblock,ALL_PROCESS[i]->blocktime,ALL_PROCESS[i]->state);
            }
            printf("---------------------------------------------------------------------------\n\n");
            printf("不大于零");
            return 0;
        }


    }

}

 实验结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值