private void button_safe_Click(object sender, EventArgs e) { state = new bool[nprocesses]; for (int i = 0; i < nprocesses; i++) { process p = new process(); p.id = i; p.Allocation = Allocation[i].ToList <int>(); p.Max = Max[i].ToList <int>(); p.Need = new List <int>(); for (int j = 0; j < nresources; j++) { p.Need.Add(p.Max[j] - p.Allocation[j]); } processes.Add(p); state[i] = false; } available = Array.ConvertAll(text_available.Text.Split(' '), int.Parse); // print Need matrix rich_need.Clear(); string n = ""; for (int j = -1; j < nprocesses; j++) { n = ""; if (j == -1) { n += " \t"; for (int i = 0; i < nresources; i++) { n += "R" + i + "\t"; } rich_need.AppendText(n + "\n"); continue; } n += "P" + j + "\t"; for (int i = 0; i < nresources; i++) { n += processes[j].Need[i] + "\t"; } rich_need.AppendText(n + "\n"); } string s = ""; if (choice == 1) { if (IsSafe(processes, available)) { s = "Yes , Safe state <"; for (int i = 0; i < nprocesses; i++) { s = s + "P" + seq[i]; if (i != nprocesses - 1) { s += ","; } else { s += ">"; } } rich_output.AppendText(s + "\n"); } else { rich_output.AppendText("No\n"); } } else { int pp = 0; s = ""; pp = int.Parse(text_Prequest.Text); req = Array.ConvertAll(text_Rrequest.Text.Split(' '), int.Parse).ToList <int>(); if (Requset(processes, available, pp, req)) { s += "Yes , Safe state <"; s += "P" + pp + "req,"; for (int i = 0; i < nprocesses; i++) { s += "P" + seq[i]; /* * if(seq[i]==p) cout<<"P"<<seq[i]<<"req"; * else cout<<"P"<<seq[i]; */ if (i != nprocesses - 1) { s += ","; } else { s += ">"; } } } else { s += "No"; } rich_output.AppendText(s + "\n"); } }
private bool Requset(List <process> processes, int[] available, int p, List <int> req) { int j; for (j = 0; j < nresources; j++) { if (req[j] > available[j] || req[j] > processes[p].Need[j]) { break; } } if (j != nresources) { return(false); } for (int i = 0; i < nprocesses; i++) { process pp = processes[0]; processes.RemoveAt(0); if (pp.id == p) { for (j = 0; j < nresources; j++) { pp.Allocation[j] += req[j]; pp.Need[j] -= req[j]; available[j] -= req[j]; } } processes.Add(pp); } /* * int finished = nprocesses; * while (finished != 0) * { * int counter = finished; * foreach (var i in processes) * { * if (state[i.id] == false) * { * for (j = 0; j < nresources; j++) * if (i.Need[j] > available[j]) break; * if (j == nresources) * { * finished--; * //processes[i.id].status = true; * state[i.id] = true; * * for (int k = 0; k < nresources; k++) * available[k] += i.Allocation[k]; * seq.Add(i.id); * * } * } * } * if (counter == finished) * { * return false; * } * * } * return true; */ return(IsSafe(processes, available)); }