16
Felicia Ionescu, Valentin Pupezescu – Laborator de Calcul paralel Lucrarea 1 - PROCESE LINUX 1.1. Arhitectura sistemelor de calcul din laborator Laboratorul de Calcul paralel se desfășoară într-un cluster Linux (din salile B125a sau B138) precum și în clusterul HPC (High Performance Computer)-Dell PowerEdge. Un cluster de calculatoare este compus dintr-un grup de calculatoare independente, conectate printr-o rețea de interconectare locală (LAN – Local Area Network) care poate oferi (în functie de numărul și capacitatea calculatoarelor conectate) performante foarte ridicate, până la nivel de supercalculatoare. Într-adevar, cel mai performant supercalculator actual (din lista top500/ noiembrie 2013) este clusterul Tianhe-2 (MilkyWay-2) cu 3,120,000 procesoare Intel E5, cu putere de calcul ~ 33 PFLOPS, instalat în China. În fiecare nod al clustrerelor rulează un sistem de operare, care asigură gestiunea resurselor locale ale nodului respectiv și interfața cu alte componente software (middleware) și aplicatiile din cluster. Cele mai folosite sisteme de operare în clustere sunt sistemele Linux (în diferite distributii ca RedHat, Suse etc.), care acoperă un procent de peste 90% din supercalculatoarele listate în www.top500.org/lists/2013/11 (din care majoritatea sunt clustere). Sistemele de operare Unix (în diferite variante: AIX, IRIX, HP-UX, Solaris, Tru64 Unix, Super-UX etc.), sunt folosite intr-o proportie mult mai mică (aproximatiiv 6%), iar sistemele Windows au o utilizare de sub 1%. 1.1.1 Clusterele Linux Clusterele din laboratoarele B125a si B138 sunt compuse din 12-15 calculatoare desktop cu procesoare CPU cu 2 (respectiv 4) cores fiecare, conectate printr-o rețea 1 GB Ethernet. Pe fiecare stație este instalat sistemul Linux - Ubuntu 12.04 (LTS), bibliotecile și toolset- urile necesare pentru dezvoltarea următoarelor categorii de aplicații paralele: Aplicații paralele cu memorie partajată: se pot folosi numai cele 2 (respectiv 4) cores care accesează memoria partrajată din fiecare nod. Pentru astfel de aplicații s-au folosit bibliotecile Pthread (POSIX Threads) și OpenMP (Open Multi-Processing). Aplicații paralele cu transfer de mesaje: se pot folosi toate nodurile din fiecare cluster și toate procesoarele (cores) din fiecare nod, între care datele se comunică prin transfer de mesaje. Pentru astfel de aplicații s-a folosit biblioteca MPI (Massage Passing Interface), în implementarea open-source OpenMPI. Aplicații R și Parallel-R. 1.1.2 Clusterul HPC-Dell PowerEdge Clusterul HPC-Dell PowerEdge a fost achizitionat și instalat în cadrul masterului ITEMS și este compus din: Rețeaua de noduri ale clusterului, dintre care un nod este nod de control iar celelalte 3 sunt noduri de calcul, conectate printr-o rețea (switch intern) de 10 GB Fiecare nod (de control și de calcul) conține câte 2 procesoare Intel Xeon (fiecare cu câte 8 cores) și 64 GB RAM. Fiecare nod de calcul mai conține câte 2 procesoare GPU Nvidia Tesla M2090 cu câte 512 CUDA cores (655 Gflops/GPU), astfel încât performanța unui astfel de nod ajunge la 1.6 Tflops - - 1

L1 Procese Linux

Embed Size (px)

DESCRIPTION

CP CP CP CP CP CP CP CP CP CP CP CP CP CP

