Procesador de programación para algoritmo de programación de rotación de intervalos de tiempo basado en el número de prioridad
# 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: " p>
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; p>
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;
}