Qualche esempio di analisi di Sistemi Operativi mediante la teoria delle code
d’attesa.
E.Mumolo
Si consideri un S.O. non pre-emptive, senza iterazioni di I/O. Supponendo che il tempo medio
di esecuzione dei processi sia di 0.2 secondi, trovare la frequenza massima di arrivo dei
processi tale che il tempo di attesa nel sistema sia minore di 0.5 secondi.
1
, dove 
 (1   )
e’ la frequenza di elaborazione,  =1/te=5, dove te e’ il tempo medio di elaborazione. Inoltre 
Il modello e’ quello della coda M/M/1. Il tempo d’attesa nel sistema e’ w 
e’ la frequenza di arrivo, e  e’ il coefficiente di traffico, ed e’ uguale a  

. Dunque:

1
1
1


 0.5 . Quindi     1 / 0.5 ovvero     1 / 0.5 .
 (1   )      
Quindi   3
w
Si consideri un S.O. non pre-emptive, senza iterazioni di I/O. Si supponga che da alcune
misure risulti che il tempo medio di esecuzione dei processi sia pari a 100/(frequenza clock
CPU in MHz). Se il tempo medio di interarrivo e’ di 3 secondi, qual’e’ il clock minimo
della CPU tale che il tempo d’attesa nel sistema sia minore di 0.5 secondi?
Il modello e’ quello della coda M/M/1. Il tempo d’attesa nel sistema e’
1
1
w

 0.5 . Cioe’     2 , cioe’   2   . Visto che   1/ 3 ,   7 / 3 .
 (1   )   
