¿Cómo usar Java para implementar la programación de CPU? ¿Qué clases se deben usar?
Algoritmo de programación de CPU y asignación de memoria
Escrito en un experimento del sistema operativo. Por razones de espacio, solo se proporciona el código de reciclaje y asignación de memoria.
/**
Unidad: Clase 0501, Escuela de Software, Universidad Central Sur
Archivo: CpuScheduler.java
Proyecto: Programa de simulación de algoritmo de programación de CPU del sistema operativo
Autor: Liu Xin
Hora de creación: 14 de mayo de 2007
**/
público static void InitMem(){
MemTable = nueva memoria();
MemTable.Setmem_beg(0);
MemTable.Setmem_size(100); p>
MemTable.Setmem_state(0);
}
InitMemory pública booleana (temperatura de PCB){
memoria mem_temp,último,ahora;
último = MemTable;
mem_temp = nueva memoria(temp.GetName(),temp.Getmem_size());
indicador booleano = verdadero;
if(mem_temp.Getmem_size() > 100 ){
c.tcpuinfo.setText(mem_temp.GetPcd_name()+"es demasiado grande");
bandera = falso;
}
if(MemTable == null){
indicador de retorno;
}
if( mem_temp.Getmem_size() + nowsize > 100){
c.tcpuinfo.setText("la memoria ha estado llena, espere");
flag = false;
}
if(MemTable.Getmem_state() == 0){// si el primero está vacío;
if(MemTable.Getmem_size() > mem_temp.Getmem_size () ){
mem_temp.next = MemTable;
mem_temp.Setmem_beg( last.Getmem_beg() );
mem_temp.Setmem_state(1);
MemTable.Setmem_beg(mem_temp.Getmem_beg() + mem_temp.Getmem_size());
MemTable.Setmem_size( MemTable.Getmem_size()-mem_temp.Getmem_size() );
MemTable = mem_temp;
nowsize += mem_temp.Getmem_size();
bandera de retorno;
}
si (MemTable .Getmem_size() == mem_temp.Getmem_size()){
// MemTable.SetPcd_name(yo
m_temp.GetPcd_name());
mem_temp = MemTable;
mem_temp.Setmem_state(1);
mem_temp.next = MemTable
nowsize += mem_temp.Getmem_size();
return flag;
}
}
// comenzar a obtener el otro ;
if(last != null){
now = last.next;
while(now != null){// busca en la tabla memoria compatible;
if(now.Getmem_state() == 0){// si la primera está vacía;
if(now.Getmem_size() > mem_temp.Getmem_size() ){
mem_temp.next = ahora;
mem_temp.Setmem_beg( ahora.Getmem_beg() );
mem_temp.Setmem_state(1);
now.Setmem_beg(mem_temp.Getmem_beg() + mem_temp.Getmem_size());
now.Setmem_size( now.Getmem_size()-mem_temp.Getmem_size() );
last.next = mem_temp;
nowsize += mem_temp.Getmem_size();
devolver bandera;
}
else if (now.Getmem_size() == mem_temp.Getmem_size()){
now.SetPcd_name(mem_temp.GetPcd_name());
mem_temp = ahora;
mem_temp.Setmem_state(1);
last.next = mem_temp;
nowsize += mem_temp.Getmem_size();
devolver bandera; p> p>
}
}
último = ahora;
//if(último != nulo){
ahora = ahora.next;
//}
}
}
devolver bandera;
}
public void ReleaseMem(Pcb Temp){
memoria mem_temp,last,now;
mem_temp = nueva memoria(Temp.GetName(),Temp. Getmem_size( ));
if(MemTable == null){
c.tcpuinfo.setText("No hay memoria para liberar");
// return false ;
}
último = MemTable;
ahora = último.siguiente;
si (Yo
mTable.GetPcd_name() == mem_temp.GetPcd_name()){//Si la primera es la partición a liberar;
MemTable.Setmem_state(0);
MemTable. SetPcd_name (null);
if(now != null && now.Getmem_state() == 0 ){//Si la partición adyacente posterior también está libre;
MemTable.Setmem_size (MemTable .Getmem_size() + now.Getmem_size());
MemTable.SetPcd_name(null);
nowsize -= mem_temp.Getmem_size();
MemTable .next = null;
// return true;
}
}
mientras (ahora! = null){ // Encuentra la partición que se liberará en la lista vinculada;
if(now.GetPcd_name() == mem_temp.GetPcd_name()){//Find;
nowsize -= mem_temp.Getmem_size( );
now.Setmem_state(0);
if(now.next != null && now.next.Getmem_state() == 0){// Vea lo siguiente adyacente Si el nodo está libre;
last.next = now.next;
now.next.Setmem_beg(now.Getmem_beg());
now.next.Setmem_size(now.Getmem_size() + now.next.Getmem_size());
ahora = last.next;
now.SetPcd_name(null);
}
if(last.Getmem_state() == 0){//Compruebe si el nodo adyacente anterior está libre;
last.next = ahora .siguiente;
last.Setmem_size(last.Getmem_size() + ahora.Getmem_size());
last.SetPcd_name(null);
ahora = último.siguiente ;
// ahora.SetPcd_name(null);
}
}
último = ahora;
ahora = ahora.siguiente;
}
}