// 先来先服务 public void FCFS(ref pcb[] m_pcb) { int n = 0; //保存先来的服务的索引 int x = 0, locate_x = 30, locate_y; for (int j = 0; j < m_pcb.Length; j++) { n = FirstIn(ref m_pcb); //调用求要进入此次的服务进程n的函数 int k = m_pcb[n].TimeServer; //服务时间 Graphics gps = this.CreateGraphics(); Pen pen_showtable = new Pen(Color.Black , 3f); locate_y = 50 * (n + 1) + 33; x = 10; for (int i = 0; i < k; i++) { gps.DrawLine(pen_showtable, locate_x, locate_y, locate_x + x, locate_y); locate_x = locate_x + x; Thread.Sleep(1000); m_pcb[n].TimeServer--; //还需要的服务时间,循环一次,自减。 } m_pcb[n].finish = true; //标明此个进程已经结束 } }
//求最早到达时间的作业,返回此作业在进程控制块数组中的索引号。 private int FirstIn(ref pcb[] m_pcb) { int n = 0; int m = 10000; //设置最大服务时间10000个单位 for (int j = 0; j < m_pcb.Length; j++) { if (m >= m_pcb[j].TimeComing && !m_pcb[j].finish) //求到达时间最小、并且是没完成的作业。 { m = m_pcb[j].TimeComing; //到达时间最小的作业的到达时间赋给m n = j;//保存最小到达时间的索引号 } } return n; }