Prima versione funzionante dello scheduler
This commit is contained in:
parent
3da3418b99
commit
523f0dc354
1 changed files with 181 additions and 140 deletions
137
index.html
137
index.html
|
@ -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
|
||||||
|
for(var i=0; i<100; i++){
|
||||||
|
risorse.mem[i]= new Memoria();
|
||||||
|
}
|
||||||
|
|
||||||
|
var pidNuovo = 1;
|
||||||
function Processo(){
|
function Processo(){
|
||||||
var pidNuovo=1;
|
processiPronti.push(this);
|
||||||
processi.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>
|
||||||
|
|
Reference in a new issue