进程调度—时间片轮转

#include <malloc.h>
#include <stdio.h>
#include <string.h>

typedef struct table
{ 
	int key;             /*进程ID号*/
	int run_time;        /*进程所需要的运行时间*/
	char message[10];    /*进程说明信息*/
	struct table *next;
}node;

node *creat(void)
{
	node *head;
	node *p1, *p2;
	int n = 0;
	p1 = p2 = (node *)malloc(sizeof(node));
	scanf("%d %d", &p1->key, &p1->run_time);
	gets(p1->message);

	while (p1->key != 0) {
		++n;
		if (n == 1)
			head = p1;
		else 
			p2->next = p1;
		p2 = p1;
		p1 = (node *)malloc(sizeof(node));
		scanf("%d %d",&p1->key,&p1->run_time);
		gets(p1->message);
	}
	p2->next = NULL;
	return head;
}

/*
	输出函数
*/
void print(node *head)
{
	node *p;
	printf("\n recent table is:\n");
	p = head;

	while (p) {
		printf("%d,%d,%s\n",p->key,p->run_time,p->message);
		p = p->next;
	}
}

/*
	对进程表按优先数从大到小排序
*/
node *insert(node *head, node *news)
{
	node *p;
	p = head;

	if (head == NULL) {
		head = news;
		head->next = NULL;
	} else {
		while (p->next != NULL)
			p = p->next;
		p->next = news;
		p = news;
		p->next = NULL;
	}
	return head;
}
/*
	模拟当前就绪进程队列中最先进入进程出队并输出的调度过程
*/
node *timeslice(node *head, int cpu_base_time)
{
	node *p, *q;
	p = head;

	if (p->run_time > cpu_base_time) {
		q = (node *)malloc(sizeof(node));
		q->key = p->key;
		q->run_time = p->run_time - cpu_base_time;
		strcpy(q->message, p->message);
		q->next = NULL;
		printf("key=%d,run_time=%d,message=%s\n",p->key,cpu_base_time,p->message);
		head = p->next;
		head = insert(head, q);
	} else {
		printf("key=%d,run_time=%d,message=%s\n",p->key,p->run_time,p->message);
		head = p->next;
	}
	free(p);
	return head;
}

int main(void)
{
	int count=0,cpu_base_time;
   	node *p,*q;

   	printf("新建的进程控制表为:\nkey run_time message\n");
   	p=creat(); /*输入进程控制表*/
   	print(p);/*输出原始进程控制表*/
   	printf("CPU运行的单位时间片cpu_base_time为:\n");
   	scanf("%d",&cpu_base_time);
   	
	while(p)/*模拟按单位时间片长逐个被调度并进入CPU运行的过程*/
   	{
   		count++;
     	printf("\n第%d次被调度的就绪进程为:\n",count);
     	p=timeslice(p,cpu_base_time);
     	if(p==NULL) {
		 	printf("\n distribute is over! \n");
			break;
       	}
    	print(p);
    }
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值