Пример #1
0
        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");
            }
        }
Пример #2
0
        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));
        }