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,79 +11,127 @@
file: new Array(5),
stampante: 0,
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 = {
//template
pid: 1,
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(){
var nuovo=processo;
processo.tempoDiCompletamento=Math.floor(Math.random()*10)+3;
processo.quantitaMemoria=Math.floor(Math.random()*10)+3;
processo.pid++;
var nuovo=clone(processo);
processi.push(nuovo);
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++;
scriviLog("Nuovo processo: pid="+nuovo.pid+" memoria="+nuovo.nPagine+" tempo="+nuovo.tempoDiCompletamento);
return nuovo;
}
function lanciaProcesso(){
var nuovo=generaProcesso();
var j=0;
var inizioMemoriaLibera=-1;
function allocaSegmento(proc){
//ricerca memoria libera tramite first-fit
for(var i=0; i<100; i++){
if(risorse.memoria[i]!=0){
j=0;
inizioMemoriaLibera=-1;
}
else{
j++;
if(inizioMemoriaLibera==-1){
inizioMemoriaLibera=i;
}
if(j==nuovo.quantitaMemoria){
break;
}
}
}
//scrivo su memoria il processo
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++){
processo.memoria[i]=0;
if(proc.paginaDaAllocare>=proc.nPagine){
scriviLog("Processo "+proc.pid+": tutte le pagine sono allocate");
return false;
}
for(var i=0; i<100; i++){
if(risorse.mem[i].pid==0) break;
}
if(i==100){
//allocazione fallita
scriviLog("Allocazione fallita. Gestione del page fault...");
//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(!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;
}
}
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));
}
//avvio del programma
for(var i=0; i<100; i++){
risorse.mem[i]=clone(memoria);
}
function testAllocazione(){
//test di allocazione
var provaProc = generaProcesso();
while(allocaSegmento(provaProc));
}
testAllocazione();
</script>
<style type="text/css">
</style>
<body>
<div style="background-color:yellow; color:black; padding:20px;">
<h2>Scheduler</h2>
<p>In informatica lo scheduler (da to schedule letteralmente "mettere in lista", ovvero "pianificare") è un componente
di un sistema operativo ovvero un programma che implementa un algoritmo di scheduling il quale, dato un insieme di richieste
di accesso ad una risorsa (tipicamente l'accesso al processore da parte di un processo da eseguire), stabilisce un ordinamento
temporale per l'esecuzione di tali richieste, privilegiando quelle che rispettano determinati parametri secondo una certa politica
di scheduling, in modo da ottimizzare l'accesso a tale risorsa e consentire così l'espletamento del servizio/istruzione o processo desiderato.</p>
</div>
<div>
<ul>
<li>Processo 1</li>
<li>Processo 2</li>
<li>Processo 3</li>
</ul>
</div>
<div style="background-color:yellow; color:black; padding:20px;">
<h2>Scheduler</h2>
<p>In informatica lo scheduler (da to schedule letteralmente "mettere in lista", ovvero "pianificare") è un componente
di un sistema operativo ovvero un programma che implementa un algoritmo di scheduling il quale, dato un insieme di richieste
di accesso ad una risorsa (tipicamente l'accesso al processore da parte di un processo da eseguire), stabilisce un ordinamento
temporale per l'esecuzione di tali richieste, privilegiando quelle che rispettano determinati parametri secondo una certa politica
di scheduling, in modo da ottimizzare l'accesso a tale risorsa e consentire così l'espletamento del servizio/istruzione o processo desiderato.</p>
</div>
<div>
<ul>
<li>Processo 1</li>
<li>Processo 2</li>
<li>Processo 3</li>
</ul>
</div>
<h1>Prima modifica</h1>
</body>
</html>