课内实验报告课程名:操作系统任课教师:沈超专业:电子商务学号:二○一五至二○一六年度第一学期南京邮电大学管理学院《操作系统》课程实验第一次实验报告一、实验目的与基本要求1、了解进程管理的实现方法;2、理解和掌握处理进程同步问题的方法。二、实验仪器与设备硬件:微型计算机。中央处理器PentiumIV以上;显示器256色VGA以上;内存使用128兆;硬盘300M以上。软件:学生可以采用任何一种自己熟悉的编程语言完成算法的程序设计,如C/C++、Delphi、VB、VC、C#等。三、实验内容:实现银行家算法、进程调度过程的模拟、读者-写者问题的写者优先算法。实验结果:银行家算法:代码:#includeiostreamusingnamespacestd;intAvailable[100];//可利用资源数intMax[100][100];//最大需求矩阵intAllocation[100][100];//分配矩阵intNeed[100][100];//需求矩阵intRequest[100][100];//某个资源的请求数intFinish[100];//完成intp[100];intProcessNum,SourceNum;voidSafe(){inti,j,k;intcount=0;intn=0;intWork[100];//工作向量,可提供所需资源for(i=0;iSourceNum;i++)Work[i]=Available[i];//把可用资源赋给工作向量//coutworkWork[i]endl;for(i=0;iProcessNum;i++)Finish[i]=0;//先设置一个标志将初值设为0,判定是否安全的标志for(i=0;iProcessNum;i++){if(Finish[i]==1)continue;//如果判定过就继续else{for(j=0;jSourceNum;j++){if(Need[i][j]Work[j])break;//不安全,跳出}if(j==SourceNum){//coutiiendl;Finish[i]=1;//安全,判断过设置为1for(k=0;kSourceNum;k++){Work[k]=Work[k]+Allocation[i][k];//可用资源累加//coutworkWork[k]endl;}count++;p[n++]=i;i=-1;//将i设置为-1,之后变为0,重新开始判断//i=0;//coutcountcountnn;}}}if(count==ProcessNum){cout系统是安全的endl;cout安全序列是:endl;for(i=0;iProcessNum;i++){coutp[i];}coutendl;}if(count!=ProcessNum){cout系统是不安全的endl;}}voidmain(){inti,j;intRequestProcess;inta[100];cout请输入进程数:endl;cinProcessNum;cout请输入每个进程的资源数:endl;cinSourceNum;cout请输入每个进程最大需求资源数:endl;for(i=0;iProcessNum;i++)for(j=0;jSourceNum;j++)cinMax[i][j];cout输入每个进程已经分配的资源数:endl;for(i=0;iProcessNum;i++)for(j=0;jSourceNum;j++)cinAllocation[i][j];for(i=0;iProcessNum;i++)for(j=0;jSourceNum;j++)Need[i][j]=Max[i][j]-Allocation[i][j];//need根据max-allocation算出cout请输入可利用资源数:endl;for(i=0;iSourceNum;i++)cinAvailable[i];Safe();cout请输入你要分配的进程:endl;cinRequestProcess;cout请输入你分配进程的资源数endl;for(i=0;iSourceNum;i++)cina[i];//进行初判断for(i=0;iSourceNum;i++){if(a[i]Need[RequestProcess][i]){cout输入的请求资源错误(请求的资源数已超过它所宣布的最大值)endl;break;}if(a[i]Available[i]){cout输入的请求资源错误(尚无足够资源)endl;break;}else{Available[i]=Available[i]-a[i];Allocation[RequestProcess][i]=Allocation[RequestProcess][i]+a[i];Need[RequestProcess][i]=Need[RequestProcess][i]-a[i];Safe();break;}}}运算结果:进程调度的模拟:代码:#includewindows.h#includeconio.h#includestdlib.h#includefstream.h#includeio.h#includestring.h#includestdio.hvoidCreate_ProcInfo();//建立进程调度需要的数据voidDisplay_ProcInfo();//显示当前系统全部进程的状态voidScheduler_FF();voidCpu_Sched();voidIO_Sched();voidNextRunProcess();voidDisData();voidDisResult();intRunPoint;//运行进程指针,-1时为没有运行进程intWaitPoint;//阻塞队列指针,-1时为没有阻塞进程intReadyPoint;//就绪队列指针,-1时为没有就绪进程longClockNumber;//系统时钟intProcNumber;//系统中模拟产生的进程总数intFinishedProc;//系统中模拟产生的进程总数//进程信息结构structProcStruct{intp_pid;//进程的标识号charp_state;//进程的状态,C--运行R--就绪W--组塞B--后备F--完成intp_rserial[16];//模拟的进程执行的CPU和I/O时间数据序列,间隔存储,0项存储有效项数intp_pos;//当前进程运行到的序列位置intp_starttime;//进程建立时间intp_endtime;//进程运行结束时间intp_cputime;//当前运行时间段进程剩余的需要运行时间intp_iotime;//当前I/O时间段进程剩余的I/O时间intp_next;//进程控制块的链接指针}proc[10];voidCreate_ProcInfo(void){ints,i,j;srand(GetTickCount());//初始化随机数队列的种子ProcNumber=((float)rand()/32767)*5+5;//随机产生进程数量5~10FinishedProc=0;for(i=0;iProcNumber;i++)//生成进程的CPU--I/O时间数据序列{proc[i].p_pid=((float)rand()/32767)*1000;proc[i].p_state='B';//初始都为后备状态s=((float)rand()/32767)*6+6;//产生的进程数据序列长度在6~12间proc[i].p_rserial[0]=s;//第一项用于记录序列的长度for(j=1;j=s;j++)//生成时间数据序列,数值在10~30间proc[i].p_rserial[j]=((float)rand()/32767)*10+5;//赋其他字段的值proc[i].p_pos=1;proc[i].p_starttime=((float)rand()/32767)*49+1;proc[i].p_endtime=0;proc[i].p_cputime=proc[i].p_rserial[1];proc[i].p_iotime=proc[i].p_rserial[2];proc[i].p_next=-1;}printf(\n---------------------------\n建立了-个进程数据序列\n\n,ProcNumber);DisData();printf(\nPressAnyKeyToContinue.......);_getch();return;}voidDisplay_ProcInfo(void){inti,n;system(cls);printf(\n当前系统模拟-个进程的运行时钟:%ld\n\n,ProcNumber,ClockNumber);printf(就绪指针=%d,运行指针=%d,阻塞指针=%d\n\n,ReadyPoint,RunPoint,WaitPoint);if(RunPoint!=-1){printf(当前运行的进程No.%dID:%d\n,RunPoint,proc[RunPoint].p_pid);printf(m,m,m\n,proc[RunPoint].p_starttime,proc[RunPoint].p_rserial[proc[RunPoint].p_pos],proc[RunPoint].p_cputime);}elseprintf(当前运行的进程ID:NoProcessRunning!\n);n=ReadyPoint;printf(\nReadyProcess......\n);while(n!=-1)//显示就绪进程信息{printf(No.%dID:],m,m,m\n,n,proc[n].p_pid,proc[n].p_starttime,proc[n].p_rserial[proc[n].p_pos],proc[n].p_cputime);n=proc[n].p_next;}n=WaitPoint;printf(\nWaitingProcess......\n);while(n!=-1)//显示阻塞进程信息{printf(No.%dID:],m,m,m\n,n,proc[n].p_pid,proc[n].p_starttime,proc[n].p_rserial[proc[n].p_pos],proc[n].p_iotime);n=proc[n].p_next;}printf(\n===================后备进程====================\n);for(i=0;iProcNumber;i++)if(proc[i].p_state=='B')printf(No.%dID:],m\n,i,proc[i].p_pid,proc[i].p_starttime);printf(\n================已经完成的进程=================\n);for(i=0;iProcNumber;i++)if(proc[i].p_state=='F')printf(No.%dID:],m,m\n,i,proc[i].p_pid,proc[i].p_starttime,proc[i].p_endtime);}voidDisResult(void){inti;printf(\n---------------------------------\n);for(i=0;iProcNumber;i++){printf(ID=M-,proc[i].p_pid,proc