I processi ora hanno anche lo stato "disponibile". RImossa Wiki e JQuery nella repo

This commit is contained in:
Claudio Maggioni 2016-05-23 18:38:08 +02:00
parent ee525c03da
commit 7b84f5ddb9
2 changed files with 89 additions and 22 deletions

View file

@ -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

File diff suppressed because one or more lines are too long