




免費預覽已結(jié)束,剩余12頁可下載查看
下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
一、需求分析設計一個SP00LING輸出進程和兩個請求輸出的用戶進程,以及一個SP00LING輸出服務程序。當請求輸出的用戶進程希望輸出一系列信息時,調(diào)用輸出服務程序,由輸出服務程序?qū)⒃撔畔⑺腿胼敵鼍4龅揭粋€輸出結(jié)束標志時,表示進程該次的輸出文件輸出結(jié)束。之后,申請一個輸出請求塊(用來記錄請求輸出的用戶進程的名字、信息在輸出井中的位置、要輸出信息的長度等),等待SP00LING進程進行輸出。SP00LING輸出進程工作時,根據(jù)請求塊記錄的各進程要輸出的信息,把信息輸出到文本框里。進程調(diào)度采用隨機算法,這與進程輸出信息的隨機性相一致。兩個請求輸出的用戶進程的調(diào)度概率各為45,SP00LING輸出進程為10,這由隨機數(shù)發(fā)生器產(chǎn)生的隨機數(shù)來模擬決定。編碼實現(xiàn)的平臺環(huán)境是JCreator4.50 Pro ,實現(xiàn)語言是Java。為每個進程建立一個pcb,記錄進程信息,進程有5種狀態(tài):0為可執(zhí)行態(tài);1為等待狀態(tài)1,表示輸出井滿,請求輸出的用戶進程等待;2為等待狀態(tài)2,表示請求輸出井空,SP00LING輸出進程等待;3為等待狀態(tài)3,表示請求輸出井滿,請求輸出的用戶進程等待;4為結(jié)束態(tài),進程執(zhí)行完成。二、整體功能及設計1、數(shù)據(jù)結(jié)構:1)進程控制塊PCBclass Pcb int id; 進程標識數(shù)int status; 進程狀態(tài)int count; 要輸出的文件數(shù)int x; 進程輸出時的臨時變量2)請求輸出塊Reqblock class Reqblock int repname; 請求進程名int length; 本次輸出信息長度int addr; 信息在輸出井的首地址3)輸出井BUFFERint buffer3100buffer1100為用戶進程1的輸出井,buffer2100為用戶進程2的輸出井4)其他主要的控制變量和指針int c13;c11為輸出井buffer1的空間,c12為輸出井buffer2的空間int c232;c210、c220為輸出井bufferi第一個空閑指針 c211、c221為輸出井bufferi第一個滿指針int c3;reqblock的剩余個數(shù)int pt1;要輸出的第一個reqblock指針int pt2;第一個空閑reqblock指針2、主要類及其函數(shù) 1)主類public class Spooling public Spooling():構造函數(shù),生成界面,為按鈕添加事件監(jiān)聽器 public void actionPerformed(ActionEvent e): 單擊事件響應函數(shù) public void begin(): 點擊重置按鈕時,重新初始化界面 public void run() :點擊運行時,轉(zhuǎn)入調(diào)度函數(shù) public static void main(String args): 生成Spooling類的對象 2)調(diào)度實施類class Manage public Manage(Spooling spooling1) :構造函數(shù),對進程的數(shù)據(jù)初始化 public void run() :SP00LING輸出模擬系統(tǒng)主控函數(shù),用隨機數(shù)來決定調(diào)度的進程,使得兩個請求輸出的用戶進程的調(diào)度概率各為45,SP00LING輸出進程為10。 public int user(int name,int out,JTextArea textarea,JTextField field):SP00LING輸出服務程序,當請求輸出的用戶進程希望輸出一系列信息時,通過傳參調(diào)用輸出服務程序,由輸出服務程序?qū)⒃撔畔⑺腿胼敵鼍?public void spooling1() :SPOOLING輸出進程,根據(jù)請求塊記錄的各進程要輸出的信息,把信息輸出到文本框里。3、流程圖(1)SP00LING輸出模擬系統(tǒng)主控流程圖如圖1所示。NYX0.9且SPOOLING進程為執(zhí)行態(tài)0.45X0.9且進程2為執(zhí)行態(tài)X0.45且進程1為執(zhí)行態(tài)開始對各進程的PCB、輸出請求快、輸出井初始化生成(0-1)隨機數(shù)X判斷X的值及進程的狀態(tài)執(zhí)行請求輸出用戶進程user(1)執(zhí)行請求輸出用戶進程user(2)執(zhí)行SPOOLING進程spooling()進程都結(jié)束了嗎?結(jié)束返回YN圖1 SP00LING輸出模擬系統(tǒng)主控流程圖(2)SP00LING輸出服務程序流程圖如圖2所示。開始調(diào)用進程PCBi的隨機輸出量送PCBi.x輸出井滿 (C10=0)嗎?進程的輸出信息PCBi.x送bufferiC2i0C1i= C1i-1修改空緩沖區(qū)指針C2i0= C2i0+1調(diào)用進程的一個文件,輸出結(jié)束了嗎? (PCBi.x=0?)還有空閑請求塊嗎?請求輸出的進程等待,3送PCBi.status轉(zhuǎn)進程調(diào)度請求輸出的進程等待(1送PCBi.STATUS)轉(zhuǎn)進程調(diào)度將文件在輸出井的位置和長度填入空閑請求塊,將進程名i填入請求塊修改空閑請求塊指針空閑請求塊數(shù)減1YYYNNSPOOLING進程是等待狀態(tài)嗎? NY喚醒SPOOLING進程進程所以輸出文件全部輸出完?N進程i運行結(jié)束Y轉(zhuǎn)進程調(diào)度NY圖2 輸出請求服務的程序框圖(3)SPOOLING輸出進程流程圖如圖3所示。NYNNNY開始請求輸出塊空嗎?兩個請求輸出的進程結(jié)束了嗎?按該請求輸出信息塊reqlock的指針ptrl將輸出井中的一個文件的內(nèi)容輸出釋放相應輸出井,即修改相應的輸出井計數(shù):按請求輸出塊中進程號修改C1數(shù)組和C2數(shù)組有等待輸出井空的進程嗎?釋放該請求輸出塊,修改請求信息塊reqlock的指針ptrl=ptrl=1,C3=C3+1有等待輸出塊的進程嗎?喚醒相應進程轉(zhuǎn)進程調(diào)度SPOOLING進程等待SPOOLING進程結(jié)束返回返回喚醒相應進程轉(zhuǎn)進程調(diào)度YYYNYYYNNN圖3 SP00LING輸出進程流程圖三、編程實現(xiàn)import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.lang.Math;import java.util.Random;/*1)主類public class Spooling public Spooling():構造函數(shù),生成界面,為按鈕添加事件監(jiān)聽器 public void actionPerformed(ActionEvent e): 單擊事件響應函數(shù) public void begin(): 點擊重置按鈕時,重新初始化界面 public void run() :點擊運行時,轉(zhuǎn)入調(diào)度函數(shù) public static void main(String args): 生成Spooling類的對象*/public class Spooling extends JFrame implements ActionListener,Runnable JPanel panel1,panel2,panel3; JTextField field1,field2; JScrollPane p1,p2,p3,p4; JTextArea textarea1,textarea2,textarea3,textarea4; JButton button1,button2,button3; Manage spoo; public Spooling()/界面構造函數(shù) spoo=new Manage(this); Container c=this.getContentPane(); c.setLayout(new BorderLayout(); field1=new JTextField(3);/設置panel1 field2=new JTextField(3); button1=new JButton(運行); button2=new JButton(關閉); button3=new JButton(重置); button1.addActionListener(this); button2.addActionListener(this); button3.addActionListener(this); panel1=new JPanel(); panel1.setLayout(new FlowLayout(); panel1.add(new JLabel(用戶進程1文件數(shù):,SwingConstants.RIGHT); panel1.add(field1); panel1.add(new JLabel(用戶進程2文件數(shù):,SwingConstants.RIGHT); panel1.add(field2); panel1.add(button1); panel1.add(button3); panel1.add(button2);/設置panel1完畢 textarea1=new JTextArea(80,100);/設置panel2 textarea2=new JTextArea(112,400); textarea3=new JTextArea(112,400); textarea1.append(用戶進程1的輸出n); textarea2.append(用戶進程2的輸出n); textarea3.append(Spooling的調(diào)度n); p1=new JScrollPane(textarea3); p2=new JScrollPane(textarea1); p3=new JScrollPane(textarea2); panel2=new JPanel(); panel2.setLayout(new GridLayout(1,3); panel2.add(p1); panel2.add(p2); panel2.add(p3);/設置panel2完畢 textarea4=new JTextArea(10,150);/設置panel3 textarea4.append(主程序調(diào)度過程n); p4=new JScrollPane(textarea4); panel3=new JPanel(); panel3.setLayout(new GridLayout(1,1); panel3.add(p4);/設置panel3完畢 c.add(panel1,BorderLayout.NORTH);/設置窗口 c.add(panel2,BorderLayout.CENTER); c.add(panel3,BorderLayout.SOUTH); this.setSize(1200,600); this.setLocation(100, 100); this.setTitle(Spooling); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/設置窗口完畢 public void actionPerformed(ActionEvent e) if(e.getSource()=button1) /點擊運行按鈕,run() run(); if(e.getSource()=button2) /點擊重置按鈕,begin() System.exit(0); if(e.getSource()=button3)/點擊推出按鈕,退出 begin(); public void begin() field1.setText();/點擊重置,重新初始化界面 field2.setText(); textarea1.setText(用戶進程1的輸出n); textarea2.setText(用戶進程2的輸出n); textarea3.setText(Spooling的調(diào)度n); textarea4.setText(主程序調(diào)度過程n); public void run() /點擊運行時,轉(zhuǎn)入調(diào)度函數(shù) spoo.start(); public static void main(String args) Spooling spooling=new Spooling(); /*2)調(diào)度實施類class Manage public Manage(Spooling spooling1) :構造函數(shù),對進程的數(shù)據(jù)初始化 public void run() :SP00LING輸出模擬系統(tǒng)主控函數(shù),用隨機數(shù)來決定調(diào)度的進程,使得兩個請求輸出的用戶進程的調(diào)度概率各為45,SP00LING輸出進程為10。 public int user(int name,int out,JTextArea textarea,JTextField field):SP00LING輸出服務程序,當請求輸出的用戶進程希望輸出一系列信息時,通過傳參調(diào)用輸出服務程序,由輸出服務程序?qū)⒃撔畔⑺腿胼敵鼍?public void spooling1() :SPOOLING輸出進程,根據(jù)請求塊記錄的各進程要輸出的信息,把信息輸出到文本框里。*/class Manage extends ThreadPcb pcb;Reqblock reqblock;int buffer;int c1;/可使用的輸出井buffer空間int c2;/輸出井buffer空閑和滿指針int c3;/reqblock的剩余個數(shù)int pt1;/要輸出的第一個reqblock指針int pt2;/第一個空閑reqblock指針double random; /用于調(diào)度三個進程的控制隨機數(shù)int out1;/用戶進程1已生成的文件數(shù)int out2;/用戶進程2已生成的文件數(shù)int out_1;/用戶進程1已輸出的文件數(shù)int out_2;/用戶進程2已輸出的文件數(shù)int x;/隨機生成的數(shù)據(jù)09int i;/臨時控制變量Random x1;/輔助生成隨機數(shù)據(jù)x:09 Spooling spooling;public Manage(Spooling spooling1) /對各進程的數(shù)據(jù)初始化out1=0;out2=0;out_1=0;out_2=0; pcb = new Pcb4;reqblock = new Reqblock10;buffer = new int3100;c1=new int3;c11=100;c12=100;c2=new int32;c210=0;c220=0;c3=10;pt1=0;pt2=0;x1=new Random();for(i=0;i4;i+)pcbi=new Pcb(); for(i=0;i10;i+) reqblocki=new Reqblock(); for(i=1;i=3;i+) pcbi.status=0; spooling=spooling1; /對各進程的數(shù)據(jù)初始化完畢public void run() /進程調(diào)度do/while循環(huán) random=Math.random();/產(chǎn)生一個隨機數(shù),控制進程調(diào)度,令用戶進程概率為45%,Spooling進程為10%if(random0.45&random=0.9&random=c2name1) c1name=c1name+c2name0-c2name1; else c1name=c1name+100-c2name1+c2name0; c2name0=c2name1; textarea.append(第+(out+1)+個文件缺少輸出井,); textarea.append(進入等待狀態(tài)1n); try sleep(1000); catch (InterruptedException e) e.printStackTrace(); return out; else/若輸出井沒滿 buffernamec2name0=pcbname.x;/進程的輸出信息PCBi.x送bufferiC2i0 c1name=c1name-1; /輸出井空閑個數(shù)減1 c2name0=(c2name0+1)%100;/修改空緩沖區(qū)指針C2i0前進1 while(x!=0); /判斷進程的一個文件是否輸出完畢的while循環(huán)結(jié)束 textarea.append(第+(out+1)+個文件已放入輸出井:+c2name1+(c2name0-1)+ 剩余空間+c1name+。 ); try sleep(1000); catch (InterruptedException e) e.printStackTrace(); out+; if(c3=0) /若沒有空閑請求輸出塊,轉(zhuǎn)為等待狀態(tài)3 pcbname.status=3; if(c2name0=c2name1) c1name=c1name+c2name0-c2name1; else c1name=c1name+100-c2name1+c2name0; c2name0=c2name1; out-; textarea.append(缺少請求輸出塊,); textarea.append(進入等待狀態(tài)3。n); try sleep(1000); catch (InterruptedException e) e.printStackTrace(); out+; return out; else/若有空閑請求輸出塊 reqblockpt2.addr=c2name1;/將文件在輸出井的位置填入空閑請求塊 if(c2name0=c2name1) /將文件在輸出井的長度填入空閑請求塊 reqblockpt2.length=c2name0-c2name1; else reqblockpt2.length=100-c2name1+c2name0; reqblockpt2.repname=name; /將進程名i填入請求塊 textarea.append(獲得請求輸出塊+(Integer.toString(pt2+1)+n); pt2=(pt2+1)%10;/修改空閑請求塊指針 c3-;/空閑請求塊數(shù)減1 if(pcb3.status=2)/若SPOOLING進程是等待狀態(tài),則喚醒SPOOLING進程 pcb3.status=0; /判斷進程所要輸出的文件是否輸出完畢的while循環(huán)結(jié)束 textarea.append(進程+name+輸出完畢!);/文件輸出完畢,修改狀態(tài)為結(jié)束,轉(zhuǎn)進程調(diào)度 pcbname.status=4; return out; public void spooling1() while(c3!=10)/判斷請求輸出塊是否為空的while循環(huán) /若請求輸出塊不為空 StringBuffer buffer1=new StringBuffer(100); for(i=0;ireqblockpt1.length;i+) /按該請求輸出信息塊reqlock的指針ptrl將輸出井中的一個文件的內(nèi)容放入臨時buffer1中 buffer1.append(bufferreqblockpt1.repnamereqblockpt1.addr); reqblockpt1.addr=(reqblockpt1.addr+1)%100; if(reqblockpt1.repname=1) out_1+; spooling.textarea3.append(輸出進程1第+out_1+個文件的內(nèi)容:); else out_2+; spooling.textarea3.append(輸出進程2第+out_2+個文件的內(nèi)容:); spooling.textarea3.append(buffer1.toString()+n); try sleep(1000); catch (InterruptedException e) e.printStackTrace(); /釋放相應輸出井,即修改相應的輸出井計數(shù)c1c1reqblockpt1.repname=c1reqblockpt1.repname+reqblockpt1.length; pt1=(pt1+1)%10; c3+; int k; for(k=1;k=2;k+) if(pcbk.status=1)/有等待輸出井的進程,喚醒相應進程,轉(zhuǎn)進程調(diào)度 pcbk.status=0; return; for(k=1;k=2;k+) if(pcbk.status=3) /有等待請求輸出塊的進程,喚醒相應進程 pcbk.status=0; return; /判斷請求輸出塊是否為空的while循環(huán)結(jié)束 if(pcb1.status=4&pcb2.status=4)/進程1、2結(jié)束后輸出進程結(jié)束pcb3.status=4;spooling.textarea3.append(Spooling輸出進程結(jié)束); return;else /輸出進程等待pcb3.status=2;return; class Pcb int id;/進程標識數(shù)int status;/進程狀態(tài)int count;/要輸出的文件數(shù)int x;/進程輸出時的臨時變量class Reqblock int repname;/請求進程名int length;/本次輸出信息長度int addr;/信息在輸出井的首地址四、使用說明運行界面如下圖1所示。圖1 運行結(jié)果1、在“用戶進程1文件數(shù)”和“用戶進程2文件數(shù)”的文本框里填入要輸出的文件數(shù)。2、點擊“運行”按鈕開始運行。3、最底下的“主程序調(diào)度過程”文本區(qū)會顯示每次調(diào)度的進程。4、左邊的“Spooling的調(diào)度”文本區(qū)會把請求輸出塊的指針所示的信息輸出。5、中間的“用戶進程1的輸出”文本區(qū)會顯示用戶進程1每個文件的占用輸出井和請求輸出塊的情況。6、右邊的“用戶進程2的輸出”文本區(qū)會顯示用戶進程2每個文件的占用輸出井和請求輸出塊的情況。7、點擊“重置”按鈕,回到最初界面。8、點擊“關閉”按鈕,關閉運行窗口。五、結(jié)果分析 在“用戶進程1文件數(shù)”和“用戶進程2文件數(shù)”的文本框里分別填入3和11,點擊“運行”按鈕,得到的結(jié)果如上圖1所示,每次的調(diào)度都用“*”隔開,從圖中的數(shù)據(jù)可以分析出運行的順序為:1、主程序選擇調(diào)度用戶進程2,“用戶進程2的輸出”顯示第110個文件成功得到輸出井資源buffer2071和請求輸出塊資源reqblock09。第11個文件缺少reqblock,申請失敗,進入等待狀態(tài)3,轉(zhuǎn)調(diào)度函數(shù)。2、主程序選擇調(diào)度用戶進程1,“用戶進程1的輸出”顯示第1個文件缺少reqblock,申請失敗,進入等待狀態(tài)3,轉(zhuǎn)調(diào)度函數(shù)。3、用戶進程1、2都處于等待狀態(tài)3,主程序只能選擇調(diào)度Spooling進程,“Spooling的調(diào)度”顯示第110個reqblock所指的信息,即用戶進程2的第110個文件,喚醒等待輸出井和請求塊的進程,用戶進程1、2都變?yōu)閳?zhí)行狀態(tài)0。4、主程序選擇調(diào)度用戶進程1,“用戶進程1的輸出”顯示第13個文件成功得到輸出井資源buffer
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025私人投資合作協(xié)議合同樣本
- 2025市場營銷專員聘用合同
- 保護環(huán)境我們共同的責任議論文作文7篇
- 圖書館學論文
- 禮儀心得體會范文(16篇)
- 關于堅持的勵志演講稿展示15篇
- 美術與設計專業(yè)研究生入學考試題及答案2025年
- 2025年新媒體傳播專業(yè)研究生入學考試試卷及答案
- 2025年心理健康法治宣傳考試試卷及答案
- 2025年現(xiàn)代漢語語法試題及答案
- 統(tǒng)編版語文三年級上冊第四單元快樂讀書吧:在那奇妙的王國里 課件
- 第二屆全國化工和醫(yī)藥行業(yè)安全生產(chǎn)線上知識競賽題庫(共150題)
- 數(shù)據(jù)采集與分析服務協(xié)議
- 2025年北京市朝陽區(qū)九年級初三二模道德與法治試卷(含答案)
- 第2章 第2節(jié) 五行學說課件
- 西安市統(tǒng)計局招聘基層“統(tǒng)計員”筆試真題2024
- 2025年4月版安全環(huán)境職業(yè)健康法律法規(guī)標準文件清單
- JJF1033-2023計量標準考核規(guī)范
- 2024年上海市初中學業(yè)水平考試地理中考試卷真題(含答案詳解)
- 抖音火花合同電子版獲取教程
- 三對三籃球賽記錄表
評論
0/150
提交評論