Sunteți pe pagina 1din 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 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 toolseturile 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.

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.

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 user@141.85.254.57
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
exit
man
man man

- afieaz data curent;


- nchide sesiunea de lucru;
- cutarea subiectului indicat n sistemul de fiiere cu documentaia de care dispune sistemul
- 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

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 <ESC> 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 piduri (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 <stdio.h>
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 <stdio.h>
#include <sys/wait.h>
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 =
i = 0 FIU pid
i = 1 FIU pid
i = 2 FIU pid
i = 2 FIU pid
i = 1 FIU pid
i = 2 FIU pid
i = 2 FIU pid

6546
= 6547
= 6548
= 6549
= 6550
= 6551
= 6552
= 6553

ppid
ppid
ppid
ppid
ppid
ppid
ppid

=
=
=
=
=
=
=

6546
6547
6548
6547
6546
6551
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 <stdio.h>
#include <sys/wait.h>
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.h>
. . . .
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,
const char *arg0,
const char *arg1,
................,
const char * argn,
char * /* NULL */);

/* cale si nume fiier cu noua imagine */


/* nume fiier cu noua imag - arg. argv[0] */
/* corespunde argumentului argv[1] */
/* ultimul argument */
/* inchiderea listei de argumente */

Exemplul 1.7.
// Parent.c
#include <stdio.h>
#include <sys/types.h>
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 <stdio.h>
// 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