a4

#include<stdio.h>
#define N 100
#define INF 100000000
struct PCB
{
	int id;//标志数
	int priority;//优先数
	int cputime;//已占用CPU时间
	int alltime;//还需占用CPU时间
	int startblock;//阻塞时间
	int blocktime;//被阻塞时间
	int state;//状态
}pro[N];

int n;//进程数
int time;//已经过的时间片数
int oncall_front,oncall_rear;
int block_front,block_rear;

//输入初始进程PCB
void Input()
{
	for(int i=0;i<n;i++)
	{
		scanf("%d%d%d%d%d%d",&pro[i].id,&pro[i].priority,&pro[i].cputime,&pro[i].alltime,&pro[i].startblock,&pro[i].blocktime);
		pro[i].state=0;
	}
}
//检测是否所有进程都完成,是则返回1,否则返回0
int Finish()
{
	for(int i=0;i<n;i++)
	{
		if(pro[i].alltime>0)
			return 0;
	}
	return 1;
}
//找出优先权最大的进程,返回它在pro数组中的序号
int Priority()
{
	int max=-INF,max_id=-1;
	for(int i=0;i<n;i++)
	{
		if(pro[i].state==0 && pro[i].alltime>0 && max<pro[i].priority)//只考虑就绪状态的进程
		{
			max=pro[i].priority;
			max_id=i;
		}
	}
	return max_id;
}

//阻塞判断
void Block_Judge()
{
	for(int i=0;i<n;i++)
	{
		if(pro[i].startblock!=-1)
		{
			if(time>=pro[i].startblock+1 && time<pro[i].startblock+1+pro[i].blocktime)
				pro[i].state=2;
			else
				pro[i].state=0;
		}
	}
}
//时间片过程,更新PCB
void Cputime_process()
{
	for(int i=0;i<n;i++)
	{
		if(pro[i].state==1)//使用处理机的进程
		{
			pro[i].priority-=3;
			pro[i].cputime++;
			pro[i].alltime--;
		}
		else if(pro[i].state==0)//就绪队列的进程
		{
			pro[i].priority++;
		}
	}
}
void print()
{
	printf("==================== current_time: %d =======================\n\n",time);
	printf("   ID\t");//ID
	for(int i=0;i<n;i++)
		printf("%d\t",pro[i].id);
	printf("\n");
	printf("   PRIORITY\t");//PRIORITY
	for(int i=0;i<n;i++)
		printf("%d\t",pro[i].priority);
	printf("\n");
	printf("   CPUTIME\t");//CPUTIME
	for(int i=0;i<n;i++)
		printf("%d\t",pro[i].cputime);
	printf("\n");
	printf("   ALLTIME\t");//ALLTIME
	for(int i=0;i<n;i++)
		printf("%d\t",pro[i].alltime);
	printf("\n");
	printf("   STARTBLOCK\t");//STARTBLOCK
	for(int i=0;i<n;i++)
		printf("%d\t",pro[i].startblock);
	printf("\n");
	printf("   BLOCKTIME\t");//BLOCKTIME
	for(int i=0;i<n;i++)
		printf("%d\t",pro[i].blocktime);
	printf("\n");
	printf("   STATE\t");//STATE
	for(int i=0;i<n;i++)
		printf("%d\t",pro[i].state);
	printf("\n\n");

}
int main()
{
	time=0;
	oncall_front=oncall_rear=block_front=block_rear=-1;
	printf("Please input the number of processes:");
	scanf("%d",&n);
	Input();
	
	while(!Finish())
	{
		time++;
		Block_Judge();
		int max_id=Priority();
		pro[max_id].state=1;
		Cputime_process();
		print();
		pro[max_id].state=0;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值