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
107
index.html
107
index.html
|
@ -5,14 +5,12 @@
|
||||||
<title>Scheduler</title>
|
<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="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'>
|
<link href='https://fonts.googleapis.com/css?family=Hammersmith+One' rel='stylesheet' type='text/css'>
|
||||||
<script>
|
<script>
|
||||||
var lunghezzaExec=300 //in millis
|
var lunghezzaExec=300 //in millis
|
||||||
var risorse = {
|
var risorse = {
|
||||||
file: new Array(5),
|
varie: new Array(5),
|
||||||
stampante: 0,
|
|
||||||
io: new Array(6),
|
|
||||||
mem: new Array(100) //vettore contenente 100 cloni di memoria
|
mem: new Array(100) //vettore contenente 100 cloni di memoria
|
||||||
}
|
}
|
||||||
function Memoria(){
|
function Memoria(){
|
||||||
|
@ -22,7 +20,8 @@
|
||||||
}
|
}
|
||||||
var pidNuovo = 1;
|
var pidNuovo = 1;
|
||||||
function Processo(){
|
function Processo(){
|
||||||
processiPronti.push(this);
|
processiDisponibili.push(this);
|
||||||
|
processi.push(this);
|
||||||
this.pid=pidNuovo;
|
this.pid=pidNuovo;
|
||||||
this.logProcesso="";
|
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
|
||||||
|
@ -30,6 +29,7 @@
|
||||||
this.pagine[i]=-1;
|
this.pagine[i]=-1;
|
||||||
}
|
}
|
||||||
this.percorsoAllocazione=new Array(Math.floor(Math.random()*10)+this.pagine.length);
|
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++){
|
for(var i=0; i<this.percorsoAllocazione.length; i++){
|
||||||
this.percorsoAllocazione[i]=Math.floor(Math.random()*this.pagine.length);
|
this.percorsoAllocazione[i]=Math.floor(Math.random()*this.pagine.length);
|
||||||
}
|
}
|
||||||
|
@ -38,6 +38,19 @@
|
||||||
this.percorsoAllocazione.push(i);
|
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.stato="disponibile";
|
||||||
this.contatorePercorso=0;
|
this.contatorePercorso=0;
|
||||||
scriviLog("<span style=\"color: white\">Nuovo processo: pid="+this.pid+" pagine="+
|
scriviLog("<span style=\"color: white\">Nuovo processo: pid="+this.pid+" pagine="+
|
||||||
|
@ -53,10 +66,37 @@
|
||||||
this.stato=str;
|
this.stato=str;
|
||||||
this.log("<span style=\"color: violet\">"+this.stato+"</span>");
|
this.log("<span style=\"color: violet\">"+this.stato+"</span>");
|
||||||
};
|
};
|
||||||
Processo.prototype.termina = function (){
|
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){
|
if(this.terminazioneCont===undefined){
|
||||||
this.terminazioneCont=0;
|
this.terminazioneCont=0;
|
||||||
this.cambiaStato("terminazione");
|
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]===undefined){
|
||||||
if(this.pagine[this.terminazioneCont]!=-1){
|
if(this.pagine[this.terminazioneCont]!=-1){
|
||||||
|
@ -107,8 +147,34 @@
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
var processiDisponibili = new Array();
|
||||||
var processiPronti = new Array();
|
var processiPronti = new Array();
|
||||||
var processiTerminati = 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){
|
function allocaSegmento(proc){
|
||||||
var min=0;
|
var min=0;
|
||||||
//ricerca memoria libera tramite first-fit
|
//ricerca memoria libera tramite first-fit
|
||||||
|
@ -176,6 +242,7 @@
|
||||||
var vuoto=false;
|
var vuoto=false;
|
||||||
var interrompi=false;
|
var interrompi=false;
|
||||||
function loopProcessiPronti(){
|
function loopProcessiPronti(){
|
||||||
|
assegnaRisorse();
|
||||||
if(processiPronti.length>0){
|
if(processiPronti.length>0){
|
||||||
if(pidAttuale >= processiPronti.length) pidAttuale=0;
|
if(pidAttuale >= processiPronti.length) pidAttuale=0;
|
||||||
var tmp;
|
var tmp;
|
||||||
|
@ -214,10 +281,13 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function avvio(){
|
function avvio(){
|
||||||
document.getElementsByName("wiki")[0].href=wikiScheduler;
|
for(var i=0; i<risorse.mem.length; i++){
|
||||||
for(var i=0; i<100; i++){
|
risorse.mem[i] = new Memoria();
|
||||||
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++){
|
for(var j=0; j<10; j++){
|
||||||
new Processo();
|
new Processo();
|
||||||
}
|
}
|
||||||
|
@ -236,14 +306,16 @@
|
||||||
for(var i=0; i<100; i++){
|
for(var i=0; i<100; i++){
|
||||||
var cella = document.getElementById("memoria"+Math.floor(i/10)+i%10);
|
var cella = document.getElementById("memoria"+Math.floor(i/10)+i%10);
|
||||||
if(eseguita==i) cella.style.background=colore;
|
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 if(risorse.mem[i].pid!=0) cella.style.background="orange";
|
||||||
else cella.style.background="white";
|
else cella.style.background="white";
|
||||||
cella.innerHTML= risorse.mem[i].pid!=0 ? risorse.mem[i].pid : "";
|
cella.innerHTML= risorse.mem[i].pid!=0 ? risorse.mem[i].pid : "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function trovaProcessoPronto(pid){
|
function trovaProcessoDaPid(pid){
|
||||||
return $.grep(processiPronti, function(e){ return e.pid == 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){
|
function comandiDaTastiera(e){
|
||||||
switch(e.keyCode){
|
switch(e.keyCode){
|
||||||
|
@ -262,11 +334,6 @@
|
||||||
//lettera C: avanza di un esecuzioneCicloSingolo se è in pausa
|
//lettera C: avanza di un esecuzioneCicloSingolo se è in pausa
|
||||||
if(interrompi) loopProcessiPronti();
|
if(interrompi) loopProcessiPronti();
|
||||||
break;
|
break;
|
||||||
case 82:
|
|
||||||
case 114:
|
|
||||||
//lettera R: apri wiki dello scheduler
|
|
||||||
window.open(window.wikiScheduler,"","width=600,height=450");
|
|
||||||
break;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
@ -490,7 +557,6 @@
|
||||||
<p><a href="#teoria">TEORIA</a></p>
|
<p><a href="#teoria">TEORIA</a></p>
|
||||||
<p><a href="#log">LOG</a></p>
|
<p><a href="#log">LOG</a></p>
|
||||||
<p><a href="#memoria">MEMORIA</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">
|
||||||
|
@ -571,6 +637,11 @@
|
||||||
</div>
|
</div>
|
||||||
<script>
|
<script>
|
||||||
avvio();
|
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>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</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