一、实习内容
选择一个调度算法,实现处理器调度。
二、实习目的
本实习模拟在单处理器环境下的处理器调度,加深了解处理器调度的工作。
三、实习题目
设计一个按时间片轮转法实现处理器调度的程序
[提示]:
(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;
}
}
}
才疏学浅,如有错误请多指正