Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: d91 en 2 Septiembre 2015, 16:56 pm



Título: retomar bucle for con valores globales
Publicado por: d91 en 2 Septiembre 2015, 16:56 pm
Hola a todos, estoy intentando simular el algoritmo dekker 1 (alternancia estricta), llamo al proceso 1, y su seccion_critica inicia el bucle for empieza corriendo bien pero al retomar el bucle for despues de la  primera interrupcion ya no lo realiza, el for deberia llegar a 7000 porque  aumento el acumulador de los procesos
Código
  1. struct PCB{
  2. int id; //id del proceso
  3. char nombre[16];//nombre
  4. int tareas_iniciales; //duracion de las tareas iniciales
  5. int duracion; //cuanto durara el proceso
  6. int quantum; //contador de interrupciones
  7. int acumulador;//valor antes de la interrupcion
  8. };
  9.  
  10. PCB p1;
  11. PCB p2;
  12.  
  13. void crear_procesos(){        /***********************************/
  14. p1.id=1;                      //  RELLENA DATOS A LAS
  15. strcpy(p1.nombre,"PWRDVD");   //  ESTRUCTURAS
  16. p1.duracion=7000;             //  DE TIPO PCB
  17. p1.quantum=0;                 //
  18. p1.acumulador=0;              //                 //
  19. p1.tareas_iniciales=2000;     //  P1 ES PARA PROCESO1
  20.                              //
  21. p2.id=2;                      //
  22. strcpy(p2.nombre,"DVDRIPPER");//  P2 ES PARA PROCESO2
  23. p2.duracion=7000;             //
  24. p2.quantum=0;                 //
  25. p2.acumulador=0;              //                  //
  26. p2.tareas_iniciales=2000;     /*****************************/
  27. }
  28.  
  29. int seccion_critica(int id){
  30. cout<<"\nSeccion Critica: Proceso "<<id;
  31.   if(id==1){
  32.   for(int i=p1.acumulador; i<=p1.duracion; i=i+1000){
  33.   p1.acumulador=i;
  34.      if(i==3000||i==6000||i==9000){
  35.  
  36.         return 1;    /*** ENTRO AL BUCLE DEL QUANTUM ***/
  37.         Sleep(2000);
  38.         break;
  39.   }  //if
  40.   }//for
  41.   }//if principal
  42.   else{
  43.       for(int i=p2.acumulador; i<=p2.duracion; i=i+1000){
  44.            p2.acumulador=i;
  45.   if(i==3000||i==6000||i==9000){
  46.  
  47.         return 1;        /*** ENTRO AL BUCLE DEL QUANTUM***/
  48.         Sleep(2000);
  49.         break;
  50.   }  //if
  51.   }//for
  52.   }//else
  53.   Sleep(2000);
  54. }
  55.  
  56.  
la interrupcion se da a los 3000 lo cual si funciona, se interrumpe pero como es alternancia estricta regresa hacia la seccion_critica porque no ha terminado, en teoria la siguiente seria en 6000, pero despues de la primera interrupcion se vuelve a llamar a la sección critica del proceso 1 pero el ciclo for ya no hace nada solo se inicia en 3000 pero ya no sigue contando, aunque p1.duracion sigue siendo 7000, agradecere sus aportes


Título: Re: retomar bucle for con valores globales
Publicado por: someRandomCode en 2 Septiembre 2015, 17:23 pm
Hmm, te hago una pregunta..
Lo estas haciendo con mutex y threads como el algoritmo de dekker implica verdad?
De ser asi, podrias postear el codigo entero para futuras referencias?


Título: Re: retomar bucle for con valores globales
Publicado por: d91 en 2 Septiembre 2015, 18:18 pm
es solo simulacion y no he utilizado threads, esto es  para comprender como se manejan las interrupciones y funcionamiento segun los algoritmos de dekker, al final encontre una solucion al problema
Código
  1. p1.acumulador=p1.acumulador+1000;
al principio asignaba lo que tenia i pero no se porque razon no corria bien