Citation preview

  • Felicia Ionescu, Valentin Pupezescu Laborator de Calcul paralel

    Lucrarea 1 - PROCESE LINUX 1.1. Arhitectura sistemelor de calcul din laborator

    Laboratorul de Calcul paralel se desfoar ntr-un cluster Linux (din salile B125a sau B138) precum i n clusterul HPC (High Performance Computer)-Dell PowerEdge.

    Un cluster de calculatoare este compus dintr-un grup de calculatoare independente, conectate printr-o reea de interconectare local (LAN Local Area Network) care poate oferi (n functie de numrul i capacitatea calculatoarelor conectate) performante foarte ridicate, pn la nivel de supercalculatoare.

    ntr-adevar, cel mai performant supercalculator actual (din lista top500/ noiembrie 2013) este clusterul Tianhe-2 (MilkyWay-2) cu 3,120,000 procesoare Intel E5, cu putere de calcul ~ 33 PFLOPS, instalat n China.

    n fiecare nod al clustrerelor ruleaz un sistem de operare, care asigur gestiunea resurselor locale ale nodului respectiv i interfaa cu alte componente software (middleware) i aplicatiile din cluster. Cele mai folosite sisteme de operare n clustere sunt sistemele Linux (n diferite distributii ca RedHat, Suse etc.), care acoper un procent de peste 90% din supercalculatoarele listate n www.top500.org/lists/2013/11 (din care majoritatea sunt clustere). Sistemele de operare Unix (n diferite variante: AIX, IRIX, HP-UX, Solaris, Tru64 Unix, Super-UX etc.), sunt folosite intr-o proportie mult mai mic (aproximatiiv 6%), iar sistemele Windows au o utilizare de sub 1%. 1.1.1 Clusterele Linux Clusterele din laboratoarele B125a si B138 sunt compuse din 12-15 calculatoare desktop cu procesoare CPU cu 2 (respectiv 4) cores fiecare, conectate printr-o reea 1 GB Ethernet.

    Pe fiecare staie este instalat sistemul Linux - Ubuntu 12.04 (LTS), bibliotecile i toolset-urile necesare pentru dezvoltarea urmtoarelor categorii de aplicaii paralele:

    Aplicaii paralele cu memorie partajat: se pot folosi numai cele 2 (respectiv 4) cores care acceseaz memoria partrajat din fiecare nod. Pentru astfel de aplicaii s-au folosit bibliotecile Pthread (POSIX Threads) i OpenMP (Open Multi-Processing).

    Aplicaii paralele cu transfer de mesaje: se pot folosi toate nodurile din fiecare cluster i toate procesoarele (cores) din fiecare nod, ntre care datele se comunic prin transfer de mesaje. Pentru astfel de aplicaii s-a folosit biblioteca MPI (Massage Passing Interface), n implementarea open-source OpenMPI.

    Aplicaii R i Parallel-R. 1.1.2 Clusterul HPC-Dell PowerEdge

    Clusterul HPC-Dell PowerEdge a fost achizitionat i instalat n cadrul masterului ITEMS i este compus din:

    Reeaua de noduri ale clusterului, dintre care un nod este nod de control iar celelalte 3 sunt noduri de calcul, conectate printr-o reea (switch intern) de 10 GB

    Fiecare nod (de control i de calcul) conine cte 2 procesoare Intel Xeon (fiecare cu cte 8 cores) i 64 GB RAM.

    Fiecare nod de calcul mai conine cte 2 procesoare GPU Nvidia Tesla M2090 cu cte 512 CUDA cores (655 Gflops/GPU), astfel nct performana unui astfel de nod ajunge la 1.6 Tflops

    - -

    1

  • Lucrarea 1 Procese Linux

    Unitate de stocare cu capacitate de 6TB (RAID controlat de un procesor Intel Xeon) Adaptor de reea Ethernet pentru conexiuni externe (switch extern cu 2 porturi 1Gbit si

    22 porturi 10/100 Mbit)

    Software de baz instalat n clusterul HPC:

    RedHat Linux Enterprise (RHEL6.3 - 64 bits) pe fiecare nod de control i de calcul Windows Storage Server 2008 pe unitatea de stocare Rocks6.1 - cluster toolkit for HPC & cloud

    n clusterul HPC Dell PowerEdge sunt instalate aceleai biblioteci pentru aplicaii paralele ca i n clusterele Linux:

    PTHREAD biblioteca de thread-uri POSIX

    OpenMP biblioteca de calcul paralel n multiprocesoare

    OpenMPI biblioteca de transfer de mesaje

    Platforma R si bibliotecile Parallel-R

    n plus, n clusterul HPC mai este instalat biblioteca CUDA 5 toolkit si Nvidia drivers care permit execuia programelor paralele n procesoarele GPU ale nodurilor de calcul.

    Majoritatea bibliotecilor i toolset-urilor de calcul paralel sunt disponibile sub sistemele de operare Unix/Linux, de aceea laboratorul se desfoar n sisteme Linux i prima lucrare face o introducere n aspectele de baz ale sistemelor de operare Unix/Linux.

    2

  • Felicia Ionescu, Valentin Pupezescu Laborator de Calcul paralel

    1.1.3. Programarea algoritmilor paraleli Un algoritm secvenial este compus dintr-unul sau mai multe task-uri (sarcini de calcul),

    care se execut secvenial (unul dup celalalt), indiferent dac se execut pe un calculator secvenial (cu un singur procesor) sau ntr-un sistem paralel cu zeci sau zeci de mii de procesoare

    Un algoritm secvenial executat ntr-un sistem paralel sau distribuit nu folosete dect un procesor al sistemului i nu mbunete performanele de execuie.

    Pentru a se accelera execuia prin folosirea concurent a mai multor procesoare dintr-un sistem paralel, este necesar un algoritm paralel de rezolvare a acelei probleme

    Un algoritm paralel este compus din mai multe task-uri care pot fi executate concurent (simultan, n acelasi timp) pe mai multe procesoare ale unui sistem paralel sau distribuit.

    Pentru proiectarea unui algoritm paralel se descompune (partiioneaz) problema n mai multe task-uri i se atribuie (mapeaz) task-urile proceselor sau thread-urilor care se execut concurent pe procesoarele unui sistem paralel sau distribuit.

    n principiu partiionarea (paralelizarea) se poate face prin: Descompunere funcional, dac algoritmul conine date neregulate, iar operaiile asupra

    lor sunt variate i diferite Descompunere structural (partiionarea datelor) dac algoritmul conine masive de date

    asupra crora se execut prelucrri similare. Cele dou modaliti de partiionare nu sunt complet independente i se pot combina. Programarea prin partiionarea datelor este cel mai simplu i mai utilizat model de

    programare paralel. n general, n paralelismul structural operaiile asupra elementelor tablourilor de date sunt executate de iteraiile uneia sau ale mai multor bucle.

    De aceea, partiionarea datelor este realizat prin distribuirea iteraiilor buclelor (paralelizarea buclelor): iteraiile buclei se distribuie ntre mai multe task-uri, fiecare task este compus dintr-una sau mai multe iteraii i prelucreaz o partiie de date.

    O bucl este paralelizabil dac iteraiile ei pot fi distribuite pentru a fi executate n paralel; buclele paralelizabile pot fi:

    (a) Bucle perfect paralelizabile (perfect, embarassing parallelism), dac nu exist dependene ntre iteraiile ei (iteraiile buclei sunt independente) (de exemplu adunarea a doi vectori, adunarea a dou matrice etc.).

    (b) Bucle paralelizabile cu dependene: dac exist dependene ntre iteraiile buclei, atunci pentru execuia n paralel a buclei, sunt necesare mecanisme de sincronizare adecvate, n funcie de tipul dependenelor (dependene prin succesiune, antidependene, dependene prin ieire). (de exemplu reducerea paralel, produsul scalar a doi vectori, integrarea numeric etc.)

    O bucl este neparalelizabil dac iteraiile ei nu pot fi distribuite pentru a fi executate n paralel; acest lucru se poate ntmpla din diferite cauze, de ex:

    dac fiecare iteraie prelucreaz toate elementele mulimii de date; datele nu pot fi distribuite la task-uri diferite, ci trebuie prelucrare secvenial de ctre iteraiile succesive; de exemplu, algoritmii n care rezultatul se obine prin modificri succesive ale unor tablouri de date (algoritmul k-means clustering, eliminarea Gaussiana etc.)

    dac bucla are prea puine iteraii Un algoritm paralel se implementeaz (programeaz) printr-un program paralel, prin

    maparea unuia sau mai multor task-uri ntr-un proces (sau thread). Procesele (thread-urile) unui program paralel sunt organizate ca o succesiune de regiuni

    secveniale (compuse din unul sau mai multe procese/thread-uri care se execut succesiv) i regiuni paralele (compuse din dou sau mai multe procese/thread-uri care se execut concurent), corespunztoare task-urilor pe care le implementeaz

    - -

    3

  • Lucrarea 1 Procese Linux

    Din punct de vedere al com. ntre procese (thread-uri), programarea paralel se clasific n: Programare paralel prin memorie partajat se poate folosi n sistemele cu memorie

    partajat (multiprocesoare, GPGPU) Programare paralel prin transfer de mesaje se poate folosi n orice sistem paralel sau

    distribuit (multicalculatoare, clustere, grid-uri, cloud etc.) n programarea prin memorie partajat se creeaz procese sau thread-uri care se execut

    concurent, pe procesoare diferite, i comunic ntre ele prin variabile stocate n memoria partajat. Variabilele partajate ntre procese se aloc ntr-un segment de memorie partajat. Variabilele partajate ntre thread-urile aceluiai proces se aloc n segmentul de date al

    procesului, partajat de toate thread-urile pe care le deine. n mod obinuit, n programarea prin memorie partajat se folosesc thread-uri, datorit

    timpului de comutare mai redus. Pentru programarea prin memorie partajat se pot folosi mai multe biblioteci, dintre care cele mai cunoscute sunt:

    Biblioteca de thread-uri POSIX (Pthread) Biblioteca OpenMP Programarea prin transfer de mesaje se folosete atunci cnd nu exist memorie

    partajat. Modelul de programare prin transfer de mesaje este definit astfel: Programul se execut ca o mulime de procese concurente care utilizeaz numai

    memorie local. Procesele comunic ntre ele prin transmiterea i recepionarea mesajelor Programarea prin transfer de mesaje se poate folosi ca programare paralel sau ca

    programare n sisteme distribuite. Programarea paralel prin transfer de mesaje: Biblioteci de comunicaie: MPI (Message Passing Interface), PVM (Parallel Virtual

    Machine) Limbaje i platforme de programare paralel prin transfer de mesaje: Parallel-R Platforma Hadoop (http://hadoop.apache.org): prelucrarea n paralel a unor mari seturi

    de date n sisteme distribuite Programarea prin transfer de mesaje n sisteme distribuite: numeroase limbaje i tehnologii: Obiecte i componente distribuite Servicii Web Grid Computing, Cloud Computing n sistemele paralele i distribuite execuia este eficient dac fiecare proces (thread) se

    execut pe un procesor diferit, deci numrul de procese (thread-uri) trebuie s fie mai mic sau cel mult egal cu numrul de procesoare ale sistemului.

    n laboratorul de Calcul paralel se va studia: Programarea paralel prin memorie partajat, cu bibliotecile Pthread i OpenMP; se

    pot folosi procesoarele (cores) unei singure staii (un nod de calcul dintr-unul din clustere: cu 2 procesoare n B125, 4 procesoare n B138, 16 procesoare n HPC, care comunic ntre ele prin memorie partajat.

    Programarea paralel prin transfer de mesaje, cu biblioteca MPI; se pot folosi procesoarele (cores) din mai multe noduri de calcul din clusterele Linux din laboratoarele B125 sau B138 sau din clusterul HPC; n HPC sunt disponibile 64 de procesoare (cores) care comunic ntre ele prin transfer de mesaje.

    4

  • Felicia Ionescu, Valentin Pupezescu Laborator de Calcul paralel

    1.2 Introducere n sistemele de operare UNIX/Linux

    1.2.1 Scurt istoric

    UNIX este un sistem de operare multiproces (poate planifica concurent spre execuie mai multe procese), multiutilizator (poate suporta simultan sesiuni de lucru pentru mai muli utilizatori), multiecran (pe ecranul calculatorului pot fi afiate rnd pe rnd mai multe ecrane virtuale), interactiv. Pe sistemele UNIX mai multe procese se pot execut simultan, fr s existe restricii semnificative asupra numrului lor (grad nalt de multiprogramare). Bazele sistemului de operare UNIX au fost puse n 1968 de ctre Ken Thompson i Denis Ritchie de la laboratoarele Bell. Ei au dezvoltat un sistem monoutilizator pe un calculator PDP-7. n anul 1973 are loc prima scriere n limbajul C a sistemului (pn atunci se lucrase n limbaj de asamblare), ceea ce a dus la realizarea unei foarte bune portabiliti. n 1978 laboratoarele Bell comercializeaz versiunea UNIX v7 (prima versiune comercial a sistemului) i tot n acest an se creeaz Unix Support Group la AT&T. Sistemele de operare UNIX formeaz o familie. UNIX este o marc nregistrat a AT&T Bell Laboratories. Orice sistem care cuprinde cuvntul UNIX n numele su este considerat ca autentic. Restul sistemelor sunt clasificate n: sisteme derivate din UNIX (UNIX based) sau sisteme similare cu UNIX (UNIX like).

    LINUX este o versiune de UNIX distribuit liber, dezvoltat n principal de Linus Torvalds la Universitatea din Helsinki, Finlanda. Mai muli programatori dedicai (hack-eri de sistem) i-au unit forele prin intermediul Internetului, dnd astfel oricrui amator cu destule cunotine i pricepere posibilitatea s participe la dezvoltarea i modificarea sistemului. Nucleul Linux-ului nu utilizeaz deloc cod care s fie n vreun fel proprietatea cuiva, mare parte din programele disponibile pentru Linux fiind dezvoltate n cadrul proiectului GNU al Fundaiei pentru Software Liber (Free Software Foundation) din Cambridge, Massachusetts.

    1.2.2 Gestiunea utilizatorilor

    n Linux mai muli utilizatori pot folosi calculatorul n acelai timp executnd independent diferite aplicaii. Un utilizator n sistemul Linux este oricine poate interaciona cu sistemul prin deschiderea unei sesiuni de lucru, fie de la un terminal, fie din alt sistem n cadrul reelei.

    Sistemele permit deschiderea simultan a mai multor sesiuni de lucru de ctre acelai utilizator. Contul unui utilizator este caracterizat de cteva atribute simple, scrise n fiierul /etc/passwd, unde sunt separate prin caracterul ':' :

    :numele - specific utilizatorul ntr-un mod unic i este format din litere, cifre, '.' sau '_'; :UID - ID-ul utilizatorului, un numr asociat numelui; :GID - ID-ul grupului de utilizatori implicit; parola - parola este un ir de caractere pe care l cunoate numai utilizatorul; numele real - alte informaii despre utilizator, n mod obinuit numele ntreg; directorul de baz - este directorul implicit iniial; fiecare utilizator trebuie s aib un

    director de baz, de obicei n /home, al crui proprietar trebuie s fie; shell pentru login - programul pornit de sistem pentru utilizator dup ce acesta este

    admis n sistem; de cele mai multe ori este un interpretor de comenzi (shell);

    Crearea unui nou utilizator poate fi fcut numai de ctre superuser folosind comenzi care pot diferi de la un sistem la altul. n sistemul Linux se utilizeaz comanda #adduser. Aceasta stabilete n dialogul cu administratorul sistemului toate elementele care caracterizeaz noul utilizator: nume, numr, apartenena la un grup, parola, shell-ul utilizat, etc. Tot superuser-ul este cel care poate terge un utilizator din sistem folosind comanda #rmuser.

    - -

    5

  • Lucrarea 1 Procese Linux

    Alte comenzi legate de gestiunea utilizatorilor: $ cat /etc/passwd - afieaz coninutul fiierului care conine informaii despre

    utilizator $ logname - afieaz numele utilizatorului curent, adic al utilizatorului care are o

    sesiune deschis pe terminalul sau ecranul de la care este dat comanda $ whoami - afieaz numrul i numele de utilizator i de grup al utilizatorului curent $ who - afieaz numele tuturor utilizatorilor activi la un moment dat pe un sistem

    UNIX, informaii despre terminalul la care se afl i momentul deschiderii sesiunii curente.

    Conectarea utilizatorilor la clusterele Linux. n clusterele Linux utilizatorii (studenii) se pot conecta local sau remote (prin ssh, portul 22) pe oricare staie folosind contul i parola disponibil (stabilite de administator).

    n B125a calculatoarele au nume de la h1 la h16 i adrese ntre 141.85.107.201-216.

    Conectarea utilizatorilor la clusterul HPC. n clusterul HPC un user care are un cont (creat de administrator) se poate conecta prin ssh.

    Conectare SSH la nodul de control se face cu comanda ssh din Linux astfel: $ ssh p 2222 [email protected] Password:****** [user@hpc ~]$ hostname hpc.intern

    Nodul de control are numele hpc.intern i mai multe adrese de reea interne, i este accesibil pe portul 2222 al adresei translatate (cu NAT) 141.85.254.57. Conectarea la nodurile de calcul se face din nodul de control compute-0-1 (respectiv compute-0-2, compute-0-3) astfel: [user@hpc ~]$ ssh compute-0-1 Se poate realiza conectarea la clusterul HPC i dintr-un sistem Windows, folosind un program client SSH, de exemplu Putty. Bineneles, clientul SSH trebuie configurat s comunice pe portul 2222.

    Pentru copierea fiierelor ntre o statie Linux i HPC se lanseaz comanda Places Connect to Server (din Linux) i se seteaza: protocol SSH, host 141.85.254.57, port 2222, user, parola.

    n Windows se poate folosi programul WinSCP pentru copierea fiierelor ntre hostul local i HPC, bineneles cu acelai port 2222 i adresa de conectare la HPC (141.85.254.57)

    1.2.3 Structura sistemului de fiiere UNIX/Linux

    Cea mai important caracteristic a sistemului de fiiere Unix/Linux este organizarea sa arborescent, cu o rdcin unic. Partiia rmne baza pentru gestiunea spaiului pe discul magnetic, aa cum o cunoatem din DOS sau alte sisteme de operare.

    La pornire, sistemul de operare monteaz o partiie n punctul de montare /, rdcina absolut a ierarhiei de fiiere a calculatorului. Aceast partiie gzduiete sistemul de fiiere rdcin. Sistemul de fiiere rdcin trebuie s conin anumite directoare, programe i fiiere de configurare necesare pornirii corecte a sistemului. Structura subdirectoarelor din directorul rdcin este urmtoarea:

    / - directorul rdcin + -bin - programele pentru comenzile eseniale + -boot - fiierele statice ale ncrctorului

    + -dev - fiierele speciale pentru acces la periferice + -etc - fiierele de configurare locale

    6

  • Felicia Ionescu, Valentin Pupezescu Laborator de Calcul paralel

    + -home - directorul de baz ale utilizatorilor + -lib - bibliotecile partajate +-mnt - punct de montare temporar a altor partiii diverse +-proc - pseudo-sistem de fiiere cu informaii ale sistemului de operare +-root - directorul de baz pentru utilizatorul root +-sbin - comenzile eseniale de sistem +-tmp - director pentru fiiere temporare +-usr - alte utilitare i biblioteci +-var - date variabile 1.2.4 Interpretoare de comenzi

    Accesul la calculator se face printr-un program cu aparen auster care citete comenzile de la tastatur, le interpreteaz i le execut. Dincolo de aceast aparen simpl se ascund posibiliti sofisticate de combinare a programelor, fiiere de comenzi, monitorizarea i controlul execuiei. Shell-ul este interfaa primar a utilizatorului cu sistemul de operare. Un shell UNIX este n primul rnd un interpretor de comenzi, permind execuia bogatului set de utilitare UNIX. n al doilea rnd, shell-ul este un limbaj de programare care d posibilitatea combinrii acestor comenzi n activiti complexe. El ofer utilizatorului un control complet asupra programelor: execuia lor poate fi sincron sau asincron, intrrile i ieirile pot fi redirecionate, mediul de execuie poate fi ajustat dup dorin. n mod neinteractiv shell-ul citete comenzi dintr-un fiier (script). Astfel, utilizatorul poate folosi facilitile de programare ale shell-ului: variabile, structuri de control (if, while, for, do), subprograme. Unul din shell-urile tradiionale UNIX este bash (acronim pentru Bourne-Again Shell), scris de Stephen Bourne. Toate comenzile interne ale shell-ului sunt disponibile i n bash.

    Exemplul 1.1 Presupunem c se dorete obinerea listei fiierelor din directorul curent sortat n ordine invers: $ ls bibliografie cuprins documente text $ ls > lista_fiiere $ sort -r lista_fiiere Se va afia: text documente cuprins bibliografie

    Metoda de mai sus necesit folosirea explicit a unui fiier intermediar temporar

    (lista_fisiere) ctre care este direcionat ieirea comenzii ls, precum i execuia succesiv a unor comenzi. O soluie mai bun este oferit de shell i se numete prelucrare n conduct (pipelining). Prelucrarea n conduct permite s se conecteze un ir de comenzi n care ieirea standard a fiecreia dintre ele este conectat direct la intrarea standard a celei care urmeaz. Aceast conectare ntre o ieire i o intrare este simbolizat de caracterul "|". Astfel lista sortat este obinut prin conectarea n conduct a comenzii ls i a programului sort. $ ls | sort -r

    - -

    7

  • Lucrarea 1 Procese Linux

    Exemplul 1.2 Un alt exemplu util este examinarea coninutului unui director mai mare, se folosete programul less pentru vizualizare: $ ls /usr/bin | less Alte tipuri de comenzi:

    Comenzi shell generale: $ date - afieaz data curent; $ exit - nchide sesiunea de lucru; $ man - cutarea subiectului indicat n sistemul de fiiere cu documentaia de care dispune sistemul $ man man - cutarea informaiilor despre sistemul de manuale on-line; Pe unele sisteme cu resurse reduse (memorie intern, spaiu pe disc) sistemul de manuale este nlocuit cu un help mai puin consumator de resurse, dar cu mai puine informaii: $ help who - se obin informaii despre opiunile comenzii who; Comenzi shell referitoare la fiiere: $ mkdir nume_catalog - creeaz un nou catalog (director) cu numele nume_catalog, n directorul curent; $ rmdir nume_catalog - terge directorul nume_catalog; acesta trebuie s nu conin nici un fiier; $ pwd - afieaz catalogul curent de lucru al utilizatorului; $ cd [nume_catalog] - schimb catalogul curent, noul catalog de lucru fiind cel specificat n nume_catalog; $ ln nume_fiier nume_legatur - creeaz o noua legtur cu numele la fiierul nume_fiier; $ rm nume_fiier - terge fiierul nume_fiier; $ mv nume_vechi nume_nou - redenumete/mut un fiier; $ cp fiier_surs fiier_destinaie - copiaz fiiere $ find catalog_start -name fiier print - afieaz numele cataloagelor (din structura arborescent a crei rdcini este specificat ca prim parametru al comenzii), care conin fiierul cu numele fiier.

    1.3 Dezvoltarea programelor sub Linux 1.3.1 Editarea programelor

    n sesiunile care pot folosi interfaa grafic a sistemului, editarea fiierelor surs se face cel mai simplu cu utilitarul gedit. $ gedit nume_fisier

    Comenzile acestuia se gsesc n meniu i sunt asemantoare cu ale oricrui alt editor de text. n sesiunile care nu pot folosi interfaa grafic (cum este conectarea ssh la HPC), pentru

    editarea fiierelor sursa se poate folosi unul dintre urmtoarele editoare : vi, joe, jed. De exemplu, cel mai simplu i mai folosit mod de a apela vi este: $ vi nume_fisier unde nume_fiier este numele fiierului de editat. Dup introducerea acestei linii de comand, pe ecran vor fi afiate liniile de nceput ale fiierului. Pe ultima linie a ecranului apare un mesaj care

    8

  • Felicia Ionescu, Valentin Pupezescu Laborator de Calcul paralel

    const din numele fiierului i dimensiunea sa n cazul n care fiierul exist pe disc sau numele fiierului i mesajul No such file or directory sau New file n funcie de versiunea de vi. Dialogul utilizator/vi se desfoar fie n modul comand fie n modul introducere text. La terminarea introducerii textului se apas pentru trecerea n modul comand. Exemple de comenzi vi: :wq salvarea pe disc i ieirea din vi; :w scriere n fiierul specificat n linia de apel a editorului fr nchiderea editorului; :w nume_fisier2 scrierea n fiierul nume_fisier2 (alt fiier dect cel specificat iniial n linia

    de apel); :q - ieirea din editor fr salvare dac nu s-au fcut modificri; :q! - ieirea din editor fr salvarea modificrilor;

    1.3.2. Compilarea programelor Linux ofer un mediu complet pentru dezvoltarea de programe i aplicaii, incluznd

    biblioteci standard, compilatoare, depanatoare i ntregul set de utilitare software necesar. n mod obinuit, dezvoltarea de programe pentru UNIX se face n limbajele C/C++. Compilatorul standard pentru aceste limbaje este compilatorul GNU, gcc pentru C i g++ pentru C++.

    n afar de C i C++, multe alte limbaje compilate sau interpretate sunt disponibile sub Linux, cum ar fi FORTRAN, JAVA etc.

    Exemplul 1.3 Comanda urmtoare compileaz programul prog.c i genereaz executabilul cu numele prog: $ gcc prog.c o prog Dac nu se specific parametrul [-o nume] compilatorul produce ca ieire executabilul a.out. Alte opiuni ale compilatorului gcc se pot gsi prin comanda: $ man gcc De exemplu: -O sau -O3 realizeaz optimizarea codului executabil, este bine s se foloseasc n special dac se

    urmrete viteza de execuie i nu lungimea codului; -c realizeaz numai compilarea, care n combinaie cu -o genereaz mai multe fiiere obiect care apoi

    vor fi link-edit-ate ntr-un singur executabil; -l[biblioteca] introduce la link-edit-are biblioteca cerut, n desfurarea lucrrilor de laborator se

    va utiliza biblioteca matematic (-lm) i pthread (-lpthread); -L/path d indicaii asupra localizrii bibliotecilor suplimentare, nu cele implicite ale compilatorului; -I/path d indicaii asupra localizrii header-elor suplimentare. Exemplul 1.4 Secvena de comenzi: $ gcc -c p1.c -o p1.o -I/home/user/include $ gcc -c p2.c -o p2.o -I/usr/local/include $ gcc p1.o p2.o main.c -L/usr/local/lib -L/home/user/lib -lmylib -luser -o program compileaz p1.c cu header-ele suplimentare n /home/user/include i genereaz p1.o; compileaz p2.c cu header-ele suplimentare n /usr/local/include i genereaz p2.o; compileaz main.c i genereaz executabilul program, el va fi link-edit-at cu obiectele p1.o i p2.o

    mpreun cu bibliotecile libmylib.a i libuser.a care se gsesc n /usr/local/lib i /home/user/lib.

    - -

    9

  • Lucrarea 1 Procese Linux

    Cutarea n biblioteci se face n ordinea specificrii opiunilor -l n linia de comand. Bibliotecile sunt fiiere cu extensia .a (archive file pentru biblioteci statice) sau .so (pentru biblioteci dinamice). Cele mai folosite biblioteci se afl n cataloagele /lib , /usr/lib i /usr/local/lib, dar pot exista i n /opt/lib n alte sisteme (dependent de distribuie).

    1.4. Procese Linux

    Procesul este unitatea elementar de execuie a sistemului de operare UNIX, gestionat de ctre modulul de gestiune a proceselor i procesoarelor din nucleul sistemului.

    Un proces este o instan de execuie a unui program. n terminologia UNIX un proces este execuia unei imagini, unde prin imagine se nelege ansamblul elementelor care constituie contextul de execuie al procesului. Aceste elemente sunt:

    programul (codul) datele asociate programului starea fiierelor deschise (tabela descriptorilor de fiiere utilizator) catalogul de lucru Pentru a putea fi gestionate de nucleu, n UNIX procesele primesc identificatori numii pid-

    uri (n generalo, numere ntregi) prin care sunt, la un moment dat, unic determinate n sistem. La nivelul sistemului UNIX, fiecrui proces i se aloc o intrare ntr-o tabel sistem (tabela

    de procese). Dimensiunea acestei tabele este dat de constanta sistem NPRCC, iar numrul maxim de procese active care pot fi asociate unui acelai utilizator este MAXUPROC. Pid-ul este de fapt indicele intrrii asociate procesului n tabel. O intrare n tabel conine informaii necesare nucleului sistemului de operare, ca de exemplu starea procesului sau numele utilizatorului care execut procesul.

    Spaiul de adrese al unui proces cuprinde mai multe segmente cu rol diferit, funcie de natura informaiilor pe care le conin:

    zona antet (numita i zona user sau zona U), inaccesibil procesului, conine structuri de date importante prin care nucleul gestioneaz procesul i-i ofer servicii prin intermediul apelurilor sistem.

    segmentul de cod pur (text) este protejat la scriere i adesea partajat; folosind opiunea -n, compilatorul poate genera programe avnd segmente text reentrante. Cnd acest segment este partajat de ctre mai multe procese, el nu sufer operaia de swapping.

    segmentul de date poate fi scris de ctre procesul utilizatorului care nu este nici partajat nici accesibil celorlalte procese; el conine date alocate static sau dinamic de ctre proces; cuprinde zona de date data, zona de rezervri bss (date neiniializate) i zona de alocare dinamic heap.

    segmentul de stiv nu este partajat i crete automat n momentul epuizrii cantitii de memorie pe care o avea la dispoziie (dac maina dispune de mecanisme hardware de gestiune a memoriei); n caz contrar fiierul executabil trebuie reconstruit, indicndu-se o stiv de dimensiuni mai mari.

    Un proces se poate afla ntr-una din urmtoarele stri: n execuie (running) - n mod utilizator sau n mod nucleu, dac procesul execut o

    funcie sistem; pregtit pentru execuie (ready) - ateapt atribuirea procesorului de ctre planificator n ateptare (waiting) - ateapt producerea unor evenimente externe procesului, ca de

    exemplu terminarea unei operaii de I/O.

    10

  • Felicia Ionescu, Valentin Pupezescu Laborator de Calcul paralel

    n UNIX procesele au caracter dinamic. Ele se creeaz la execuia unei comenzi, putnd da natere altor procese i dispar. n felul acesta se creeaz o ierarhie dinamic de procese n sistem, care ncepe cu procesul 0 (swapper), continu cu procesul 1 (init), proces care d natere unor procese fiu (unele dintre ele sunt shell-uri), care la rndul lor dau natere altor procese fiu.

    1.4.1. Comenzi shell referitoare la gestiunea proceselor

    Pentru a obine starea la un moment dat a proceselor sistem se poate utiliza comanda:

    $ ps [optiuni] Dac nu se specific alte opiuni se afieaz numai lista de procese asociate terminalului curent. Cteva din opiunile posibile:

    -a - afiarea de informaii despre toate procesele din sistem cu excepia proceselor de tip process group leaders i a proceselor neasociate cu un terminal;

    -e - afiarea de informaii despre absolut toate procesele din sistem; -f - listing complet; se caut att n memorie ct i n zona de evacuare (swapping)

    pentru a afla comanda complet cu care s-a creat procesul; dac nu se reuete, se afieaz numai numele prescurtat al comenzii ntre [].

    -l - format lung de afiare (informaie complet). Tot pentru vizualizarea proceselor din sistem se poate folosi programul top: $ top [opiuni] [fiier] Programul permite monitorizarea n timp real a proceselor din sistem i a altor parametrii cum ar fi ncrcarea sau utilizarea memoriei. Lista opiunilor:

    k - distruge un proces; i - afieaz doar procesele active; n sau # - modific numrul proceselor afiate; r modific prioritatea (vezi nice) a unui proces; S - schimb modul cumulativ; totalizeaz sau nu i timpul proceselor; s - schimba intervalul de actualizare a datelor pe ecran; f sau F - adaug sau scade cmpuri afiate; o sau O - modific ordinea de afiare a informaiilor;

    Utilizatorul are posibilitatea s determine terminarea forat a unor procese care lucreaz, dureaz mult, nu evolueaz conform ateptrilor, sunt blocate n ateptarea unor condiii care nu se vor ndeplini niciodat, etc. Pentru aceasta el are la dispoziie comanda: $ kill [numr_semnal] identificator_proces Comanda kill poate controla ntr-un mod mai complex execuia proceselor, mod dependent chiar de procesele controlate. Procesele pot primi din exterior semnale i pot reaciona la acestea n modul n care programatorul crede de cuviin. Semnalul SIGKILL (cu numrul 9) nu poate fi tratat de procese i efectul va fi ca procesul dispare. Opiunea -l tiprete o list a semnalelor disponibile n sistem pentru comunicarea cu procesele. Utilizarea cea mai frecvent este: $ kill -SIGTERM 5678 care transmite procesului cu id 5678 semnalul SIGTERM n sperana c acesta se va termina.

    - -

    11

  • Lucrarea 1 Procese Linux

    1.4.2 Crearea dinamic a proceselor Mecanismul fundamental prin care se creeaz noi procese este apelul funciei de sistem: pid_t fork() care creeaz un nou proces prin copierea identic a procesului apelant; n raport cu fork(), primul proces este procesul printe iar cel creat n urma apelului este procesul fiu. Valoarea returnat de funcia fork() este:

    n procesul printe, este retunat pid-ul fiului; n procesul fiu se returneaz 0; n caz de eroare returneaz -1 i seteaz variabila global errno;

    ntreaga imagine a procesului printe este motenit de fiu, cu excepia segmentului de cod pur care nu se duplic ci se utilizeaz n comun. Procesul fiu continu execuia instruciunii urmtoare apelului funciei fork().

    Orice proces poate afla propriul pid i pid-ul printelui apelnd funciile: pid_t getpid( ) - returneaz pid-ul procesului curent pid_t getppid() returneaz pid-ul procesului printe Exemplul 1.5. // Hello_Process.c #include int main(){ if (fork()== 0) printf("Hello FIU pid = %d ppid = %d\n",getpid(),getppid()); else { printf("Hello PARINTE pid = %d ppid = %d\n", \ getpid(),getppid()); sleep(2); } return 0; } Compilare: $ gcc Hello_Process.c o Hello_Process Executie: $ ./Hello_Process Afiseaza: Hello PARINTE pid = 6416 ppid = 4489 Hello FIU pid = 6417 ppid = 6416 n exemplul de mai sus, procesul printe creeaz un proces fiu, cele dou procese vor afia la consol cte un mesaj, printele ateapt terminarea fiului apelnd funcia sleep(), apoi se termin i el.

    De remarcat c nu exist o ordine prestabilit de apariie a mesajelor, deoarece execuia este determinat de planificarea executat de sistem, iar ident. (pid) se modific de la o execuie la alta.

    14.3 Funcii de ateptare a proceselor fiu

    Dup crearea unuia sau a mai multor fii prin apelul funciei fork(), procesul printe poate atepta ca unul din procesele fiu create s-i termine execuia, prin apelul funciei wait(), care are prototipul: pid_t wait(int *status)

    Procesul care apeleaz wait() este suspendat pn se termin unul dintre fiii si. n cazul execuiei normale funcia wait() returneaz pid-ul procesului fiu care i-a terminat execuia; n

    12

  • Felicia Ionescu, Valentin Pupezescu Laborator de Calcul paralel

    cazul n care nu mai exist nici un fiu, wait() returneaz -1. Starea obinut n status este valoarea returnat (de instruciunea return sau funcia exit()) de procesul care s-a terminat. Exemplul 1.6. n acest exemplu un proces iniial apeleaz funcia fork() ntr-o bucl for. Fiecare nou proces creat ntr-o iteraie continu execuia n bucl i n iteraia urmtoare creeaz, la rndul lui un alt proces, obinndu-se un arbore de procese. Dup fiecare fork(), dac execuia este n fiu se afieaz un mesaj, dac este n printe se ateapt terminarea fiului (cu wait()) // Tree.c #include #include int main(){ int i; printf("PARINTE pid = %d \n",getpid()); for (i = 0; i < 3; i++){ if (fork()== 0) { // Executie in fiu printf("i = %d FIU pid = %d ppid = %d \n" ,i, \ getpid(),getppid()); sleep (1); } else wait(0); // Executie in parinte } return 0; } La execuie se afieaz mesaje astfel: PARINTE pid = 6546 i = 0 FIU pid = 6547 ppid = 6546 i = 1 FIU pid = 6548 ppid = 6547 i = 2 FIU pid = 6549 ppid = 6548 i = 2 FIU pid = 6550 ppid = 6547 i = 1 FIU pid = 6551 ppid = 6546 i = 2 FIU pid = 6552 ppid = 6551 i = 2 FIU pid = 6553 ppid = 6546 Identificatorii proceselor se schimb de la o execuie la alta, iar ordinea de execuie depinde de planificarea executat de sistemul de operare.

    Se poate ca un proces s atepte s se termine toi fii lui apelnd funcia wait() ntr-o bucl pn cnd returneaz -1 (nu mai sunt fii de ateptat).

    n varianta Tree_1.c a programului precedent, fiecatre proces ateapt la sfrit pn ce se termin toi fii pe care i-a creat, nu imediat dup crearea fiecruia:

    // Tree_1.c #include #include int main(){ int i; printf("PARINTE pid = %d \n",getpid()); for (i = 0; i < 3; i++){ if (fork()== 0) { // Executie in fiu printf("i= %d FIU pid = %d ppid = %d \n",i,getpid(),getppid()); sleep (1); } }

    - -

    13

  • Lucrarea 1 Procese Linux

    while(wait(0) != -1); return 0; }

    Funcia: pid_t waitpid(pid_t pid,int *status,int options) este similar cu funcia wait() cu deosebirea c i se transmite ca parametru pid-ul procesului care se dorete ateptat.

    Funciile wait i waitpid sunt declarate n header-ele stdlib.h i sys/wait.h. Dac procesul printe se termin nainte de terminarea fiilor si, atunci procesul init (cu

    pid = 1) va deveni printele acestora. Termenul de zombie denumete acele procese UNIX care au fost lansate de ctre un proces printe i printele nu a ateptat terminarea procesului fiu; un proces fiu care s-a terminat este trecut de ctre nucleu n starea zombie pn cnd printele execut wait.

    ncepnd cu UNIX System v Release 4, s-a introdus o posibilitate simpl de evitare a apariiei proceselor zombie. Este suficient ca n partea de iniializare s apar secvena de mai jos: #include . . . . signal(SIGCHLD,SIG_IGN);

    Prin apelul signal se cere procesului respectiv s ignore (SIG_IGN) semnalul de terminare a proceselor fii (SIGCHLD). Acest mecanism este de asemenea valabil pentru toate versiunile de sistem de operare Linux.

    Cnd este executat o comand, shell-ul ateapt n background, prin apelul funciei wait(), care permite shell-ului s atepte terminarea procesului lansat (ca proces fiu).

    Dac utilizatorul plaseaz & la sfritul comenzii (pentru a indica shell-ului c procesul se va execut n background), shell-ul nu ateapt pn cnd se termin execuia comenzii (fiului) i revine imediat cu prompt-ul caracteristic.

    Cnd comanda s-a executat, a fost ntors un cod de retur prin apelul funciei exit() sau return. ntregul returnat de aceste apeluri este disponibil procesului printe prin argumentul status al funciei sistem wait(). n cazul liniei de comand (shell-ului), codul de retur este pstrat ntr-o variabil sistem numit status. Aceasta poate fi inspectat prin comanda: # echo $status

    1.4.4. Execuia unui fiier executabil n imaginea unui proces Mecanismul fork() este singurul mecanism prin care se creeaz noi procese n UNIX. Deoarece aceste procese sunt identice cu procesul printe, el introduce astfel o limitare. Ar fi util ca n cadrul creat de un apel fork() s se poat execut un alt fiier executabil care s joace rol de fiu al procesului care a apelat fork().

    Aceast facilitate este oferit prin apelul funciei generice exec(). Funcia exec() nlocuiete procesul apelant prin programul coninut ntr-un fiier executabil indicat ca parametru al procedurii i ncepe execuia acestui program de la punctul su de intrare. Coninutul fiierului executabil nlocuiete numai imaginea unui proces, nu creeaz un nou proces. Informaia (din tabela de procese) asociat procesului care a apelat exec()nu este practic modificat, n mod normal fiierele deschise rmn deschise i dup apelul funciei exec().

    Dac funcia exec()se execut corect, nu exist cod de retur n procesul apelant iar imaginea procesului apelant este pierdut. Programul apelant nu primete controlul dect n cazul n care exec() eueaz (de exemplu nu se poate gsi sau nu poate execut fiierul indicat).

    Variantele funciei exec (execl, execv, execlp), depind de tipul argumentelor, care const din numele fiierului care conine codul executabil care va nlocui segmentul de cod existent,

    14

  • Felicia Ionescu, Valentin Pupezescu Laborator de Calcul paralel

    precum i argumentele liniei de comand pentru funcia main (int argc, char** argv): caracterul l indic o list de parametri (terminat cu null); caracterul v indic vector de parametri; caracterul p indic faptul ca primul parametru este calea fiierului cu codul executabil (path). De exemplu, prototipul funciei execlp este: int execlp (

    const char *path, /* cale si nume fiier cu noua imagine */ const char *arg0, /* nume fiier cu noua imag - arg. argv[0] */ const char *arg1, /* corespunde argumentului argv[1] */ ................, const char * argn, /* ultimul argument */ char * /* NULL */); /* inchiderea listei de argumente */

    Exemplul 1.7. // Parent.c #include #include int main(){ char arg1[4]; pid_t pid = getpid(); sprintf(arg1,"%4d", pid); printf("Proces Parinte pid = %d\n", pid); if (fork() == 0) execlp("./Child","Child",arg1,(char*)0); wait(0); return 0; } // Child.c #include // Argumentul primit in argv[1] este pid-ul parintelui int main(int argc, char** argv){ int arg1 = atoi(argv[1]); printf("Procesul Fiu a primit argumentul: %d \ si are pid = %d ppid = %d \n", arg1, getpid(), getppid()); return 0; } n acest exemplu:

    Procesul printe (programul Parent.c) creeaz un proces fiu prin apelul funciei fork() i ateapt terminarea acestuia (prin apelul funciei wait)

    Procesul fiu creat nlocuiete imaginea motenit cu o nou imagine (fiierul executabil Child, creat prin compilarea programului Child.c), apelnd execlp() cu argumentele: Calea relativ (path) (./Child ) a fiierului executabil Numele fiieului executabil (argv[0]) Child Un argument (arg1) care conine pid-ul procesului printe

    Procesul fiu afieaz valoarea parametrului primit, pid, ppid i revine. La execuie a programului se vor afia mesajele: $ Parent Proces Parinte pid = 7086 Procesul Fiu a primit argumentul: 7086 si are pid = 7087 ppid = 7086 Bineinteles, identificatorii proceselor se modific la fiecare execuie.

    - -

    15

  • Lucrarea 1 Procese Linux

    Exerciii E1.1. Scriei si executai toate exemplele prezentate n lucrare. E1.2. Creeai un proces printe care s execute o bucl for cu 0 i < 4. n iteraiile pare fiecare proces creeaz un fiu cruia i nlocuiete imaginea cu un program executabil cruia i transmite ca argumente calea (path), numele fiierului executabil i contorul i al buclei. Creai programele, executai i explicai rezultatele obinute.

    E1.3. Creeai un proces printe care s execute o bucl for cu 0 i < 3. n fiecare iteraie creeaz un fiu cruia i nlocuiete imaginea cu un program executabil cruia i transmite ca argument calea (path) i numele fiierului executabil. Creai programele, executai i explicai rezultatele obinute. Bibliografie 1. Documentatia instalata Linux man 2. L. Greenfield, Linux User Guide 3. P. Cobbaut, Linux Fundamentals 4. Felicia Ionescu, Calcul paralel, 2014, slide-uri publicate pe site-ul moodle ETTI. 5. Felicia Ionescu, Calcul paralel, Anexe, publicate pe site-ul moodle ETTI. 6. B. Barney, Introduction to Parallel Programming, Lawrence Livermore National Laboratory,

    2013, https://computing.llnl.gov/tutorials/parallel_comp/

    16

    1.2.1 Scurt istoric 1.2.2 Gestiunea utilizatorilor 1.2.3 Structura sistemului de fiiere UNIX/Linux 1.2.4 Interpretoare de comenzi 1.3 Dezvoltarea programelor sub Linux 1.4. Procese Linux 1.4.1. Comenzi shell referitoare la gestiunea proceselor 1.4.2 Crearea dinamic a proceselor 14.3 Funcii de ateptare a proceselor fiu 1.4.4. Execuia unui fiier executabil n imaginea unui proces