Prima versione funzionante dello scheduler

This commit is contained in:
Claudio Maggioni 2016-05-10 21:35:43 +02:00
parent 3da3418b99
commit 523f0dc354

View file

@ -4,26 +4,32 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="author" content="Claudio Maggioni, Fabio Brambilla, Pamela Dardano, Federico Mainetti, Ionel Mihali"/> <meta name="author" content="Claudio Maggioni, Fabio Brambilla, Pamela Dardano, Federico Mainetti, Ionel Mihali"/>
<meta name="description" content="Simulazione di uno scheduler in HTML, Javascript e (purtroppo) CSS."/> <meta name="description" content="Simulazione di uno scheduler in HTML, Javascript e (purtroppo) CSS."/>
</head> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>
<script> <script>
var lungIstante=2000 //in millis var lunghezzaExec=300 //in millis
var risorse = { var risorse = {
file: new Array(5), file: new Array(5),
stampante: 0, stampante: 0,
io: new Array(6), io: new Array(6),
mem: new Array(100) //vettore contenente 100 cloni di memoria mem: new Array(100) //vettore contenente 100 cloni di memoria
} }
var memoria = {
pid: 0, function Memoria(){
istanteAllocazione: -1, this.pid = 0;
numeroPagina: -1 this.istanteAllocazione = 0;
this.numeroPagina = -1;
} }
var processi = new Array();
var processiTerminati = new Array(); //avvio del programma
function Processo(){ for(var i=0; i<100; i++){
risorse.mem[i]= new Memoria();
}
var pidNuovo = 1; var pidNuovo = 1;
processi.push(this); function Processo(){
processiPronti.push(this);
this.pid=pidNuovo; this.pid=pidNuovo;
this.logProcesso="";
this.pagine=new Array(Math.floor(Math.random()*10)+3); //vettore contenente gli indirizzi di tutte le pagine in ordine this.pagine=new Array(Math.floor(Math.random()*10)+3); //vettore contenente gli indirizzi di tutte le pagine in ordine
for(var i=0; i<this.pagine.length; i++){ for(var i=0; i<this.pagine.length; i++){
this.pagine[i]=-1; this.pagine[i]=-1;
@ -39,28 +45,36 @@
} }
this.stato="disponibile"; this.stato="disponibile";
this.contatorePercorso=0; this.contatorePercorso=0;
scriviLog("Nuovo processo: pid="+this.pid+" pagine="+this.pagine.length+" lunghezzaPercorso="+this.percorsoAllocazione.length); scriviLog("<span style=\"color: white\">Nuovo processo: pid="+this.pid+" pagine="+
this.pagine.length+" lunghezzaPercorso="+this.percorsoAllocazione.length+"</span>");
pidNuovo++; pidNuovo++;
} }
Processo.prototype.log = function(str){
var tmp = str.replace(/ *\<[^>]*\> */g, "");
scriviLog("<span style=\"color: lightblue\">Processo "+this.pid+": </span>"+str+"\n");
this.logProcesso+="Processo "+this.pid+": "+tmp+"\n";
};
Processo.prototype.cambiaStato = function (str) { Processo.prototype.cambiaStato = function (str) {
this.stato=str; this.stato=str;
scriviLog("Processo "+this.pid+": "+this.stato); this.log("<span style=\"color: violet\">"+this.stato+"</span>");
}; };
Processo.prototype.termina = function (){ Processo.prototype.termina = function (){
this.cambiaStato("terminazione"); this.cambiaStato("terminazione");
(this.pagine).forEach(function(item, index){ (this.pagine).forEach(function(item, index){
resettaPagina(item); if(item>=0) resettaPagina(item);
}); });
this.cambiaStato("terminato"); this.cambiaStato("terminato");
var i = processi.indexOf(this); var i = processiPronti.indexOf(this);
processiTerminati.push(processi.splice(i, 1)[0]); processiTerminati.push(processiPronti.splice(i, 1)[0]);
}; };
Processo.prototype.esecuzioneCicloSingolo = function(){ Processo.prototype.esecuzioneCicloSingolo = function(){
if(this.contatorePercorso>=this.percorsoAllocazione.length){ if(this.contatorePercorso>=this.percorsoAllocazione.length){
this.termina(); this.termina();
return false; return false;
} }
scriviLog("Processo "+this.pid+": esecuzione pagina " + this.percorsoAllocazione[this.contatorePercorso]); this.stato="esecuzione";
this.log("<span style=\"color: violet\">esecuzione</span> pagina <span style=\"color: orange\">" +
this.percorsoAllocazione[this.contatorePercorso]+"</span>");
if(paginaDaCaricareGiaAllocata(this)){ if(paginaDaCaricareGiaAllocata(this)){
this.contatorePercorso++; this.contatorePercorso++;
return true; return true;
@ -68,8 +82,12 @@
else { else {
return allocaSegmento(this); return allocaSegmento(this);
} }
this.stato="pronto";
}; };
var processiPronti = new Array();
var processiTerminati = new Array();
function allocaSegmento(proc){ function allocaSegmento(proc){
//ricerca memoria libera tramite first-fit //ricerca memoria libera tramite first-fit
for(var i=0; i<100; i++){ for(var i=0; i<100; i++){
@ -78,7 +96,7 @@
if(i==100){ if(i==100){
//allocazione fallita //allocazione fallita
scriviLog("Allocazione fallita. Gestione della memoria piena..."); proc.log("<span style=\"color: orange\">Allocazione fallita. Gestione della memoria piena...</span>");
//si applica least recently used //si applica least recently used
var min=0; var min=0;
@ -87,7 +105,7 @@
min = i; min = i;
} }
if(!resettaPagina(min)){ if(!resettaPagina(min)){
scriviLog("Gestione della memoria piena fallita."); proc.log("<span style=\"color: red\">gestione della memoria piena fallita.</span>");
return false; return false;
}; };
i=min; i=min;
@ -96,7 +114,8 @@
risorse.mem[i].numeroPagina=proc.percorsoAllocazione[proc.contatorePercorso]; risorse.mem[i].numeroPagina=proc.percorsoAllocazione[proc.contatorePercorso];
risorse.mem[i].istanteAllocazione=Date.now(); risorse.mem[i].istanteAllocazione=Date.now();
proc.pagine[proc.percorsoAllocazione[proc.contatorePercorso]]=i; proc.pagine[proc.percorsoAllocazione[proc.contatorePercorso]]=i;
scriviLog("Allocata pagina "+proc.percorsoAllocazione[proc.contatorePercorso]+" in locazione di memoria "+i); proc.log("<span style=\"color: grey\">allocata pagina <span style=\"color: orange\">"+proc.percorsoAllocazione[proc.contatorePercorso]+
"</span> in locazione di memoria <span style=\"color: orange\">"+i+"</span></span>");
proc.contatorePercorso++; proc.contatorePercorso++;
return true; return true;
} }
@ -106,20 +125,20 @@
return false; return false;
} }
function resettaPagina(pagina){ function resettaPagina(pagina){
scriviLog("Libero locazione di memoria "+pagina); scriviLog("<span style=\"color: grey\">Libero locazione di memoria <span style=\"color: orange\">"+pagina+"</span></span>");
for(var i=0; i<processi.length; i++){ for(var i=0; i<processiPronti.length; i++){
if(processi[i].pid==risorse.mem[pagina].pid){ if(processiPronti[i].pid==risorse.mem[pagina].pid){
var a = processi[i].pagine.indexOf(pagina); var a = processiPronti[i].pagine.indexOf(pagina);
if(a<0){ if(a<0){
scriviLog("Pagina non registrata nel processo."); scriviLog("<span style=\"color: red\">Pagina non registrata nel processo.</span>");
return false; return false;
} }
processi[i].pagine[a]=-1; processiPronti[i].pagine[a]=-1;
break; break;
} }
} }
if(i==processi.length){ if(i==processiPronti.length){
scriviLog("Pid non trovato. Questa locazione potrebbe essere già libera"); scriviLog("<span style=\"color: red\">Pid non trovato. Questa locazione potrebbe essere già libera</span>");
return false; return false;
} }
risorse.mem[pagina].pid=0; risorse.mem[pagina].pid=0;
@ -128,28 +147,52 @@
return true; return true;
} }
function scriviLog(str){ function scriviLog(str){
console.log(str); var $cont = $('.logger');
//log nella div $cont.append('<p>' + str + '</p>');
} $cont[0].scrollTop = $cont[0].scrollHeight;
function clone(obj){
return JSON.parse(JSON.stringify(obj));
} }
//avvio del programma var pidAttuale = 0;
for(var i=0; i<100; i++){ var vuoto=false;
risorse.mem[i]=clone(memoria); function loopProcessiPronti(){
if(processiPronti.length>0){
if(pidAttuale >= processiPronti.length) pidAttuale=0;
processiPronti[pidAttuale].esecuzioneCicloSingolo();
pidAttuale++;
vuoto=false;
}
else if(!vuoto){
scriviLog("<span style=\"color: white\">Coda dei processi pronti vuota.<span>");
vuoto=true;
}
window.setTimeout(function(){
loopProcessiPronti();
},lunghezzaExec);
} }
function testAllocazione(){ function testaProcessiPronti(){
//test di allocazione for(var j=0; j<10; j++){
var provaProc = new Processo(); new Processo();
while(provaProc.esecuzioneCicloSingolo()); }
loopProcessiPronti();
} }
testAllocazione();
</script> </script>
<style type="text/css"> <style type="text/css">
.logger{
overflow-y: scroll;
height: 50vh;
background-color: black;
}
.logger > p{
margin-top: 0;
margin-bottom: 0;
font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
font-size: 1em;
font-weight: bolder;
color: lightgreen;
}
</style> </style>
</head>
<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>
@ -159,13 +202,11 @@
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 class="logger">
<ul>
<li>Processo 1</li>
<li>Processo 2</li>
<li>Processo 3</li>
</ul>
</div> </div>
<h1>Prima modifica</h1> <button type="button" name="aggiungiProcesso" onclick="new Processo()">Aggiungi processo</button>
<script>
testaProcessiPronti()
</script>
</body> </body>
</html> </html>