《操作系统》课程设计报告_第1页
《操作系统》课程设计报告_第2页
《操作系统》课程设计报告_第3页
《操作系统》课程设计报告_第4页
《操作系统》课程设计报告_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《操作系统》课程设计报告姓名:学号:级班组实验室:提交日期成绩指导教师实验题目:基于软件互斥算法的临界区进程互斥的模拟实现实验要求:(1)互斥算法选择界面要求对Dekker、Peterson、Lamport、Eisenburg/Mcguire4个软件解决互斥的算法进行模拟实现。(2)运行结果(界面)根据选择的软件互斥算法,能动态显示2个或多个并发进程对临界区的互斥执行信息,包括处于临界区内的进程和要进入临界区的进程。所需数据结构:数组算法设计:根据Dekker、Peterson算法原理,模拟实现2个线程访问临界区。根据Lamport、Eisenburg_Mcguire算法原理,模拟实现多个线程访问临界区。流程图:以Dekker算法为例任务分工及各分工实现方法:黄兆龙:总体程序设计,整体界面设计及编写以及最终代码的整合,编写报告实现方法:利用java编写GUI及程序框架。杨霞:根据Dekker,Lamport算法,具体实现多进程访问临界区。实现方法:利用java的线程模拟进程,根据相应算法原理实现进程互斥。李海巍:根据Peterson,Eisenburg算法,具体实现多进程访问临界区。实现方法:利用java的线程模拟进程,根据相应算法原理实现进程互斥。测试结果:(1.主界面)(2.Dekker算法实现)(3.Peterson算法实现)(4.Lamport算法实现)(5.Eisenburg算法实现)(6.异常处理)总结(对所作程序进行分析、评价运行效果,总结遇到的问题和解决办法)分析:程序利用GUI图形化界面选择算法,启动后可根据相应算法及输入选项完成模拟进程访问临界区。评价:程序已成功执行,运行效果还算良好,能够直观的体现进程进入临界区以及出临界区的情形。总结:遇到的问题有很多,百度很多资料查不到,只能翻墙去Google查,不过最终都不完美的解决了。程序代码:《Main.java》packagemutual_exclusion;importjavax.swing.JFrame;publicclassMain{ publicstaticvoidmain(String[]args){ //TODOAuto-generatedmethodstub Contentcontent=newContent(); content.setSize(400,400); content.setLocation(400,200); content.setVisible(true); content.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }}《Content.java》packagemutual_exclusion;importjava.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.FocusEvent;importjava.awt.event.FocusListener;importjavax.swing.*;importjavax.swing.event.*;publicclassContentextendsJFrame{ /** *@authorNapster;YangXia;LiHaiwei */ privatestaticfinallongserialVersionUID=1L; privatestaticintTHREADS; privateBorderLayoutbor_layout,button_layout; privateJPanelpanel,panel_button; privateJRadioButtonradiobutton[]; privateButtonGroupbuttongroup; privateJTextFieldtextField; privateJButtonbutton_ok; privateJTextAreatext; privateJScrollPanescroll; privateListener_Buttonlistener_button; privateListener_Oklistener_ok; privateintalg_ID; publicContent(){ super("进程互斥的模拟实现"); Containercontainer=this.getContentPane(); bor_layout=newBorderLayout(); container.setLayout(bor_layout); panel=newJPanel(); panel.setSize(300,100); button_layout=newBorderLayout(); panel.setLayout(button_layout); panel.setVisible(true); panel_button=newJPanel(newGridLayout(5,1)); radiobutton=newJRadioButton[4]; textField=newJTextField(); textField.setEditable(true); textField.addFocusListener(newFocusListener(){ @Override publicvoidfocusLost(FocusEventarg0){} @Override publicvoidfocusGained(FocusEventarg0){ textField.setText(""); } }); radiobutton[0]=newJRadioButton("Dekker"); radiobutton[1]=newJRadioButton("Peterson"); radiobutton[2]=newJRadioButton("Lamport"); radiobutton[3]=newJRadioButton("Eisenburg_Mcguire"); listener_button=newListener_Button(); radiobutton[0].addActionListener(listener_button); radiobutton[1].addActionListener(listener_button); radiobutton[2].addActionListener(listener_button); radiobutton[3].addActionListener(listener_button); panel_button.add(radiobutton[0]); panel_button.add(radiobutton[1]); panel_button.add(radiobutton[2]); panel_button.add(radiobutton[3]); panel_button.add(textField); buttongroup=newButtonGroup(); buttongroup.add(radiobutton[0]); buttongroup.add(radiobutton[1]); buttongroup.add(radiobutton[2]); buttongroup.add(radiobutton[3]); button_ok=newJButton("启动"); button_ok.setSize(50,50); listener_ok=newListener_Ok(); button_ok.addActionListener(listener_ok); panel.add(panel_button,BorderLayout.NORTH); panel.add(button_ok,BorderLayout.SOUTH); text=newJTextArea(); scroll=newJScrollPane(text); text.setEditable(false); text.setAutoscrolls(true); container.add(panel,BorderLayout.EAST); container.add(scroll,BorderLayout.CENTER); } classListener_ButtonimplementsActionListener{ @Override publicvoidactionPerformed(ActionEventarg0){ //TODOAuto-generatedmethodstub if(arg0.getSource().equals(radiobutton[0])){ alg_ID=0; textField.setEditable(false); } if(arg0.getSource().equals(radiobutton[1])){ alg_ID=1; textField.setEditable(false); } if(arg0.getSource().equals(radiobutton[2])){ alg_ID=2; textField.setEditable(true); textField.setText("请输入线程数(大于2)"); } if(arg0.getSource().equals(radiobutton[3])){ alg_ID=3; textField.setEditable(true); textField.setText("请输入线程数(大于2)"); } } } classListener_OkimplementsActionListener{ @Override publicvoidactionPerformed(ActionEventarg0){ //TODOAuto-generatedmethodstub try{ if(!textField.getText().toString().equals("")) THREADS=Integer.valueOf(textField.getText().toString()); }catch(NumberFormatExceptione){ JOptionPane.showMessageDialog(null,"错误,请正确输入!"); } switch(alg_ID){ case0: Dekker(); break; case1: Peterson(); break; case2: Lamport(); break; case3: Eisenburg_Mcguire(); break; } } privatevoidDekker(){ //TODOAuto-generatedmethodstub newThread(newDekker(0,text),"Thread-0").start(); newThread(newDekker(1,text),"Thread-1").start(); } privatevoidPeterson(){ //TODOAuto-generatedmethodstub newThread(newPeterson(0,text),"Thread-0").start(); newThread(newPeterson(1,text),"Thread-1").start(); } privatevoidLamport(){ //TODOAuto-generatedmethodstub for(inti=0;i<THREADS;i++){ newThread(newLamport(i,THREADS,text),"Thread-"+i) .start(); } } privatevoidEisenburg_Mcguire(){ //TODOAuto-generatedmethodstub for(inti=0;i<THREADS;i++){ newThread(newEisenburg_Mcguire(i,THREADS,text),"Thread-" +i).start(); } } }}《Dekker.java》packagemutual_exclusion;importjavax.swing.JTextArea;publicclassDekkerimplementsRunnable{ privatestaticboolean[]interested={false,false}; privatestaticvolatileintturn=-1; privatefinalintid; privatefinalJTextAreatext; publicDekker(inti,JTextAreatext1){ id=i; text=text1; text.setText(""); } privateintother(){ returnid==0?1:0; } @Override publicvoidrun(){ //TODO自动生成的方法存根 //announcethatIaminterestedintheresource interested[id]=true; //Ifotherthreadisalsointerestedintheresource,Iwillnotinterestedinit. //thenifit'sturntootherthread,waituntilotherthreadisfinished. //Ifotherthreadhasfinished,theniwillinterestedinitandenterthecriticalsection while(interested[other()]){ if(turn==other()){ interested[id]=false; while(turn==other()){ text.append("["+id+"]--Waiting...\n"); } interested[id]=true; } } /*criticalsection*/ try{ text.append("["+id+"]--Working\n"); Thread.sleep(1000); text.append("["+id+"]--Done!\n"); }catch(InterruptedExceptione){ //TODO自动生成的catch块 e.printStackTrace(); } /*Leavingthecriticalsection*/ //IhavefinishednowandIt'sturntoothers. interested[id]=false; turn=other(); }}《Peterson.java》packagemutual_exclusion;importjavax.swing.JTextArea;publicclassPetersonimplementsRunnable{ privatestaticboolean[]interested={false,false}; privatestaticvolatileintturn=-1; privatefinalintid; privatefinalJTextAreatext; publicPeterson(inti,JTextAreatext1){ id=i; text=text1; text.setText(""); } privateintother(){ returnid==0?1:0; } @Override publicvoidrun(){ //announcethatIaminterestedintheresource interested[id]=true; //Itmeansthatotherthreadmayhasenteredthecriticalsection turn=other(); //Ifotherthreadisalsointerestedandit'sturntootherthread //waituntilotherthreadisfinished. while(interested[other()]&&turn==other()){ text.append("["+id+"]--Waiting...\n"); } //Ifotherthreadhasfinished,theniwillinterestedinitandenterthecriticalsection /*criticalsection*/ try{ text.append("["+id+"]--Working\n"); Thread.sleep(1000); text.append("["+id+"]--Done!\n"); }catch(InterruptedExceptione){ //TODO自动生成的catch块 e.printStackTrace(); } /*Leavingthecriticalsection*/ interested[id]=false; }}《Lamport.java》packagemutual_exclusion;importjava.util.concurrent.atomic.AtomicIntegerArray;importjavax.swing.JTextArea;publicclassLamportimplementsRunnable{ privatestaticintthreads; //AtomicInteger:achieveatomizationoftheintegervariableoperations //queueforthreadsinline. privatestaticAtomicIntegerArrayqueue; //needthisfornon-atomicmaxselection privatestaticAtomicIntegerArrayentering; privatefinalintid; privatefinalJTextAreatext; publicLamport(inti,intN,JTextAreatext1){ id=i; text=text1; text.setText(""); Lamport.threads=N; queue=newAtomicIntegerArray(threads); entering=newAtomicIntegerArray(threads); for(intj=0;j<threads;++j){ queue.set(j,0); entering.set(j,0); } } @Override publicvoidrun(){ //TODO自动生成的方法存根 entering.set(id,1);//Wanttoenter queue.set(id,max(queue)+1);//Enterthequeue entering.set(id,0);//Hasentered for(inti=0;i<queue.length();++i){ if(i!=id){ /* *Ifatthistimeotherthreadwantstoenterthequeue,wait *whileotherthreadhasenteredthequeue. */ while(entering.get(i)==1){ text.append("["+id+"]--Waiting...\n"); } /* *Ifatthistimeotherthreadhasthehighpriority,waitfor *theotherthreadisfinished. */ while(queue.get(i)!=0 &&(queue.get(id)>queue.get(i)||(queue.get(id)==queue .get(i)&&id>i))){ text.append("["+id+"]--Waiting...\n"); } } } /*criticalsection*/ try{ text.append("["+id+"]--Working\n"); Thread.sleep(1000); text.append("["+id+"]--Done!\n"); }catch(InterruptedExceptione){ //TODO自动生成的catch块 e.printStackTrace(); } /*Leavingthecriticalsection*/ queue.set(id,0); } privateintmax(AtomicIntegerArrayqueue2){ //TODO自动生成的方法存根 intmax=0; for(inti=0;i<queue2.length();i++){ if(queue2.get(i)>=max){ max=queue2.get(i); } } returnmax; }}《Eisenburg_Mcguire.java》packagemutual_exclusion;importjavax.swing.JTextArea;publicclassEisenburg_McguireimplementsRunnable{ privatestaticintthreads; privatestaticenumstates{ IDLE,WAITTING,ACTIVE }; privatestaticstatesflags[]; privatestaticvolatileintturn=0; privateintindex; privatefinalintid; privatefinalJTextAreatext; publicEisenburg_Mcguire(inti,intN,JTextAreatext1){ id=i; text=text1; text.setText(""); Eisenburg_Mcguire.threads=N; flags=newstates[threads]; for(index=0;index<threads;++index){ flags[index]=states.IDLE; } } @Override publicvoidrun(){ //TODO自动生成的方法存根 flags[id]=states.WAITTING; /*scanprocessesfromtheonewiththeturnuptoourselves.*/ /*repeatifnecessaryuntilthescanfindsallprocessesidle*/ index=turn; do{ while(ind

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论