Aggiunti comandi da tastiera. Gli elementi del menù ora sono ancore. Il menu è fixed in modalità desktop. Aggiunti log alla pausa e al riavvio. Aggiunto comando per eseguire una sola iterazione di loopProcessiPronti alla volta.

This commit is contained in:
Claudio Maggioni 2016-05-14 15:25:50 +02:00
parent 258d9c2cf0
commit 6977953f7a
2 changed files with 62 additions and 20 deletions

View file

@ -2,6 +2,7 @@
<html lang="it"> <html lang="it">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>Scheduler</title>
<meta name="author" content="Claudio Maggioni, Fabio Brambilla, Pamela Dardano, Federico Mainetti"/> <meta name="author" content="Claudio Maggioni, Fabio Brambilla, Pamela Dardano, Federico Mainetti"/>
<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."/>
<script src="jquery.min.js"></script> <script src="jquery.min.js"></script>
@ -19,10 +20,7 @@
this.istanteAllocazione = 0; this.istanteAllocazione = 0;
this.numeroPagina = -1; this.numeroPagina = -1;
} }
//avvio del programma
for(var i=0; i<100; i++){
risorse.mem[i]= new Memoria();
}
var pidNuovo = 1; var pidNuovo = 1;
function Processo(){ function Processo(){
processiPronti.push(this); processiPronti.push(this);
@ -105,7 +103,7 @@
return false; return false;
} }
else { else {
allocaSegmento(this); if(allocaSegmento(this)==="DEALLOC") return true;
this.stato="pronto"; this.stato="pronto";
return false; return false;
} }
@ -113,7 +111,8 @@
var processiPronti = new Array(); var processiPronti = new Array();
var processiTerminati = new Array(); var processiTerminati = new Array();
function allocaSegmento(proc){ function allocaSegmento(proc){
//ricerca memoria libera tramite first-fit var min=0;
//ricerca memoria libera tramite first-fit
for(var i=0; i<100; i++){ for(var i=0; i<100; i++){
if(risorse.mem[i].pid==0) break; if(risorse.mem[i].pid==0) break;
} }
@ -121,7 +120,7 @@
//allocazione fallita //allocazione fallita
proc.log("<span style=\"color: orange\">Allocazione fallita. Gestione della memoria piena...</span>"); 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; min=0;
for(i=1; i<100; i++){ for(i=1; i<100; i++){
if(risorse.mem[min].istanteAllocazione > risorse.mem[i].istanteAllocazione) if(risorse.mem[min].istanteAllocazione > risorse.mem[i].istanteAllocazione)
min = i; min = i;
@ -130,7 +129,8 @@
proc.log("<span style=\"color: red\">gestione della memoria piena fallita.</span>"); proc.log("<span style=\"color: red\">gestione della memoria piena fallita.</span>");
return false; return false;
}; };
i=min; aggiornaMemoria(min, "#FF6666");
return "DEALLOC";
} }
risorse.mem[i].pid=proc.pid; risorse.mem[i].pid=proc.pid;
risorse.mem[i].numeroPagina=proc.percorsoAllocazione[proc.contatorePercorso]; risorse.mem[i].numeroPagina=proc.percorsoAllocazione[proc.contatorePercorso];
@ -195,16 +195,29 @@
scriviLog("<span style=\"color: white\">Coda dei processi pronti vuota.<span>"); scriviLog("<span style=\"color: white\">Coda dei processi pronti vuota.<span>");
vuoto=true; vuoto=true;
} }
if(interrompi) return; if(interrompi){
if(interrompi===true){
scriviLog("<span style=\"color: white\">In pausa.</span>");
interrompi=2;
}
return;
}
window.setTimeout(function(){ window.setTimeout(function(){
loopProcessiPronti(); loopProcessiPronti();
},lunghezzaExec); },lunghezzaExec);
} }
function toggleProcessiPronti(){ function toggleProcessiPronti(){
interrompi= !interrompi; interrompi= !interrompi;
if(!interrompi) loopProcessiPronti(); if(!interrompi) {
scriviLog("<span style=\"color: white\">Continuo...</span>");
loopProcessiPronti();
}
} }
function testaProcessiPronti(){ function avvio(){
document.getElementsByName("wiki")[0].href=wikiScheduler;
for(var i=0; i<100; i++){
risorse.mem[i]= new Memoria();
}
for(var j=0; j<10; j++){ for(var j=0; j<10; j++){
new Processo(); new Processo();
} }
@ -232,6 +245,31 @@
function trovaProcessoPronto(pid){ function trovaProcessoPronto(pid){
return $.grep(processiPronti, function(e){ return e.pid == pid; }); return $.grep(processiPronti, function(e){ return e.pid == pid; });
} }
function comandiDaTastiera(e){
console.log(e.keyCode);
switch(e.keyCode){
case 84:
case 116:
//lettera T: nuovo processo
new Processo();
break;
case 69:
case 101:
//lettera E: pausa/riprendi processi
toggleProcessiPronti();
break;
case 67:
case 99:
//lettera C: avanza di un esecuzioneCicloSingolo se è in pausa
if(interrompi) loopProcessiPronti();
break;
case 82:
case 114:
//lettera R: apri wiki dello scheduler
window.open(window.wikiScheduler,"","width=600,height=450");
break;
};
}
</script> </script>
<style type="text/css"> <style type="text/css">
body{ body{
@ -291,6 +329,7 @@
background: #cccccc; background: #cccccc;
float: left; float: left;
font-weight: lighter; font-weight: lighter;
position: fixed;
} }
.nav > p, .section.teoria > p{ .nav > p, .section.teoria > p{
margin: 0; margin: 0;
@ -420,6 +459,7 @@
width: calc(100vw - 3rem); width: calc(100vw - 3rem);
margin-bottom: .5rem; margin-bottom: .5rem;
float: none; float: none;
position: static;
} }
.sections{ .sections{
float: none; float: none;
@ -439,18 +479,19 @@
} }
</style> </style>
</head> </head>
<body> <body onkeypress="comandiDaTastiera(event)">
<div class="header"> <div class="header">
<h1>Scheduler</h1> <h1>Scheduler</h1>
</div> </div>
<div class="nav card"> <div class="nav card">
<p><a href="javascript:void(0)">HOME</a></p> <p><a href="#teoria">TEORIA</a></p>
<p><a href="javascript:void(0)">GRAFICO</a></p> <p><a href="#log">LOG</a></p>
<p><a href="javascript:void(0)">TEORIA</a></p> <p><a href="#memoria">MEMORIA</a></p>
<p><a name="wiki">WIKI</a></p>
</div> </div>
<div class="sections"> <div class="sections">
<div class="section card teoria"> <div class="section card teoria">
<h2>Teoria</h2> <a name="teoria"><h2>Teoria</h2></a>
<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
@ -458,7 +499,7 @@
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 class="section card loggerSection"> <div class="section card loggerSection">
<h2>Log dello scheduler</h2> <a name="log"><h2>Log dello scheduler</h2></a>
<div class="logger"> <div class="logger">
</div> </div>
<div class="controls"> <div class="controls">
@ -470,7 +511,7 @@
</div> </div>
</div> </div>
<div class="section card memory"> <div class="section card memory">
<h2>Memoria</h2> <a name="memoria"><h2>Memoria</h2></a>
<table class="memTable"> <table class="memTable">
<tbody> <tbody>
<script> <script>
@ -484,12 +525,13 @@
</script> </script>
</tbody> </tbody>
</table> </table>
</div>
</div> </div>
<div class="footer"> <div class="footer">
Creato da Claudio Maggioni, Federico Mainetti, Pamela Dardano, Fabio Brambilla Creato da Claudio Maggioni, Federico Mainetti, Pamela Dardano, Fabio Brambilla
</div> </div>
<script> <script>
testaProcessiPronti() avvio();
</script> </script>
</body> </body>
</html> </html>

2
jquery.min.js vendored

File diff suppressed because one or more lines are too long