进程调度—时间片轮转

来源:互联网 发布:淘宝哪家百乐 编辑:程序博客网 时间:2024/05/17 02:53
#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;}

原创粉丝点击