




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
作者:琚耀 D:FileRootFileRoot_1_201503162019-4169aacbbd4-738e-449f-8169-9300715e9eb276a23787b06c1a6fad0770a4bfba9ec5.pdf 日期:2011-10-21合肥学院操作系统实验报告 学号: 0913011018 姓名: 秦瑞金 系别: 管理系 专业: 09 信息管理 指导老师: 琚耀 实验成绩: 操作系统实验题一:设计一若干并发进程的进程调度程序一、 实验目的在多道程序和多任务系统中,系统内同时处于就绪状态的进程可能有若干个。也就是说能运行的进程数大于处理机个数。为了使系统中的进程能有条不紊地工作,必须选用某种调度策略,选择某一进程占用处理机。二、 实验要求用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解 三、 实验内容进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。 每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。 进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。 进程的运行时间以时间片为单位进行计算。 每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。 就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。 如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。 每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。 重复以上过程,直到所要进程都完成为止。四、 实验算法流程优先数调度算法用于进程调度时,系统把处理机分配给就绪队列中优先数最大的进程,系统一旦把处理机分配给就绪队列中优先数最大的进程后,该进程便一直执行下去直至完成,若因发生某事件使该进程放弃处理机时,系统方可再将处理机重新分配给另一优先数最大的进程。在轮转调度算法中,系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。当执行的时间片用完时,又一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾,然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。五、 实验程序清单 Private Type PCB P_Name As String 进程名称 P_CPU As Integer 已使用的时间片数 P_NCPU As Integer 需要的时间片数 P_PRI As Integer 优先数(优先数法)或分配的CPU单位(轮转法) P_State As String 进程状态End TypePrivate Const VV_LEFT = 200Private Const KK_LEFT = 7200定义全局变量Dim mItem As ListItem 定义ListItem对象,用于把数据插入ListView控件Dim PRI As Boolean 判断是否采用优先数法(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单位(轮转发) Get_R = Int(NCPU - CPU) / 3) + 1End FunctionPrivate Sub P_Index() 对进程按优先数进行排序,并加入到P_Ready(ListView控件)中 Dim T As PCB 用于在排序过程中临时存放数据 用 冒泡排序法按 优先级 降序 进行排序 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中添加)状态 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 如果是优先数法 优先数减一 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() 为优先数算法初始化ListView表头 PRI = True 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 , , 状态, 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 , , 状态, 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 , , 状态, 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 , , 状态, 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的大小生成优先数 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 如果是 优先数算法则 排序 否则直接添加到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() 调节动画速度 调节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 对不起,请规定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() 暂停系统 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.Ena
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 首付款赠与协议书范本
- 太阳能光伏产业发展趋势
- 三方协议书那章给学校
- 合作开发协议内容须知
- 微信是什么协议书
- 2025年电子产品购销合同范本
- 银行 抽屉协议书
- 三方协议书电话核实
- 买断竞业协议书
- 2025租赁合同的形式和主要内容
- 河北省2025-2026学年高一上学期9月月考测评英语试卷
- 2025年省盐业投资控股集团有限公司招聘笔试备考试题带答案详解
- 钢管桩施工土建方案范例
- 保安三级安全考试题库及答案解析
- 市场仿真花施工方案
- 2025年入团知识考试题库(含答案)
- 职业培训项目实施方案
- 破产重整程序中金融债权人保护问题研究
- 设备预防维护培训课件
- (2025秋新版)人教版九年级物理上册全册教案
- 2025年高级经济师《财政税收》真题卷及答案
评论
0/150
提交评论