第1页共9页仲恺农业工程学院实验报告纸信息科学与技术(院、系)计算机科学与技术专业142班__组操作系统实验课学号:201420224430姓名:黄丽君实验日期教师评定实验一、进程管理一、实验目的通过实验使学生进一步了解进程、进程状态、进程控制等基本概念。基本能达到下列具体的目标:1、理解进程PCB的概念,以及PCB如何实现、如何组织以及管理。2、复习数据结构中如何对链的操作,包括建链、删除、插入结点等,来实现进程的管理。二、实验内容1、建立一个结点,即PCB块包括用户标识域、状态域(执行、等待、就绪)、link域。2、建立三个队列(执行队列、就绪队列、等待队列)。3、根据进程状态转换实现对三个队列的具体操作。具体的驱动可以采用时间片算法或手动调度的形式完成三个状态之间的转换4、用switch选择语句选择状态。5、按照自己的设定能完成所有的状态转换的运行(包括创建和运行结束)。三、实验步骤1、复习进程管理三状态模型部分内容。2、预习C++Builder或VC++、Delphi、JBuilder线程编程。3、运行示例程序,进一步明确实验要求。可以采用控制台模式或窗口模式。4、上机编程、调试程序。5、完成实验报告。第2页共9页四、实验代码#includestdlib.h#includestdio.h#includeconio.h#definegetpch(type)(type*)malloc(sizeof(type))//将申请内存空间函数自定义为getpch(type)#defineNULL0structpcd{charname[10];charstate;//进程状态intsuper;//进程优先级intntime;//进程需要运行的时间intrtime;//进程已经运行的时间structpcb*link;//进程指向另一个进程的指针}*ready=NULL,*p;//ready表示指向就绪队列中首元素的指针,初始化为NULL,p用来存放当前刚刚输入的PCBtypedefstructpcbPCB;voidsort()//建立对进程进行优先级排列函数{PCB*first,*second;intinsert=0;第3页共9页if((ready==NULL)||((p-super)(ready-super)))//优先级最大者,插入队首{p-link=ready;ready=p;}else//进程比较优先级,插入适当的位置{first=ready;second=first-link;while(second!=NULL){if((p-super)(ready-super))//若插入进程比当前进程优先数大{//插入到当前进程前面p-link=second;first-link=p;second=NULL;insert=1;//插入队列记录符号}else//插入进程优先数最低,则插入到队尾第4页共9页{first=first-link;second=second-link;}}if(insert==0)first-link=p;}}voidinput()//建立进程控制块函数,PCB输入模块{inti,num;printf(\n请输入进程号:);scanf(%d,&num);for(i=0;inum;i++){printf(\n进程号%d:\n,i);p=getpch(PCB);printf(\n请输入进程名:);scanf(%s,&p-name);printf(\n请输入进优先数:);第5页共9页scanf(%d,&p-super);printf(\n请输入进程运行时间:);scanf(%d,&p-ntime);printf(\n);p-rtime=0;p-state='W';p-link=NULL;sort();//调用sort函数}}intspace()//PCB就绪队列元素计数模块,计算就绪队列中PCB的总数{intl=0;PCB*pr=ready;//获取就绪队列的头指针readywhile(pr!=NULL){l++;pr=pr-link;}return(l);}第6页共9页voiddisp(PCB*pr)//建立进程显示函数,用于显示当前进程{printf(\n进程名\t进程状态\t优先级\t运行需要时间\t已经运行时间\n);printf(%s\t,pr-name);printf(%c\t,pr-state);printf(%d\t,pr-super);printf(%d\t,pr-ntime);printf(%d\t,pr-rtime);printf(\n);}voidcheck()//建立进程查看函数{PCB*pr;printf(\n\t当前正在运行的进程是:%s,p-name);//显示当前运行进程disp(p);pr=ready;printf(\n\t当前就绪队列状态是:\n);//显示就绪队列状态while(pr!=NULL){第7页共9页disp(pr);pr=pr-link;}}voiddestroy()//建立进程撤销函数,进程运行结束,撤销进程{printf(\n进程:%s已经完成\n,p-name);free(p);}voidrunning()//建立进程就绪函数,进程运行时间到,置就绪状态{(p-rtime)++;if(p-rtime==p-ntime)destroy();//调用destroy函数else{(p-super)--;p-state='W';sort();//调用sort函数}第8页共9页}voidmain()//主函数{intlen,h=0;//h表示进程调度次数charch;input();len=space();//获取就绪队列长度while((len!=0)&&(ready!=NULL)){ch=getchar();h++;printf(\n执行数:%d\n,h);p=ready;//以下3行是将P从就绪队列的队首摘除ready=p-link;p-link=NULL;p-state='R';//将P的状态改为Rcheck();running();printf(\n按任意键继续:);ch=getchar();}第9页共9页printf(\n\n进程已经完成\n);ch=getchar(();}