实验一进程管理一、实验目的加强对进程概念的理解二、实验内容1、创建新的进程;2、查看运行进程;3、换出某个进程;4、杀死运行进程以及进程之间通信等功能。三、实验环境①PC兼容机②Windows、DOS系统③TC语言四、实验提示PCB结构通常包括以下信息:进程名,进程优先数,轮转时间片,进程所占用的CPU时间,进程的状态,当前队列指针等。可根据实验的不同,PCB结构的内容可以作适当的增删。五、实验代码#includeconio.h#includestdio.h#includestdlib.h#includeiostreamvoidclrscr();voidcreate();voidrun();voidhuanchu();voidkill();voidtongxun();structjincheng_type{intpid;intyouxian;intdaxiao;intflag;};structjincheng_typeneicun[20];usingnamespacestd;intshumu=0,pid_l;voidcreate()/*创建一个进程的示例*/{if(shumu=20){printf(\n内存已满,请先结束或换出进程\n);}else{printf(\n请输入新进程的pid\n);scanf(%d,&neicun[shumu-1].pid);printf(\n请输入新进程的优先级\n);scanf(%d,&neicun[shumu-1].youxian);printf(\n请输入新进程的大小\n);scanf(%d,&neicun[shumu-1].daxiao);shumu++;}}voidclrscr(){inti;for(i=0;i19;i++){neicun[i].pid=0;neicun[i].youxian=0;neicun[i].daxiao=0;neicun[i].flag=0;}shumu=0;}voidrun()/*查看内存中进程运行的情况*/{inti;printf(\n);printf(当前内存单元已经占用单元%d\n,shumu);for(i=0;ishumu;i++){printf(当前各内存中的进程\n);printf(当前运行的进程%d\n,neicun[i].pid);printf(当前运行进程的优先级%d\n,neicun[i].youxian);printf(当前运行进程占用的空间大小%d\n,neicun[i].daxiao);}}voidhuanchu()/*换出优先级最小的进程*/{inti,min;min=neicun[0].youxian;for(i=1;ishumu;i++){if(minneicun[i].youxian){min=neicun[i].youxian;}}for(i=0;ishumu;i++){if(min==neicun[i].youxian){neicun[i].youxian=444;neicun[i].pid=444;neicun[i].daxiao=444;//优先级最低先进程换出printf(\n进程%d被置换出内存\n,i);printf(\n请在%d位置输入新进程的pid\n,i);scanf(%d,&neicun[i].pid);printf(\n请输入新进程的优先级\n);scanf(%d,&neicun[i].youxian);printf(\n请输入新进程的大小\n);scanf(%d,&neicun[i].daxiao);}}}voidkill()/*杀死某个进程*/{intp,j;printf(\n请输入要杀死的进程\n);scanf(%d,&p);for(j=0;jshumu;j++){if(p==neicun[j].pid){neicun[j].daxiao=444;neicun[j].youxian=444;neicun[j].pid=-1;printf(此进程%d被杀死,p);}}}voidtongxun()//通过进程是单双数改变进程中的参数,来达到进程之间通讯的简单描述{inti,j,n,m;for(i=0;ishumu;i++)if(neicun[i].pid%2==0){for(j=1;jshumu;j++){neicun[j].flag=22;printf(\n发现偶数进程时,进程%d标志变量为%d,j,neicun[j].flag);//当进程中进程值为偶数,把所有进程中的标志位置}}for(n=0;nshumu;n++)if(neicun[n].pid%2==1){for(m=1;mshumu;m++){neicun[m].flag=11;printf(\n发现偶数进程时,进程%d标志变量为%d,m,neicun[m].flag);//当进程中的进程值为奇数时,把所有进程标志位置}}}voidmain(){intn;chara;n=1;clrscr();while(n==1){printf(\n********************************************);printf(\n*进程演示系统*);printf(\n********************************************);printf(\n1.创建新的进程2.查看运行进程);printf(\n3.换出某个进程4.杀死运行进程);printf(\n5.进程之间通信6.退出系统);printf(\n********************************************);printf(\n请选择(1~6));a=getche();switch(a){case'1':create();break;case'2':run();break;case'3':huanchu();break;case'4':kill();break;case'5':tongxun();break;case'6':exit(0);default:n=0;}}}六、实验运行结果七、实验心得通过对老师提供的代码的理解,再加上自己的学习,在多次试验下,成功实现了创建新的进程,查看运行进程等功能。实验二进程调度一、实验目的进程调度是处理机管理的核心内容。本实验要求用C语言编写和调试一个简单的进程调度程序。通过本实验可以加深理解有关进程控制块、进程队列的概念,并体会和了解优先数和时间片轮转调度算法的具体实施办法。二、实验内容①设计进程控制块PCB表结构,分别适用于优先数调度算法和循环轮转调度算法。②建立进程就绪队列。对两种不同算法编制入链子程序。③编制两种进程调度算法:1)优先数调度;2)循环轮转调度三、实验环境①PC兼容机②Windows、DOS系统③TC语言四、实验提示①本程序用两种算法对五个进程进行调度,每个进程可有三个状态,并假设初始状态为就绪状态。②为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。③在优先数算法中,优先数可以先取值为98,进程每执行一次,优先数减3,CPU时间片数加1,进程还需要的时间片数减1。在轮转算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了2个单位),这时,CPU时间片数加2,进程还需要的时间片数减2,并排列到就绪队列的尾上。④对于遇到优先数一致的情况,采用FIFO策略解决。五、实验代码#includestdio.h#includedos.h#includestdlib.h#includeconio.h#includeiostream#defineP_NUM5#defineP_TIME50usingnamespacestd;enumstate{ready,execute,block,finish};structpcb{charname[4];intpriority;intcputime;intneedtime;intcount;intround;stateprocess;pcb*next;};pcb*get_process();pcb*get_process(){pcb*q;pcb*t;pcb*p;inti=0;coutinputnameandtimeendl;while(iP_NUM){q=(structpcb*)malloc(sizeof(pcb));cinq-name;cinq-needtime;q-cputime=0;q-priority=P_TIME-q-needtime;q-process=ready;q-next=NULL;if(i==0){p=q;t=q;}else{t-next=q;t=q;}i++;}//whilereturnp;}voiddisplay(pcb*p){coutnamecputimeneedtimeprioritystateendl;while(p){coutp-name;cout;coutp-cputime;cout;coutp-needtime;cout;coutp-priority;cout;switch(p-process){caseready:coutreadyendl;break;caseexecute:coutexecuteendl;break;caseblock:coutblockendl;break;casefinish:coutfinishendl;break;}p=p-next;}}intprocess_finish(pcb*q){intbl=1;while(bl&&q){bl=bl&&q-needtime==0;q=q-next;}returnbl;}voidcpuexe(pcb*q){pcb*t=q;inttp=0;while(q){if(q-process!=finish){q-process=ready;if(q-needtime==0){q-process=finish;}}if(tpq-priority&&q-process!=finish){tp=q-priority;t=q;}q=q-next;}if(t-needtime!=0){t-priority-=3;t-needtime--;t-process=execute;t-cputime++;}}voidpriority_cal(){pcb*p;p=get_process();intcpu=0;while(!process_finish(p)){cpu++;coutcputime:cpuendl;cpuexe(p);display(p);}printf(Allprocesseshavefinished,pressanykeytoexit);getch();}voiddisplay_menu(){coutCHOOSETHEALGORITHM:endl;cout1PRIORITYendl;cout2ROUNDROBINendl;cout3EXITendl;}pcb*get_process_round(){pcb*q;pcb*t;pcb*p;inti=0;coutinputnameandtimeendl;while(iP_NUM){q=(structpcb*)malloc(sizeof(pcb));cinq-name;cinq-needtime;q-cputime=0;q-round=0;q-count=0;q-process=ready;q-next=NULL;if(i==0){p=q;t=q;}else{t-next=q;t=q;}i++