This repository has been archived on 2021-01-15. You can view files and clone it, but cannot push or open issues or pull requests.
html-scheduler/index.html

172 lines
6.7 KiB
HTML
Raw Normal View History

<!DOCTYPE HTML>
<html lang="it">
<head>
<meta charset="utf-8">
<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."/>
</head>
<script>
var lungIstante=2000 //in millis
var risorse = {
file: new Array(5),
stampante: 0,
io: new Array(6),
mem: new Array(100) //vettore contenente 100 cloni di memoria
}
var memoria = {
pid: 0,
istanteAllocazione: -1,
numeroPagina: -1
}
var processi = new Array();
var processiTerminati = new Array();
function Processo(){
var pidNuovo=1;
processi.push(this);
this.pid=pidNuovo;
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++){
this.pagine[i]=-1;
}
this.percorsoAllocazione=new Array(Math.floor(Math.random()*10)+this.pagine.length);
for(var i=0; i<this.percorsoAllocazione.length; i++){
this.percorsoAllocazione[i]=Math.floor(Math.random()*this.pagine.length);
}
for(var i=0; i<this.pagine.length; i++){
if(this.percorsoAllocazione.indexOf(i)==-1){
this.percorsoAllocazione.push(i);
}
}
this.stato="disponibile";
this.contatorePercorso=0;
scriviLog("Nuovo processo: pid="+this.pid+" pagine="+this.pagine.length+" lunghezzaPercorso="+this.percorsoAllocazione.length);
pidNuovo++;
}
Processo.prototype.cambiaStato = function (str) {
this.stato=str;
scriviLog("Processo "+this.pid+": "+this.stato);
};
Processo.prototype.termina = function (){
this.cambiaStato("terminazione");
(this.pagine).forEach(function(item, index){
resettaPagina(item);
});
this.cambiaStato("terminato");
var i = processi.indexOf(this);
processiTerminati.push(processi.splice(i, 1)[0]);
};
Processo.prototype.esecuzioneCicloSingolo = function(){
if(this.contatorePercorso>=this.percorsoAllocazione.length){
this.termina();
return false;
}
scriviLog("Processo "+this.pid+": esecuzione pagina " + this.percorsoAllocazione[this.contatorePercorso]);
if(paginaDaCaricareGiaAllocata(this)){
this.contatorePercorso++;
return true;
}
else {
return allocaSegmento(this);
}
};
function allocaSegmento(proc){
//ricerca memoria libera tramite first-fit
for(var i=0; i<100; i++){
if(risorse.mem[i].pid==0) break;
}
if(i==100){
//allocazione fallita
scriviLog("Allocazione fallita. Gestione della memoria piena...");
//si applica least recently used
var min=0;
for(i=1; i<100; i++){
if(risorse.mem[min].istanteAllocazione > risorse.mem[i].istanteAllocazione)
min = i;
}
if(!resettaPagina(min)){
scriviLog("Gestione della memoria piena fallita.");
return false;
};
i=min;
}
risorse.mem[i].pid=proc.pid;
risorse.mem[i].numeroPagina=proc.percorsoAllocazione[proc.contatorePercorso];
risorse.mem[i].istanteAllocazione=Date.now();
proc.pagine[proc.percorsoAllocazione[proc.contatorePercorso]]=i;
scriviLog("Allocata pagina "+proc.percorsoAllocazione[proc.contatorePercorso]+" in locazione di memoria "+i);
proc.contatorePercorso++;
return true;
}
function paginaDaCaricareGiaAllocata(proc){
if(proc.contatorePercorso>=proc.percorsoAllocazione.length) return false;
if(proc.pagine[proc.percorsoAllocazione[proc.contatorePercorso]]!=-1) return true;
return false;
}
function resettaPagina(pagina){
scriviLog("Libero locazione di memoria "+pagina);
for(var i=0; i<processi.length; i++){
if(processi[i].pid==risorse.mem[pagina].pid){
var a = processi[i].pagine.indexOf(pagina);
if(a<0){
scriviLog("Pagina non registrata nel processo.");
return false;
}
processi[i].pagine[a]=-1;
break;
}
}
if(i==processi.length){
scriviLog("Pid non trovato. Questa locazione potrebbe essere già libera");
return false;
}
risorse.mem[pagina].pid=0;
risorse.mem[pagina].numeroPagina=-1;
risorse.mem[pagina].istanteAllocazione=-1;
return true;
}
function scriviLog(str){
console.log(str);
//log nella div
}
function clone(obj){
return JSON.parse(JSON.stringify(obj));
}
//avvio del programma
for(var i=0; i<100; i++){
risorse.mem[i]=clone(memoria);
}
function testAllocazione(){
//test di allocazione
var provaProc = new Processo();
while(provaProc.esecuzioneCicloSingolo());
}
testAllocazione();
</script>
2016-05-05 10:49:50 +00:00
<style type="text/css">
2016-05-05 10:49:50 +00:00
</style>
<body>
<div style="background-color:yellow; color:black; padding:20px;">
<h2>Scheduler</h2>
<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 accesso ad una risorsa (tipicamente l'accesso al processore da parte di un processo da eseguire), stabilisce un ordinamento
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>
</div>
<div>
<ul>
<li>Processo 1</li>
<li>Processo 2</li>
<li>Processo 3</li>
</ul>
</div>
<h1>Prima modifica</h1>
</body>
</html>