操作系统—C语言进程调度模拟.c

来源:互联网 发布:linux系统ping命令参数 编辑:程序博客网 时间:2024/05/19 00:49
/*______________________________进程调度模拟程序设计说明:选择算法以后,进程由用户创建。______________________________*/#include<stdio.h>#include<stdlib.h>#define Left 75#define Right 77typedef struct node{int ID;       //进程IDint PRIORITY; //进程优先数int CPUTIME;  //进程占用CPU的时间int ALLTIME;  //进程所需要时间char STATE;   //进程当前状态    struct node *next;//指向下一个进程}PRO;int CHIP; //时间片数int NUM;  //进程个数int A=0;    // 0代表先来先服务算法 1时间片轮转调度算法PRO *p; //进程队列队头;void choose(){//选择    char ch;while(1){switch(A){case 0:printf("→[先来先服务算法]  [时间轮算法]  [优先级服务算法]");break;case 1:printf("  [先来先服务算法]→[时间轮算法]  [优先级服务算法]");break;case 2:printf("  [先来先服务算法]  [时间轮算法]→[优先级服务算法]");break;}ch=getch();if(ch==Left) A--;if(ch==Right) A++;if(A<0) A=2;if(A>2) A=0;if(ch=='\r') break;system("cls");}}int num(){//计算所有进程是否都调度完毕 返回为完成进程个数int i=NUM;PRO *t1;t1=p;while(t1!=NULL){    if(t1->ALLTIME==0)i--;t1=t1->next;}    return i;}PRO *_sort(PRO *h){//链表排序子函数PRO *p,*max;max=h;p=h;while(p->next!=NULL){//找max的节点p=p->next;if(max->PRIORITY<p->PRIORITY)max=p;}p->next=h;//形成环形链表while(p->next!=max)//找出min节点前面的节点并让它指向NULLp=p->next;p->next=NULL;h=max;return h;}PRO *sort(PRO *h){//链表排序int i=4;PRO *p;if(h==NULL)return h;h=_sort(h);p=h;while(p->next!=NULL){p->next=_sort(p->next);p=p->next;}return h;}int show(){//显示当前状态    PRO *t1;t1=p;printf("ID  PRIORITY  CPUTIME  ALLTIME  STATE\n");  while(t1!=NULL){    printf("P%-3d%-10d%-9d%-7d  %c\n",t1->ID,t1->PRIORITY,t1->CPUTIME,t1->ALLTIME,t1->STATE);    t1=t1->next;}    printf("-------------------------------------\n\n");}void queue(){//先来先服务算法    int t;PRO *t1=p;    printf("先来先服务算法,初始状态到每一个时间片用完状态:\n");    show();    while(t1!=NULL){t=CHIP;while(t!=0&&t1!=NULL){t--;t1->ALLTIME--;t1->CPUTIME++;t1->STATE='E';if(t1->ALLTIME==0){//进程调度完毕t1->STATE='F';t1=t1->next;}}show();    }}void time(){//时间片轮转调度算法    int t,i;PRO *t1=p;    printf("时间片轮转调度算法,初始状态到每一个时间片用完状态:\n");    show();    while(1){t=CHIP;while(t!=0&&t1!=NULL&&t1->ALLTIME!=0){    t--;    t1->ALLTIME--;    t1->CPUTIME++;t1->STATE='E';if(t1->ALLTIME==0){//进程调度完毕    t1->STATE='F';t=CHIP;//剩下时间段不要}}show();if(t1->STATE!='F')t1->STATE='R';if(t1!=NULL)t1=t1->next;if(t1==NULL)t1=p;i=num();if(i==0)//i等于0,表示所有进程运行完毕break;    }}void priority(){//优先级算法    int t;PRO *t1;p=sort(p);t1=p;printf("优先级算法,初始状态到每一个时间片用完状态:\n");    show();    while(t1!=NULL){t=CHIP;while(t!=0&&t1!=NULL){t--;t1->ALLTIME--;t1->CPUTIME++;t1->STATE='E';if(t1->ALLTIME==0){//进程调度完毕t1->STATE='F';t1=t1->next;}}show();    }}create_process(){//创建进程PRO *t1,*t2;int i=1;system("cls");    printf("请输入时间片数:");scanf("%d",&CHIP);    printf("请输入想创建进程个数(大于1):");scanf("%d",&NUM);p=(PRO *)malloc(sizeof(PRO));t1=p;t1->ID=i;t1->STATE='R';t1->CPUTIME=0;//开始创建时 占用cpu时间为0printf("请输入进程P%d的优先级:",i);scanf("%d",&t1->PRIORITY);    printf("请输入进程P%d的需要运行时间:",i);scanf("%d",&t1->ALLTIME);    while(i++<NUM){    t2=(PRO *)malloc(sizeof(PRO));t1->next=t2;    t2->ID=i;t2->STATE='R';    t2->CPUTIME=0;//开始创建时 占用cpu时间为0    printf("请输入进程P%d的优先级:",i);    scanf("%d",&t2->PRIORITY);        printf("请输入进程P%d的需要运行时间:",i);    scanf("%d",&t2->ALLTIME);t1=t2;}t1->next=NULL;}int main(){choose();//先选择算法create_process();//再创建进程system("cls");if(A==0)queue();if(A==1)time();if(A==2)priority();return 0;}

0 0