I processi ora hanno anche lo stato "disponibile". RImossa Wiki e JQuery nella repo
This commit is contained in:
parent
ee525c03da
commit
7b84f5ddb9
2 changed files with 89 additions and 22 deletions
103
index.html
103
index.html
|
@ -5,14 +5,12 @@
|
|||
<title>Scheduler</title>
|
||||
<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."/>
|
||||
<script src="jquery.min.js"></script>
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>
|
||||
<link href='https://fonts.googleapis.com/css?family=Hammersmith+One' rel='stylesheet' type='text/css'>
|
||||
<script>
|
||||
var lunghezzaExec=300 //in millis
|
||||
var risorse = {
|
||||
file: new Array(5),
|
||||
stampante: 0,
|
||||
io: new Array(6),
|
||||
varie: new Array(5),
|
||||
mem: new Array(100) //vettore contenente 100 cloni di memoria
|
||||
}
|
||||
function Memoria(){
|
||||
|
@ -22,7 +20,8 @@
|
|||
}
|
||||
var pidNuovo = 1;
|
||||
function Processo(){
|
||||
processiPronti.push(this);
|
||||
processiDisponibili.push(this);
|
||||
processi.push(this);
|
||||
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
|
||||
|
@ -30,6 +29,7 @@
|
|||
this.pagine[i]=-1;
|
||||
}
|
||||
this.percorsoAllocazione=new Array(Math.floor(Math.random()*10)+this.pagine.length);
|
||||
this.risorseVarie=new Array(Math.floor(Math.random()*4));
|
||||
for(var i=0; i<this.percorsoAllocazione.length; i++){
|
||||
this.percorsoAllocazione[i]=Math.floor(Math.random()*this.pagine.length);
|
||||
}
|
||||
|
@ -38,6 +38,19 @@
|
|||
this.percorsoAllocazione.push(i);
|
||||
}
|
||||
}
|
||||
for(var i=0; i<this.risorseVarie.length; i++){
|
||||
var tmp=Math.floor(Math.random()*risorse.varie.length);
|
||||
for(var j=0; j<this.risorseVarie.length; j++){
|
||||
if(this.risorseVarie[j]!==undefined && this.risorseVarie[j].numero===tmp) break;
|
||||
}
|
||||
if(j<this.risorseVarie.length){
|
||||
i--;
|
||||
continue;
|
||||
}
|
||||
this.risorseVarie[i] = {};
|
||||
this.risorseVarie[i].numero = tmp;
|
||||
this.risorseVarie[i].allocata = false;
|
||||
}
|
||||
this.stato="disponibile";
|
||||
this.contatorePercorso=0;
|
||||
scriviLog("<span style=\"color: white\">Nuovo processo: pid="+this.pid+" pagine="+
|
||||
|
@ -53,10 +66,37 @@
|
|||
this.stato=str;
|
||||
this.log("<span style=\"color: violet\">"+this.stato+"</span>");
|
||||
};
|
||||
Processo.prototype.rilasciaRisorsaDaIndice = function(index){
|
||||
risorse.varie[this.risorseVarie[index].numero]=-1;
|
||||
this.risorseVarie.allocata=false;
|
||||
this.log("<span style=\"color: violet\">rilasciata</span> risorsa <span style=\"color: orange\""+this.risorseVarie[index].numero+"</span>");
|
||||
};
|
||||
Processo.prototype.rilasciaRisorsaDaNumero = function(index){
|
||||
for(var tmp=0; i<this.risorseVarie.length; tmp++){
|
||||
if(this.risorseVarie[tmp].numero==index) break;
|
||||
}
|
||||
if(tmp<this.risorseVarie.length){
|
||||
return this.rilasciaRisorsaDaIndice(tmp);
|
||||
}
|
||||
return false;
|
||||
};
|
||||
Processo.prototype.ottieniRisorsaDaIndiceOFallisci = function(j){
|
||||
if(risorse.varie[this.risorseVarie[j].numero]==-1){
|
||||
risorse.varie[this.risorseVarie[j].numero] = this.pid;
|
||||
this.risorseVarie[j].allocata = true;
|
||||
this.log("<span style=\"color: violet\">allocata</span> risorsa <span style=\"color: orange\""+this.risorseVarie[j].numero+"</span>");
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
Processo.prototype.termina = function(){
|
||||
if(this.terminazioneCont===undefined){
|
||||
this.terminazioneCont=0;
|
||||
this.cambiaStato("terminazione");
|
||||
//rilascio risorse
|
||||
for(var i=0; i<this.risorseVarie.length; i++){
|
||||
this.rilasciaRisorsaDaIndice(i);
|
||||
}
|
||||
}
|
||||
if(this.pagine[this.terminazioneCont+1]===undefined){
|
||||
if(this.pagine[this.terminazioneCont]!=-1){
|
||||
|
@ -107,8 +147,34 @@
|
|||
return false;
|
||||
}
|
||||
};
|
||||
var processiDisponibili = new Array();
|
||||
var processiPronti = new Array();
|
||||
var processiTerminati = new Array();
|
||||
var processi = new Array();
|
||||
function assegnaRisorse(){
|
||||
for(var i=0;i<processiDisponibili.length; i++){
|
||||
var k=0;
|
||||
for(var j=0; j<processiDisponibili[i].risorseVarie.length; j++){
|
||||
processiDisponibili[i].ottieniRisorsaDaIndiceOFallisci(j);
|
||||
if(processiDisponibili[i].risorseVarie[j].allocata) k++;
|
||||
}
|
||||
if(k==processiDisponibili[i].risorseVarie.length){
|
||||
processiDisponibili[i].cambiaStato("pronto");
|
||||
processiPronti.push(processiDisponibili.splice(i, 1)[0]);
|
||||
}
|
||||
}
|
||||
if(!processiPronti.length&&processiDisponibili.length){ //se non ci sono pronti assegna tutte le risorse necessarie al processo più vecchio
|
||||
processiDisponibili[0].log("<span style=\"color: orange\">Forzatura dello stato a pronto</span>");
|
||||
for(var j=0; j<processiDisponibili[0].risorseVarie.length; j++){
|
||||
if(risorse.varie[processiDisponibili[0].risorseVarie[j].numero]!=processiDisponibili[0].pid){
|
||||
processi[risorse.varie[processiDisponibili[0].risorseVarie[j].numero]].rilasciaRisorsaDaNumero(processiDisponibili[0].risorseVarie[j].numero);
|
||||
processiDisponibili[0].ottieniRisorsaDaIndiceOFallisci(j);
|
||||
}
|
||||
}
|
||||
processiDisponibili[0].cambiaStato("pronto");
|
||||
processiPronti.push(processiDisponibili.splice(0, 1)[0]);
|
||||
}
|
||||
}
|
||||
function allocaSegmento(proc){
|
||||
var min=0;
|
||||
//ricerca memoria libera tramite first-fit
|
||||
|
@ -176,6 +242,7 @@
|
|||
var vuoto=false;
|
||||
var interrompi=false;
|
||||
function loopProcessiPronti(){
|
||||
assegnaRisorse();
|
||||
if(processiPronti.length>0){
|
||||
if(pidAttuale >= processiPronti.length) pidAttuale=0;
|
||||
var tmp;
|
||||
|
@ -214,10 +281,13 @@
|
|||
}
|
||||
}
|
||||
function avvio(){
|
||||
document.getElementsByName("wiki")[0].href=wikiScheduler;
|
||||
for(var i=0; i<100; i++){
|
||||
for(var i=0; i<risorse.mem.length; i++){
|
||||
risorse.mem[i] = new Memoria();
|
||||
}
|
||||
for(var i=0; i<risorse.varie.length; i++){
|
||||
risorse.varie[i]=-1;
|
||||
}
|
||||
processi.push({pid: 0, pagine:"https://www.youtube.com/watch?v=BeyEGebJ1l4"});
|
||||
for(var j=0; j<10; j++){
|
||||
new Processo();
|
||||
}
|
||||
|
@ -236,14 +306,16 @@
|
|||
for(var i=0; i<100; i++){
|
||||
var cella = document.getElementById("memoria"+Math.floor(i/10)+i%10);
|
||||
if(eseguita==i) cella.style.background=colore;
|
||||
else if(processiPronti[pidAttuale]!==undefined&&risorse.mem[i].pid==(processiPronti[pidAttuale].pid)) cella.style.background="lightblue";
|
||||
else if(processiPronti[pidAttuale]!==undefined&&risorse.mem[i].pid==(processiPronti[pidAttuale].pid))
|
||||
cella.style.background="lightblue";
|
||||
else if(risorse.mem[i].pid!=0) cella.style.background="orange";
|
||||
else cella.style.background="white";
|
||||
cella.innerHTML= risorse.mem[i].pid!=0 ? risorse.mem[i].pid : "";
|
||||
}
|
||||
}
|
||||
function trovaProcessoPronto(pid){
|
||||
return $.grep(processiPronti, function(e){ return e.pid == pid; });
|
||||
function trovaProcessoDaPid(pid){
|
||||
if(pid===0) window.open(processi[pid].pagine,"","width=600,height=450");
|
||||
return $.grep(processi, function(e){ return e.pid == pid; })[0];
|
||||
}
|
||||
function comandiDaTastiera(e){
|
||||
switch(e.keyCode){
|
||||
|
@ -262,11 +334,6 @@
|
|||
//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>
|
||||
|
@ -490,7 +557,6 @@
|
|||
<p><a href="#teoria">TEORIA</a></p>
|
||||
<p><a href="#log">LOG</a></p>
|
||||
<p><a href="#memoria">MEMORIA</a></p>
|
||||
<p><a name="wiki">WIKI</a></p>
|
||||
</div>
|
||||
<div class="sections">
|
||||
<div class="section card teoria">
|
||||
|
@ -571,6 +637,11 @@
|
|||
</div>
|
||||
<script>
|
||||
avvio();
|
||||
window.onerror = function myErrorHandler(errorMsg, url, lineNumber) {
|
||||
scriviLog("<span style=\"color: red\">Errore: Faccio partire Astley...</span>");
|
||||
window.open(processi[0].pagine,"","width=600,height=450");
|
||||
return false;
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
4
jquery.min.js
vendored
4
jquery.min.js
vendored
File diff suppressed because one or more lines are too long
Reference in a new issue