Il linguaggio di programmazione C; Il Sistema Operativo Linux installato, con relativo utilizzo della shell bash attraverso i principali comandi standard UNIX; Il protocollo NFS (Network File System); Sviluppo di programmi in C per la scrittura e la lettura di file da 512 MB su un hard disk remoto; Test di velocità di NFS riguardo la creazione e la lettura di file in un hard disk remoto. Testing dell’efficienza di una rete composta da 5 macchine collegate tra loro, analizzando la velocità di trasferimento dei dati tramite operazioni di lettura e scrittura. lxmaster01 Gigabit Ethernet switch cisco catalyst 6000 Fast Ethernet fullduplex lxmaster02 lxmaster03 lxmaster04 lxmaster05 Il linguaggio C è il linguaggio che abbiamo utilizzato per creare programmi mirati al raggiungimento dell’Obiettivo preposto. Venne progettato da Brian W.Kernighan e da Dennis M.Ritchie nei Bell Laboratories intorno al 1972 e divenne inizialmente famoso come linguaggio di sviluppo di UNIX. E’ proprio grazie alla sua flessibilità che tali programmatori lo utilizzarono per la scrittura della maggior parte delle funzioni che compongono il kernel del SO stesso, anche se ultimamente in cooperazione con la sua “evoluzione” detta C++ per i SO di ultima generazione. Si può definire come un linguaggio di medio livello, potente quasi come un linguaggio macchina(es. assembly)però molto meno complesso e più accessibile al programmatore. Per la progettazione di programmi in C, inoltre, si possono utilizzare editor testuali semplici come vi (già implementato in UNIX) oppure grafici come Kate o un semplice note-pad in qualsiasi SO. Per eventuali errori di tipo sintattico infine si può ricorrere ad un semplice compilatore C. Il tipo di distribuzione Linux installata è la versione “SUSE Enterprise Server 9”. PRINCIPALI PROCEDURE DI INSTALLAZIONE: • Partizionamento del disco di ognuna delle 5 macchine in un’area di 5GB dedicata al sistema operativo utilizzando un File System di tipo ext3 e in un’area relativamente piccola (256MB) dedicata allo swapping, che tra l’altro Linux utilizza raramente; • Settaggio delle impostazioni varie,quali Keyboard Language, Time Zone, System Language, Boot loader (di tipo GRUB o LILO); • Impostazioni relative alla registrazione degli accounts root e user con le relative passwords; • Scelta delle home directory dei vari utenti. La shell è uno dei livelli che compongono i sistemi operativi UNIX. Esegue la read (o lettura) di una linea di comando dallo standard input e la interpreta secondo uno schema di regole prefissato. In pratica rende comprensibili alla macchina i comandi che le vengono inviati. PRINCIPALI COMANDI DELLA SHELL: ls: visualizza il contenuto di una directory; cd: cambia la directory di lavoro; mkdir: crea una nuova directory; touch: crea un nuovo file; rm: cancellazione di un file; chmod: cambia i diritti di lettura,scrittura ed eseguibilità di un file; more: visualizza il contenuto di un file; su: cambia utenza; cd .. : sale al livello precedente nella struttura gerarchica del file system; ps: visualizza i nomi dei processi in esecuzione in una data shell; reboot: riavvio del sistema; ssh: prende il controllo di una macchina remota collegata in rete; find: ricerca di un file nel sistema. Il Network File System è un protocollo sviluppato inizialmente da Sun Microsystems nel 1984. L'NFS è un file system che consente ai computer di utilizzare la rete per accedere ai dischi remoti come fossero dischi locali. NFS è spesso associato a sistemi Unix, sebbene spesso sia utilizzato anche da macchine utilizzanti i sistemi operativi Macintosh e Microsoft Windows. NFS permette ad n calcolatori che compongono un sistema distribuito di condividere file, directory od un intero file system utilizzando il protocollo client-server. Un calcolatore (client) deve richiedere esplicitamente ad un altro calcolatore (server) del sistema distribuito di condividere una directory o un file, dichiarando un punto di montaggio. Una volta effettuato un montaggio un utente sul calcolatore client accede alla directory montata in modo assolutamente trasparente, ossia accede alla directory remota credendo di accedere ad una directory locale. NFS si può pensare inoltre come uno strato superiore del famoso protocollo TCP/IP. #include <stdio.h> #include <string.h> #include <curses.h> int main (int argc, char *argv[]) { FILE *wp; int blank=0; int car=0; char a=' '; int words=0; int cont=0; if(argc!=2) { printf("\nSintax error! - Correct sintax: counter filename \n\n"); exit(-1); } wp=(fopen(argv[1], "w")); while(a) { if(a==EOF) { if((car==0)&&(blank==0)&&(words==0)) printf("\n\nEmpty file...\n\n"); printf("\n\n#Characters are: %d \n\n",car); printf("\n\n# Blanks are: %d \n\n",blank); printf("\n\n#Words are: %d \n\n",words); exit(-1); } fputc(a=getchar(),wp); if((a!=' ')&&(a!=EOF)&&(a!='\n')) { car++; cont++; } if(a==' ') blank++; if(((a==' ')||(a=='\n')||(a==EOF))&&(cont!=0)) { cont=0; words++; } } } Questo programma è stato per così dire l’introduzione al linguaggio C e al suo utilizzo. Una semplice funzione che calcola il numero di parole,di blank e di caratteri presenti in un testo scritto in un file creato al momento dell’esecuzione. #include <stdio.h> #include <string.h> #include <curses.h> #define SIZE 512024576 #define SIZE1 65536 int main(int argc, char *argv[]) { if((argc!=3)||(atoi(argv[2])>SIZE1)) { if(argc!=3) printf("\n\nWrong Sintax ! Correct Sintax: fcreate OutputFile BlockSize\n\n"); if(atoi(argv[2])>SIZE1) printf("\n\nBlockSize too long. It must be <= %d\n\n",SIZE1); exit(-1); } FILE *wp; char buffer[SIZE1]; char *bp; bp=&buffer[0]; int conv=atoi(argv[2]); int i=0,count,j=0; for(i=0; i<SIZE1; i++) buffer[i]='#'; int cicle=(SIZE/conv); wp=fopen(argv[1], "w"); for(i=0;i<cicle;i++) fwrite(bp,1,conv,wp); printf("\n\nWriting completed\n\n"); close(wp); } #include <stdio.h> #include <string.h> #include <curses.h> #define SIZE1 65536 #define SIZE 512024576 int main(int argc, char *argv[]) { int n=10,i=0; char car='#'; if((argc!=3)||(atoi(argv[2])>SIZE1)) { if(argc!=3) printf("\n\nWrong Sintax ! Correct Sintax: fread InputFile BlockSize\n\n"); if(atoi(argv[2])>SIZE1) printf("\n\nBlockSize too long. It must be <= %d\n\n",SIZE1); exit(-1); } FILE *wp; char buffer[SIZE1]; char *bp; bp=&buffer[0]; int bdim=atoi(argv[2]); wp=fopen(argv[1], "r"); while(n>0) { n=fread(bp,1,bdim,wp); i++; } printf("\n\n %d Reading completed...\n\n",i); close (wp); } Test di velocità in scrittura su disco remoto con variazione di Block Size e n° di macchine. 1 client BLOCK SIZE (byte) TIME (sec.) VELOCITA' (MB/sec) 2 clients 64 25,877 19,790 128 26,830 19,080 256 26,438 19,370 512 26,736 1024 BLOCK SIZE (byte) TIME 1 (sec) TIME 2 (sec) VELOCITA' MEDIA (MB/sec) 19,150 64 247,904 249,814 2,06 26,121 19,600 128 187,69 192,015 2,70 2048 26,853 19,070 256 212,825 209,525 2,42 4096 27,260 18,780 16348 249,727 253,2 2,04 8192 26,475 19,340 32768 182,938 178,75 2,83 16348 26,468 19,350 65536 274,343 274,439 1,87 32768 26,089 19,630 65536 25,916 19,760 3 clients BLOCK SIZE (byte) TIME 1 (sec) TIME 2 (sec) TIME 3 (sec) VELOCITA' MEDIA (MB/sec) 64 1116,91 1115,733 1116,442 0,46 128 1120,672 1120,277 1119,762 0,46 256 1132,208 1131,52 1130,556 0,45 16348 1140,314 1139,697 1139,195 0,45 32768 1131,114 1130,78 1130,311 0,45 65536 1127,831 1127,264 1126,627 0,45 BLOCK SIZE (byte) TIME 1 (sec) TIME 2 (sec) TIME 3 (sec) TIME 4 (sec) VELOCITA' MEDIA (MB/sec) 64 1131,356 1131,069 1129,438 1130,131 0,45 128 1163,415 1162,886 1162,29 1161,771 0,44 256 1138,117 1137,728 1136,66 1136,259 0,45 4 clients Velocità in scrittura con variazione del Block Size e del numero di clients 20 18 14 12 10 8 6 Velocità (MB/sec) 16 4 2 65536,0 32768,0 16348,0 8192,00 4096,00 2048,00 1024,00 512,000 256,000 128,000 64,000 0 4 clients 3 clients Block Size (byte) 2 clients 1 client Come si è notato dalle tabelle e dai grafici relativi alle misurazioni effettuate, il Network File System v3 presenta un miglioramento rispetto alle versioni precedenti, per quanto riguarda la velocità di trasferimento in scrittura, che risulta essere costante anche al variare della dimensione del pacchetto di dati inviato (Block Size). Se da un lato però la situazione risulta essere migliore sotto questo punto di vista, dall’altro c’è da dire che aumentando i client in rete si verifica un crollo delle prestazioni con un abbassamento drastico della velocità. Test di velocità in scrittura e in lettura su disco remoto con valore di Block Size fisso (65536 byte) e variazione del n° di threads e n° di macchine. Ciclo di scrittura … Threads 4 6 8 12 16 20 24 Macchine VELOCITA' (MB/sec) VELOCITA' (MB/sec) VELOCITA' (MB/sec) VELOCITA' (MB/sec) VELOCITA' (MB/sec) VELOCITA' (MB/sec) VELOCITA' (MB/sec) 1 20,05 19,53 19,71 18,78 19,18 18,52 19,74 2 0,33 0,35 0,51 0,63 0,62 2,99 4,30 3 * * * 0,44 * 2,61 2,50 4 * * * * * 0,56 0,46 Ciclo di lettura … Threads 4 6 8 12 16 20 24 Macchine VELOCITA' (MB/sec) VELOCITA' (MB/sec) VELOCITA' (MB/sec) VELOCITA' (MB/sec) VELOCITA' (MB/sec) VELOCITA' (MB/sec) VELOCITA' (MB/sec) 1 12,09 12,90 12,78 13,48 13,92 14,39 13,58 2 7,88 9,26 7,45 7,53 8,26 5,39 5,45 3 8,68 8,58 5,87 8,26 8,27 8,19 8,39 4 6,56 6,32 6,76 6,70 6,15 6,50 6,34 Velocità di scrittura con variazione del numero di Threads e clients, e Block Size costante (65536 byte) 25 15 10 Velocità (MB/sec) 20 5 0 24 20 16 12 8 6 4 Threads 4 client 3 client 2 client 1 client Velocità di lettura con variazione del numero di Threads e clients, e Block Size costante (65536 byte) 16 12 10 8 6 4 Velocità (MB/sec) 14 2 0 4 6 8 Threads 12 16 20 24 4 client 3 client 2 client 1 client Lasciando invariato, invece, il Block Size ad un valore definito (nel nostro caso 65536 byte) e modificando il numero di threads, si ottengono due risultati diversi per quanto riguarda la scrittura e la lettura. Mentre nel primo caso all’aumentare dei threads, la velocità aumenta visibilmente ad eccezione della rete con un solo client, nel secondo,la velocità di trasferimento si mantiene pressoché costante.