#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;
}
进程调度—时间片轮转
最新推荐文章于 2023-05-18 16:33:59 发布