171 lines
6.7 KiB
HTML
171 lines
6.7 KiB
HTML
<!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>
|
|
<style type="text/css">
|
|
|
|
</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>
|