Politecnico di Milano Facoltà di Ingegneria Industriale INFORMATICA B Esercitazione del 22/01/2013 Esercizio 1 Un sistema dispone di 16 pagine di memoria fisica e 64 di memoria virtuale. Sapo che l indirizzo fisico è di 12 bit, rispondere alle seguenti domande giustificando le risposte: a) Qual è la dimensione della pagina di memoria fisica e la dimensione totale della memoria fisica? b) Qual è la dimensione della pagina di memoria virtuale e la dimensione totale della memoria virtuale? c) Qual è la struttura dell indirizzo virtuale e di quello fisico (indicarne i campi e la rispettiva lunghezza)? Si ricordano le seguenti relazioni utili per risolvere questa tipologia di esercizi: bit_indirizzo_fisico = NPF + bit_offset bit_indirizzo_virtuale = NPV + bit_offset dimensione_pagina = 2^bit_offset pagine_fisiche_indirizzabili = 2^NPF pagine_virtuali_indirizzabili = 2^NPV dimensione_memoria_fisica = 2^bit_indirizzo_fisico dimensione_memoria_virtuale = 2^bit_indirizzo_virtuale c) 12 bit indirizzo fisico, 16 pagine fisiche à NPF: 4 bit offset: 8bit 64 pagine virtuali à 14 bit indirizzo virtuale à NPV=6bit offset: 8bit a) pagina fisica da 256 byte, memoria fisica da 4Kbyte b) pagina virtuale da 256 byte, memoria virtuale da 16 Kbyte Esercizio 2 Un sistema dotato solamente di memoria centrale ha un tempo di accesso ai dati pari a 350ns. Per poter migliorare il tempo di accesso si decide di aggiungere una memoria cache dalle seguenti caratteristiche: Hit Rate=80% e Hit Time=40ns. Miss Penalty pari a due volte l'hit Time della cache, più il tempo di accesso alla memoria centrale. 1. Calcolare il tempo di accesso ai dati dopo l'aggiunta della cache; 2. Poto scegliere una cache alternativa con Hit Time ridotto e stesso Hit Rate, quanto dovrebbe valere l'hit Time della nuova cache per avere un tempo di accesso ai dati pari a 100ns? Risposte prive di giustificazione dei risultati ottenuti non saranno valutate.
punto 1 TACC=HR*HT+(1 HR)*MP MP=2HT+TMEM TACC=0.8*40ns+(1-0.8)*(2*40ns+350ns)= =0.8*40ns+0.2*(80ns+350ns)= =32ns+86ns=118ns punto 2 HR*HT+(1 HR)*MP=100ns HR*HT+(1 HR)*(2HT+TMEM)=100ns HR*HT+2HT+TMEM-2*HR*HT-HR*TMEM=100ns (HR+2-2HR)*HT=100ns-TMEM+HR*TMEM HT=(100ns-TMEM+HR*TMEM)/(2-HR) HT=(100ns-350ns+0.8*350ns)/(2-0.8) HT=30ns/1.2ns=25ns Esercizio 3 Un call centre possiede un archivio che contiene informazioni sulla produttività dei dipenti. L archivio consiste in un file di testo (prod.dat) contenente una tabella di 3 colonne: nella prima sono contenuti i nomi dei dipenti, nella seconda la media di ore giornaliere di lavoro relative all ultimo mese e nella terza il numero di contratti stipulati in quel mese dal dipente. L azia calcola la retribuzione dei dipenti nel seguente modo: se un dipente ha lavorato in media meno di 7 ore al giorno la paga è di 5 all ora, se ha lavorato da 7 a 12 ore in media, è di 10, altrimenti è di 6. Ai fini del calcolo dello stipio si supponga che i giorni di lavoro al mese siano 24. Inoltre se il numero di contratti stipulati è superiore a 48 l azia premia un dipente con un bonus di 500. Si scriva uno script che legga da file l archivio sulla produttività (utilizzando la funzione predefinita textread) e inserisca i dati letti in un array di strutture. Tale array deve contenere, per ogni dipente, una struttura con un campo nome per memorizzare il nome del dipente, un campo ore per il numero medio di ore, e un campo contratti per il numero di contratti. Successivamente lo script deve - calcolare, per ogni dipente, lo stipio, memorizzandolo in un opportuno campo di nome stipio aggiunto alla struttura che già contiene gli altri dati, e - stampare a video il numero dei dipenti che, pur lavorando più di 12 ore al giorno (in media), guadagnano meno della media dei dipenti. [nomi ore contratti] = textread('prod.dat', '%s %f %f'); for i=1:length(nomi) dipenti(i).nome = nomi(i); dipenti(i).ore = ore(i); dipenti(i).contratti = contratti(i); for i=1:length(nomi) coefficiente = 10; if dipenti(i).ore < 7 coefficiente = 5; elseif dipenti(i).ore > 12 coefficiente = 6; dipenti(i).stipio = dipenti(i).ore * 24 * coefficiente;
if dipenti(i).contratti >= 48 dipenti(i).stipio = dipenti(i).stipio + 500; mediastipi = mean([dipenti.stipio]); numdipenti = sum([dipenti.stipio] < mediastipi &... [dipenti.ore]> 12); fprintf('numero dipenti richiesti: %d \n', numdipenti); Esercizio 4 Data una serie di misurazioni i cui valori misurati sono contenuti in un vettore x e i relativi pesi sono contenuti in un vettore w (delle stesse dimensioni di x), la media pesata si calcola come segue: Si risponda ai seguenti quesiti utilizzando il linguaggio MATLAB. 1) Scrivere una funzione mediapesata avente come argomenti i vettori x e w e come risultato la media pesata. 2) Scrivere una funzione mediapesataspeciale con parametri analoghi alla precedente, ma che calcoli la media pesata considerando come zeri i pesi relativi alle misurazioni con il valore minimo e il valore massimo. 3) Si consideri una matrice Z di dimensione 2xN precedentemente definita in cui le colonne rappresentano le N misurazioni, la prima riga contiene i valori di ogni misurazione e la seconda riga i relativi pesi. Si scriva uno script per trovare gli indici delle misurazioni con valore compreso tra la media pesata e la media pesata speciale (estremi inclusi). 4) Scrivere una funzione di ordine superiore mediapesatasuperiore avente come argomenti x, w, e una funzione f con parametri analoghi a quelle sviluppate ai punti 1 e 2. Il risultato sarà la media pesata calcolata utilizzando f. Si mostri infine un esempio di invocazione. punto 1 function r=mediapesata(x,w) r=sum(x.*w./sum(w)); punto 2 function r=mediapesataspeciale(x,w) selmin=min(x)==x; selmax=max(x)==x; w(selmin selmax)=0; r=mediapesata(x,w); punto 3 x=z(1,:); w=z(2,:); sel1=x>=mediapesata(x,w)&x<=mediapesataspeciale(x,w); sel2=x<=mediapesata(x,w)&x>=mediapesataspeciale(x,w); find(sel1 sel2) punto 4 function r=mediapesatasuperiore(x,w,f) r=f(x,w); mediapesatasuperiore(x,w,@mediapesata)
Esercizio 5 Un metodo per calcolare il valore approssimato della radice quadrata di un numero reale non negativo z, detto metodo babilonese, utilizza la seguente relazione ricorsiva: " $ # $ % x(n) = 1 z (x(n 1)+ 2 x(n 1) ) x(0) =1 Dove n è un intero positivo arbitrario, mentre x(n) rappresenta un'approssimazione della radice quadrata del numero z. Per esempio, se z è pari a 2 e n è pari a 3 il valore di x(n) ottenuto applicando la formula indicata sopra è 1.4142 (che è una buona approssimazione di 2). L'errore di approssimazione associato ad x(n) è definito come segue: errore(n) = x(n) x(n 1) e decresce al crescere di n. Per esempio, se si calcola la radice di 2 con n pari a 1 si ottiene il valore 1.5000 con errore 0.5000. Se invece si calcola la radice dello stesso valore con n pari a 2 si ottiene il valore 1.4167 con errore 0.0833. 1. Si scriva una funzione ricorsiva sqrt1(z,n) che restituisca un'approssimazione della radice quadrata di z e il relativo errore utilizzando il metodo babilonese. Quando n è pari a zero, si assuma un valore dell errore pari a inf. 2. Si scriva una funzione sqrt2(z,err) che, utilizzando la funzione sqrt1, restituisca un valore approssimato della radice quadrata di z con errore non superiore al valore err fornito come parametro. Nella soluzione di entrambi i quesiti non è permesso utilizzare alcuna funzione di libreria di MATLAB/Octave a parte la funzione abs per il calcolo del valore assoluto. function [r err] = sqrt1(z,n) if (n == 0) % caso base r=1; err = inf; % va bene un valore arbitrario elseif (n > 0) ) % caso ricorsivo [tmp_r tmp_err] = sqrt1(z,n-1); r = 0.5 * (tmp_r + z / tmp_r); err = abs(r - tmp_r); function r = sqrt2(z,err) k = 0; tmp_err = inf; while (tmp_err > err) k = k + 1; [r tmp_err] = sqrt1(z,k);
Esercizio 6 Si analizzi la funzione ricorsiva sotto riportata e si spieghi in modo sintetico che cosa calcola. Si indichi inoltre cosa restituisce la funzione quando viene chiamata con argomento pari a 5. function M=cosafa(n) if (n == 1) M = 1; else S = cosafa(n-1); k = size(s,1)+2; M = ones(k)*n; M(2:k-1,2:k-1)=S; Nota: La funzione MATLAB ones(n) restituisce una matrice di dimensione n x n in cui tutti gli elementi sono pari ad 1 La funzione calcola una matrice di dimensione (2 n 1) x (2 n 1) che ha come elemento centrale 1 le cui cornici concentriche hanno valori che vanno da 2 ad n: cosafa(1) 1 cosafa(2) 222 212 222 cosafa(3) 33333 32223 32123 32223 33333 cosafa(5) 555555555 544444445 543333345 543222345 543212345 543222345 543333345 544444445 555555555