操作系統(tǒng)實驗報告一.doc_第1頁
操作系統(tǒng)實驗報告一.doc_第2頁
操作系統(tǒng)實驗報告一.doc_第3頁
操作系統(tǒng)實驗報告一.doc_第4頁
操作系統(tǒng)實驗報告一.doc_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

合肥學院操作系統(tǒng)實驗報告 學號: 0913011018 姓名: 秦瑞金 系別: 管理系 專業(yè): 09 信息管理 指導老師: 琚耀 實驗成績: 操作系統(tǒng)實驗題一:設計一若干并發(fā)進程的進程調度程序一、 實驗目的在多道程序和多任務系統(tǒng)中,系統(tǒng)內同時處于就緒狀態(tài)的進程可能有若干個。也就是說能運行的進程數大于處理機個數。為了使系統(tǒng)中的進程能有條不紊地工作,必須選用某種調度策略,選擇某一進程占用處理機。二、 實驗要求用高級語言編寫和調試一個進程調度程序,以加深對進程的概念及進程調度算法的理解 三、 實驗內容進程調度算法:采用最高優(yōu)先數優(yōu)先的調度算法(即把處理機分配給優(yōu)先數最高的進程)和先來先服務算法。 每個進程有一個進程控制塊( PCB)表示。進程控制塊可以包含如下信息:進程名、優(yōu)先數、到達時間、需要運行時間、已用CPU時間、進程狀態(tài)等等。 進程的優(yōu)先數及需要的運行時間可以事先人為地指定(也可以由隨機數產生)。進程的到達時間為進程輸入的時間。 進程的運行時間以時間片為單位進行計算。 每個進程的狀態(tài)可以是就緒 W(Wait)、運行R(Run)、或完成F(Finish)三種狀態(tài)之一。 就緒進程獲得 CPU后都只能運行一個時間片。用已占用CPU時間加1來表示。 如果運行一個時間片后,進程的已占用 CPU時間已達到所需要的運行時間,則撤消該進程,如果運行一個時間片后進程的已占用CPU時間還未達所需要的運行時間,也就是進程還需要繼續(xù)運行,此時應將進程的優(yōu)先數減1(即降低一級),然后把它插入就緒隊列等待CPU。 每進行一次調度程序都打印一次運行進程、就緒隊列、以及各個進程的 PCB,以便進行檢查。 重復以上過程,直到所要進程都完成為止。四、 實驗算法流程優(yōu)先數調度算法用于進程調度時,系統(tǒng)把處理機分配給就緒隊列中優(yōu)先數最大的進程,系統(tǒng)一旦把處理機分配給就緒隊列中優(yōu)先數最大的進程后,該進程便一直執(zhí)行下去直至完成,若因發(fā)生某事件使該進程放棄處理機時,系統(tǒng)方可再將處理機重新分配給另一優(yōu)先數最大的進程。在輪轉調度算法中,系統(tǒng)將所有的就緒進程按先來先服務的原則排成一個隊列,每次調度時,把CPU分配給隊首進程,并令其執(zhí)行一個時間片。當執(zhí)行的時間片用完時,又一個計時器發(fā)出時鐘中斷請求,調度程序便據此信號來停止該進程的執(zhí)行,并將它送往就緒隊列的末尾,然后,再把處理機分配給就緒隊列中新的隊首進程,同時也讓它執(zhí)行一個時間片。五、 實驗程序清單 Private Type PCB P_Name As String 進程名稱 P_CPU As Integer 已使用的時間片數 P_NCPU As Integer 需要的時間片數 P_PRI As Integer 優(yōu)先數(優(yōu)先數法)或分配的CPU單位(輪轉法) P_State As String 進程狀態(tài)End TypePrivate Const VV_LEFT = 200Private Const KK_LEFT = 7200定義全局變量Dim mItem As ListItem 定義ListItem對象,用于把數據插入ListView控件Dim PRI As Boolean 判斷是否采用優(yōu)先數法(PRI=True)Dim P_Run As PCB 存放當前運行的進程控制塊中的數據Dim Proc() As PCB 存放模擬的進程Dim Proc_B() As PCB 備份模擬的進程Dim N, i As Integer N存放模擬的進程數Dim TimeChip As Integer 每個CPU單位分配的時間片Dim Sum As Integer 存放總調度次數Dim NSum As Integer 存放總時間片數Dim A, B As Integer 存放隨機數Dim Pause_R As Integer 存放被暫停的TimerPrivate Function Get_R(ByVal NCPU As Integer, ByVal CPU As Integer) As Integer 計算分配的CPU單位(輪轉發(fā)) Get_R = Int(NCPU - CPU) / 3) + 1End FunctionPrivate Sub P_Index() 對進程按優(yōu)先數進行排序,并加入到P_Ready(ListView控件)中 Dim T As PCB 用于在排序過程中臨時存放數據 用 冒泡排序法按 優(yōu)先級 降序 進行排序 For i = 1 To N For j = 1 To N - 1 If Proc(i).P_PRI = Proc(j).P_PRI Then 交換數據 T = Proc(i) Proc(i) = Proc(j) Proc(j) = T End If Next j Next i 清除就緒隊列 P_Ready.ListItems.Clear 向就緒隊列中插入進程 For i = 1 To N If Proc(i).P_State F Then 初始化mItem對象,并向P_Ready(ListView控件)中添加數據 Set mItem = P_Ready.ListItems.Add(, Proc(i).P_Name, Proc(i).P_Name) mItem.ListSubItems.Add Key:=A + Proc(i).P_Name, Text:=Trim(Proc(i).P_CPU) mItem.ListSubItems.Add Key:=B + Proc(i).P_Name, Text:=Trim(Proc(i).P_NCPU) mItem.ListSubItems.Add Key:=C + Proc(i).P_Name, Text:=Trim(Proc(i).P_PRI) mItem.ListSubItems.Add Key:=D + Proc(i).P_Name, Text:=Trim(Proc(i).P_State) End If Next iEnd SubPrivate Sub Start_P() 開始 Picture1.Visible = True 取得就緒站頂的PCB放入P_Run P_Run.P_Name = P_Ready.ListItems(1).Text P_Run.P_CPU = CInt(P_Ready.ListItems(1).ListSubItems(1).Text) P_Run.P_NCPU = CInt(P_Ready.ListItems(1).ListSubItems(2).Text) P_Run.P_PRI = CInt(P_Ready.ListItems(1).ListSubItems(3).Text) P_Run.P_State = P_Ready.ListItems(1).ListSubItems(4).Text 初始化控件 Text4.Text = P_Run.P_Name Label7.Caption = CStr(P_Run.P_CPU) 初始化完成度進度條 PB2.Max = P_Run.P_NCPU PB2.Value = P_Run.P_CPU Label11.Caption = CStr(P_Run.P_PRI) 把PCB從P_Ready中移除 P_Ready.ListItems.Remove (1) 初始化移動Bar(TextBox控件)的位置 Text4.Visible = True 判斷是否為輪轉法 If Not (PRI) Then 根據CPU單位計算時間片數 TimeChip = CInt(Text3.Text) TimeChip = TimeChip * P_Run.P_PRI End If Label6.Caption = CStr(TimeChip) 初始化時間片進度條 PB1.Max = TimeChip PB1.Value = TimeChip 開始移動控件 Timer1.Enabled = TrueEnd SubPrivate Sub P_End() 完成和結束處理 P_Run.P_State = F 置完成的PCB(用于判斷是否向P_Ready中添加)狀態(tài) If PRI Then For i = 1 To N - 1 Proc(i) = Proc(i + 1) Next i Proc(N) = P_Run Proc(N).P_PRI = -10000 End If 把該進程加入到P_Finish(ListView控件)完成隊列中 Set mItem = P_Finish.ListItems.Add(, P + P_Run.P_Name, P_Run.P_Name) mItem.ListSubItems.Add Key:=A + P_Run.P_Name, Text:=Trim(P_Run.P_CPU) mItem.ListSubItems.Add Key:=B + P_Run.P_Name, Text:=Trim(P_Run.P_NCPU) mItem.ListSubItems.Add Key:=C + P_Run.P_Name, Text:=Trim(P_Run.P_PRI) mItem.ListSubItems.Add Key:=D + P_Run.P_Name, Text:=Trim(P_Run.P_State) 判斷是否結束 If P_Ready.ListItems.Count 0 Then Start_P Else 如果結束 Text4.Text = If Comp_P = -1 Then Else If Comp_P = 1 Then 如果是比較模式的第一次運行 改變標志,表示已經運行過一次 Comp_P = Comp_P - 1 判斷運行過的算法,設置未運行的算法為當前算法 If PRI Then Option2.Value = True Else Option1.Value = True End If 清除就緒隊列 P_Ready.ListItems.Clear 利用備份數據重新初始化Proc() For i = 1 To N Proc(i) = Proc_B(i) If PRI Then Proc(i).P_PRI = Int(36 - Proc(i).P_NCPU) / 3) Else Proc(i).P_PRI = Get_R(Proc(i).P_NCPU, Proc(i).P_CPU) End If Proc_B(i) = Proc(i) 把新數據加入到就緒隊列中 Set mItem = P_Ready.ListItems.Add(, Proc(i).P_Name, Proc(i).P_Name) mItem.ListSubItems.Add Key:=A + Proc(i).P_Name, Text:=Trim(Proc(i).P_CPU) mItem.ListSubItems.Add Key:=B + Proc(i).P_Name, Text:=Trim(Proc(i).P_NCPU) mItem.ListSubItems.Add Key:=C + Proc(i).P_Name, Text:=Trim(Proc(i).P_PRI) mItem.ListSubItems.Add Key:=D + Proc(i).P_Name, Text:=Trim(Proc(i).P_State) Next i 重新開始運行 Start.Value = True Text4.Text = Exit Sub Else 運行全部結束 設置標志位 Comp_P = Comp_P - 1 End If End If 恢復按鍵功能 SSTab1.Enabled = True Simulation.Enabled = True Start.Enabled = True Stop_R.Enabled = False End IfEnd SubPrivate Sub P_Back() 返回就緒隊列 Dim Find_Pos As Boolean 判斷算法 If PRI Then 如果是優(yōu)先數法 優(yōu)先數減一 P_Run.P_PRI = P_Run.P_PRI - 1 把運行的PCB數據放回數組Proc Find_Pos = False For i = 2 To N If P_Run.P_PRI = Proc(i).P_PRI Then Proc(i - 1) = Proc(i) Else Proc(i - 1) = P_Run Find_Pos = True Exit For End If Next i If Not (Find_Pos) Then Proc(N) = P_Run 刷新P_Ready P_Ready.ListItems.Clear For i = 1 To N If Proc(i).P_State F Then Set mItem = P_Ready.ListItems.Add(, P + Proc(i).P_Name, Proc(i).P_Name) mItem.ListSubItems.Add Key:=A + Proc(i).P_Name, Text:=Trim(Proc(i).P_CPU) mItem.ListSubItems.Add Key:=B + Proc(i).P_Name, Text:=Trim(Proc(i).P_NCPU) mItem.ListSubItems.Add Key:=C + Proc(i).P_Name, Text:=Trim(Proc(i).P_PRI) mItem.ListSubItems.Add Key:=D + Proc(i).P_Name, Text:=Trim(Proc(i).P_State) Else Exit For End If Next i Else 如果是輪轉法 重新計算分配的CPU單位 P_Run.P_PRI = Get_R(P_Run.P_NCPU, P_Run.P_CPU) 放入就緒隊列的隊尾 Set mItem = P_Ready.ListItems.Add(, P + P_Run.P_Name, P_Run.P_Name) mItem.ListSubItems.Add Key:=A + P_Run.P_Name, Text:=Trim(P_Run.P_CPU) mItem.ListSubItems.Add Key:=B + P_Run.P_Name, Text:=Trim(P_Run.P_NCPU) mItem.ListSubItems.Add Key:=C + P_Run.P_Name, Text:=Trim(P_Run.P_PRI) mItem.ListSubItems.Add Key:=D + P_Run.P_Name, Text:=Trim(P_Run.P_State) End If Text4.Visible = False If P_Ready.ListItems.Count 0 Then Start_P End IfEnd SubPrivate Sub Comp()If P_Ready.ListItems.Count 0 Then 置標志位 Comp_P = 1 Start.Value = True Else MsgBox 請先模擬進程!, vbInformation, End IfEnd SubPrivate Sub CPU_T_Timer() 控制時間片 Dim M As Integer DoEvents M = PB1.Value DoEvents P_Run.P_CPU = P_Run.P_CPU + 1 PB2.Value = PB2.Value + 1 DoEvents M = M - 1 PB1.Value = PB1.Value - 1 DoEvents NSum = NSum + 1 If M = 0 Or P_Run.P_CPU = P_Run.P_NCPU Then DoEvents Label6.Caption = 0 PB1.Value = 0 PB2.Value = 0 DoEvents Label11.Caption = 0 Picture1.Visible = False DoEvents If P_Run.P_CPU = P_Run.P_NCPU Then Timer2.Enabled = True Else Timer3.Enabled = True End If CPU_T.Enabled = False End IfEnd SubPrivate Sub Exit_Click() 結束整個程序 EndEnd SubPrivate Sub Option1_Click() 為優(yōu)先數算法初始化ListView表頭 PRI = True Me.Caption = 進程調度模擬優(yōu)先數法 P_Ready.ColumnHeaders.Clear P_Ready.ColumnHeaders.Add , , 名稱, 560 P_Ready.ColumnHeaders.Add , , 使用時間片, 1100 P_Ready.ColumnHeaders.Add , , 需要時間片, 1100 P_Ready.ColumnHeaders.Add , , 優(yōu)先級, 760 P_Ready.ColumnHeaders.Add , , 狀態(tài), 460 P_Finish.ColumnHeaders.Clear P_Finish.ColumnHeaders.Add , , 名稱, 560 P_Finish.ColumnHeaders.Add , , 使用時間片, 1100 P_Finish.ColumnHeaders.Add , , 需要時間片, 1100 P_Finish.ColumnHeaders.Add , , 優(yōu)先級, 760 P_Finish.ColumnHeaders.Add , , 狀態(tài), 460End SubPrivate Sub Option2_Click() 為輪轉法初始化ListView表頭 PRI = False Me.Caption = 進程調度模擬輪轉法 P_Ready.ColumnHeaders.Clear P_Ready.ColumnHeaders.Add , , 名稱, 560 P_Ready.ColumnHeaders.Add , , 使用時間片, 1100 P_Ready.ColumnHeaders.Add , , 需要時間片, 1100 P_Ready.ColumnHeaders.Add , , 時間片, 760 P_Ready.ColumnHeaders.Add , , 狀態(tài), 460 P_Finish.ColumnHeaders.Clear P_Finish.ColumnHeaders.Add , , 名稱, 560 P_Finish.ColumnHeaders.Add , , 使用時間片, 1100 P_Finish.ColumnHeaders.Add , , 需要時間片, 1100 P_Finish.ColumnHeaders.Add , , 時間片, 760 P_Finish.ColumnHeaders.Add , , 狀態(tài), 460End SubPrivate Sub Simulation_Click() A = 1 B = 10 取得模擬進程數 N = CInt(Text2.Text) If N = 0 Then MsgBox 對不起!請輸入模擬進程數。, vbInformation, SSTab1.Tab = 1 Text2.SetFocus Exit Sub End If 從新定義進程數組 ReDim Proc(N) ReDim Proc_T(N) ReDim Proc_B(N) 隨機賦值 For i = 1 To N Proc(i).P_Name = 進程 + CStr(i) Proc(i).P_State = W Proc(i).P_CPU = 0 Proc(i).P_NCPU = Rnd * (B - A) + A 隨機取 判斷使用算法 If PRI Then 根據占用CPU的大小生成優(yōu)先數 Proc(i).P_PRI = Int(36 - Proc(i).P_NCPU) / 3) Else 分配CPU單位 Proc(i).P_PRI = Get_R(Proc(i).P_NCPU, Proc(i).P_CPU) End If 備份數據 Proc_B(i) = Proc(i) Next i 如果是 優(yōu)先數算法則 排序 否則直接添加到P_Ready中 If PRI Then P_Index Else P_Ready.ListItems.Clear For i = 1 To N Set mItem = P_Ready.ListItems.Add(, P + Proc(i).P_Name, Proc(i).P_Name) mItem.ListSubItems.Add Key:=A + Proc(i).P_Name, Text:=Trim(Proc(i).P_CPU) mItem.ListSubItems.Add Key:=B + Proc(i).P_Name, Text:=Trim(Proc(i).P_NCPU) mItem.ListSubItems.Add Key:=C + Proc(i).P_Name, Text:=Trim(Proc(i).P_PRI) mItem.ListSubItems.Add Key:=D + Proc(i).P_Name, Text:=Trim(Proc(i).P_State) Next i End IfEnd SubPrivate Sub Slider1_Change() 調節(jié)動畫速度 調節(jié)Timer控件的間隔時間 Select Case Slider1.Value Case Is = 1 快 Timer1.Interval = 1 Timer2.Interval = 1 Timer3.Interval = 1 CPU_T.Interval = 1 Case Is = 2 中 Timer1.Interval = 55 Timer2.Interval = 55 Timer3.Interval = 55 CPU_T.Interval = 300 Case Is = 3 慢 Timer1.Interval = 100 Timer2.Interval = 100 Timer3.Interval = 100 CPU_T.Interval = 500 End SelectEnd SubPrivate Sub Start_Click() 取每CPU單位分配的時間片 TimeChip = CInt(Text3.Text) 判斷TimeChip是否有效 If TimeChip = 0 Then MsgBox 對不起,請規(guī)定CPU每次分配的時間片。, vbInformation, SSTab1.Tab = 1 Text3.SetFocus Exit Sub End If 判斷就緒隊列中是否有進程 If P_Ready.ListItems.Count = 0 Then i = MsgBox(對不起,就緒隊列中沒有進程。要模擬進程嗎?, vbInformation + vbYesNo, ) If i = vbYes Then Simulation.Value = 1 End If Exit Sub End If 清除完成隊列 P_Finish.ListItems.Clear 屏蔽按鈕 SSTab1.Enabled = False Simulation.Enabled = False Start.Enabled = False Stop_R.Enabled = True Pause_R = -1 清除計數器 Sum = 0 NSum = 0 開始運行 Start_PEnd SubPrivate Sub Stop_R_Click() 暫停系統(tǒng) Pause_R=-1表示要暫停,否則表示恢復暫停 判斷當前運行的Timer If Pause_R = -1 Then If Timer1.Enabled = True Then Timer1.Enabled = False Pause_R = 1 ElseIf Timer2.Enabled = True Then Timer2.Enabled = False Pause_R = 2 ElseIf Timer3.Enabled = True Then Timer3.En

溫馨提示

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

評論

0/150

提交評論