实验一进程的状态及其转换一、实验目的:自行编制模拟程序,通过形象化的状态显示,加深理解进程的概念、进程之间的状态转换及其所带来的PCB内容、组织的变化,理解进程与其PCB间的一一对应关系。二、实验内容及要求:1)设计并实现一个模拟进程状态转换及其相应PCB内容、组织结构变化的程序。2)独立编写、调试程序。进程的数目、进程的状态模型(三状态、五状态、七状态或其它)以及PCB的组织形式可自行选择。3)合理设计与进程PCB相对应的数据结构。PCB的内容要涵盖进程的基本信息、控制信息、资源需求及现场信息。4)设计出可视性较好的界面,应能反映出进程状态的变化引起的对应PCB内容、组织结构的变化。三、程序流程图:开始初始化使用界面创建进程就绪队列结束空就绪队列链首进程开始运行该进程运行一个时间片在时间片内是否完成运行指针指向下一个进程撤销该进程否不空是四、使用的数据结构及说明:在本实验中,主要用到的数据结构是PCB的结构,其中PCB的数据结构如下:structPCB{intP_Id;//PCB的ID号charP_Name[10];//PCB的名称charP_State[10];//PCB状态intP_Runtime;//PCB的所需要的运行时间intP_Requiry;//PCB所需要的资源要求structPCB*next;//PCB块的下一个指针};其中,P_Id,和P_Name用来标示一个进程,而P_State用来标示进程的五种状态:Create_state,Ready_state,Block_state,Run_state,Exit_state。P_Runtime标示要完成一个进程所需要的时间。P_Requiry标示一个进程的执行所需要的其他条件,当其他的条件满足,则P_Requiry置1,否则置0。StructPCB*next用来指向同一队列中的下一个PCB块。五、参考程序源代码:#includestdlib.h#includestdio.h#includestring.h#includewindows.h/*全局结构体及变量定义*/structPCB{intP_Id;//PCB的ID号charP_Name[10];//PCB的名称charP_State[10];//PCB状态intP_Runtime;//PCB的所需要的运行时间intP_Requiry;//PCB所需要的资源要求structPCB*next;//PCB块的下一个指针};structPCB*Create_state;//创建状态structPCB*Run_state;//运行状态structPCB*Ready_state;//就绪状态structPCB*Block_state;//阻塞状态structPCB*Exit_state;//退出状态intsignal4=0;//标示进程4的完成状态intsignal5=0;//标示进程5的完成状态voidInsertQueue(structPCB**head,structPCB*node)//将进程插入到队列的尾部{structPCB*p,*q;node-next=NULL;if(*head==NULL)//如果队列为空{*head=node;}else//队列不空{p=*head;q=p-next;while(q!=NULL)//找到最后的元素位置{p=q;q=q-next;}p-next=node;//将节点插入队列}}voidDeleteQueue(structPCB**head,structPCB*node)//撤销进程,从队列中删除元素{structPCB*p,*q;p=node;q=*head;if(*head==NULL||node==NULL)//如果队列为空,返回return;if(*head==node)//如果要删除的元素是队首元素{*head=(*head)-next;return;}else//如果不是队列的首元素{while(q-next!=p&&q-next!=NULL)q=q-next;q=p-next;p-next=NULL;}}voidDisplay_Process(structPCB*node)//打印进程状态的元素函数{printf(\n\nthisprocessIdis:%d\n,node-P_Id);printf(thisprocessnameis:%s\n,node-P_Name);printf(thisprocessstateis:on%s\n,node-P_State);printf(thisprocessRuntimeis:%d\n,node-P_Runtime);if(node-P_Requiry)printf(thisprocessresourceisready\n);elseprintf(thisprocessresourceisnotready!\n);}voidDispatchToBlock(structPCB*node)//调度到阻塞状态的函数{if(!node-P_Requiry)//如果所需要的资源没有满足则,调度到阻塞状态{strcpy(node-P_State,block);InsertQueue(&Block_state,node);//插入到阻塞队列Display_Process(node);}}voidDispatchToReady(structPCB*node)//调度到就绪状态的函数{if(node-P_Requiry)//如果所需的资源满足,则调度{strcpy(node-P_State,Ready);InsertQueue(&Ready_state,node);Display_Process(node);}}voidDispatchBlockToReady()//从阻塞状态调度到就绪状态函数{structPCB*p,*q;q=Block_state;while(q!=NULL)//如果阻塞状态队列不空{p=q;q=q-next;if(signal4&&p-P_Id==1)//如果所需要的资源满足{p-P_Requiry=1;DeleteQueue(&Block_state,p);strcpy(p-P_State,ready);InsertQueue(&Ready_state,p);printf(process1willbeinthestateofready!\n);Display_Process(p);}if(signal5&&p-P_Id==2){p-P_Requiry=1;DeleteQueue(&Block_state,p);strcpy(p-P_State,ready);InsertQueue(&Ready_state,p);printf(process2willbeinthestateofready!\n);Display_Process(p);}}}voidCreate_Process()//创建进程函数{inti;structPCB*p;charname[10];strcpy(name,process);for(i=1;i3;i++)//动态创建2个处于阻塞状态的进程{p=(structPCB*)malloc(sizeof(structPCB));p-P_Id=i;name[7]=i+'0';name[8]='\0';strcpy(p-P_Name,name);strcpy(p-P_State,create);p-P_Runtime=1;//所需要的时间片为1p-P_Requiry=0;Display_Process(p);Sleep(4000);printf(\nprocess%dwillbeinthestateofBlock,waitingtheresourceready\n\n,i);DispatchToBlock(p);//同时调度到阻塞队列}for(i=3;i7;i++)//创建4个就绪状态的队列{p=(structPCB*)malloc(sizeof(structPCB));p-P_Id=i;name[7]=i+'0';name[8]='\0';strcpy(p-P_Name,name);strcpy(p-P_State,create);p-P_Requiry=1;if(i==6)//在这里个进程6所需要的时间片为2p-P_Runtime=2;elsep-P_Runtime=1;Display_Process(p);Sleep(4000);printf(\nprocess%dwillbeinthestateofReady,waitingtorun\n\n,i);DispatchToReady(p);}}voiddisplay(structPCB**head)//打印各个状态队列里进程数目{structPCB*p;p=*head;while(p!=NULL){Sleep(2000);printf(\n\nthisprocessIdis:%d\n,p-P_Id);printf(thisprocessnameis:%s\n,p-P_Name);printf(thisprocessstateis:on%s\n,p-P_State);printf(thisprocessRuntimeis:%d\n,p-P_Runtime);if(p-P_Requiry)printf(thisprocessresourceisready\n);elseprintf(thisprocessresourceisnotready!\n);p=p-next;}}voidProcess_Run()//进程运行函数{structPCB*p;while(Ready_state!=NULL)//就绪队列不空则继续执行{p=Ready_state;if(p-P_Runtime=0)break;//如果时间片执行完了,则跳出循环strcpy(p-P_State,running);Display_Process(p);p-P_Runtime=p-P_Runtime-1;Sleep(4000);if(p-P_Runtime0)//没有完成,则进入就绪队列{printf(thisprocessisnotfinished,willbedispatchtothereadyqueue!!\n);DeleteQueue(&Ready_state,p);strcpy(p-P_State,ready);InsertQueue(&Ready_state,p);Display_Process(p);}else//执行完成,则跳出,并发送相应的信息{printf(\n\nProcess%disfinishedandwillbeinthestateofexit!\n\n,p-P_Id);if(p-P_Id==4)signal4=1;if(p-P_Id==5)signal5=1;DeleteQueue(&Ready_state,p);}if(signal4||signal5)DispatchBlockToReady();//如果资源满足,则将进程调度到就绪队列}if(Ready_state==NULL)printf(\nthereisnoprocessready!\nSTOPMachine!!!\n);}voidmain(intargc,char*argv[])//主函数{charc='c';//界面printf(\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n);printf(...................................DingHaibo\n);printf(......Pressstostarttheprocess.......\n);scanf(%