La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Process synchronization

Presentazioni simili


Presentazione sul tema: "Process synchronization"— Transcript della presentazione:

1 Process synchronization
Operating System Operating System Lab 6 – Info B Luca M. Cassano – Sadegh M. Astaneh – Matteo Papini – © 2005 William Fornaciari © 2005 William Fornaciari 1

2 Process synchronization
Lab 6: Obiettivi Operating System Introduzione a Matlab/Octave Grafici Funzioni Ricorsive Strutture 2 © 2005 William Fornaciari

3 Process synchronization
Grafici Operating System Superficie di rotazione Disegno 2D Mappamondo 3 © 2005 William Fornaciari

4 Process synchronization
Superficie di rotazione Operating System Scrivere un programma che permetta di visualizzare la funzione bidimensionale sin(r)/r, lungo le due direzioni x e y N.B.: r è la distanza dall'origine nel piano XY 4 © 2005 William Fornaciari

5 Process synchronization
sin(r)/r Operating System 5 © 2005 William Fornaciari

6 Process synchronization
Soluzione Operating System [X,Y] = meshgrid(-8:.5:8); R = sqrt(X.^2 + Y.^2) + eps; Z = sin(R)./R; mesh(X,Y,Z)  6 © 2005 William Fornaciari

7 Process synchronization
Disegno 2D Operating System Scrivere un programma di disegno 2D interattivo: L'utente può scegliere se disegnare un segmento o un cerchio Segmento: l'utente fornisce i due estremi come array di Matlab (e.g. [-1,-1] e [2,3]) Cerchio: l'utente fornisce centro e raggio L'utente sceglie se disegnare altre figure (segmenti e cerchi) o smettere Tutte le figure devono essere disegnate sullo stesso piano   7 © 2005 William Fornaciari

8 Process synchronization
Suggerimenti Operating System Equazione parametrica del segmento: Equazione parametrica del cerchio: 8 © 2005 William Fornaciari

9 Process synchronization
Esempio Operating System 9 © 2005 William Fornaciari

10 Process synchronization
Soluzione Operating System function [ xx,yy ] = segmento(x0,y0,x1,y1) lambda = 0:.01:1; xx = x0*lambda + x1*(1-lambda); yy = y0*lambda + y1*(1-lambda); end function [xx,yy] = cerchio(x0,y0,r) t = 0:pi/180:2*pi; xx = x0 + r*cos(t); yy = y0 + r*sin(t); end 10 © 2005 William Fornaciari

