




已閱讀5頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
操作系統(tǒng)課程設(shè)計(jì)報(bào)告學(xué) 院 計(jì)算機(jī) 專 業(yè) 計(jì)算機(jī)科學(xué)與技術(shù) 班 級(jí) 2011級(jí)1班 題 目 實(shí)現(xiàn)處理機(jī)調(diào)度模塊功能 學(xué) 號(hào) 姓 名 指導(dǎo)教師 丁國(guó)芳 一、 采用具有二級(jí)調(diào)度的調(diào)度隊(duì)列模型。其中作業(yè)調(diào)度采用先來(lái)先服務(wù)策略,進(jìn)程調(diào)度采用時(shí)間片輪轉(zhuǎn)調(diào)度算法。二、利用銀行家算法避免死鎖。三、課程設(shè)計(jì)要求:1. 系統(tǒng)總共運(yùn)行100個(gè)作業(yè)。為每個(gè)進(jìn)入后備隊(duì)列的作業(yè)創(chuàng)建一個(gè)JCB,內(nèi)容包括:作業(yè)標(biāo)識(shí)、預(yù)計(jì)運(yùn)行時(shí)間、資源需求等。其中預(yù)計(jì)運(yùn)行時(shí)間和資源需求隨機(jī)生成(120個(gè)時(shí)間片,A資源0-5,B資源0-3,C資源0-4)。2. 系統(tǒng)開始從后備隊(duì)列中調(diào)入10個(gè)作業(yè)進(jìn)入系統(tǒng)。以后每完成一個(gè)作業(yè)就從后備隊(duì)列中調(diào)入一個(gè),直到所有作業(yè)完成。3. 系統(tǒng)為每個(gè)作業(yè)創(chuàng)建一個(gè)進(jìn)程,按JCB分配系統(tǒng)資源。共有3類系統(tǒng)資源,其中A類資源50個(gè),B類資源30個(gè),C類資源40個(gè))。4. 進(jìn)程在運(yùn)行過(guò)程中(即每個(gè)時(shí)間片內(nèi)),可能會(huì)申請(qǐng)新的資源(申請(qǐng)的各類資源個(gè)數(shù)均不超過(guò)2)。用銀行家算法控制資源的分配,避免死鎖。注意,每個(gè)進(jìn)程申請(qǐng)各類資源的數(shù)目不能超過(guò)系統(tǒng)資源總數(shù)的二分之一。5. 創(chuàng)建三個(gè)阻塞隊(duì)列A、B、C,分別記錄因資源請(qǐng)求而阻塞的進(jìn)程。6. 可視化編程,形象地展現(xiàn)進(jìn)程運(yùn)行的狀態(tài)。四、代碼實(shí)現(xiàn):using System;using System.Collections.Generic;using System.Text;using System.Windows.Forms;namespace process_scheduling public partial class Form1 : Form StringBuilder sb = new StringBuilder(); static int timeflat = 0; static int, max = new int100, 3; static int, allocation = new int100, 3; static int, need = new int100, 3; public struct JCB public int flag; public String name;/作業(yè)名 public int servertime;/服務(wù)時(shí)間 public int arrivetime;/到達(dá)時(shí)間 public int remaintime;/剩余服務(wù)時(shí)間 public int f;/阻塞時(shí)獲得資源變成就緒狀態(tài)標(biāo)志 ; Queue pqueue = new Queue();/后備隊(duì)列 Queue rqueue = new Queue();/就緒隊(duì)列 Queue blockA = new Queue();/阻塞A隊(duì)列 Queue blockB = new Queue();/阻塞B隊(duì)列 Queue blockC = new Queue();/阻塞C隊(duì)列 int resource = new int3 50, 30, 40 ;/分別是資源A ,B,C 和它們的數(shù)量 static JCB job = new JCB100; public Form1() InitializeComponent(); private void Form1_Load(object sender, EventArgs e) sb.Append(); Random rd = new Random(); for (int i = 0; i 0) timeflat = Convert.ToInt32(tb_timeflat.Text); else if (tb_timeflat.Text.Length = 0) sb.Append(請(qǐng)輸入時(shí)間片!); sb.Append(Environment.NewLine); tb_content.Text = sb.ToString(); if (timeflat 20) sb.Append(時(shí)間片大小不合法!); sb.Append(Environment.NewLine); tb_content.Text = sb.ToString(); else run(); public void run() int count = 0; for (int i = 0; i count) if (blockA.Count = 0 & blockB.Count = 0 & blockC.Count = 0) sb.Append(count.ToString(); sb.Append( 處理機(jī)處理空轉(zhuǎn) ); sb.Append(Environment.NewLine); count+; else wakeup(); else JCB pro1 = new JCB(); pro1 = rqueue.Dequeue(); if (allocationpro1.flag, 0 = maxpro1.flag, 0) if (allocationpro1.flag, 1 = maxpro1.flag, 1) if (allocationpro1.flag, 2 = maxpro1.flag, 2) if (pro1.remaintime = timeflat&pro1 .servertime =timeflat ) pro1.remaintime -= timeflat; sb.Append(時(shí)間: 作業(yè)名: 服務(wù)總時(shí)間: 剩余服務(wù)時(shí)間 狀態(tài) ); sb.Append(Environment.NewLine); sb.Append(count); sb.Append(-); sb.Append(count +timeflat) ); sb.Append( ); sb.Append(pro1 .name ); sb.Append( ); sb.Append(pro1 .servertime ); sb.Append( ); sb.Append(pro1 .remaintime ); if(pro1 .remaintime=0) sb.Append( 進(jìn)程結(jié)束 ); else sb.Append( 運(yùn)行中 ); sb.Append(Environment .NewLine ); count += timeflat;/當(dāng)前時(shí)間加上時(shí)間片 if (pro1.remaintime != 0) addprocess(ref count ,9);/加回之前確保在這之前的進(jìn)程加入到就緒隊(duì)列里,9確保能有位置加入 rqueue.Enqueue(pro1);/加回就緒隊(duì)列 showqueue(rqueue ); else sb.Append(時(shí)間: 作業(yè)名: 服務(wù)總時(shí)間: 剩余服務(wù)時(shí)間 狀態(tài) ); sb.Append(Environment.NewLine); sb.Append(count); sb.Append(-); sb.Append(count + pro1.remaintime ); sb.Append( ); sb.Append(); sb.Append( ); sb.Append(pro1.servertime); sb.Append( ); sb.Append(0 進(jìn)程結(jié)束 ); sb.Append(Environment.NewLine); count += pro1 .remaintime ;/當(dāng)前時(shí)間加上時(shí)間片 pro1.remaintime = 0;/服務(wù)時(shí)間 /進(jìn)程結(jié)束查看阻塞隊(duì)列 if (pro1.remaintime = 0) relaxresource(pro1); wakeup(); else sb.Append(pro1 .name ); sb.Append(阻塞 ); sb.Append(Environment.NewLine); blockC.Enqueue(pro1); else sb.Append(); sb.Append(阻塞 ); sb.Append(Environment.NewLine); blockB.Enqueue(pro1); else sb.Append(); sb.Append(阻塞 ); sb.Append(Environment.NewLine); blockA.Enqueue(pro1); tb_content.Text = sb.ToString(); /銀行家算法 private int allocationarithmetic(int i, int requestA, int requestB, int requestC) int rtn = 1; /資源A if (requestA = resource0 & requestA 0) resource0 -= requestA;/減去相應(yīng)資源 needi, 0 -= requestA;/減去相應(yīng)需求資源數(shù) allocationi, 0 += requestA;/增加相應(yīng)資源數(shù) else rtn = -1; /資源B if (requestB = resource1 & requestB 0) resource1 -= requestB;/減去相應(yīng)資源 needi, 1 -= requestB;/減去相應(yīng)需求資源數(shù) allocationi, 1 += requestB;/增加相應(yīng)資源數(shù) else rtn = -1; /資源C if (requestC = resource2 & requestC 0) resource2 -= requestC;/減去相應(yīng)資源 needi, 2 -= requestC;/減去相應(yīng)需求資源數(shù) allocationi, 2 += requestC;/增加相應(yīng)資源數(shù) else rtn = -1; if (rtn != -1) / Console.WriteLine(進(jìn)程請(qǐng)求量出現(xiàn)錯(cuò)誤,請(qǐng)核實(shí)后在運(yùn)行程序!); /else rtn = safearithmetic(); if (rtn = 0)/此分配方案導(dǎo)致系統(tǒng)不安全 if (requestA 0) resource0 += requestA;/加上相應(yīng)資源 needi, 0 += requestA;/加上相應(yīng)需求資源數(shù) allocationi, 0 -= requestA;/減去相應(yīng)資源數(shù) if (requestB 0) resource1 += requestB;/加上相應(yīng)資源 needi, 1 += requestB;/加上相應(yīng)需求資源數(shù) allocationi, 1 -= requestB;/減去相應(yīng)資源數(shù) if (requestC 0) resource2 += requestC;/加上相應(yīng)資源 needi, 2 += requestC;/加上相應(yīng)需求資源數(shù) allocationi, 2 -= requestC;/減去相應(yīng)資源數(shù) return rtn; /安全算法 private int safearithmetic() int finish = new int10;/完成工作量 int work = new int3;/現(xiàn)有資源記錄量 int, record = new int10, 3;/記錄就緒隊(duì)列中每個(gè)進(jìn)程的需求量 int, allocate = new int10, 3;/記錄就緒隊(duì)列中每個(gè)進(jìn)程已分配的資源量 int i = 0; work0 = resource0; work1 = resource1; work2 = resource2; foreach (JCB item in rqueue) recordi, 0 = needitem.flag, 0;/進(jìn)程對(duì)資源A的需求量 recordi, 1 = needitem.flag, 1; recordi, 2 = needitem.flag, 2; allocatei, 0 = allocationitem.flag, 0; allocatei, 1 = allocationitem.flag, 1; allocatei, 2 = allocationitem.flag, 2; i+; i = 0; while (i 10) if (recordi, 0 = work0 & recordi, 1 = work1 & recordi, 2 = work2 & finishi = 0) work0 += allocationi, 0; work1 += allocationi, 1; work2 += allocationi, 2; finishi = 1; i = 0; else i+; int flg = 1; for (i = 0; i 0) jp1 = blockA.Peek(); if (needjp1.flag, 0 0) jp1 = blockB.Peek(); if (needjp1.flag, 1 = 2)/請(qǐng)求資源 request(ref jp1, 0, needjp1.flag, 1, 0); else request(ref jp1, 0, 2, 0); if (jp1.f = 1 & jp1.flag 0) jp1 = blockC.Peek(); if (needjp1.flag, 2 = 2)/請(qǐng)求資源 request(ref jp1, 0, 0, needjp1.flag, 2); else request(ref jp1, 0, 0, 2); if (jp1.f = 1 & jp1.flag jp.flag) jp = blockC.Peek(); bl = 2; if (bl != -1) switch (bl) case 0: jp = blockA.Dequeue(); break; case 1: jp = blockB.Dequeue(); break; case 2: jp = blockC.Dequeue(); break; rqueue.Enqueue(jp);/將已獲資源的進(jìn)程加回到就緒隊(duì)列中 sb.Append(); sb.Append(進(jìn)入就緒隊(duì)列 ); sb.Append(Environment.NewLine); showqueue(rqueue ); private void relaxresource(JCB jcb1) resource0 += allocationjcb1.flag, 0; resource1 += allocationjcb1.flag, 1; resource2 += allocationjcb1.flag, 2; private void addprocess(ref int count,int sum) JCB jb = new JCB(); if (pqueue.Count != 0) jb = pqueue.Peek(); else jb.arrivetime = int.MaxValue; while (jb.arrivetime = count & rqueue.Count 0) pro = pqueue.Dequeue(); /分配資源 if (resource0 - maxpro.flag, 0 = 0) needpro.flag, 0 = 0; allocationpro.flag, 0 = maxpro.flag, 0; resource0 -= maxpro.flag, 0; else allocationpro.flag, 0 = resource0; needpro.flag, 0 = maxpro.flag, 0 - allocationpro.flag, 0; resource0 = 0; if (resource1 - maxpro.flag, 1 = 0) needpro.flag, 1 = 0; allocationpro.flag, 1 = maxpro.flag, 1; resource1 -= maxpro.flag, 1; else allocationpro.flag, 1 = resource1; needpro.flag, 1 = maxpro.flag, 1 - allocationpro.flag, 1; resource1 = 0; if (resource2 - maxpro.flag, 2 = 0) needpro.flag, 2 = 0; allocationpro.flag, 2 = maxpro.flag, 2; resource2 -= maxpro.flag, 2; else allocationpro.flag, 2 = resource2; needpro.flag, 2 = maxpro.flag, 2 - allocationpro.flag, 2; resource2 = 0; rqueue.Enqueue(pro); tb_content.Text = tb_content.Text + .ToString() + 進(jìn)入系統(tǒng)+Environment .NewLine ; if (pqueue.Count != 0) jb = pqueue.Peek(); /顯示當(dāng)前就緒隊(duì)列中所有進(jìn)程信息 private void showqueue(Queue q) sb.Append(當(dāng)前就緒隊(duì)列中所有進(jìn)程信息); sb.Append(Environment .NewLin
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年廠級(jí)安全培訓(xùn)考試試題附完整答案(易錯(cuò)題)
- 2025安全標(biāo)準(zhǔn)化安全培訓(xùn)考試試題答案完整版
- 安全生產(chǎn)月競(jìng)賽錯(cuò)題復(fù)盤測(cè)試題與答案
- 2025年廠級(jí)員工安全培訓(xùn)考試試題【考點(diǎn)精練】
- 2025年企業(yè)管理人員安全培訓(xùn)考試試題答案a4版
- 跨境電商人才核心素養(yǎng)與培養(yǎng)模式創(chuàng)新研究報(bào)告
- 2025車間安全培訓(xùn)考試試題(1套)
- 2025年新入員工安全培訓(xùn)考試試題及答案可打印
- 2024-2025工廠員工安全培訓(xùn)考試試題附參考答案【綜合卷】
- 2025工廠安全培訓(xùn)考試試題(完整)
- 《成人心肺復(fù)蘇術(shù)》課件
- 腫瘤患者營(yíng)養(yǎng)治療科普
- 低空空域資源的協(xié)調(diào)與管理策略
- 高教版2023年中職教科書《語(yǔ)文》(基礎(chǔ)模塊)下冊(cè)教案全冊(cè)
- 服務(wù)機(jī)器人的智能導(dǎo)航與定位考核試卷
- 3.2.1.1函數(shù)的單調(diào)性課件-高一上學(xué)期數(shù)學(xué)人教A版(2019)必修第一冊(cè)
- 噬血細(xì)胞綜合征并發(fā)患者的個(gè)案護(hù)理課件
- 2025新譯林版英語(yǔ)七年級(jí)下單詞默寫單
- 2024年長(zhǎng)沙市事業(yè)單位招聘計(jì)算機(jī)崗位專業(yè)知識(shí)試題
- 2024年中國(guó)心力衰竭診斷和治療指南2024版
- 超齡員工用工免責(zé)協(xié)議書
評(píng)論
0/150
提交評(píng)論