这是我在 Java 中的大学项目。它显示了 CPU 如何接收每个进程。我在法国,这就是为什么它是法语:
import java.util.Scanner;
public class Round {
int[] t = new int[26];
int[] ta = new int[26];
Scanner scan = new Scanner(System.in);
String lettres = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
String[] nom = lettres.split("");
public void robin_sta() {
/**
* @author Etudiantcci Si les processus arrivent tous en même temps
*/
System.out.println("\nRound Robin sans temps d'arrivée\n");
int nbproc;
int att = 0;
do {
System.out.print("Combien de processus (entre 1 et 26)? ");
nbproc = scan.nextInt();
if (nbproc <= 0 || nbproc > 26) {
att++;
if (att == 3) {
System.out.println("\nAu revoir!");
return;
}
System.out.println("\nChoisisez un entier entre 1 et 26, s'il-vous-plaît");
}
} while (nbproc <= 0 || nbproc > 26);
att = 0;
int q;
System.out.println();
do {
System.out.print("Quantum s'il-vous-plaît: ");
q = scan.nextInt();
if (q <= 0) {
att++;
if (att == 3) {
System.out.println("\nAu revoir!");
return;
}
System.out.println("\nChoisisez un entier supérieur à 0, s'il-vous-plaît");
}
} while (q <= 0);
for (int i = 0; i < nbproc; i++) {
System.out.print("Rentrez la taille du processus " + nom[i + 1]
+ ": ");
t[i] = scan.nextInt();
if (t[i] < 0) {
System.out.println("\nValeurs positives s'il vous plaît!\n");
System.out.print("Rentrez la taille du processus " + nom[i + 1]
+ ": ");
t[i] = scan.nextInt();
if (t[i] < 0) {
System.out
.println("\nValeurs positives s'il vous plaît!\n");
System.out.print("Rentrez la taille du processus "
+ nom[i + 1] + ": ");
t[i] = scan.nextInt();
if (t[i] < 0) {
System.out.println("\nVous comprenez rien!");
return;
}
}
}
System.out
.print("Processus " + nom[i + 1]
+ " (taille,temps d'arrivée): (" + t[i] + ","
+ ta[i] + ")");
System.out.println("\n");
}
/**
* @author Etudiantcci Mise en place des outils pour la méthode
*/
int[] t1 = new int[nbproc];
int[] ta1 = new int[nbproc];
int[] fil = new int[nbproc];
int[] t2 = new int[nbproc];
int[] t3 = new int[nbproc];
int[] temps = new int[nbproc];
int[] rot = new int[nbproc];
for (int i = 0; i < nbproc; i++)
t1[i] = t[i];
for (int i = 0; i < nbproc; i++)
ta1[i] = ta[i];
int t = 0;
for (int i : t1)
t += i;
String[] tab = new String[t];
int s = ta1[0];
for (int i : ta1)
if (i < s)
s = i;
int k = 0;
int j = 0;
if (t1[0] == 0)
for (int i = 0; i < nbproc; i++)
if (t1[i] > 0) {
j = i;
break;
}
int port = 0;
while (k < t) {
for (int i = 0; i < nbproc; i++)
if (ta1[i] == s) {
t2[i] = t1[i];
temps[i] = 1;
fil[i] = 1;
}
for (int i = 0; i < nbproc; i++)
if (i != j && fil[i] == 1)
t3[i]++;
fil[j] = 0;
int cpt = 0;
for (int i : t2)
if (i > 0)
cpt++;
if (cpt > 0) {
if (port > 0) {
/**
* @author Etudiantcci Après un certain temps sans processus
* exécutés, on détermine le prochain à exécuter dès
* qu'il arrive
*/
j = next_job(ta1, t2, j, s, t3);
port = 0;
}
int p = 0;
while (p < q) {
/**
* @author Etudiantcci Calcul des temps d'attente
*/
for (int i = 0; i < nbproc; i++)
if (i != j && temps[i] > 0 && t2[i] > 0)
temps[i]++;
tab[k] = nom[j + 1];
t2[j]--;
k++;
p++;
s++;
if (t2[j] == 0)
break;
/**
* @author Etudiantcci Si le processus se termine, on sort
* de la boucle et on réinitialise le compteur du
* quantum
*/
for (int i = 0; i < nbproc; i++)
if (ta1[i] == s) {
t2[i] = t1[i];
temps[i] = 1;
fil[i] = 1;
}
/**
* @author Etudiantcci On donne plus de priorité aux
* processus qui sont déjà dans la file d'attente
*/
for (int i = 0; i < nbproc; i++)
if (i != j && fil[i] == 1)
t3[i]++;
}
if (t2[j] > 0)
fil[j] = 1;
t3[j] = 0;
for (int i = 0; i < nbproc; i++)
if (ta1[i] == s) {
t2[i] = t1[i];
temps[i] = 1;
fil[i] = 1;
}
for (int i = 0; i < nbproc; i++)
if (i != j && fil[i] == 1)
t3[i]++;
/**
* @author Etudiantcci Calcul du temps de rotation
*/
if (t2[j] == 0)
rot[j] = s - ta1[j];
j = next_job(ta1, t2, j, s, t3);
fil[j] = 0;
t3[j] = 0;
} else {
s++;
port++;
}
}
System.out.print("\n * * Interprétation du processeur * *\n\n\t");
affiche_tab(tab);
System.out.println("\t");
System.out.println("\n * * * Temps d'attente * * *");
for (int i = 0; i < nbproc; i++) {
System.out.print("\t" + nom[i + 1] + " --> ");
if (temps[i] > 0)
System.out.println(temps[i] - 1);
else
System.out.println(0);
}
System.out.print("\n * * Temps d'attente moyen * *\n\t");
int m = 0;
for (int i : temps)
if (i > 0)
m += i - 1;
System.out.println((double) m / nbproc);
System.out.println("\n * * * Temps de rotation * * *");
for (int l = 0; l < nbproc; l++) {
System.out.print("\t" + nom[l + 1] + " --> ");
System.out.println(rot[l]);
}
System.out.println("\n * * Temps de rotation moyen * *");
m = 0;
for (int z : rot)
m += z;
System.out.println("\t" + (double) m / nbproc);
System.out.println("\n * * Durée de l'exécution * *");
System.out.println("\t" + s);
}
/**
* @author Etudiantcci Pour déterminer le prochain processus à exécuter
*/
private int next_job(int[] ta1, int[] t2, int j, int s, int[] t3) {
int cpt = 0;
int n = 0;
for (int i = 0; i < t2.length; i++)
if (t2[i] > 0) {
cpt++;
n = i;
}
if (cpt == 1)
return n;
else {
cpt = 0;
for (int k = 0; k < t2.length; k++)
if (k != j && t2[k] > 0 && t3[k] == max(t3))
cpt++;
if (cpt > 0)
for (int k = 0; k < t2.length; k++)
if (k != j && t2[k] > 0 && t3[k] == max(t3))
return k;
return j;
}
}
/**
* @author Etudiantcci Pour trouver la valeur maximale dans un tableau. On
* se sert pour déterminer le prochain proccesus à exécuter parmi
* ceux qui sont dans la file d'attente
*/
private int max(int[] t3) {
int max = t3[0];
for (int i : t3)
if (i > max)
max = i;
return max;
}
/**
* @author Etudiantcci Pour afficher l'ordre d'exécution des processus
*/
private void affiche_tab(String[] tab) {
for (String i : tab)
System.out.print(" " + i);
}
/**
* @author Etudiantcci Pour déterminer le premier processus à exécuter
*/
private int first_job(int[] ta1, int[] t1) {
int ta_min = ta1[0];
int t = 0;
int[] n = new int[ta1.length];
int[] m = new int[ta1.length];
for (int i = 0; i < n.length; i++)
if (ta1[i] < ta_min)
ta_min = ta1[i];
for (int i = 0; i < n.length; i++)
if (ta1[i] == ta_min)
n[i] = ta_min + 1;
for (int i = 0; i < n.length; i++)
if (n[i] == ta_min + 1)
m[i] = t1[i];
int k = min_positif(m);
for (int i = 0; i < t1.length; i++)
if (ta_min == ta1[i] && k == t1[i])
t = i;
return t;
}
/**
* @author Etudiantcci Pour retrouver la plus petite valeur strictement
* positive
*/
public int min_positif(int[] ar) {
int min = -1;
for (int i : ar)
if (i > 0) {
min = i;
break;
}
if (min == -1) {
System.out.println("\nPas de valeurs positives");
return min;
}
for (int i : ar)
if (i < min && i > 0)
min = i;
return min;
}
/**
* @author Etudiantcci Pour retrouver l'indice de la plus petite valeur
* positive dans un tableau
*/
public int ind_min_positif(int[] ar) {
int min = min_positif(ar);
int k = 0;
for (int i = 0; i < ar.length; i++)
if (ar[i] == min)
k = i;
return k;
}
public void robin_ta() {
/**
* @author Etudiantcci Si les processus arrivent à différents instants
*/
System.out.println("\nRound Robin avec temps d'arrivée\n");
int nbproc;
int att = 0;
do {
System.out.print("Combien de processus (entre 1 et 26)? ");
nbproc = scan.nextInt();
if (nbproc <= 0 || nbproc > 26) {
att++;
if (att == 3) {
System.out.println("\nAu revoir!");
return;
}
System.out.println("\nChoisisez un entier entre 1 et 26, s'il-vous-plaît");
}
} while (nbproc <= 0 || nbproc > 26);
att = 0;
int q;
System.out.println();
do {
System.out.print("Quantum s'il-vous-plaît: ");
q = scan.nextInt();
if (q <= 0) {
att++;
if (att == 3) {
System.out.println("\nAu revoir!");
return;
}
System.out.println("\nChoisisez un entier supérieur à 0, s'il-vous-plaît");
}
} while (q <= 0);
for (int i = 0; i < nbproc; i++) {
System.out.print("\nTaille du processus " + nom[i + 1] + "? ");
t[i] = scan.nextInt();
if (t[i] < 0) {
System.out.println("\nValeurs positives s'il vous plaît!\n");
System.out.print("\nTaille du processus " + nom[i + 1] + "? ");
t[i] = scan.nextInt();
if (t[i] < 0) {
System.out
.println("\nValeurs positives s'il vous plaît!\n");
System.out.print("\nTaille du processus " + nom[i + 1]
+ "? ");
t[i] = scan.nextInt();
if (t[i] < 0) {
System.out.println("\nAu revoir");
return;
}
}
}
System.out.print("Rentrez son temps d'arrivée: ");
ta[i] = scan.nextInt();
if (ta[i] < 0) {
System.out.println("\nValeurs positives s'il vous plaît!\n");
System.out.print("Rentrez son temps d'arrivée: ");
ta[i] = scan.nextInt();
if (ta[i] < 0) {
System.out
.println("\nValeurs positives s'il vous plaît!\n");
System.out.print("Rentrez son temps d'arrivée: ");
ta[i] = scan.nextInt();
if (ta[i] < 0) {
System.out.print("\nAu revoir!");
return;
}
}
}
System.out.print("Processus " + nom[i + 1]+" (taille,temps d'arrivée): (" + t[i] + ","
+ ta[i] + ")");
System.out.println();
}
int[] t1 = new int[nbproc];
int[] ta1 = new int[nbproc];
int[] fil = new int[nbproc];
int[] temps = new int[nbproc];
int[] rot = new int[nbproc];
for (int i = 0; i < nbproc; i++)
t1[i] = t[i];
for (int i = 0; i < nbproc; i++)
ta1[i] = ta[i];
int t = 0;
for (int i : t1)
t += i;
String[] tab = new String[t];
int s = ta1[0];
for (int i : ta1)
if (i < s)
s = i;
int k = 0;
int[] t2 = new int[nbproc];
int[] t3 = new int[nbproc];
int j = first_job(ta1, t1);
if (t1[0] == 0)
for (int i = 0; i < nbproc; i++)
if (t1[i] > 0) {
j = i;
break;
}
int port = 0;
while (k < t) {
for (int i = 0; i < nbproc; i++)
if (ta1[i] == s) {
t2[i] = t1[i];
temps[i] = 1;
fil[i] = 1;
}
for (int i = 0; i < nbproc; i++)
if (i != j && fil[i] == 1)
t3[i]++;
fil[j] = 0;
int cpt = 0;
for (int i : t2)
if (i > 0)
cpt++;
if (cpt > 0) {
if (port > 0) {
/**
* Après un certain temps sans processus exécutés, on
* détermine le prochain à exécuter dès qu'il arrive
*/
j = next_job(ta1, t2, j, s, t3);
port = 0;
}
int p = 0;
while (p < q) {
/**
* @author Etudiantcci Calcul des temps d'attente
*/
for (int i = 0; i < nbproc; i++)
if (i != j && temps[i] > 0 && t2[i] > 0)
temps[i]++;
tab[k] = nom[j + 1];
t2[j]--;
k++;
p++;
s++;
if (t2[j] == 0)
break;
/**
* @author Etudiantcci Si le processus se termine, on sort
* de la boucle et on réinitialise le compteur du
* quantum
*/
for (int i = 0; i < nbproc; i++)
if (ta1[i] == s) {
t2[i] = t1[i];
temps[i] = 1;
fil[i] = 1;
}
/**
* @author Etudiantcci On donne plus de priorité aux
* processus qui sont déjà dans la file d'attente
*/
for (int i = 0; i < nbproc; i++)
if (i != j && fil[i] == 1)
t3[i]++;
}
if (t2[j] > 0)
fil[j] = 1;
t3[j] = 0;
for (int i = 0; i < nbproc; i++)
if (ta1[i] == s) {
t2[i] = t1[i];
temps[i] = 1;
fil[i] = 1;
}
for (int i = 0; i < nbproc; i++)
if (i != j && fil[i] == 1)
t3[i]++;
/**
* @author Etudiantcci Calcul du temps de rotation
*/
if (t2[j] == 0)
rot[j] = s - ta1[j];
j = next_job(ta1, t2, j, s, t3);
fil[j] = 0;
t3[j] = 0;
} else {
s++;
port++;
}
}
System.out.print("\n * * Interprétation du processeur * *\n\n\t");
affiche_tab(tab);
System.out.println("\t");
System.out.println("\n * * * Temps d'attente * * *");
for (int i = 0; i < nbproc; i++) {
System.out.print("\t" + nom[i + 1] + " --> ");
if (temps[i] > 0)
System.out.println(temps[i] - 1);
else
System.out.println(0);
}
System.out.print("\n * * Temps d'attente moyen * *\n\t");
int m = 0;
for (int i : temps)
if (i > 0)
m += i - 1;
System.out.println((double) m / nbproc);
System.out.println("\n * * * Temps de rotation * * *");
for (int l = 0; l < nbproc; l++) {
System.out.print("\t" + nom[l + 1] + " --> ");
System.out.println(rot[l]);
}
System.out.println("\n * * Temps de rotation moyen * *");
m = 0;
for (int z : rot)
m += z;
System.out.println("\t" + (double) m / nbproc);
System.out.println("\n * * Durée de l'exécution * *");
System.out.println("\t" + s);
}
}