操作系統(tǒng)課程設計多線程_第1頁
操作系統(tǒng)課程設計多線程_第2頁
操作系統(tǒng)課程設計多線程_第3頁
操作系統(tǒng)課程設計多線程_第4頁
操作系統(tǒng)課程設計多線程_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

燕山大學課程設計說明書————操作系統(tǒng)題目:多道程序緩沖區(qū)協(xié)調(diào)操作班級:計算機應用2班開發(fā)小組名稱:Beyond軟件開發(fā)小組課題負責人:張鵬課題組成員:姓名學號班級自評成績張鵬090104010071應用2班A李倩090104010064應用2班B課題開發(fā)日期:2012.1.9—2012.1.13概述1.1課程設計目的本次課程設計的主要目的是通過模擬多道程序緩沖區(qū)協(xié)調(diào)操作,充分理解操作系統(tǒng)中進程、線程及線程間同步和互斥的概念;并通過自己編寫程序了解軟件開發(fā)流程,鍛煉自己的編程能力,充分提高自己的綜合能力。1.2主要完成任務模擬設定PUT、GET、Move操作的如下圖所示,有多個PUT操作要不斷循環(huán)地向Buffer1送數(shù)據(jù),有Move1操作和Move2操作要不斷地將Buffer1的數(shù)據(jù)取到Buffer2和Buffer3,有多個GET操作要不斷地從Buff2和Buffer3中取數(shù)據(jù)。PUT、MOVE、GET每次操作一個數(shù)據(jù),為了在操作的過程中要保證數(shù)據(jù)不丟失,每個Buffer每次只能接受一個PUT或一個Move或一個Get,多個操作不能同時操作同一BUFFER。Get2Get2PutMove2Buff1Buff2Buff3Move1Get1PUTMOVEGET軟件能顯示各個Buffer的操作過程和每個Buffer中的現(xiàn)有數(shù)據(jù),放入、取出的總數(shù)據(jù),可以設置Buffer的容量及放入、取出數(shù)據(jù)的速度,設置put、move、get操作的線程數(shù)和操作速度,軟件結束運行時可以顯示匯總數(shù)據(jù),并能將統(tǒng)計結果保存到任意的路徑下。1.3解決的主要問題 在本次課程設計中解決的重要問題有線程間的同步和互斥問題,java語言軟件設計中面向?qū)ο笏枷敫鱾€類的創(chuàng)建方法及類之間互相操作問題,軟件界面設計問題。2.設計使用的基本概念和原理2.1多道程序多道程序設計技術是在計算機內(nèi)存中同時存放幾道相互獨立的程序,使他們在管理程序控制下,相互穿插運行。2.2進程進程是并發(fā)程序的執(zhí)行,是多道程序系統(tǒng)中程序的執(zhí)行過程。2.3線程線程是進程中的一個實體,是被系統(tǒng)獨立調(diào)度和分派的基本單位。線程自己基本上不擁有系統(tǒng)資源,只擁有一點運行中必不可少的資源,但它可與同屬一個進程的其他線程共享進程所擁有的資源。2.4同步和互斥相互合作的進程需要在某些點上協(xié)調(diào),先到達某點的進程需要等待后到達的進程,進程間的這種協(xié)調(diào)關系叫同步?;コ馐且环N特殊的同步方式。當多個進程需要使用相同的資源,而次資源在任意時刻卻只能供一個進程使用。獲得資源的進程可以繼續(xù)執(zhí)行,沒有獲得資源的進程必須等待。進程間的這種相互排斥關系叫做互斥。2.5基本原理設計的基本理念是運用面向?qū)ο蠹夹g,設計三個緩沖區(qū)類Buffer1,Buffer2,Buffer3,主要屬性有容量,當前數(shù)據(jù)量,放入、取出數(shù)據(jù)量,放入、取出速度等,主要方法有放入、取出等;然后設計線程類Producer,Transporter1,Transporter2,Consumer1,Consumer2,主要屬性有線程個數(shù),線程操作速度,主要方法是重新run()方法,調(diào)用相應Buffer的put和get方法,執(zhí)行對Buffer的操作。利用信號量機制,對線程進行等待,喚醒操作,實現(xiàn)線程間的同步和互斥;利用線程的休眠時間來模擬放入,取出的速度以及各個線程操作的速度。3.總體設計3.1基本技術路線本程序主要利用面向?qū)ο缶幊谭椒?,采用java提供的多線程技術,來模擬實現(xiàn)P、V操作。3.2總體結構、模塊關系本程序中Producer線程可以調(diào)用Buffer1的put方法向Buffer1中放入數(shù)據(jù);Transporter1線程可以調(diào)用Buffer1的get方法,調(diào)用Buffer2的put方法,將數(shù)據(jù)從Buffer1中取出放入Buffer2中;Transporter2線程可以調(diào)用Buffer1的get方法,調(diào)用Buffer3的put方法,將數(shù)據(jù)從Buffer1中取出數(shù)據(jù)放入Buffer3中;Consumer1線程可以調(diào)用Buffer2的get方法,從Buffer2中取出數(shù)據(jù);Consumer2線程調(diào)用Buffer3的get方法,從Buffer3中取數(shù)據(jù)。程序運行前可以在設置中設置各個參數(shù)的值;程序運行中會在主界面顯示各個Buffer中的操作,以及各個Buffer中的數(shù)據(jù)信息,包括現(xiàn)有數(shù)據(jù),放入數(shù)據(jù)和取出數(shù)據(jù),還能顯示程序運行時間;程序運行結束后可以在菜單中點擊統(tǒng)計按鈕,查看所有數(shù)據(jù)的統(tǒng)計結果,并能保存結果到任意文件中。3.3總體流程3.31各個界面截圖主界面截圖數(shù)據(jù)統(tǒng)計窗口(可以點擊保存,保存到任意文件中)、參數(shù)設置和使用說明界面3.32總體流程圖主界面主界面菜單時間顯示退出系統(tǒng)結束運行啟動程序信息顯示菜單時間顯示退出系統(tǒng)結束運行啟動程序信息顯示狀態(tài)信息文件設置幫助操作過程狀態(tài)信息文件設置幫助操作過程統(tǒng)計退出參數(shù)設置使用說明關于統(tǒng)計退出參數(shù)設置使用說明關于4.詳細設計4.1主要類的描述4.11三個緩沖區(qū)類Buffer1、Buffer2、Buffer3三個類的內(nèi)容類似,以Buffer1為例說明。主要屬性:privateintbuffercount;//Buffer當前數(shù)據(jù)量privateintbuffernum;//Bufffer的容量privateintputnum=0;//放入數(shù)量privateintgetnum=0;//取出數(shù)量privatelongputtime=1000;//放入速度privatelonggettime=1000;//取出速度主要方法:publicsynchronizedvoidput()throwsInterruptedException{//put方法向Buffer中放數(shù)據(jù),synchronized關鍵字確定只能有一個線程操作Bufferwhile(buffercount>=this.buffernum){//當前數(shù)量大于等于容量時等待this.wait();}try{Thread.sleep(this.getPuttime());}catch(InterruptedExceptione){}this.setBuffercount(++this.buffercount);//當前數(shù)據(jù)量加1this.setPutnum(++this.putnum);//放入數(shù)據(jù)量加1MainFrame.jTextArea1.append(Thread.currentThread().getName().toString()+""+getBuffercount()+"\n");//操作顯示在主界面MainFrame.jTextField1.setText(Integer.toString(getBuffercount()).toString().trim());//當前數(shù)據(jù)量顯示在主界面MainFrame.jTextField4.setText(Integer.toString(this.putnum));//放入數(shù)據(jù)量在主界面顯示this.notifyAll();//喚醒所有等待的線程}publicsynchronizedvoidget()throwsInterruptedException{//put方法從Buffer中取數(shù)據(jù)while(buffercount<=0){//如果當前數(shù)據(jù)小于等于0等待this.wait();}try{Thread.sleep(this.getGettime());}catch(InterruptedExceptione){}this.setBuffercount(--this.buffercount);//當前數(shù)據(jù)量減1this.setGetnum(++this.getnum);//取出數(shù)據(jù)量加1MainFrame.jTextArea1.append(Thread.currentThread().getName().toString()+""+getBuffercount()+"\n");//操作顯示在主界面MainFrame.jTextField1.setText(Integer.toString(getBuffercount()).toString().trim());//當前數(shù)據(jù)量顯示在主界面MainFrame.jTextField7.setText(Integer.toString(this.getnum));//取出數(shù)據(jù)量顯示在主界面this.notifyAll();//喚醒所有等待的線程}}4.12Producer類主要屬性:privateintputnum=1;//put線程的數(shù)量private longtime=1000;//控制線程速度主要方法:publicvoidrun(){//重寫接口Rannable中的run方法try{while(this.getRun()){Thread.sleep(this.gettime());buffer.put();//調(diào)用Buffer1的put方法}}catch(InterruptedExceptione){e.printStackTrace();}}4.13Transporter1和Transporter2類兩個類類似以Transporter1為例說明。主要屬性:privatelongtime=1000;//控制線程速度 privateintmovenum=1;//線程個數(shù)主要方法:publicvoidrun(){//重寫接口Rannable中的run方法try{while(this.getRun()){Thread.sleep(this.gettime());buffer1.get();//調(diào)用Buffer1的get方法buffer2.put();//調(diào)用Buffer2的put方法}}catch(InterruptedExceptione){e.printStackTrace();}}4.14Consumer1和Consumer2類兩個類類似以Consumer1為例說明。主要屬性:privateintgetnum=1;//get線程的數(shù)量 Privatelongtime=1000;//線程的速度主要方法:publicvoidrun(){//重寫接口Rannable中的run方法try{while(this.getRun()){Thread.sleep(this.gettime());buffer.get();//調(diào)用Buffer2的get方法}}catch(InterruptedExceptione){e.printStackTrace();}}4.15各個窗體類各個窗體類主要通過軟件JBuilder2006畫圖,代碼自動生成,然后寫事件函數(shù),以主頁面為例說明。主要事件處理方法:publicvoidqiDong_actionPerformed(ActionEvente){//點擊啟動運行按鈕后對應操作this.qidong.setEnabled(false);time.init();//初始化時間對象Threadt=newThread(time);t.start();Shezhi();//設置參數(shù)方法jTextArea1.setText("");//以下為清空主界面顯示jTextArea2.setText("");jTextArea3.setText("");jTextField1.setText("");jTextField2.setText("");jTextField3.setText("");jTextField4.setText("");jTextField5.setText("");jTextField6.setText("");jTextField7.setText("");jTextField8.setText("");jTextField9.setText("");buffer1.setBuffercount(0);buffer1.setGetnum(0);buffer1.setPutnum(0);buffer2.setBuffercount(0);buffer2.setGetnum(0);buffer2.setPutnum(0);buffer3.setBuffercount(0);buffer3.setGetnum(0);buffer3.setPutnum(0);producer.running();//設置各個線程可以運行transporter1.running();transporter2.running();consumer1.running();consumer2.running();this.jMenuItem5.setEnabled(false);Threadproducers[]=newThread[producer.getPutnum()];//創(chuàng)建producer線程for(inti=0;i<producers.length;i++){producer.running();producers[i]=newThread(producer,"put_"+i);producers[i].start();}Threadtransporters1[]=newThread[transporter1.getMovenum()];//創(chuàng)建Transporter1線程for(inti=0;i<transporters1.length;i++){transporter1.running();transporters1[i]=newThread(transporter1,"tansporter1_"+i);transporters1[i].start();}Threadtransporters2[]=newThread[transporter2.getMovenum()];//創(chuàng)建Transporter2線程for(inti=0;i<transporters2.length;i++){transporter2.running();transporters2[i]=newThread(transporter2,"tansporter2_"+i);transporters2[i].start();}Threadconsumers1[]=newThread[consumer1.getGetnum()];//創(chuàng)建Consumer1線程for(inti=0;i<consumers1.length;i++){consumer1.running();consumers1[i]=newThread(consumer1,"consumer1_"+i);consumers1[i].start();}Threadconsumers2[]=newThread[consumer2.getGetnum()];//創(chuàng)建Consumer2線程for(inti=0;i<consumers2.length;i++){consumer2.running();consumers2[i]=newThread(consumer2,"consumer2_"+i);consumers2[i].start();}}publicvoidjieshu_actionPerformed(ActionEvente){//點擊結束按鈕的對應操作this.qidong.setEnabled(true);producer.stop();transporter1.stop();transporter2.stop();consumer1.stop();consumer2.stop();time.setstop();this.jMenuItem5.setEnabled(true);}publicvoidtuichu_actionPerformed(ActionEvente){//點擊退出系統(tǒng)按鈕對應操作System.exit(0);}publicvoidjMenuItem2_actionPerformed(ActionEvente){//點擊文件—>統(tǒng)計按鈕對應操作tj=newTongjiFrame(buffer1,buffer2,buffer3,producer,consumer1,consumer2,transporter1,transporter2);tj.setTitle("數(shù)據(jù)統(tǒng)計窗口");tj.setSize(600,400);tj.setVisible(true);}publicvoidjMenuItem1_actionPerformed(ActionEvente){//點擊文件—>退出按鈕對應操作System.exit(0);}publicvoidjMenuItem3_actionPerformed(ActionEvente){//點擊幫助—>使用說明對應操作help=newHelpFrame();help.setSize(580,460);help.setTitle("使用說明書");help.setVisible(true);help.setResizable(false);}publicvoidjMenuItem4_actionPerformed(ActionEvente){//點擊幫助—>關于按鈕對應操作about=newAboutFrame();about.setVisible(true);}publicvoidjMenuItem5_actionPerformed(ActionEvente){//點擊設置—>參數(shù)設置按鈕對應操作shezhi.setVisible(true);}}5.編碼設計5.1開發(fā)環(huán)境的設置和建立開發(fā)環(huán)境:操作系統(tǒng)為Windows7,開發(fā)軟件為JBuilder2006.5.2程序設計時要注意的事項注意面向?qū)ο蟮某绦蛟O計思想,任何一個類都是一個對。線程間的同步互斥操作,必須注意數(shù)據(jù)的安全性保護。5.3關鍵插進的特點和使用程序開發(fā)時主要用到JBuilder2006中畫圖的功能,其他代碼都是自己完成,沒有用到其他插件。5.4解決的技術難點1、多線程之間的同步、互斥問題2、Buffer的數(shù)據(jù)的安全問題3、對各個線程放入取出速度的任意控制問題。6.測試時出現(xiàn)過的問題及其解決方法1、問題:界面顯示不是預想大小解決方法:通過代碼調(diào)整各個界面的大小2、問題:一個類中的方法修改另一個類的屬性有錯誤解決方法:將那些屬性設置為靜態(tài)屬性7.軟件使用說明7.1基本功能程序運行后,再點擊啟動按鈕之前可以在菜單參數(shù)設置中設置各個參數(shù)的值。點擊啟動按鈕軟件運行,可以在主界面顯示各個Buffer中的操作以及各個Buffer中的狀態(tài)信息,包括Buffer中的現(xiàn)有數(shù)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論