Explication d'un script C

Explication d'un script C - C - Programmation

Marsh Posté le 08-03-2017 à 08:31:16    

Bonjour,
 
Est ce qu'il y'a quelqu'un qui peu m'aider a comprendre ce script de sélection des processus.
J'ai compris que ce code permet de sélection le processus qui a le moins temps d'exécution,  mais je n'ai pas compris comment fonctionne.
Merci pour votre aide  
 

Code :
  1. int SJFElect(void) {
  2. int elu;
  3. int min,i,indice;
  4. min=Tproc[0].duration;
  5. elu=0;
  6. indice=0;
  7. for(i=1;i<MAXPROC;i++)
  8. {
  9.  if(Tproc[i].duration<=min && Tproc[i].flag==RUN)
  10.  {
  11.   indice=i;
  12.   min=Tproc[i].duration;
  13.  }
  14. }
  15. elu=indice;
  16. if(Tproc[elu].flag==RUN)
  17.  printf("SJFElect : J'ai élu le processus %d\n",elu);
  18. return elu;
  19. }

Reply

Marsh Posté le 08-03-2017 à 08:31:16   

Reply

Marsh Posté le 08-03-2017 à 10:22:23    

Bah ya rien de compliqué, c'est juste moche et avec pas mal de trous. Il a un array Tproc (global) de "structures de processus" (avec une durée d'exécution et un état), lignes 7~15 il traverse le tableau pour essayer de trouver le proc vivant (flag == RUN) avec le plus bas taux d'exécution et stocke son indice dans i (en partant du principe qu'il y a au moins un proc ligne 4 sinon il va mourir), puis il renvoie ça aprè avoir imprimé l'indice sur stdout.

Message cité 1 fois
Message édité par masklinn le 08-03-2017 à 10:22:47

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 08-03-2017 à 13:42:35    

masklinn a écrit :

Bah ya rien de compliqué, c'est juste moche et avec pas mal de trous. Il a un array Tproc (global) de "structures de processus" (avec une durée d'exécution et un état), lignes 7~15 il traverse le tableau pour essayer de trouver le proc vivant (flag == RUN) avec le plus bas taux d'exécution et stocke son indice dans i (en partant du principe qu'il y a au moins un proc ligne 4 sinon il va mourir), puis il renvoie ça aprè avoir imprimé l'indice sur stdout.


 
Merci Beaucoup pou votre aide et cette explication que je trouvé très claire.
J'ai un autre code et je veux savoir ce qu'il fait si ça vous dérange pas.

Code :
  1. int RandomElect(void) {
  2. int elu;
  3. int i;
  4. srand(getpid());
  5. while(1) 
  6. {
  7.  i = (int) random()%(MAXPROC+1);
  8.  if (Tproc[i].flag == RUN)
  9.  {
  10.   elu=i;
  11.   break;
  12.  }
  13. }
  14. printf("RandomElect : J'ai élu le processus %d\n",elu);
  15.  return elu;
  16. }


Reply

Marsh Posté le 08-03-2017 à 17:08:41    

Il choisit aléatoirement un processus qui est en RUN.
Et c'est de la merde, surtout si peu de processus sont en RUN.


---------------
sheep++
Reply

Marsh Posté le 08-03-2017 à 17:22:48    

C'est pire que ça :  
Le modulo devrait être fait sur MAXPROC et pas sur MAXPROC+1 (ou alors, MAXPROC représente le nombre maximum de processus -1, et le tableau est déclaré struct proc TPROC[MAXPROC+1], mais je n'y crois guère  :lol: :lol: :lol: )
 
Si aucun processus n'est en RUN, alors il part en boucle infinie et bouffe de la CPU autant qu'il peut !
 
De plus, comme le srand est fait dans la fonction, on risque d'avoir à chaque fois le même processus choisi, si les états n'évouent pas : le getpid renvoyant toujours la même chose, on risque très fort d'avoir toujours la même séquence de nombre "aléatoires" qui va être renvoyée, donc, au final, toujours le même processus qui sera choisi :(
 
Vraiment, ce code n'est pas terrible !
 

Message cité 1 fois
Message édité par Farian le 08-03-2017 à 17:39:57

---------------
On n'est jamais très fort pour ce calcul !
Reply

Marsh Posté le 09-03-2017 à 08:04:16    

Farian a écrit :

C'est pire que ça :  
Le modulo devrait être fait sur MAXPROC et pas sur MAXPROC+1 (ou alors, MAXPROC représente le nombre maximum de processus -1, et le tableau est déclaré struct proc TPROC[MAXPROC+1], mais je n'y crois guère  :lol: :lol: :lol: )
 
Si aucun processus n'est en RUN, alors il part en boucle infinie et bouffe de la CPU autant qu'il peut !
 
De plus, comme le srand est fait dans la fonction, on risque d'avoir à chaque fois le même processus choisi, si les états n'évouent pas : le getpid renvoyant toujours la même chose, on risque très fort d'avoir toujours la même séquence de nombre "aléatoires" qui va être renvoyée, donc, au final, toujours le même processus qui sera choisi :(
 
Vraiment, ce code n'est pas terrible !
 


Merci pour vos réponse,
Ce que je ne comprend pas, c'est comment ce code ci-dessous permet de sélectionné d'une manière aléatoire un processus, avec un modulo !!  
 

Code :
  1. i = (int) random()%(MAXPROC+1);


Message édité par raghebgmira le 09-03-2017 à 08:13:48
Reply

Marsh Posté le 09-03-2017 à 08:16:42    

Random() choisit un entier au "hasard".
Modulo est le reste d'une division entière donc n'importe quel entier modulo X donne un entier compris dans [0..X-1]
 
 
Dans la ligne que tu as postée je ne comprends pas l'utilité du cast vers int.


---------------
sheep++
Reply

Marsh Posté le 09-03-2017 à 08:50:58    

h3bus a écrit :

Random() choisit un entier au "hasard".
Modulo est le reste d'une division entière donc n'importe quel entier modulo X donne un entier compris dans [0..X-1]
 
 
Dans la ligne que tu as postée je ne comprends pas l'utilité du cast vers int.


 
Merci, si j’enlève le module, est ce qu'il sélectionne n'importe quelle processus de MAXPROC+1  :
 

Code :
  1. i = (int) random()(MAXPROC+1);

 

Reply

Marsh Posté le 09-03-2017 à 10:33:12    

raghebgmira a écrit :

 

Merci, si j’enlève le module, est ce qu'il sélectionne n'importe quelle processus de MAXPROC+1  :

 
Code :
  1. i = (int) random()(MAXPROC+1);




non, si t'enlèves le modulo ça veut plus rien dire.

 

Faudrait ptet songer à apprendre les bases là, ça devient problématique


Message édité par masklinn le 09-03-2017 à 10:33:57

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed