Red de conocimiento informático - Material del sitio web - Procesador de programación para algoritmo de programación de rotación de intervalos de tiempo basado en el número de prioridad

Procesador de programación para algoritmo de programación de rotación de intervalos de tiempo basado en el número de prioridad

No es una coincidencia exacta, pero sí lo suficientemente cercana. ¡Cámbialo tú mismo!

# include & ltiostream.h & gt

# include & ltstdlib.h & gt

# include & ltstring.h & gt

estructura typedef PCBA

{

char name[30];

int round

int prio

int cputime

int needtime

Estado de carga;

Estructura PCBA *Siguiente;

} PCB, *CurrentRunPCB, *LinkQueue

actual unpcb SelMosHeiPrio(link queue * Q); //Seleccione un proceso con la mayor prioridad de la lista Q.

void init queue(link queue * Q); //Inicializa la lista enlazada q. Si la lista enlazada no tiene un puntero de encabezado, se puede omitir

void InsertQueue( LinkQueue * Q, PCB * run) ;

{

}// Inserte el nodo en ejecución en la lista vinculada Q, lo que indica que hay un proceso más en la cola lista.

void priosch(Link Queue Wait_Queue, Link Queue Finish_Queue)// Utilice el método de prioridad para ejecutar, seleccione el proceso de la cola lista Wait_Queue para su ejecución (seleccione el proceso con la mayor prioridad en la cola), complete El proceso se coloca en la cola de finalización;

