Inizio lavoro su funzioni che gestiscono la paginazione con gestione del page fault LRU.
This commit is contained in:
parent
59357dcca2
commit
9fe9fa340d
1 changed files with 106 additions and 58 deletions
160
index.html
160
index.html
|
@ -11,79 +11,127 @@
|
||||||
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;
|
||||||
processo.pid++;
|
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;
|
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
|
||||||
for(var i=0; i<100; i++){
|
if(proc.paginaDaAllocare>=proc.nPagine){
|
||||||
if(risorse.memoria[i]!=0){
|
scriviLog("Processo "+proc.pid+": tutte le pagine sono allocate");
|
||||||
j=0;
|
return false;
|
||||||
inizioMemoriaLibera=-1;
|
}
|
||||||
}
|
for(var i=0; i<100; i++){
|
||||||
else{
|
if(risorse.mem[i].pid==0) break;
|
||||||
j++;
|
|
||||||
if(inizioMemoriaLibera==-1){
|
|
||||||
inizioMemoriaLibera=i;
|
|
||||||
}
|
|
||||||
if(j==nuovo.quantitaMemoria){
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if(i==100){
|
||||||
|
//allocazione fallita
|
||||||
|
scriviLog("Allocazione fallita. Gestione del page fault...");
|
||||||
|
|
||||||
//scrivo su memoria il processo
|
//si applica least recently used
|
||||||
for(var i=j; i<j+nuovo.quantitaMemoria; i++){
|
var min=0;
|
||||||
risorse.memoria[i]=nuovo.pid;
|
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));
|
||||||
|
}
|
||||||
|
|
||||||
window.setTimeout(function(){
|
//avvio del programma
|
||||||
//libero il processo dalla memoria
|
for(var i=0; i<100; i++){
|
||||||
for
|
risorse.mem[i]=clone(memoria);
|
||||||
},)
|
}
|
||||||
}
|
function testAllocazione(){
|
||||||
function main(){
|
//test di allocazione
|
||||||
//inizializzazione memoria
|
var provaProc = generaProcesso();
|
||||||
for(var i=0; i<100; i++){
|
while(allocaSegmento(provaProc));
|
||||||
processo.memoria[i]=0;
|
}
|
||||||
}
|
testAllocazione();
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
<body>
|
<body>
|
||||||
<div style="background-color:yellow; color:black; padding:20px;">
|
<div style="background-color:yellow; color:black; padding:20px;">
|
||||||
<h2>Scheduler</h2>
|
<h2>Scheduler</h2>
|
||||||
<p>In informatica lo scheduler (da to schedule letteralmente "mettere in lista", ovvero "pianificare") è un componente
|
<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 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
|
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
|
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>
|
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>
|
||||||
<div>
|
<div>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Processo 1</li>
|
<li>Processo 1</li>
|
||||||
<li>Processo 2</li>
|
<li>Processo 2</li>
|
||||||
<li>Processo 3</li>
|
<li>Processo 3</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<h1>Prima modifica</h1>
|
<h1>Prima modifica</h1>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
Reference in a new issue