选择一个调度算法,实现处理器调度。
本实习模拟在单处理器环境下的处理器调度,加深了解处理器调度的工作。
设计一个按时间片轮转法实现处理器调度的程序 [提示]: (1)假定系统有5个进程,每个进程用一个PCB来代表。PCB的结构为: ·进程名——如Q1~Q5。 ·指针——把5个进程连成队列,用指针指出下一个进程PCB的首地址。 ·要求运行时间——假设进程需要运行的时间单位数。 ·已运行时间——进程已运行的时间单位数,初始值为0。 ·状态——假设两种状态,就绪和结束,用R表示就绪,用E表示结束。初始状态都为就绪状态。 (2) 运行之前,为每个进程确定它的“要求运行时间”。通过键盘输入这些参数。 (3) 把5个进程按顺序排成循环队列,用指针指出队列连接情况。用一个标志单元记录轮到运行的进程。处理器调度总是选择标志单元指示的进程运行,对所指的进程,将其“已运行时间”加1。 (4) 进程运行一次后,若“要求运行时间”等于“已运行时间”,则将状态改为“结束”,退出队列,否则将继续轮转。 (5) 若就绪队列为空,结束,否则转到(3)重复。 要求能接受键盘输入的进程要求运行时间,能显示每次进程调度的情况,如哪个进程在运行,哪些进程就绪。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CaoZuoXiTong1 { class Program { public static PCB[] pcb = new PCB[5]; public static int number=0;//进程号 static void Main(string[] args) { try { for (int i = 0; i < 5; i++)//初始化 { string name = "Q" + i; pcb[i] = new PCB(name); Console.WriteLine("请输入进程" + name + "的要求运行时间:"); pcb[i].RTime = Convert.ToDouble(Console.ReadLine()); } Program.work(); } catch { Console.WriteLine("输入错误"); } } static public void work() { if (pcb[0].judge == PCB.IsOrNot.E && pcb[1].judge == PCB.IsOrNot.E && pcb[2].judge == PCB.IsOrNot.E && pcb[3].judge == PCB.IsOrNot.E && pcb[4].judge == PCB.IsOrNot.E) { Console.WriteLine("进程全部运行结束"); } else { if (pcb[number % 5].judge == PCB.IsOrNot.R) { Console.WriteLine("进程" + pcb[number % 5].Name + "正在运行,此时所有进程的状态为:\n"); Console.WriteLine("Q0:" + pcb[0].judge.ToString()); Console.WriteLine("Q1:" + pcb[1].judge.ToString()); Console.WriteLine("Q2:" + pcb[2].judge.ToString()); Console.WriteLine("Q3:" + pcb[3].judge.ToString()); Console.WriteLine("Q4:" + pcb[4].judge.ToString() + "\n\n"); pcb[number % 5].CTime += 1;//进程运行一次 if (pcb[number % 5].CTime == pcb[number % 5].RTime) pcb[number % 5].judge = PCB.IsOrNot.E; number += 1; } else number += 1; work(); } } } class PCB { public string Name { set; get; }//进程名 public double RTime { set; get; }//要求运行时间 public double CTime { set; get; }//已经完成运行时间 public enum IsOrNot { R,E //R未完成,E已完成 } public IsOrNot judge; public PCB(string name) { Name = name; CTime = 0; RTime = 0; judge= IsOrNot.R; } } }才疏学浅,如有错误请多指正