东北大学操作系统实验报告.docx
课程编号:B080000070操作系统实验报告姓名班级指导教师实验名称操作系统实验开设学期2016-2017第二学期开设时间第11周第18周报告日期2017年7月3日评定成绩评定人评定日期2017年7月5日东北大学软件学院实验一进程的同步与互斥实验题目:通过学习和分析基础例子程序,使用windows进程和线程编程(也可以采用Java或Unix/Linux的POSIX线程编程)实现一个简单的生产者/消费者问题的程序。关键代码:importjava.util.ArrayList;publicclassProducepublicObjectobject;publicArrayList<Integer>list;/用list存放生产之后的数据,最大容量为1publicProduce(Objectobject,ArrayList<Integer>list)this.object=object;this.list=list;publicvoidproduce()synchronized(object)/*只有list为空时才会去进行生产操作*/trywhile(!list.isEmpty()System.out.println(生产者+Thread.currentThread().getName()+);object.wait();intvalue=9999;list.add(value);System.out.println(生产者+Thread.currentThread().getName()+);object.notifyAll();/然后去唤醒因object调用wait方法处于阻塞状态的线程catch(InterruptedExceptione)e.printStackTrace();importjava.util.ArrayList;publicclassConsumerpublicObjectobject;publicArrayList<Integer>list;/用list存放生产之后的数据,最大容量为1publicConsumer(Objectobject,ArrayList<Integer>list)this.object=object;this.list=list;publicvoidconsmer()synchronized(object)try/*只有list不为空时才会去进行消费操作*/while(list.isEmpty()System.out.println(消费者+Thread.currentThread().getName()+);object.wait();list.clear();System.out.println(消费者+Thread.currentThread().getName()+);object.notifyAll();/然后去唤醒因object调用wait方法处于阻塞状态的线程catch(InterruptedExceptione)e.printStackTrace();实验结果:_Problem1-Javadoc.DeclarationSConsoleu«WorkpceMigrationJAX-WSAnnotations吠JPAAnnotaonfZSpringAnotatiom<terminated>MoG(JavaApplicationCAppniyecSpscbinoryXconisunjovojdkdwinl?x66_64_1,0.0vl12binovawexc20174r77a下午6;29;14),住产看主产舌2Rurr或K生产舌生产右2waiting消费者消身舌1RunnableI港各者拍看者1waiting冷管否拍身者Nsiting生产右生产者1Ruzbk生产古生产者1,Naiiamg泊费古带费者?Runnable泊量者僧贤者2WitinE消目者捎费者1Miitine生产者生产者2Ruwable生产者主产者2waiting用野者消费舌1Runnable4骨舌消身舌工waiting,目旨者捐号者2Naiting生产者生产者1Rurrle生产力生产者1waiting论管各相器者2Runnable1汕黄古制赞者IH-aiting油目昔浩特者1itinc思考题:(1)如何控制进程间的相互通信?答:主要有:管道,信号,共享内存,消息队列(2)什么是进程的同步?什么是进程的互斥?分别有哪些实现方式?答:进程互斥是进程之间的间接制约关系。当一个进程进入临界区使用临界资源时,另一个进程必须等待。只有当使用临界资源的进程退出临界区后,这个进程才会解除阻塞状态。进程同步也是进程之间直接的制约关系,是为完成某种任务而建立的两个或多个线程,这个线程需要在某些位置上协调他们的工作次序而等待、传递信息所产生的制约关系。进程间的直接制约关系来源于他们之间的合作。可以利用信号量来实现进程的同步与互斥。typedefstructpbcharpname5;charstatus8;inttime;intpri;intcputime;structpb*p;pbc,*pbcp;实验二处理机调度实验题目:设计一个按优先权调度算法实现处理器调度的程序数据结构及符号说明:/每个进程/进程的名字/进程的状态/要求运行时间/进程的优先权/cpu时间/队列结构,它的下一个。流程设计:关键代码:voidattemper(pbcppbca)pbcppItem=pbca->p;pbcppIterator=pbca->p;while(pIterator!=NULL)if(pItem->pri<=pIterator->pri&&pIterator->time!=0)pItem=pIterator;pIterator=pIterator->p;if(pItem->time-=1)=0)pItem->cputime+=1;pItem->pri-=1;strcpy(pItem->status,);elsestrcpy(pItem->status,);pItem->cputime+=1;pItem->pri-=1;strcpy(pItem->status,);pIterator=pbca->p;while(pIterator!=NULL)if(pIterator->cputime!=0&&pIterator!=pItem&&pIterator->time!=0)pIterator->cputime+=1;strcpy(pIterator->status,);pIterator=pIterator->p;printPbc(pbca);运行结果:CAWandows»ystefiil2cmcLexeX始化进程数据块卜输入进程数量:5b输入进程名,运行时间.优先级P121再输入进程名,运行时间,优先级I输入进程名.运行时间.优先级P313清第入地程名,运行时问,优先级履输入进程名.运行时间,优先级542旌程名Jcpu时间/运行时问,优先级J状态P1021readyW程名/cpu时间,运行时间.优先纺状态P2035rwtdy旌程名Jcpu时间/运行时问,优先级J状态P3013readv团程名Jcpu时间,运行时间,优先纺状态P4024rady进程名Jcpu时间/运行时问,,优先级J状态P5042readyTIffil进程名/cpu时问/运行时间/优先级,状态P1021readyW程名Jcpu时间,运行时间/优先纺状态P2124runUCAW*ndawi&y$tem2.cind.exe|进程名,,'C叫时间,运行时间ft先级状态P504TIME1ready俄程名/cpu时间/运行时间/优先级状态P1021r«4dypu%间/运言时间/优4畿/状£域程名/cpu时间/运行时间/优先-/状态进程老P3013ready威程名Jcpu时间/运行时间/优先版状态P4024ready世程名/cpu时何,运行时间,tt先缴状态P5042re&dyIIME2法程名/cpu时同/运行时问,tt先级状态P1021ready因程名/cpu时间/运行时间优先级/状态P2224readyH程名Jcpu时间/运行时问唯先级,状态P3013ready同程名/cpu时何/运行时间优先然状态P4113nm进程名/cpu时间/运行时间/优先级/状态P5042ready门侬进程名/cpu时间/运行时间/优先级状态021ready思考题:(1)处理机调度的目的?答:主要还是为了优化软件的运行。(2)你实现优先权调度算法的思想?答:遍历一次,取出优先权最高的,判断该进程是否还要运行,要允许就运行它。实验题目:实验三存储管理模拟分页式存储管理中硬件的地址转换和产生缺页中断。用先进先出(FIFO)页面调度算法处理缺页中断。数据结构及符号说明:intpaper_table75char*oper_char12intoper_table122intfifo_table4intstaticcount=0;/7乘5的页表/每次操作/指令序列的单元号和操作存储/先进先出表,记录那几个在内存中/记下哪个先来的流程设计:核心代码:voidscheduler(void)inti,page,page_block,page_move;for(i=0;i<12;i+)page=*(oper_table+i);printf(,i);if(*(*(paper_table+page)+1)=1)/在页表中page_block=*(*(paper_table+page)+2);page_move=*(*(oper_table+i)+1);printf(在内存中,块号:%d;偏移量:%d;物理地址:,page_block,page_move,page_block*128+page_move);*(*(paper_table+count)+4)=1;/修改变为1fifo_print();elseif(*(*(paper_table+fifo_tablecount%4)+4)=1)printf(缺页中断,被替换的页号为:%d;页修改存入硬盘,fifo_tablecount);*(*(paper_table+fifo_tablecount%4)+4)=0;elseprintf(缺页中断,被替换的页号为:%d;页被直接替换,fifo_tablecount);*(*(paper_table+page)+1)=1;/移入内存,改变在内存中的标志为1*(*(paper_table+fifo_tablecount)+1)=0;/改变在内存中的标志为0*(*(paper_table+page)+2)=*(*(paper_table+fifo_tablecount)+2);/重置页表里的主存块号值*(*(paper_table+fifo_tablecount)+2)=0;/重置页表里的主存块号值fifo_tablecount%4=*(*(oper_table+i)+0);/更新fifo表page_block=*(*(paper_table+page)+2);page_move=*(*(oper_table+i)+1);printf(换入内存成功,块号:%d;偏移量:%d;物理地址:,page_block,page_move,page_block*128+page_move);fifo_print();count+;count=count%4;printf();x又号0标志-主存块号磁盘位置修改标志卜作卜江网1J0000000121页号12064一一存储同度表但移*7051521谑如26532337781&4klFO调度*法页表扑序:0alC:WlMoiA»s$y$?e<nlZcmdxeO在内存中.块号I5;倩移0:70!物理地址:FIFO调度算法页表排序:Q123710在内存中.块号I8:偏修0:50:物理地址|FIFO调度算法页表排序R1231074在内存中.块号I9;倩移U:15:物理地址:FIFO调度算法页表排序二01231167在内存中.块号I1:倩移U:21:物理地址:FIFO调度算法页表排序二0123149在内存中.块号I5;偏移盆:56:物理地址:FIFO调度算法页表排序二0123缺页中断.被鲁换的页号为1耻贝修改存入硬盘换入内存成功,块号15.信存量140;构理培址:680.FIFO,度弊法页表排序:6123献页中断.被咨摭的页号为:1:页被直接替换换入内存成功.块号18.信桂收153;构理地址:1077.IF0调度算法贝表排序:642实验结果:IC*WindaMf%iystem12cmd.e3ce思考题:(1)先进先出页面调度算法的思想?答:基本思想:先进入内存的页面先淘汰,后进入内存的后淘汰(2)最近最少用(LRU)页面调度算法思想?答:基本思想:最近用的最少的最先淘汰。(3)比较两种调度算法的效率(哪种调度算法使产生缺页中断的次数少)?答:从作业题我感觉最近最少使用优于先进先出。(4)分析在什么情况下采用哪种调度算法更有利?答:如果页访问高度随机的话,不见得LRU好,LRU是根据最近最少使用的来决定哪个页表被替换,但过去很多时候不能代表未来。实验四文件系统实验题目:用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。数据结构及符号说明:structTYPE_UFD/主文件目录stringFile_Name;/文件名boolRead;/是否可读可写可执行boolWrite;boolExecute;intLength_File;/文件长度;structTYPE_MFD/用户文件目录stringUser_Name;/用户名TYPE_UFD*Pointer;structTYPE_AFD/打开文件目录,即运行文件目录intFile_ID;/文件IDboolRead;boolWrite;boolExecute;intPointer;classTYPE_FILE_SYSTEM/文件系统类public:voidInitial(void);voidStart(void);private:int_Number_Users;/用户数int_Number_Files;/文件数int_MaxNumber_Open_Files;/最大打开文件数TYPE_MFD*_MFD;TYPE_UFD*_UFD;TYPE_AFD*_AFD;流程设计:关键代码:voidTYPE_FILE_SYSTEM:Start(void)intUser_ID;inti,temp_int;stringtemp;charchoice;intNumber_Open_Files;stringUser_Name;stringCommand;TYPE_UFD*UFD;dodocout<<已创建指令有:createdeleteopendirdiropenwritereadlogoutshutdowncout<<请输入用户名;cin>>User_Name;for(User_ID=0;User_ID<_Number_Users;User_ID+)if(_MFDUser_ID.User_Name=User_Name)break;if(User_ID=_Number_Users)cout<<用户名错误,请再次输入<<endl;while(User_ID=_Number_Users);cout<<欢迎登录<<User_Name<<<<endl;UFD=_MFDUser_ID.Pointer;for(i=0;i<_MaxNumber_Open_Files;i+)_AFDi.File_ID=-1;Number_Open_Files=0;docout<<<<User_Name<<cin>>Command;if(Command=)cout<<endl;cout<<打开用户<<User_Name<<的文件<<endl;cout<<<<<<<<<<endl;for(i=0;i<_Number_Files;i+)if(UFDi.Length_File!=-1)cout<<if(UFDi.Read=true)cout<<elsecout<<if(UFDi.Write=true)cout<<elsecout<<if(UFDi.Execute=true)cout<<elsecout<<cout<<cout<<UFDi.Length_File;cout<<cout<<UFDi.File_Name<<endl;cout<<endl;elseif(Command=)cout<<endl;cout<<打开用户<<User_Name<<的文件<<endl;cout<<<<<<<<endl;for(i=0;i<_MaxNumber_Open_Files;i+)if(_AFDi.File_ID!=-1)cout<<if(_AFDi.Read=true)cout<<elsecout<<if(_AFDi.Write=true)cout<<elsecout<<if(_AFDi.Execute=true)cout<<elsecout<<cout<<cout<<UFD_AFDi.File_ID.File_Name<<endl;cout<<endl;elseif(Command=)for(i=0;i<_Number_Files;i+)if(UFDi.Length_File=-1)break;if(i=_Number_Files)cout<<已有名为<<_Number_Files<<的文件<<endl;elsecout<<请输入新文件信息<<endl;cout<<文件名;cin>>temp;UFDi.File_Name=temp;cout<<文件权限;cout<<dochoice=getch();while(choice!='y'&&choice!='n');if(choice='y')UFDi.Read=true;elseUFDi.Read=false;cout<<endl;cout<<dochoice=getch();while(choice!='y'&&choice!='n');if(choice='y')UFDi.Write=true;elseUFDi.Write=false;cout<<endl;cout<<dochoice=getch();while(choice!='y'&&choice!='n');if(choice='y')UFDi.Execute=true;elseUFDi.Execute=false;cout<<endl;cout<<cin>>temp_int;if(temp_int>0)UFDi.Length_File=temp_int;cout<<新文件<<UFDi.File_Name<<已建立<<endl;elseif(Command=)cout<<请输入文件名;cin>>temp;for(i=0;i<_Number_Files;i+)if(UFDi.Length_File!=-1)&&(UFDi.File_Name=temp)break;if(i=_Number_Files)cout<<文件名错误,请再次输入<<endl;elseUFDi.Length_File=-1;cout<<文件<<UFDi.File_Name<<已删除<<endl;elseif(Command=)if(Number_Open_Files=_MaxNumber_Open_Files)endl;cout<<你已经打开了<<Number_Open_Files<<文件<<elsecout<<请输入文件名;cin>>temp;for(i=0;i<_Number_Files;i+)if(UFDi.Length_File!=-1)&&(UFDi.File_Name=temp)break;if(i=_Number_Files)cout<<文件名错误,请再次输入<<endl;elseNumber_Open_Files+;for(temp_int=0;temp_int<_MaxNumber_Open_Files;temp_int+)if(_AFDtemp_int.File_ID=-1)break;_AFDtemp_int.File_ID=i;_AFDtemp_int.Pointer=0;cout<<请定义打开方式<<endl;if(UFDi.Read=true)cout<<dochoice=getch();while(choice!='y'&&choice!='n');if(choice='y')_AFDtemp_int.Read=true;else_AFDtemp_int.Read=false;cout<<endl;else_AFDtemp_int.Read=false;if(UFDi.Write=true)cout<<dochoice=getch();while(choice!='y'&&choice!='n');if(choice='y')_AFDtemp_int.Write=true;else_AFDtemp_int.Write=false;cout<<endl;else_AFDtemp_int.Write=false;if(UFDi.Execute=true)cout<<dochoice=getch();while(choice!='y'&&choice!='n');if(choice='y')_AFDtemp_int.Execute=true;else_AFDtemp_int.Execute=false;cout<<endl;else_AFDtemp_int.Execute;cout<<文件<<temp<<已打开<<endl;elseif(Command=)<<endl;cout<<再见<<User_Name<<break;elseif(Command=)cout<<请输入文件名;cin>>temp;for(i=0;i<_Number_Files;i+)if(UFDi.Length_File!=-1)&&(UFDi.File_Name=temp)break;if(i=_Number_Files)cout<<文件名错误,请再次输入<<endl;elsefor(temp_int=0;temp_int<_MaxNumber_Open_Files;temp_int+)if(_AFDtemp_int.File_ID=i)break;if(temp_int=_MaxNumber_Open_Files)cout<<文件<<temp<<未打开<<endl;else_AFDtemp_int.File_ID=-1;Number_Open_Files-;cout<<文件<<temp<<已关闭<<endl;elseif(Command=)cout<<请输入文件名cin>>temp;for(i=0;i<_Number_Files;i+)if(UFDi.Length_File!=-1)&&(UFDi.File_Name=temp)break;if(i=_Number_Files)cout<<文件名错误,请再次输入<<endl;elsefor(temp_int=0;temp_int<_MaxNumber_Open_Files;temp_int+)if(_AFDtemp_int.File_ID=i)break;if(temp_int=_MaxNumber_Open_Files)cout<<文件<<temp<<未打开<<endl;elseif(_AFDtemp_int.Read=true)cout<<文件<<temp<<成功读取<<endl;elsecout<<文件打开模式错误<<endl;elseif(Command=)cout<<请输入文件名;cin>>temp;for(i=0;i<_Number_Files;i+)if(UFDi.Length_File!=-1)&&(UFDi.File_Name=temp)break;if(i=_Number_Files)cout<<文件名错误,请再次输入<<endl;elsefor(temp_int=0;temp_int<_MaxNumber_Open_Files;temp_int+)if(_AFDtemp_int.File_ID=i)break;if(temp_int=_MaxNumber_Open_Files)cout<<文件<<temp<<未打开<<endl;elseif(_AFDtemp_int.Write=true)cout<<文件<<temp<<成功写入<<endl;elsecout<<文件打开模式错误<<endl;elseif(Command=)cout<<正在注销<<endl;cout<<再见<<User_Name<<<<endl;cout<<正在关机break;<<endl;elsecout<<指令错误,请再次输入<<endl;while(Command!=&&Command!=);while(Command!=);实验结果:SBC:Windowssystem32cmd.exe己创建指令有:createdeleteopendirdiropenwritereadlogoutshutdown请输入用户名:yuh。欢迎登录,yuho!C:yuho>create清皤入新文件信息:文件名:music文件权限:Read(y/n):Write(y/n):Execute(y/n):Length:88新文件music己建立!C:yuho>openmusic请输入文中名:请定义打开方式:Read(y/n):Write(y/n):文件music已打开C:yuho>writemusic清输入文件名:文件music成功写入.C:yuho>dir打开用户yuh。的文件StateLengthFilenameR-E10filel.txtR-20file2.txtRW-88musicC:yuho>delete请输入文件名:music文件music己删除.C:yuho>logout再见,yuho!己创建指令有:createdeleteopendirdiropenwritereadlogoutshutdown请输入用户名:评价表格考核标准得分(1)正确理解和掌握实验所涉及的概念和原理(20%);(2)按实验要求合理设计数据结构和程序结构(20%);(3)运行结果正确(20%);(4)认真记录实验数据,原理及实验结果分析准确(20%);(5)实验过程中,具有严谨的学习态度和认真、踏实、一丝不苟的科学作风(10%);(7)实验报告规范(10%)。合计