11 Process synchronization
Soluzione (cont'd) Operating System figure; hold on; title('Disegno'); again = 1; target = '?'; while(again) target = input('Cosa vuoi disegnare?\n','s'); switch(target) case('segmento') p0 = input('Inserire primo punto\n'); p1 = input('Inserire secondo punto\n'); [xx,yy] = segmento(p0(1),p0(2),p1(1),p1(2)); seg = plot(xx,yy); set(seg,'Linewidth',2); case('cerchio') c = input('Inserisci centro\n'); r = input('Inserisci raggio\n'); [xx,yy] = cerchio(c(1),c(2),r); cer = plot(xx,yy); set(cer,'LineWidth',2); case('esci') again = 0; end 11 © 2005 William Fornaciari

12 Process synchronization
Mappamondo Operating System Scrivere un programma che permetta di visualizzare località sul mappamondo date le coordinate geografiche Rappresentare il mappamondo con una sfera di raggio unitario Visualizzare sulla sfera l'equatore e il meridiano di Greenwich In modo interattivo, l'utente può inserire latitudine (da - 90° a 90°) e longitudine (da -180° a 180°). Visualizzare il punto corrispondente sulla sfera   12 © 2005 William Fornaciari

13 Process synchronization
Un po' di geografia Operating System Latitudine: da -90° (Sud) a 90° (Nord) Longitudine: da -180° (Ovest) a 180° (Est) Equatore: cerchio di latitudine 0 Meridiano di Greenwich: semicerchio di longitudine 0 13 © 2005 William Fornaciari

14 Process synchronization
Suggerimenti Operating System Equazione parametrica del cerchio: Equazione parametrica della sfera: 14 © 2005 William Fornaciari

15 Process synchronization
Esempio Operating System 15 © 2005 William Fornaciari

16 Process synchronization
Soluzione Operating System function [XX,YY,ZZ] = punto_sfera(r,t1,t2) XX = r*cos(t1).*cos(t2); YY = r*cos(t1).*sin(t2); ZZ = r*sin(t1); end 16 © 2005 William Fornaciari

17 Process synchronization
Soluzione (cont'd) Operating System figure; %Sfera r = 1; [t1,t2] = meshgrid(0:pi/180:2*pi); [XX,YY,ZZ] = punto_sfera(r,t1,t2); mesh(XX,YY,ZZ); hold on %Equatore t3 = 0:pi/180:2*pi; xx = r*cos(t3); yy = r*sin(t3); eq = plot(xx,yy); set(eq,'Linewidth',2); %Greenwich t4 = -pi/2:pi/180:pi/2; yy = zeros(length(t4)); xx = r*cos(t4); zz = r*sin(t4); eq = plot3(xx,yy,zz); ... 17 © 2005 William Fornaciari

18 Process synchronization
Soluzione (cont'd) Operating System ... %Punti ii = 1; punti = []; again = ('si'); while(~strcmp(again,'no')) lat = -100; while(lat<-90 || lat>90) lat = input('Inserire latitudine\n'); end lat = pi*lat/180; lon = -200; while(lon<-180 || lon>180) lon = input('Inserire longitudine\n'); lon = pi*lon/180; [x,y,z] = punto_sfera(r,lat,lon); punti(ii) = plot3(x,y,z,'ro'); set(punti(ii),'MarkerFaceColor','r'); again = input('Vuoi disegnare ancora?\n','s'); N.B. La stessa funzione (punto_sfera) può essere usata per generare un luogo di punti o un singolo punto! 18 © 2005 William Fornaciari

19 Process synchronization
Strutture Operating System Scrivere un programma che chieda all’utente di inserire una serie di dati contenenti ognuno i seguenti attributi: città (stringa) giorno (intero positivo) mese (intero positivo) anno (intero positivo) tipo di misurazione (char) valore (reale) 19 © 2005 William Fornaciari

20 Process synchronization
Strutture Operating System Ad esempio, l’utente potrà inserire: Milano 04 12 2017 N 10.5 20 © 2005 William Fornaciari

21 Process synchronization
Strutture Operating System Dopo aver acquisito una certa quantità di dati, il programma dovrà chiedere all’utente il nome di una città e un tipo di misurazione. A questo punto il programma cercherà nell’archivio tutti i record riguardanti la città e il tipo di misurazione richiesti. Stamperà poi a video i dati selezionati ed il relativo valore minimo, massimo e medio dei valori. 21 © 2005 William Fornaciari

22 Process synchronization
Soluzione Operating System function dati = acquisizione_dati_meteo() next = 1; dati = []; ii = 0; while next == 1 ii = ii + 1; dati(ii).city = input('Citta'': ','s'); dati(ii).giorno = input('Giorno: '); dati(ii).mese = input('Mese: '); dati(ii).anno = input('Anno: '); dati(ii).tipo = input('Tipo: ','s'); dati(ii).valore = input('Valore: '); next = input('Per inserire un nuovo record premere 1,altrimenti 0: '); end fprintf('%d dati inseriti.\n', ii); 22 © 2005 William Fornaciari

23 Process synchronization
Soluzione Operating System function [city, tipo] = interrogazione_archivio_meteo() city = input('Citta` di interesse: ', 's'); tipo = input('Tipo misura da selezionare: ', 's'); End function [dati_sel, min, medio, max] = calc_statistiche_meteo(dati, city, tipo) for ii = 1:numel(dati) res(ii) = strcmp(dati(ii).city,city); end indici = res & [dati.tipo] == tipo; dati_sel = dati(indici); minimo = min([dati_sel.valore]); massimo = max([dati_sel.valore]); medio = mean([dati_sel.valore]); 23 © 2005 William Fornaciari

24 Process synchronization
Soluzione Operating System function stampa_statistiche(dati_sel, city, tipo, minimo, medio, massimo) fprintf('Statistiche della misura %c in citta'' %s\n', tipo, city); for r = dati_sel fprintf('%d/%d/%d %f\n', r.giorno, r.mese, r.anno, r. valore); end fprintf('\nMin: %3.2f, med: %3.2f, max: %3.2f\n', minimo,medio, massimo); end  24 © 2005 William Fornaciari

25 Process synchronization
funzioni ricorsive Operating System I numeri di Fibonacci (dinamiche di popolazione) Il Massimo Comun Divisore (algoritmo di Euclide) Il problema delle torri di Hanoi 25 © 2005 William Fornaciari

26 Process synchronization
I numeri di Fibonacci Operating System Idea di base 1) fib(n)=1 se n=0 oppure n=1 2) fib(n)= fib(n-1) + fib(n-2) se n>1 26 © 2005 William Fornaciari

27 Process synchronization
I numeri di Fibonacci Operating System 1) fib(n)=1 se n=0 opp. n=1 2) fib(n)= fib(n-1) + fib(n-2) se n>1 Vengono usati per modellare la crescita di animali per diverse generazioni function [f]=fib (n) if n==1 | n==2 f = 1; else f = fib(n - 2) + fib(n - 1); end 27 © 2005 William Fornaciari

