/***********************为进程创建的类Process.cs*************************/ using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 我们的实验 { public class Process { /********定义每个进程所拥有的属性********/ public string name; //进程名 public int arrive_time; //到达时间 public int need_time; //估计所需执行时间 public int wait_time; //等待时间 public int need_memery; //所需内存大小 public int need_printer; //所需打印机数量 public int more_time; //还需要执行的时间 public int state; //表示执行为0、就绪为1、被阻塞等待为2、完成为3 public int rank ; //处于哪个就绪队列1,2,3 public Process() { } public Process(string namePro,int arrive_timePro,int need_timePro, int need_memeryPro,int need_printerPro,int more_timePro) { this.name = namePro; this.arrive_time = arrive_timePro; this.need_time = need_timePro; this.need_memery = need_memeryPro; this.need_printer = need_printerPro; this.more_time = more_timePro; } } } /***********************类Form1.cs*************************/ using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace 我们的实验 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button4_Click(object sender, EventArgs e) //退出 { this.Close(); } static int totalMem =0; static int totalPrinter=0; //剩余的共有的资源数量 private void initial_set_Click(object sender, EventArgs e) //初始化设置 { Form2 form2 = new Form2(this.text1, this.text2); try { form2.ShowDialog(this); } finally { form2.Dispose();} totalMem = int.Parse(this.text1.Text); totalPrinter = int.Parse(this.text2.Text); } public void newPro(ListView L) //新建进程进入就绪队列1中 { ListViewItem List = new ListViewItem(pro.name); List.SubItems.Add(pro.arrive_time.ToString()); List.SubItems.Add(pro.need_time.ToString()); List.SubItems.Add(pro.need_memery.ToString()); List.SubItems.Add(pro.need_printer.ToString()); List.SubItems.Add(pro.more_time.ToString()); L.Items.Add(List); new_pro_name.Text = ""; in_time.Text = ""; need_t.Text = ""; req_mem.Text = ""; req_printer.Text = ""; } public void Transfer(Process p) //时间片到了但没有执行完,进入就绪队列2 { ListViewItem item = new ListViewItem(p.name); item.SubItems.Add(p.arrive_time.ToString()); item.SubItems.Add(p.need_time.ToString()); item.SubItems.Add(p.need_memery.ToString()); item.SubItems.Add(p.need_printer.ToString()); item.SubItems.Add(p.more_time.ToString()); listView5.Items.Add(item); } public void finishPro(Process f) //进程执行完后进入完成队列 { ListViewItem item = new ListViewItem(f.name); item.SubItems.Add(f.arrive_time.ToString()); item.SubItems.Add(f.need_time.ToString()); item.SubItems.Add(f.need_memery.ToString()); item.SubItems.Add(f.need_printer.ToString()); item.SubItems.Add(f.more_time.ToString()); listView3.Items.Add(item); } public void occupyCPU() //正在占用CPU的进程 { if (listView7.Items.Count != 0) listView7.Items.Remove(listView7.Items[0]); ListViewItem item = new ListViewItem(process.name); item.SubItems.Add(process.arrive_time.ToString()); item.SubItems.Add(process.need_time.ToString()); item.SubItems.Add(process.need_memery.ToString()); item.SubItems.Add(process.need_printer.ToString()); item.SubItems.Add(process.more_time.ToString()); listView7.Items.Add(item); } public void wakePro(Process w) //被唤醒的进程进入就绪队列3中 { ListViewItem item = new ListViewItem(w.name); item.SubItems.Add(w.arrive_time.ToString()); item.SubItems.Add(w.need_time.ToString()); item.SubItems.Add(w.need_memery.ToString()); item.SubItems.Add(w.need_printer.ToString()); item.SubItems.Add(w.more_time.ToString()); listView6.Items.Add(item); } public void blockPro(Process b) //被阻塞的进程进入等待队列 { ListViewItem item = new ListViewItem(b.name); item.SubItems.Add(b.arrive_time.ToString()); item.SubItems.Add(b.need_time.ToString()); item.SubItems.Add(b.need_memery.ToString()); item.SubItems.Add(b.need_printer.ToString()); item.SubItems.Add(b.more_time.ToString()); listView2.Items.Add(item); } Process pro; private void new_job_Click(object sender, EventArgs e) //新建进程 { try { if (new_pro_name.Text != null && in_time.Text != null) { pro = new Process(new_pro_name.Text, int.Parse(in_time.Text), int.Parse(need_t.Text), int.Parse(req_mem.Text), int.Parse(req_printer.Text), int.Parse(need_t.Text)); if ((int.Parse(req_printer.Text) > totalPrinter) || (int.Parse(req_mem.Text) > totalMem)) { MessageBox.Show("内存和打印机资源不够", "创建进程失败", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } else { newPro(listView1); newPro(listView4); totalMem = totalMem - pro.need_memery; totalPrinter = totalPrinter - pro.need_printer; return; } } else { MessageBox.Show("输入进程名", "创建进程失败", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } } catch { MessageBox.Show(""); } } private void button3_Click(object sender, EventArgs e) //exit { this.Close(); } Process process = new Process(null, 0, 0, 0, 0, 0); public void runPro() //多级反馈轮转调度算法 { int ready =0; if (listView1.Items.Count != 0) { ready = 1; process.rank = 1; process.state = 1; process.name = listView1.Items[0].SubItems[0].Text; process.arrive_time = int.Parse(listView1.Items[0].SubItems[1].Text); process.need_time = int.Parse(listView1.Items[0].SubItems[2].Text); process.need_memery = int.Parse(listView1.Items[0].SubItems[3].Text); process.need_printer = int.Parse(listView1.Items[0].SubItems[4].Text); process.more_time = int.Parse(listView1.Items[0].SubItems[5].Text); listView1.Items.Remove(listView1.Items[0]); } else if (listView5.Items.Count != 0) { ready = 2; process.rank = 2; process.state = 1; process.name = listView5.Items[0].SubItems[0].Text; process.arrive_time = int.Parse(listView5.Items[0].SubItems[1].Text); process.need_time = int.Parse(listView5.Items[0].SubItems[2].Text); process.need_memery = int.Parse(listView5.Items[0].SubItems[3].Text); process.need_printer = int.Parse(listView5.Items[0].SubItems[4].Text); process.more_time = int.Parse(listView5.Items[0].SubItems[5].Text); listView5.Items.Remove(listView5.Items[0]); } else if (listView6.Items.Count != 0) { ready = 3; process.rank = 3; process.state = 1; process.name = listView6.Items[0].SubItems[0].Text; process.arrive_time = int.Parse(listView6.Items[0].SubItems[1].Text); process.need_time = int.Parse(listView6.Items[0].SubItems[2].Text); process.need_memery = int.Parse(listView6.Items[0].SubItems[3].Text); process.need_printer = int.Parse(listView6.Items[0].SubItems[4].Text); process.more_time = int.Parse(listView6.Items[0].SubItems[5].Text); listView6.Items.Remove(listView6.Items[0]); } if (ready == 0) { process.name = ""; process.arrive_time = 0; process.need_time = 0; process.need_memery = 0; process.need_printer = 0; process.more_time = 0; } else process.state = 0; if (listView7.Items.Count != 0) /*开始执行,队列1中的进程进入执行队列*/ listView7.Items.Remove(listView7.Items[0]); ListViewItem item = new ListViewItem(process.name); item.SubItems.Add(process.arrive_time.ToString()); item.SubItems.Add(process.need_time.ToString()); item.SubItems.Add(process.need_memery.ToString()); item.SubItems.Add(process.need_printer.ToString()); listView7.Items.Add(item); int c = ready; /******************为三个就绪队列分别分配各自执行的时间片****************/ if (ready == 1) //就绪队列1为新建的进程 timeSlice = 2; else if (ready == 2) //就绪队列2为时间片到了但没有执行完的进程 timeSlice = 3; else if (ready == 3) //就绪队列3是从等待队列中被唤醒的进程 timeSlice = 4; else { timeSlice = 0; timer1.Enabled = false; MessageBox.Show("所有就绪队列中进程执行结束", "消息", MessageBoxButtons.OK, MessageBoxIcon.Information); } } public void runFCFS() //先进先服务调度算法 { if (listView1.Items.Count != 0) { process.name = listView1.Items[0].SubItems[0].Text; process.arrive_time = int.Parse(listView1.Items[0].SubItems[1].Text); process.need_time = int.Parse(listView1.Items[0].SubItems[2].Text); process.need_memery = int.Parse(listView1.Items[0].SubItems[3].Text); process.need_printer = int.Parse(listView1.Items[0].SubItems[4].Text); process.more_time = int.Parse(listView1.Items[0].SubItems[5].Text); listView1.Items.Remove(listView1.Items[0]); } else { MessageBox.Show("没有就绪状态的进程", "消息", MessageBoxButtons.OK,MessageBoxIcon.Information); } } int timeSlice=0; bool flag=true ; int count = 0; private void timer1_Tick(object sender, EventArgs e) //时间片的控制 { if (flag) { process.more_time--; count++; } if (process.more_time == 0) { flag = false; process.state = 3; finishPro(process); } else if (count ==timeSlice) { flag = false; Transfer(process); } occupyCPU(); if (flag == false && process.name!= null) { runPro(); count = 0; flag = true; } if (process.name== null) MessageBox.Show("全部就绪队列已经执行完毕!!!", "消息", MessageBoxButtons.OK, MessageBoxIcon.Information); } private void start_Click_1(object sender, EventArgs e) //开始模拟 { if (radioButton1.Checked) { runPro(); occupyCPU(); timer1.Enabled = true; } else if (radioButton2.Checked) { runFCFS(); occupyCPU(); timer1.Enabled = true; } else { MessageBox.Show("请选择调度算法", "消息", MessageBoxButtons.OK, MessageBoxIcon.Information); } } private void button1_Click(object sender, EventArgs e) //阻塞进程 { timer1.Enabled = false; process.state = 2; blockPro(process); runPro(); if (timeSlice!=0) timer1.Enabled = true; else MessageBox.Show("没有就绪状态的进程", "消息", MessageBoxButtons.OK, MessageBoxIcon.Information); } int index = 0; private void button2_Click(object sender, EventArgs e) //唤醒等待队列中的进程 { if (listView2.Items.Count != 0) { Process p1=new Process(listView2.Items[index].SubItems[0].Text, int.Parse(listView2.Items[0].SubItems[1].Text), int.Parse(listView2.Items[0].SubItems[2].Text), int.Parse(listView2.Items[0].SubItems[3].Text), int.Parse(listView2.Items[0].SubItems[4].Text), int.Parse(listView2.Items[0].SubItems[5].Text)); wakePro(p1); //唤醒进程 listView2.Items.Remove(listView2.Items[index]); if (int.Parse(listView7.Items[0].SubItems[1].Text) == 0) runPro(); timer1.Enabled = true; } else MessageBox.Show("没有进程阻塞", "消息", MessageBoxButtons.OK, MessageBoxIcon.Information); } private void reset_Click(object sender, EventArgs e) //重置 { listView1.Items.Clear(); listView2.Items.Clear(); listView3.Items.Clear(); listView4.Items.Clear(); listView5.Items.Clear(); listView6.Items.Clear(); listView7.Items.Clear(); text1.Text = ""; text2.Text = ""; new_pro_name.Text = ""; in_time.Text = ""; need_t.Text = ""; req_mem.Text = ""; req_printer.Text = ""; radioButton1.Checked = false; radioButton2.Checked = false; } private void button5_Click(object sender, EventArgs e) //重置 { listView3.Items.Clear(); listView4.Items.Clear(); } private void button6_Click(object sender, EventArgs e) //暂停 { timer1.Enabled = false; } private void button7_Click(object sender, EventArgs e) //继续 { timer1.Enabled = true; } } }