个人收集整理仅供参考学习1/6实验一:进程创建与撤消(模拟)一、实验目的1、加深对进程概念的理解和进程创建与撤消算法;2、进一步认识并发执行的实质。二、实验内容本实验完成如下三个层次的任务:(1)系统级—以普通用户身份认识windows的进程管理。通过windows的“任务管理器”观察进程的状态,进行进程的创建、切换和撤销。文档收集自网络,仅用于个人学习(2)语言级—以普通程序员身份认识高级语言VC++/Java/C#的进程创建与撤销工具。(3)模拟级—以OS设计师身份编程模拟实现进程创建与撤销功能,并在屏幕上观察进程活动的结果。三、实验步骤1、windows的进程管理当前状态切换前切换后撤销2、VC++进程创建与撤销工具3、进程创建与撤销的模拟实现(1)总体设计:①数据结构定义:结构体PCB:进程名、ID、运行时间、优先级等,队列的排序按创建时间或优先级排序。PCB空间—结构体PCB数组文档收集自网络,仅用于个人学习就绪队列指针空队列指针②函数CREATE()—进程创建:从PCB空间申请一个空PCB,填入进程参数,插入就绪队列;KILL()—进程终止:将指定的就绪进程移出就绪队列,插入空队列;就绪队列输出函数Display()—输出就绪队列中的进程信息,以便观察创建或撤消活动的结果;个人收集整理仅供参考学习2/6主函数Main()—功能选择、输入新进程参数、调用创建函数、输出就绪队列;输入进程名称、调用终止函数、输出就绪队列;文档收集自网络,仅用于个人学习③主界面设计:进程创建、进程撤销、就绪队列显示菜单;数据输入和就绪队列显示区。④功能测试:从显示出的就绪队列状态,查看操作的正确与否。(2)详细设计:①数据结构定义:结构体PCB:structPCB{charNAME[10];longID;floatTIME;intPRIORITY;};PCBpcb[100];②函数设计给出CREATE()、KILL()、Display()、Main()的流程图描述;以CREATE()为例如下:(3)调试与测试:列出你的测试结果,包括输入和输出。四、实验总结通过这次试验了解到了进城创建与撤销,并对以前的知识进行了复习,进程已存在输入进程数For循环输入参数插入就绪队优先级大到小排序Menu()是N+1否个人收集整理仅供参考学习3/6通过使用结构体和指针,实行进程的创建与撤销,我的程序设计能力得到提高,文档收集自网络,仅用于个人学习五、附录带注释的源程序。#includeiostream.h#includestring.h#includemalloc.h#includestdlib.h#defineOK1#defineERROR0#defineOVERFLOW-2structPCB//结构体PCB{charNAME[20];longID;floatTIME;intPRIORITY;};PCBpcb[100];//结构体数组typedefstructQNode//单链表{intdata;structQNode*next;}QNode,*QueuePtr;typedefstructLinkQueue//链队列{QueuePtrfront;QueuePtrrear;}LinkQueue;LinkQueueR,E;intN,m;//N为当前进程数voidmenu();intInitQueue()//就绪队、空队的初始化{R.front=R.rear=(QueuePtr)malloc(sizeof(QNode));文档收集自网络,仅用于个人学习E.front=E.rear=(QueuePtr)malloc(sizeof(QNode));if(!R.front)exit(OVERFLOW);if(!E.front)exit(OVERFLOW);R.front-next=NULL;E.front-next=NULL;returnOK;个人收集整理仅供参考学习4/6}voidcreate()//进程创建{charname[20];longid;floattime;intpriority;intn;QNode*p;cout请输入要创建进程的数目:;cinn;for(inti=1;i=n;i++){cout进程ID:;cinid;for(intj=i-1;j=N;j++){while(id==pcb[j].ID){cout进程ID已存在endl;cout进程ID:;cinid;}}cout进程名:;cinname;cout运行时间:;cintime;cout优先级:;cinpriority;N++;//保存当前就绪进程数strcpy(pcb[N].NAME,name);pcb[N].ID=id;pcb[N].TIME=time;pcb[N].PRIORITY=priority;p=(QueuePtr)malloc(sizeof(QNode));//插入就绪队列if(!p)exit(OVERFLOW);p-data=N;p-next=NULL;R.rear-next=p;R.rear=p;}for(i=1;i=N;i++)//按优先级排队{for(intj=i+1;j=N;j++)if(pcb[i].PRIORITYpcb[j].PRIORITY){pcb[0]=pcb[i];pcb[i]=pcb[j];pcb[j]=pcb[0];}}menu();}voidkill()//进程终止{longid;QNode*p;个人收集整理仅供参考学习5/6cout请输入要终止的进程ID:;cinid;p=R.front-next;if(p==NULL)cout就绪进程为空!;while(p!=NULL){if(id==pcb[N].ID)//终止进程是队列最后一个{if(N==1)//队列中只有一个进程,且是终止进程{R.front=R.rear;R.front-next=NULL;N--;cout进程已终止!;break;}文档收集自网络,仅用于个人学习else//队列中进程多个{while(p!=NULL){if(p-next-next==NULL){p-next=NULL;R.rear=p;N--;cout进程已终止!;break;}p=p-next;文档收集自网络,仅用于个人学习}}}if(id==pcb[p-data].ID){if(R.front==R.rear)coutendl队列为空!;while(p!=NULL){pcb[p-data]=pcb[p-data+1];//修改PCB数组里的值if(p-next-next==NULL){p-next=NULL;R.rear=p;cout进程已终止!;break;}p=p-next;}N--;break;}p=p-next;}menu();}voiddisplay(){QNode*p;p=R.front-next;coutID名字运行时间优先级endl;文档收集自网络,仅用于个人学习while(p!=NULL){coutpcb[p-data].IDpcb[p-data].NAMEpcb[p-data].TIMEpcb[p-data].PRIORITYendl;文档收集个人收集整理仅供参考学习6/6自网络,仅用于个人学习p=p-next;}menu();}voidexit()//退出系统;{exit(0);}voidmain(){InitQueue();pcb[0].ID=0;menu();}voidmenu(){cout'\n'1.进程创建'\n'2.进程撤销'\n'3.就绪队列显示'\n'4.退出endl;文档收集自网络,仅用于个人学习intchoice;cout请选择:;cinchoice;switch(choice){case1:create();break;case2:kill();break;case3:display();break;case4:exit();default:exit();}}