操作系統(tǒng)實(shí)驗(yàn)報(bào)告一.doc_第1頁(yè)
操作系統(tǒng)實(shí)驗(yàn)報(bào)告一.doc_第2頁(yè)
操作系統(tǒng)實(shí)驗(yàn)報(bào)告一.doc_第3頁(yè)
操作系統(tǒng)實(shí)驗(yàn)報(bào)告一.doc_第4頁(yè)
操作系統(tǒng)實(shí)驗(yàn)報(bào)告一.doc_第5頁(yè)
已閱讀5頁(yè),還剩16頁(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)介

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

最新文檔

評(píng)論

0/150

提交評(píng)論