using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SchedulingAlgorithms { public struct process { public string name;//进程标识符 public int priority;//进程优先级 public int time;//已占用的时间片 public int timeNeed;//所需时间片数 public char state;//进程状态 } public class Schedule { public static int prePosition; /// <summary> /// 获取优先级最高的非完成的进程的位置 /// </summary> /// <param name="pros"></param> /// <returns></returns> public int Position(process[] pros) { int max=0; int m = 0; for (int i = 0; i < pros.Length; i++) { if (pros[i].priority >= pros[max].priority) { if (pros[i].state != 'F') { max = i; m = -1; } if (pros[max].state == 'F') { max++; } } } if (m==0) { prePosition = -1;//获取正在执行的进程的位置 return -1; } else { prePosition = max; return max; } } /// <summary> /// 设置进程的属性 /// </summary> /// <param name="pros"></param> /// <param name="position"></param> public void setProcess(process[] pros,int position) { pros[position].priority = pros[position].priority - 3; pros[position].time = pros[position].time + 1; pros[position].timeNeed = pros[position].timeNeed - 1; if (pros[position].timeNeed == 0) { pros[position].state = 'F'; } else { pros[position].state = 'R'; } } /// <summary> /// 对进程根据优先级进行从高到低排序 /// </summary> /// <param name="pros"></param> /// <returns></returns> public void PaiXuProcess(process[] pros) { process pros2; for (int j = 0; j < pros.Length; j++) { for (int i = j; i < pros.Length - 1; i++) { if (pros[i].priority > pros[i + 1].priority) { pros2 = pros[i + 1]; pros[i + 1] = pros[j]; pros[j] = pros2; } } } } /// <summary> /// 随机产生进程的相关属性,优先级,所需时间片数。初始化进程标识符,状态,已经占用时间片。 /// </summary> /// <param name="pros"></param> public void setProcessValue(process[] pros) { Random r = new Random(); for (int i = 0; i < pros.Length; i++) { int priority = r.Next(0, 50); int timeNeed = r.Next(1, 10); pros[i].name = i.ToString() ; pros[i].state = 'W'; pros[i].time = 0; pros[i].priority = priority; pros[i].timeNeed = timeNeed; } } } } 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 SchedulingAlgorithms { public partial class Form1 : Form { Schedule s = new Schedule(); process[] pros=new process[5]; public Form1() { InitializeComponent(); s.setProcessValue(pros); } private void Form1_Load(object sender, EventArgs e) { LoadTxtValue(); } /// <summary> /// 初始化控件值 /// </summary> private void LoadTxtValue() { p1.Text = pros[0].name; pri1.Text = pros[0].priority.ToString(); time1.Text = pros[0].time.ToString(); timeNeed1.Text = pros[0].timeNeed.ToString(); s1.Text = pros[0].state.ToString(); p2.Text = pros[1].name; pri2.Text = pros[1].priority.ToString(); time2.Text = pros[1].time.ToString(); timeNeed2.Text = pros[1].timeNeed.ToString(); s2.Text = pros[1].state.ToString(); p3.Text = pros[2].name; pri3.Text = pros[2].priority.ToString(); time3.Text = pros[2].time.ToString(); timeNeed3.Text = pros[2].timeNeed.ToString(); s3.Text = pros[2].state.ToString(); p4.Text = pros[3].name; pri4.Text = pros[3].priority.ToString(); time4.Text = pros[3].time.ToString(); timeNeed4.Text = pros[3].timeNeed.ToString(); s4.Text = pros[3].state.ToString(); p5.Text = pros[4].name; pri5.Text = pros[4].priority.ToString(); time5.Text = pros[4].time.ToString(); timeNeed5.Text = pros[4].timeNeed.ToString(); s5.Text = pros[4].state.ToString(); } private void button4_Click(object sender, EventArgs e) { if (Schedule.prePosition != -1) { if (pros[Schedule.prePosition].state != 'F') { pros[Schedule.prePosition].state = 'W'; } } int position = s.Position(pros); if (position != -1) { s.setProcess(pros, position); LoadTxtValue(); } } } }