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

137 lines
5.1 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 processo = {
pid: 1,
tempoDiCompletamento: 0,
nPagine: 0,
pagine: 0, //vettore contenente gli indirizzi di tutte le pagine in ordine
paginaDaAllocare: 0
}
var processi = new Array();
function generaProcesso(){
var nuovo=clone(processo);
processi.push(nuovo);
nuovo.tempoDiCompletamento=Math.floor(Math.random()*10)+3;
nuovo.nPagine=Math.floor(Math.random()*10)+3;
nuovo.pagine=new Array(nuovo.nPagine);
for(var i=0; i<nuovo.nPagine; i++){
nuovo.pagine[i]=-1;
}
processo.pid++;
scriviLog("Nuovo processo: pid="+nuovo.pid+" memoria="+nuovo.nPagine+" tempo="+nuovo.tempoDiCompletamento);
return nuovo;
}
function allocaSegmento(proc){
//ricerca memoria libera tramite first-fit
if(proc.paginaDaAllocare>=proc.nPagine){
scriviLog("Processo "+proc.pid+": tutte le pagine sono allocate");
return false;
}
for(var i=0; i<100; i++){
if(risorse.mem[i].pid==0) break;
}
if(i==100){
//allocazione fallita
scriviLog("Allocazione fallita. Gestione del page fault...");
//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 del page fault fallita.");
return false;
};
i=min;
}
risorse.mem[i].pid=proc.pid;
risorse.mem[i].numeroPagina=proc.paginaDaAllocare;
risorse.mem[i].istanteAllocazione=Date.now();
proc.pagine[proc.paginaDaAllocare]=i;
scriviLog("Allocata pagina "+proc.paginaDaAllocare+" in locazione di memoria "+i);
proc.paginaDaAllocare++;
return true;
}
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 = generaProcesso();
while(allocaSegmento(provaProc));
}
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>