Dato che   clock / 100 , ne risulta che clock > 233.
Si consideri un S.O. di tipo batch, con un dispositivo di I/O. Supponendo che la CPU lavori
al ritmo di 3 elaborazioni al secondo e l’unita’ di I/O soddisfi 2 richieste al secondo, qual’e’
il livello (minimo) di multiprogrammazione tale che l’utilizzazione della CPU sia maggiore
del 60%?
Il modello e’ quello della coda ciclica. Dato che la utilizzazione della CPU, u, e’:
1  N
, dove N e’ il numero di processi concorrenti, cioe’ il livello di
u
1   N 1
2
2 1  2 / 3N
, cioe’ u 
.
3
3 1  2 / 3 N 1
Provando con alcuni N, si vede che il minimo N che da’ una utilizzazione della CPU maggiore
del 60% e’ N=4
multiprogrammazione, dai dati del problema ottengo  
Si supponga che in un esperimento di simulazione discreta sia necessaria una variabile
aleatoria x con la seguente funzione densita’ di probabilita’:
3
2
f ( x)  x  1 con x  [0  ] . Scrivere lo pseudo-codice di una procedura per generare
2
3
la variabile aleatoria.
Il campo di esistenza della v.a. e’ 0..2/3. Quindi la funzione di distribuzione e’
2/3
2/3
3
3
F ( x)   f ( )d   (   1)d  x 2  x che, in effetti, per x=2/3 vale 1.
2
4
0
0
3
Generando una v.a. uniforme r, ed uguagliandola ad F(x), si ha: r  x 2  x , da cui risulta che
4
3 2
2
x  x  r  0 e quindi x1,2  (1  1  3r ) . Resta da vedere quale segno scegliere, se + o
4
3
-. Se si sceglie +, le soluzioni sono tra 0 e 2/3 per r che va da 0 a 1. Se si sceglie il -, le soluzioni
vanno da –4/3 a –2 per r che va da 0 a 1. Quindi il segno e’ il +, perche’ ad esso le x prodotte
per r che va’ da 0 a 1 sono nell’intervallo indicato. In definitiva, la v.a. desiderata e’ calcolata
2
cosi’: x  (1  1  3r ) dove r ovviamente e’ una v.a. uniforme tra 0 e 1.
3
Cioe’, se rnd() e’ una procedura per il calcolo del numero uniforme, lo pseudo-codice in C puo’
essere:
float aleatoria()
{
return(2/3*(-1+sqrt(1+3*rnd()));
}
Un grosso Centro di Elaborazione Dati funziona nel seguente modo:
a. Riceve da rete un blocco di processi da eseguire da parte di N utenti
b. Una volta ricevuti, esegue gli N processi in multiprogrammazione
c. Raccoglie i risultati e li invia agli utenti, assieme alla fattura con il costo del
servizio.
Sapendo che:
- il tempo medio per ricevere un blocco di N richieste è T1 = 500 secondi
- il tempo medio richiesto da un processo è T2 = 10 secondi
- il costo fisso del centro è CS = 100 euro/secondo
- il costo del tempo d’attesa di un utente è CU = 50 euro/secondo
si determini il numero ottimale di utenti del blocco, cioe’ il numero N che minimizza il
costo totale per utente.
[suggerimento: il costo totale per utente è
(tempo totale per eseguire i programmi)(costo totale al secondo)/N
cioè (T1+NT2)(CS+NCU)/N]
Come suggerito, il costo totale C è dato da C=(T1+NT2)(CS+NCU)/N. Volendo minimizzare C,
si annulla la derivata prima di C rispetto a N. Cioe’:
dC/dN=[(T1CU+T2CS+2NT2CU)N-(T1+NT2)(CS+NCU)]/N2=0
Cioè :
T1CUN+T2CSN+2N2T2CU = T1CS+T1CUN+ T2CSN+ N2T2CU
Ovvero :
N2T2CU= T1CS cioè N=SQRT(T1CS / T2CU)=SQRT(500x100/10x50)=10
Cioè, il costo totale per utente viene minimizzato se ci sono 10 utenti del centro di elaborazione.
Un Sistema Operativo è rappresentabile nel seguente modo:
CPU1
CPU2
La frequenza di elaborazione della 2° CPU è di 1 processo/s. La probabilità che ci sia 1
processo nella coda della 2° CPU è del 25%.
Sapendo che la 1° CPU è utilizzata al 50%, determinare il numero di processi in attesa
della 1° CPU.
[ricorda: la probabilità di avere n processi in coda è n(1-)
]
Con i dati del problema, basta avere le informazioni sulla 1° CPU. Le informazioni sulla 2°
CPU sono irrilevanti. Infatti: utilizzazione CPU = 
Visto che E[N]= np(n) = /(1-il numero medio di processi in attesa della 1° CPU è
pari a 1.
Un Sistema Operativo possiede una CPU (che esegue in media di 50 processi al secondo)
ed un disco (in media esegue 40 richieste al secondo).
Sapendo che un processo ha uno spazio di indirizzamento medio di 500KB, che il Sistema
Operativo non usa memoria virtuale, e che la CPU è utilizzata al 60%, determinare la
minima quantità di memoria di cui il Sistema Operativo deve disporre.
[ricorda: la probabilità di avere n processi in coda in un sistema a
coda ciclica è n(1-)/(1-N+1) dove
è (frequenza esecuzione disco)/(frequenza elaborazione CPU)]
Visto che pn(t)=n(1-)/(1-N+1), e che il coefficiente di utilizzazione è
U=1-p0(t)=1-(1-)/(1-N+1)=  (1- N)/(1-N+1). Quindi, visto che = 40/50=0.8, possiamo
dire che: U=0.8(1-0.8 N)/(1-0.8N+1)=0.6. Sviluppando questa relazione si ha che 0.5=0.8 N+1
da cui, facendo il logaritmo dei due membri, N=ln0.5/ln0.8 –1, quindi N=2. Cioe’ ci sono
due processi nel sistema operativo. La memoria minima richiesta è quindi di 1 Mbyte.
In una biblioteca c’è un calcolatore dotato di un unico terminale mediante il quale gli
utenti fanno ricerche sulla disponibilità e collocazione dei libri. Se un nuovo utente arriva
per consultare il terminale in media ogni 3 minuti, ed il tempo medio di attesa che gli
utenti aspettano prima di usare il terminale è di 8 minuti, qual è il numero medio di utenti
che aspetta in coda?
Secondo Little, NumeroMedioDiUtentiInCoda = freq.arrivo*TempoAttesaInCoda
cioè n=*W=1/3*8=2.66 utenti medi in attesa.
I processi che arrivano ad un sistema operativo provengono da varie sorgenti, tutte
poissoniane, come si vede in figura:
I tempi medi di interarrivo sono di 10, 5, 3.33 e 2.5 secondi rispettivamente per le varie
sorgenti. Qual è la probabilità che nel processo degli arrivi risultante arrivino 5 processi in
10 secondi?
Le varie sorgenti hanno evidentemente le seguenti frequenze d’arrivo (=1/T):
rispettivamente 1=0.1, 2=0.2, 3=0.3, 4=0.4. La confluenza è sempre di Poisson con
=i, cioè =1. In accordo alla distribuzione di Poisson, la probabilità che ci siano 5
processi arrivati in 10 secondi è pari a (t)5 e-t /5! con t=10 s.
E’ cioè pari a 105 e-10 /120 = 0.037.
Un sistema operativo è modellabile come una coda ciclica. Il tempo medio di CPU è di 2
secondi, quello di I/O è di 3 secondi. Il numero di processi nel sottosistema CPU, N(t), è
una variabile aleatoria con media pari a –1/6 e varianza pari a 1. Usando
l’approssimazione del fluido continuo, determinare il numero minimo di processi nel
sistema tale che il coefficiente di utilizzazione della CPU sia maggiore dell’80%.
Si vuole cioè trovare il valore di J tale che U(J)>0.8. Dato che
U=(1-e-2J/var)/(1-e-2J/var), con i dati del problema (=2/3, =-1/6 e var=1) si ha che
(1-e-J/3)/(1.5-e-J/3) > 0.8. Questa disuguaglianza porta a –1>e-J/3 che non ha soluzioni nel
campo reale.
In effetti con i valori assegnati non si troverà mai una probabilità maggiore di 0.8. Infatti,
per J che tende a infinito, il coefficiente di utilizzazione tende a 2/3=0.6666.
Si consideri un sistema di calcolo modellabile come in figura:
CPU1
CPU2
dove il tempo medio di elaborazione della seconda CPU è di 10 secondi. Se si vuole che il
tempo d’attesa medio nell’intero sistema sia minore di 0.8 secondi, determinare la
frequenza massima d’arrivo sapendo che l’utilizzazione della prima CPU è del 65%.
Intanto, U1=1=1/1=0.65, cioè 1=0.651,
Dato che il tempo d’attesa medio complessivo è la somma dei due tempi d’attesa medi nei
due sistemi, si ha:
W=W1+W2<0.8
W1=1/(1-1)=1/(0.351)
W2=1/(-)=1/(0.1-2)=1/(0.1-1)
Quindi W=1/(0.351) + 1/(0.1-1) = (0.1-0.651)/(0.0351 – 0.35 12) < 0.8 ovvero
0.1 – 0.651 < 0.0281 - 0.2812

0.2812 – 0.678 1 + 0.1 < 0
Risolvendo l’equazione si ha che la frequenza di esecuzione della 1° CPU deve essere maggiore
di 0.1589 e minore di 2.2625, cioè i tempi medi di esecuzione devono essere tra 0.44 e 6.29
secondi. La frequenza massima d’arrivo all’intero sistema e’ dunque 0.65*2.2625 = 1.47
processi al secondo.
Da notare che se si imponesse la condizione riportata sopra in funzione di 1, si otterrebbe la
seguente diseguaglianza:
0.662712 – 1.04 1 + 0.1 < 0 con gli stessi risultati.
Consideriamo ora la congruenza dei risultati ottenuti. Si è ottenuto 1=[0.1, 1.47] arrivi al
secondo e 1=[0.15, 2.26] elaborazioni al secondo. In tutti i casi, l’utilizzazione della CPU1 è
del 65%. La frequenza d’arrivo alla 2° coda è quindi [0.1538, 2.26] mentre la frequenza di
elaborazione di CPU2 è per ipotesi pari a 0.1. In tutti i casi, cioè il coefficiente di utilizzazione
risulta maggiore di 1, il che comporta instabilità della seconda coda.
Si consideri un sistema di calcolo modellabile come in figura:


CPU1
CPU3

CPU2
I processi arrivano al sistema e si biforcano con probabilità  e 1- sui due sottosistemi di
CPU1 e CPU2. Quando i processi terminano l’elaborazione sulle due CPU, confluiscono sulla
terza CPU per l’elaborazione finale. Sapendo che la frequenza d’arrivo al sistema è di 1.5
processi al secondo e che la frequenza di esecuzione della terza CPU è di 2 processi al secondo,
e che l’utilizzazione della CPU1 e CPU2 sono del 90% e 80% rispettivamente, calcolare
l’utilizzazione di CPU3 nel caso che =0.5.
Se =1.5, per =0.5 si ha che la frequenza d’arrivo sulle due code è di 0.75. Visto che
U1=1=1/1=0.9 si ha che la frequenza di esecuzione della prima CPU è di 0.8333
processi al secondo. Ugualmente, da U2=2=2/2=0.8 si ha che la frequenza di esecuzione
della seconda CPU è di 0.9374 processi al secondo.
La frequenza di arrivo nella terza coda è la somma della frequenza di esecuzione delle
prime due CPU, cioè 3=1+2, cioè 3=1.7708. Da cui si ha che U3=3/3=0.8854 cioè
88.54 %.