示例#1
0
 // Mettre en attente un processus s'il doit attendre à la barrière
 private void attenteSiBarriere(Processus processus)
 {
     foreach (Barriere barriere in lstBarrieres)
     {
         if (barriere.getBarrierePassee() == false)
         {
             foreach (KeyValuePair <int, int> kvp in barriere.getBarriere())
             {
                 if (processus.getPID() == kvp.Key)
                 {
                     if (processus.getNbInstructionsExecutees() == kvp.Value)
                     {
                         processus.mettreEnAttenteBarriere();
                         processus.setEtat(Enums.etatProcessus.Pret);
                         foreach (Thread thread in processus.getThreads())
                         {
                             thread.setEtat(Enums.etatThread.Pret);
                             updateInfoThread(processus);
                         }
                     }
                 }
             }
         }
     }
 }
示例#2
0
        // Algorithme d'ordonnancement PP
        private List <Processus> OrderListProcessusPP(List <Processus> newlistProcessus)
        {
            List <Processus> newList = new List <Processus>();

            foreach (Processus processus in newlistProcessus)
            {
                if (Enums.etatProcessus.Pret.Equals(processus.getEtat()))
                {
                    newList.Add(processus);
                }
            }
            int lenght = newList.Count;

            while (lenght > 0)
            {
                for (int i = 0; i < lenght - 1; i++)
                {
                    if (newList.Count == 1)
                    {
                        break;
                    }
                    else if (newList[i].getPriorite() < newList[i + 1].getPriorite())
                    {
                        Processus processus = newList[i];
                        newList[i]     = newList[i + 1];
                        newList[i + 1] = processus;
                    }
                }
                lenght = lenght - 1;
            }
            return(newList);
        }
示例#3
0
        // Update les informations d'un thread
        private void updateInfoThread(Processus processus)
        {
            int indexThread = 0;

            foreach (Thread thread in processus.getThreads())
            {
                indexThread = getThreadAffiche(thread);
                dgv_RAM.Columns[indexThread].Name = thread.getInfoThread(processus);
            }
        }
示例#4
0
        // Trouver le nombre d'instructions que possède un processus
        private int trouverNbInstructionsProcessus(Processus processus)
        {
            int nbInstructions = 0;

            foreach (Thread thread in processus.getThreads())
            {
                nbInstructions += thread.getInstructions().Count;
            }
            return(nbInstructions);
        }
示例#5
0
        // Obtenir les infos d'un thread
        public string getInfoThread(Processus processus)
        {
            string infos = "NomProcessus: " + this.processNom + "\n\t";

            infos += "PID: " + this.PID + "\n\t";
            infos += "TID: " + this.TID + "\n\t";
            infos += "PrioriteProcessus: " + this.priorite + "\n\t";
            infos += "EtatProcessus: " + processus.getEtat() + "\n\t";
            infos += "EtatThread: " + this.etat;
            return(infos);
        }
示例#6
0
 // Décrémenter la priorité (pour le PP uniquement)
 private void decrementerPriorite(Processus processus)
 {
     if (executePCA == false)
     {
         processus.setPriorite();
         foreach (Thread thread in processus.getThreads())
         {
             thread.setPriorite();
             updateInfoThread(processus);
         }
     }
 }
示例#7
0
 // Exécution d'un calcul
 private void executerCalcul(Instruction instruction, Thread thread, Processus processus)
 {
     processus.setEtat(Enums.etatProcessus.Actif);
     thread.setEtat(Enums.etatThread.Actif);
     instruction.Etat = Enums.etatInstruction.EnCours;
     decrementerTempsESBloque();
     updateInfoThread(processus);
     updateCouleur();
     sleep();
     instruction.Etat = Enums.etatInstruction.Termine;
     updateCouleur();
 }
示例#8
0
        // Trouver l'instruction du processus de la barrière précédante (pour éviter les interblocages)
        private int trouverInstructionPrecedante(Processus processus)
        {
            int instructionPrec = 1;

            foreach (KeyValuePair <int, int> kvp in lstBarrieres[lstBarrieres.Count - 1].barriere)
            {
                if (kvp.Key == processus.getPID())
                {
                    instructionPrec = kvp.Value;
                }
            }
            return(instructionPrec);
        }
示例#9
0
        // Générer un nombre aléatoire entre 1 et le nombre d'instructions du processus
        private int genererNbAleatoire(Processus processus)
        {
            int niemeInstruction = 0;

            if (lstBarrieres.Count == 0)
            {
                niemeInstruction = RandomNumber(1, trouverNbInstructionsProcessus(processus) + 1);
            }
            else
            {
                niemeInstruction = RandomNumber(trouverInstructionPrecedante(processus), trouverNbInstructionsProcessus(processus) + 1);
            }

            return(niemeInstruction);
        }
示例#10
0
 // Exécution d'une E/S
 private List <Processus> executerES(Instruction instruction, Thread thread, Processus processus)
 {
     instruction.Etat = Enums.etatInstruction.EnCours;
     processus.setEtat(Enums.etatProcessus.Bloque);
     thread.setEtat(Enums.etatThread.Bloque);
     updateInfoThread(processus);
     updateCouleur();
     decrementerTempsESBloque();
     sleep();
     if (executePCA == true)
     {
         return(OrderListProcessusPCA(lstProcessus));
     }
     else
     {
         return(OrderListProcessusPP(lstProcessus));
     }
 }
        // Supprimer une barrière si elle contenait le processus supprimé
        private void supBarriere(Processus processus)
        {
            bool processusSupprime = false;

            foreach (Barriere barriere in lstBarrieres)
            {
                foreach (KeyValuePair <int, int> kvp in barriere.getBarriere())
                {
                    if (processus.getPID() == kvp.Key)
                    {
                        lstBarrieres.Remove(lstBarrieres.Find(cetteBarriere => cetteBarriere.getID() == barriere.getID()));
                        processusSupprime = true;
                        break;
                    }
                }
                if (processusSupprime == true)
                {
                    break;
                }
            }
        }
        // Ajouter le processus quand on clique sur ok
        private void btnOk_Click(object sender, EventArgs e)
        {
            int indiceTID = -1;

            foreach (Processus processus in lstProcessus)
            {
                foreach (Thread thread in processus.getThreads())
                {
                    indiceTID++;
                }
            }

            Processus currentProcessus = new Processus(this.lstProcessus.Count(), this.txtNom.Text, Convert.ToInt32(this.numPriorite.Value), this.numNbInstructCalc.Value, this.numNbInstructES.Value, this.nbThread(), indiceTID);

            if (this.checkInputFilled())
            {
                this.lstProcessus.Add(currentProcessus);
                this.Close();
            }
            else
            {
                MessageBox.Show("Saisie incorrecte");
            }
        }