28 Process synchronization
Il MCD Operating System Definizione: 1) MCD(m,n)=m se m=n 2a) MCD(m,n)= MCD(m-n,n) se m>n 2b) MCD(m,n)=MCD(m,n-m) se n>m esempio: MCD(21,56) = MCD(21,35) = MCD(21,14)= = MCD(7,14) = MCD(7,7) = 7 28 © 2005 William Fornaciari

29 Process synchronization
IL MCD Operating System Iterativo: function [M]=MCDeuclid(m,n) while m ~= n if m>n m=m-n; else n=n-m; end M=m; 29 © 2005 William Fornaciari

30 Process synchronization
IL MCD Operating System Ricorsivo: function [M]=MCDeuclidRic(m,n) if m==n M=m; else if m>n M = MCDeuclidRic(m-n,n); else M = MCDeuclidRic(m,n-m); end Iterativo: function [M]=MCDeuclid(m,n) while m ~= n if m>n m=m-n; else n=n-m; end M=m; Attenzione alla condizione di terminazione!!!!! N.B. è sempre possibile trovare un corrispondente iterativo di un programma ricorsivo!!! 30 © 2005 William Fornaciari

31 Process synchronization
Le torri di Hanoi Operating System Problema: spostare tutti i dischi dalla torre A alla torre B (usando la torre C come “supporto intermedio”) in modo che si trovino nello stesso ordine 31 © 2005 William Fornaciari

32 Process synchronization
Le torri di Hanoi Operating System Scriveremo una funzione ricorsiva che prende come parametro il numero del disco più grande che vogliamo spostare (da 0 a 5 come nel disegno) La funzione prenderà anche tre parametri che indicano: da quale asta vogliamo partire (source), a quale asta vogliamo arrivare (dest), l’altra asta, che possiamo usare come supporto temporaneo (spare). 32 © 2005 William Fornaciari

33 Process synchronization
L’idea di base Operating System Voglio spostare n anelli dal piolo sorgente, a quello destinazione, usando come appoggio il piolo ausiliario Devo quindi prima spostare n - 1 anelli dal sorgente all'ausiliario, usando come appoggio il piolo destinazione Poi sposto l'unico anello rimasto dal sorgente al piolo destinazione Infine sposto gli n - 1 anelli che si trovano sull'ausilliario all'anello destinazione.. 33 © 2005 William Fornaciari

34 Process synchronization
L’uso della ricorsione Operating System Quando si spostano gli n - 1 anelli la funzione hanoi richiama se stessa, cioè effettua una chiamata ricorsiva, semplificando però il problema perché bisogna spostare un numero di anelli inferiore. In pratica, con la ricorsione il problema viene continuamente ridotto di complessità fino alla soluzione banale in cui rimane solo un anello, che viene semplicemente spostato nel piolo destinazione. 34 © 2005 William Fornaciari

35 Process synchronization
Le torri di Hanoi: strategia Operating System Ridurremo il problema a quello di spostare 5 dischi dalla torre C alla torre B, dopo che il disco 5 è stato già messo nella posizione giusta 35 © 2005 William Fornaciari

36 Process synchronization
Pseudocodice Operating System FUNCTION MoveTower(disk, source, dest, spare): IF disk == 0, THEN: move disk from source to dest ELSE: MoveTower(disk - 1, source, spare, dest) /* (Passo 1) */ move disk from source to dest // /* (Passo 2) */ MoveTower(disk - 1, spare, dest, source) // /* (Passo 3) */ END IF Nota: l’algoritmo aggiunge un caso base: quando il disco è il più piccolo (il numero 0). In questo caso possiamo muoverlo direttamente perché non ne ha altri sopra. Negli altri casi, seguiamo la procedura descritta per il disco 5. 36 © 2005 William Fornaciari

37 Process synchronization
Soluzione in codice MATLAB con simulazione Operating System function []=hanoi(n, da, a, per) if (n>1) hanoi(n-1, da, per, a); end; fprintf('\n sposta un disco dal piolo %d al piolo %d \n', da, a); if (n>1) hanoi(n-1, per, a, da); end; hanoi(3, 1, 2, 3) hanoi(2, 1, 3, 2) hanoi(2, 3, 2, 1) hanoi(1, 1, 2, 3) hanoi(1, 2, 3, 1) hanoi(1, 3, 1, 2) >> hanoi(3, 1, 2, 3) sposta un disco dal piolo 1 al piolo 2 sposta un disco dal piolo 1 al piolo 3 sposta un disco dal piolo 2 al piolo 3 sposta un disco dal piolo 3 al piolo 1 sposta un disco dal piolo 3 al piolo 2 >> 37 © 2005 William Fornaciari


Scaricare ppt "Process synchronization"

Presentazioni simili


Annunci Google