{ while(wait queue!=empty)

{

current unpcb run = SelMosHeiPrio(& amp; cola de espera); //Ejecutar es el proceso con mayor prioridad en la cola de listos.

Ejecutar->cputime+= 2;//El intervalo de tiempo es 2

Ejecutar->necesita tiempo-= 2;

Ejecutar-& gt ; prio=50-run->toma tiempo; //Prioridad dinámica, pero la prioridad aumenta con el tiempo de ejecución, por lo que quien tenga mayor prioridad siempre ocupará la CPU.

Ejecutar->state = ' r

if(Ejecutar->lleva tiempo>0)

{ run->state = ' w

Insertar cola (& ampWaitQueue, ejecutar);

}

Otros

{ cout & lt& lt"El nombre en ejecución actual es: "

Ejecutar -> estado = 'F

Ejecutar ->necesita tiempo = 0;

Insertar cola(&FinishQueue, ejecutar

Imprimir (& cola de espera);

}

// Por supuesto, también puede finalizar directamente el proceso de alta prioridad sin mirar el proceso en ejecución Insertar en la cola de finalización.

/*

ejecución actual de unpcb = SelMosHeiPrio(& cola de espera);

cout & lt& lt"El nombre de ejecución actual es:"

Imprimir(& cola de espera);

Ejecutar-> cputime = ejecutar-> necesita tiempo;

Ejecutar->

Ejecutar -> prio = 50 // Prioridad dinámica, pero la prioridad aumenta con el aumento del tiempo de ejecución, por lo que quien tenga mayor prioridad siempre ocupará la CPU.

Ejecutar - > state = ' F

insert queue(&FinishQueue, run); LinkQueue*Q) // Muestra y genera los elementos de la cola. La salida incluye el nombre del proceso, el tiempo de CPU del proceso, el tiempo de necesidad, el estado y la prioridad.

{ cola de enlaces p = * Q;

cout & lt& lt" nombre cputime needtime estado prioridad" & lt& lt\ n '; !=null)

{ cout & lt& ltp->; nombre & lt& ltp' & lt& ltp->; t ' & lt& ltp->; estado & lt& lt\ t ' & lt& ltp->; prio & lt& lt\ n ';

p = p-& gt; p>}

}

actual unpcb dequeue(link queue * q)//Eliminar un proceso de la cola listo.

{ cola de enlaces p = * Q;

* Q = (* Q)-& gt; siguiente

p->; /p>

Return p;

}

void roundsch(Cola de espera de cola de enlace, Cola de finalización de cola de enlace)//Ejecutar en modo round robin, desde la cola lista Wait_Queue Seleccione un proceso para ejecutar durante un intervalo de tiempo y el proceso completado se colocará en la cola de finalización; si el proceso no se puede ejecutar dentro de un intervalo de tiempo, se insertará nuevamente en la cola de listos.

{ while(cola de espera!=vacía)

{

ejecución actual de unpcb = DeQueue(& cola de espera);

cout & lt& lt"El nombre de ejecución actual es:"

Ejecutar-& gt; cputime+= 2; //El intervalo de tiempo es 2

Ejecutar-& gt; 2;

Ejecutar->prio=50- ejecutar->cputime

Ejecutar->state = ' r

if(Ejecutar-& gt; lleva tiempo & gt0)

{ insertar cola(& WaitQueue, ejecutar);

Ejecutar -& gt; estado = ' w

}

Otro

{ run->state = ' F

Ejecutar->tiempo necesario = 0;

Insertar cola(& ampFinishQueue, ejecutar

}

Imprimir(& cola de espera);

}

cout & lt& lt" Estado de finalización de la cola: "

Imprimir (y finalizar cola);

}

VoidsetalPro(Link Queue * q)//Establecer función de prioridad 50-p ->; >

{ int max = 0;

LinkQueue p, t;

t = NULL

p = * Q;

if (p!=null)

{

max = p-& gt; prio

p = p- & gt; >

mientras(p)

{

si(max & lt;p->;prio)max = p-& gt ;prio

p = p-& gt; siguiente;

}

p = * Q;

t = * Q ;

if( t = = p&&max = = t->prio)

{ * Q =(* Q)->Siguiente

t->;

return t;}

else {

t = t-> siguiente ;

mientras(t)

{

if(max = = t-> prio)

{

p->siguiente = t-> siguiente;

t->siguiente = NULL

return t;

}

else { p = t

t = t-; & gt; siguiente;

}

}

}

}

regresar;

}

void main()

{

PCBA *PCB0, *PCB1, *PCB2, *PCB3, *PCB4 //Cinco; procesa cinco procesos

LinkQueue Wait_Queue, Finish_Queue//Dos colas están esperando su finalización.

Wait _ Queue = NULL//Asigna un valor inicial a la cola.

Si hay una lista vinculada con un puntero principal, puede usar la función;

Finish _ Queue = NULL

//init queue(& wait _ Queue);

//init queue(& & finish _ Queue);

char ch

//Establece el valor inicial para cada proceso.

pcb0=nueva PCBA();

pcb1=nueva PCBA();

pcb2=nueva PCBA();

pcb3 =nueva PCBA();

pcb4=nueva PCBA();

//Ejemplo

strcpy(PCB 0->Nombre," proceso 1 "

PC B0->; ronda = 2;

PC B0->; prio = 0

PC B0->;

PC B0->; necesita tiempo = 5;

PC B0->; estado = ' W

PC B0-> siguiente = NULL

p>

strcpy(PCB 1->nombre, "proceso 2");

PCB 1->ronda = 2;

PCB 1->prio = 0; /p>

PCB 1->; cputime = 0;

PCB 1->; necesita tiempo = 7

PCB 1->; p>

PCB 1->; siguiente = NULL

strcpy(PCB 2->; nombre, "Proceso 3");

PCB 2-> ; ;

PCB 2->; prio = 0;

PCB 2->; tiempo de CPU = 0;

PCB 2->;

PCB 2->; estado = ' W

PCB 2->; siguiente = NULL

strcpy(PCB 3->; nombre, "proceso 4 ");

PCB 3->; ronda = 2;

PCB 3->; prio = 0;

PCB 3-> ; tiempo de CPU = 0

PCB 3->; necesita tiempo = 11;

PCB 3->; estado = 'W

Siguiente = NULL

strcpy(PCB 4->;nombre, "proceso 5");

PCB 4->;ronda = 2;

PCB 4 -> prio = 0;

PCB 4->tiempo de CPU = 0;

PCB 4->tiempo de necesidad = 8

PCB 4->estado = 'W

PCB 4->next = NULL

//Inserte cada proceso en la cola lista.

Insertar cola(& ampWait_Queue, PC B0);

Insertar cola(& ampWait_Queue, PCB 1

Insertar cola (& ampWait_Queue, PCB 2); ;

Insertar cola(& ampWait_Queue, PCB 3);

Insertar cola(& ampWait_Queue, PCB 4);

//Utilice este algoritmo en Wait_Queue Implementar prio = 50-necesita tiempo;

setall pro(& wait_Queue);

cout & lt& lt" Ingrese el algoritmo de programación seleccionado (1 o 2 o cualquier tecla para salir). :" & lt& ltendl

CIN & gt;& gtch;

Cambiar (canal)

{

Caso "1":

Imprimir(&wait_Queue);

Roundsch(Wait_Queue, Finish_Queue);

Interrupción;

Caso "2":

Imprimir(&wait_Queue);

Priosch(Wait_Queue, Finish_Queue);

Pausa;

Valor predeterminado:

cout & lt& lt"¡Elegiste salir!"& lt& ltendl

Sistema("pausa");

Regresar ;

}

Volver;

}