Inizio lavoro su funzioni che gestiscono la paginazione con gestione del page fault LRU.

This commit is contained in:
Claudio Maggioni 2016-05-05 16:57:03 +02:00
parent 59357dcca2
commit 9fe9fa340d

View file

@ -11,59 +11,107 @@
file: new Array(5), file: new Array(5),
stampante: 0, stampante: 0,
io: new Array(6), io: new Array(6),
memoria: new Array(100), mem: new Array(100) //vettore contenente 100 cloni di memoria
}
var memoria = {
pid: 0,
istanteAllocazione: -1,
numeroPagina: -1
} }
var processo = { var processo = {
//template
pid: 1, pid: 1,
tempoDiCompletamento: 0, tempoDiCompletamento: 0,
quantitaMemoria: 0 nPagine: 0,
pagine: 0, //vettore contenente gli indirizzi di tutte le pagine in ordine
paginaDaAllocare: 0
} }
var processi = new Array();
function generaProcesso(){ function generaProcesso(){
var nuovo=processo; var nuovo=clone(processo);
processo.tempoDiCompletamento=Math.floor(Math.random()*10)+3; processi.push(nuovo);
processo.quantitaMemoria=Math.floor(Math.random()*10)+3; nuovo.tempoDiCompletamento=Math.floor(Math.random()*10)+3;
nuovo.nPagine=Math.floor(Math.random()*10)+3;
nuovo.pagine=new Array(nuovo.nPagine);
for(var i=0; i<nuovo.nPagine; i++){
nuovo.pagine[i]=-1;
}
processo.pid++; processo.pid++;
scriviLog("Nuovo processo: pid="+nuovo.pid+" memoria="+nuovo.nPagine+" tempo="+nuovo.tempoDiCompletamento);
return nuovo; return nuovo;
} }
function lanciaProcesso(){ function allocaSegmento(proc){
var nuovo=generaProcesso();
var j=0;
var inizioMemoriaLibera=-1;
//ricerca memoria libera tramite first-fit //ricerca memoria libera tramite first-fit
if(proc.paginaDaAllocare>=proc.nPagine){
scriviLog("Processo "+proc.pid+": tutte le pagine sono allocate");
return false;
}
for(var i=0; i<100; i++){ for(var i=0; i<100; i++){
if(risorse.memoria[i]!=0){ if(risorse.mem[i].pid==0) break;
j=0;
inizioMemoriaLibera=-1;
} }
else{ if(i==100){
j++; //allocazione fallita
if(inizioMemoriaLibera==-1){ scriviLog("Allocazione fallita. Gestione del page fault...");
inizioMemoriaLibera=i;
//si applica least recently used
var min=0;
for(i=1; i<100; i++){
if(risorse.mem[min].istanteAllocazione > risorse.mem[i].istanteAllocazione)
min = i;
} }
if(j==nuovo.quantitaMemoria){ if(!resettaPagina(min)){
scriviLog("Gestione del page fault fallita.");
return false;
};
i=min;
}
risorse.mem[i].pid=proc.pid;
risorse.mem[i].numeroPagina=proc.paginaDaAllocare;
risorse.mem[i].istanteAllocazione=Date.now();
proc.pagine[proc.paginaDaAllocare]=i;
scriviLog("Allocata pagina "+proc.paginaDaAllocare+" in locazione di memoria "+i);
proc.paginaDaAllocare++;
return true;
}
function resettaPagina(pagina){
scriviLog("Libero locazione di memoria "+pagina);
for(var i=0; i<processi.length; i++){
if(processi[i].pid==risorse.mem[pagina].pid){
var a = processi[i].pagine.indexOf(pagina);
if(a<0){
scriviLog("Pagina non registrata nel processo.");
return false;
}
processi[i].pagine[a]=-1;
break; break;
} }
} }
if(i==processi.length){
scriviLog("Pid non trovato. Questa locazione potrebbe essere già libera");
return false;
}
risorse.mem[pagina].pid=0;
risorse.mem[pagina].numeroPagina=-1;
risorse.mem[pagina].istanteAllocazione=-1;
return true;
}
function scriviLog(str){
console.log(str);
//log nella div
}
function clone(obj){
return JSON.parse(JSON.stringify(obj));
} }
//scrivo su memoria il processo //avvio del programma
for(var i=j; i<j+nuovo.quantitaMemoria; i++){
risorse.memoria[i]=nuovo.pid;
}
window.setTimeout(function(){
//libero il processo dalla memoria
for
},)
}
function main(){
//inizializzazione memoria
for(var i=0; i<100; i++){ for(var i=0; i<100; i++){
processo.memoria[i]=0; risorse.mem[i]=clone(memoria);
} }
function testAllocazione(){
//test di allocazione
var provaProc = generaProcesso();
while(allocaSegmento(provaProc));
} }
testAllocazione();
</script> </script>
<style type="text/css"> <style type="text/css">