Skip to content

Instantly share code, notes, and snippets.

View oppahero's full-sized avatar
🎯
Focusing

María López oppahero

🎯
Focusing
View GitHub Profile
void *gestionarCola1(void* threadid) {
struct Planificador &value = *((struct Planificador *)threadid);
Proceso n = value.getPopCola1(); //El proceso pasa al procesador
cout<<" ATENDIENDO NUEVO PROCESO EN CPU. ID: "<<value.getPopCola1().getId() <<endl;
n.setEstado("Ejecutandose"); //Cambia su estado
n.imprimirDatos(); //Imprimimis datos del proceso en CPU
cout<<endl;
value.cola1.pop(); //Ya no esta en cola
value.setProceso(n);
pthread_exit(NULL);
//Cambios de cola
for(int i = 0; i < NUM_QUEUES ; i++){
//Si el tiempo de Quantum de la cola es igual al tiempo en ejecucion por el proceso en cpu
//Y si el T que ha estado ejecutandose es distinto al tiempo de ejecución asignado en un inicio
if ( AdministradorColas.getProcesador().getCola() == (i+1) &&
tiempoEjecucion == queues[i] && AdministradorColas.getProcesador().getTEjecucion() != tiempoEjecucion){
tiempoEjecucion=0;
AdministradorColas.gestionarEvento(); //Pasara a la cola inferior
AdministradorColas.setIdProcesador();
continue;
//Si el procesador se ha desocupado
if (AdministradorColas.getProcesador().getEstado() == "Terminado" || AdministradorColas.getProcesador().getId() == LIBRE){
//Cola 1 es la de mayor prioridad. Si hay procesos se atendera primero esta
if ( ! AdministradorColas.cola1.empty())
pthread_create(&threads[i], NULL, gestionarCola1, (void*)&AdministradorColas);
else{
//Si la cola 1 esta vacia, procedemos a tomar procesos de la cola 2
if (! AdministradorColas.cola2.empty())
pthread_create(&threads[i], NULL, gestionarCola2, (void*)&AdministradorColas);
else{ //Si cola 1 y 2 están vacias
//Si hay un proceso en CPU
if (AdministradorColas.getProcesador().getId() != LIBRE){
//Obtenemos la cola a la que pertenece, esta refleja su prioridad.
//Control del tiempo del proceso en el cpu
switch (AdministradorColas.getProcesador().getCola() ){
case 1: case 2: case 3: case 4:
//Si el tiempo que ha estado ejecutandose es igual al t asignado en un inicio
if (AdministradorColas.getProcesador().getTEjecucion() == tiempoEjecucion){
tiempoEjecucion=0;
//Ese proceso saldra del procesador
Nodo *proceso;
int i=0, tiempoEjecucion=0,tiempo=0;
//Mientras las colas no esten vacias.
//Si hay al menos un proceso en alguna cola el ciclo continuara
while(AdministradorColas.getVacio != 0){
if (AdministradorColas.getProcesador){ //Si hay un proceso en el cpu
switch (AdministradorColas.getProcesador.getPrioridad()){ //Obtenemos su prioridad
case 1: //Si ya estuvo en cpu el t asignado. ALGORITMO FIFS
if (AdministradorColas.getCola1.getTEjecutado== tiempoEjecucion){
//SUMA ENTRE PILAS
cantOperandos = PrimeraOperacion.size() + SegundaOperacion.size();
// Si la suma de las dos pilas es 3, hay dos elementos en la 1eraprila y uno en la 2da pila
if (cantOperandos > 1 && cantOperandos < 4 && validaEntrada(operacion,cantOperandos)) {
Permutacion auxiliar1,auxiliar2;
if(cantOperandos == 3){ // si (R0 * R1)
auxiliar1 = miTriangulo.buscaPermutacion(PrimeraOperacion.pop()); //Este es R1
auxiliar2 = miTriangulo.buscaPermutacion(PrimeraOperacion.pop()); //Este es R0
resultado = miTriangulo.operarPermutaciones(auxiliar2,auxiliar1);
//Método empleado para los generadores cíclicos
public Permutacion powT(Permutacion perm, int x){
Permutacion result = new Permutacion();
TrianguloEquilatero aux = new TrianguloEquilatero();
if(x==0) //Si la potencia es 0
result =aux.getPi0(); //El resultado es el elemento neutro (PI0)
else if(x==1){ // Si la potencia es 1
result = perm;} // El resultado sera el mismo elemento
else if (x>1){ // Si es mayor a 1, alli multiplicaremos
result = perm; // primero le asignamos el valor del elemento
//Para buscar los subgrupos cíclicos
public void generadorCiclico (Permutacion perm){
int i=0;
boolean bandera = true;
if(perm != null){
ArrayList<Permutacion> aux = new ArrayList<Permutacion>();
Permutacion auxPerm =perm;
do{
auxPerm = powT(perm,i); //Usamos la potencia. i: Cantidad de veces a componer
else if(cantOperandos==2){
//Si 1era pila es 2. La operación fue ingresada como (Pi0*R0)
if ( primeraOperacion.size() == 2){
auxiliar1=miTriangulo.buscaPermutacion(primeraOperacion.pop());
auxiliar2=miTriangulo.buscaPermutacion(primeraOperacion.pop());
resultado=miTriangulo.operarPermutaciones(auxiliar2, auxiliar1);
}
else{ //Sino Pi0*R0
auxiliar1=miTriangulo.buscaPermutacion(segundaOperacion.pop());
auxiliar2=miTriangulo.buscaPermutacion(segundaOperacion.pop());
//SUMA ENTRE PILAS
cantOperandos = primeraOperacion.size() + segundaOperacion.size();
// Si la suma de las dos pilas es 3, hay dos elementos en la 1eraprila y uno en la 2da pila
if (cantOperandos > 1 && cantOperandos < 4 && validaEntrada(operacion,cantOperandos)) {
Permutacion auxiliar1,auxiliar2;
if(cantOperandos == 3){ // si es de la forma (R0 * R1)
auxiliar1 = miTriangulo.buscaPermutacion(primeraOperacion.pop()); //Este es R1
auxiliar2 = miTriangulo.buscaPermutacion(primeraOperacion.pop()); //Este es R0
resultado = miTriangulo.operarPermutaciones(auxiliar2,auxiliar1);