模拟进程管理C语言实现程序.docx
模拟进程管理C语言实现程序#include<stdio.h>#include<stdlib.h>#include<string.h>#define NULL 0 int shumu=0;/进程的内容结构体struct nodeint a;char ch;/进程PCB结构体struct jinchengint pid;int youxian;float luntime;float zhantime;char zhuangtai; /a表示执行,b表示动态就绪node *neirong;struct jincheng *next;struct jincheng *neijin,*neizhi,*p,*q;/换出进程函数void huanchu(int a)p=neijin;while(p->pid!=a&&p!=NULL)q=p;p=p->next;if(p=NULL)printf("该进程不在内存里!n");return;if(p=neijin)neijin=neijin->next;elseq->next=p->next; /把目标进程换出来,即把目标进程从就绪队列中移出来/杀死正在运行进程函数void shasineizhi->next=NULL;printf("运行的进程已经杀死!n");return;/创建新进程后与正在运行进程比较优先级并根据优先级判断谁该占用处理机int bijiaoint i,j;p=neijin;while(p!=NULL)q=p;p=p->next; /q指向进程的末尾,即新建的进程i=q->youxian; /i代表新进进程的优先级j=neizhi->next->youxian; /j代表正在执行进程的优先级if(i>j) /如果新建的进程的优先级高于正在执行程序的优先级p=neijin;if(p=q) /就绪队列的进程中只有一个进程。也就是那个新建的进程neijin=neizhi->next; p->neirong=(node*)malloc(sizeof(node);p->neirong->a=9;p->neirong->ch='c'neizhi->next=p; /把处理机交给优先级高的新进程return 1;else while(p->next!=q)p=p->next; /执行完后 p 指针在 q指针前面p->next=neizhi->next; /将正在执行的进程放置p的后面q->neirong=(node*)malloc(sizeof(node);q->neirong->a=9;q->neirong->ch='c'neizhi->next=q; /将q放置在正在执行列表中,把处理机交给优先级高的进程neizhi->next->next=NULL;return 1;elsereturn -1;void mainint zhixing;/定义函数void shasi;/定义函数void chakan;/定义函数void tongxing(int);/定义函数neizhi=(jincheng*)malloc(sizeof(jincheng);neizhi->next=NULL;neijin=(jincheng*)malloc(sizeof(jincheng); neijin->next=NULL;neijin->pid=1;neijin->youxian=6;neijin->luntime=3.5;neijin->zhantime=3;neijin->neirong=(node*)malloc(sizeof(node);neijin->neirong=NULL;neijin->zhuangtai='b'shumu+;p=(jincheng*)malloc(sizeof(jincheng);p->next=neijin->next;neijin->next=p;p->pid=2;p->youxian=5;p->luntime=3.5;p->zhantime=3;p->neirong=(node*)malloc(sizeof(node);p->neirong=NULL;p->zhuangtai='b'shumu+;q=(jincheng*)malloc(sizeof(jincheng);q->next=p->next;p->next=q;q->pid=3;q->youxian=4;q->luntime=3.5;q->zhantime=3;q->neirong=(node*)malloc(sizeof(node);q->neirong=NULL;q->zhuangtai='b'shumu+;int i,n=1;int k,j,s;j=zhixing;int creat;while(n=1)printf("*n");printf("* 进程演示系统 *n");printf("*n");printf(" 1.创建新的进程 2.查看运行进程 n"); printf(" 3.换出某个进程 4.杀死运行进程 n"); printf(" 5.进程之间通信 6.退出系统 n"); printf("*n");printf("请选择n");scanf("%d",&i);switch(i)case 1:k=creat;if(k=1)printf("进程创建成功!n");if(neijin->next=NULL)printf("由于只有一个进程所以为它分配处理机.n");neizhi->next=neijin;neijin->neirong=(node*)malloc(sizeof(node);neijin->neirong->a=3;neijin->neirong->ch='c'neijin=NULL;continue;k=bijiao;if(k=1)printf("由于新进程的优先级高于正在执行的进程所以正在执行的n");printf("进程让出处理机交给新进程,而它变为活动就绪!n");if(k!=1)printf("新进程的优先级低于正在运行的进程所以它只有等待!n");break;case 2:if(neizhi->next=NULL)printf("没有进程处于执行状态!n");continue;chakan;break;case 3:if(neijin=NULL)printf("内存中已经没有处于活动就绪的进程了请创建!n");continue;printf("已有处于活动就绪进程的名字为:n");p=neijin;printf("(");while(p!=NULL)printf("%d ",p->pid);p=p->next;printf(")n");printf("请输入要换出的处于活动就绪进程的名字n");scanf("%d",&s);huanchu(s);if(neijin=NULL)printf("内存中已经没有活动就绪进程!n");elseprintf("已有处于活动就绪进程的名字为:n");p=neijin;printf("(");while(p!=NULL)printf("%d ",p->pid);p=p->next;printf(")n");break;case 4:if(neizhi->next=NULL)printf("没有处于执行状态的进程!n");continue;shasi;if(neijin=NULL)printf("已经没有处于活动就绪的进程请创建!n");continue;j=zhixing;if(j=1)printf("已为一个动态就绪进程中优先级最高的进程分配处理器!n");break;case 5:if(neijin=NULL)printf("内存中已经没有处于活动就绪的进程了请创建!n");continue;if(neizhi->next=NULL)printf("没有处于执行状态的进程!n");continue;printf("请输入要与正在运行的进程进行进程通讯的进程名字n");scanf("%d",&s);tongxing(s);break;case 6:exit(0);default:n=0; /创建新的进程函数 int creat int i;if(shumu>20)printf("内存已满请先换出进程!n");i=-1;return i;elseif(neijin=NULL) /如果没有就绪队列中没有进程的话p=(jincheng*)malloc(sizeof(jincheng);printf("请输入新进程的名字:n");scanf("%d",&p->pid);printf("请输入新进程的优先级:n");scanf("%d",&p->youxian);p->luntime=3.5;p->zhantime=3;p->neirong=(node*)malloc(sizeof(node);p->neirong=NULL;p->zhuangtai='b' /新建进程的状态设置为“就绪”p->next=NULL;neijin=p;shumu+;i=1;else /如果就绪队列不是空队列p=neijin;while(p->next!=NULL)p=p->next; /p一直指向就绪队列的队尾q=(jincheng*)malloc(sizeof(jincheng);q->next=p->next;p->next=q; /在就绪队列的队尾加入新建的进程printf("请输入新进程的名字:n");scanf("%d",&q->pid);printf("请输入新进程的优先级:n");scanf("%d",&q->youxian);q->luntime=3.5;q->zhantime=3;q->neirong=(node*)malloc(sizeof(node);q->neirong=NULL;q->zhuangtai='b' /新建进程的状态设置为就绪shumu+;i=1;return i;/从活动就绪进程队列中找到一个优先级最高的进程并为它分配处理机int zhixingint i,j;p=neijin;if(neizhi->next!=NULL)return -1;i=neijin->youxian; /p=neijin->next; while(p!=NULL) j=p->youxian; if(i>=j)p=p->next; if(i<j) i=p->youxian; p=p->next; if(neijin->youxian=i) neijin->neirong=(node*)malloc(sizeof(node);neijin->neirong->a=9;neijin->neirong->ch='c'neizhi->next=neijin;neijin=neijin->next;neizhi->next->next=NULL;elsep=neijin;while(i!=p->youxian)q=p;p=p->next; / q是p前面的指针p->neirong=(node*)malloc(sizeof(node);p->zhuangtai='a'p->neirong->a=9;p->neirong->ch='c'neizhi->next=p; /将p放入执行列表q->next=p->next; /将优先级高的节点舍去return 1;/void chakanp=neizhi->next;printf("该执行进程的名字为:%dn",p->pid);printf("该执行进程的的优先级:%dn",p->youxian);printf("该执行进程的轮转时间为:%fn",p->luntime);printf("该执行进程占用cpu的时间为:%fn",p->zhantime);printf("该执行的进程内容为:n");printf("%d ",p->neirong->a);printf("%c",p->neirong->ch);printf("n");void tongxing(int a)q=neijin;while(q->pid!=a&&q!=NULL)q=q->next;/q为id为a的进程if(q=NULL)printf("所输入的进程不在内存中!n");return ;p=neizhi->next;/p为正在执行的进程q->neirong=(node*)malloc(sizeof(node);q->neirong->a=p->neirong->a;q->neirong->ch=p->neirong->ch;/将正在执行的进程内容复制给id为a的进程printf("通信成功!n");return;