Sunteți pe pagina 1din 208

CAPITOLUL 1

INTRODUCERE IN ALGORITMICA DE RETEA


Scopul algoritmicii de reea este combaterea strangulrilor de reea
cauzate de diferite implementri. Pe lng tehnici specifice, sunt
cristalizate principiile crerii de soluii pentru evitarea strangulrilor n
internet, nglobate n ceea ce se numeste algoritmica de reea sau teoria
algoritmilor de reea. Ea asigur cititorului ustensile pentru crearea
diferitelor implementri, pentru anumite contexte particulare i pentru
abordarea noilor strangulri care cu siguran vor aprea n lumea n
permanent schimbare a reelelor.
Algoritmica de reea sau teoria algoritmilor de reea trece dincolo de
crearea algoritmilor eficieni pentru sarcinile reelei, chiar dac acetia
au un rol important. In particular, teoria algoritmilor de reea recunoate
importana major a abordrii sistemelor interdisciplinare pentru
fluentizarea implementrilor de reea. Algoritmica de reea este o
abordare interdisciplinar deoarece cuprinde domenii ca arhitecturi i
sisteme de operare (pentru creterea vitezei serverului), proiectare
hardware (pentru creterea vitezei componentelor de reea cum sunt
ruterele), i proiectarea de algoritmi (pentru proiectarea unor algoritmi
scalabili). Algoritmica de reea este i o abordare de sistem, fiind descris
un set de 15 principii i utilizarea lor, care exploateaz faptul c ruterele
i serverele sunt sisteme, n care eficiena poate fi obinut prin
deplasarea funciilor n spaiu i timp ntre subsisteme.
Problemele algoritmicii de reea sunt legate de performana
fundamental legat de strangulrile de reea/bottlenecks. Soluiile
adoptate de algoritmica de reea genereaz un set de tehnici
fundamentale pentru tratarea acestor strangulri.
1.1. PROBLEMA: STRANGULRILE DE REEA
Principala problem avut n vedere este realizarea unor reele uor de
folosit, utiliznd hardware-ul la capacitatea maxim. Uurina folosirii
vine de la folosirea unor abstractizri puternice de reea, cum sunt
interfeele socket i expedierea/naintarea bazat pe prefix a pachetelor.
Trebuie avut grij ns, deoarece astfel de abstractizri pot duce la
scderea performanelor comparativ cu capacitatea transmisiilor pe
legturi ca fibra optic. Pentru a putea nelege aceast diferen de
performan vom examina dou categorii fundamentale de dispozitive de
reea, nodurile terminale/endnodes i ruterele.
Strangulri la nodurile terminale
Nodurile terminale sunt punctele de final ale reelei. Ele includ
calculatoarele personale i staiile de lucru precum i serverele de mari
dimensiuni, furnizoare de servicii. Nodurile terminale sunt dedicate
calculelor, spre deosebire de reele, i de obicei sunt proiectate ca s poat
realiza calcule de uz general. Astfel strangulrile nodurilor terminale sunt
de obicei rezultatul a dou cauze: structura i scala/dimensiunea.
1

Structura: Pentru a putea rula orice cod, calculatoarele personale i


serverele mari au de obicei un sistem de operare care mediaz ntre
aplicaii i hardware. Pentru a uura dezvoltarea software-ului, majoritatea
sistemelor de operare de mari dimensiuni sunt structurate cu grij, ca un
software pe niveluri; pentru a proteja sistemul de operare de alte aplicaii,
sistemele de operare implementeaz un set de mecanisme de protecie; n
final, rutinele nucleului sistemului de operare, cum sunt planificatoarele si
procedurile de alocare, sunt scrise folosind mecanisme generale, orientate
spre o clas de aplicaii ct mai larg posibil. Din pcate, combinaia ntre
software-ul pe niveluri, mecanismele de protecie, i generalitatea excesiv
poate duce la ncetinirea semnificativ a software-ului reelei, chiar i cu
procesoarele cele mai rapide.
Scala/dimensiunea: Apariia serverelor mari oferind Web i alte
servicii duce la apariia altor probleme, de performan. In particular, un
server mare cum este un server de Web, va avea de obicei mii de clieni
concureni. Multe sisteme de operare folosesc structuri de date ineficiente
i algoritmi care au fost proiectai pentru o epoc n care numrul de
legturi a fost mic.
In figura 1.1 sunt prezentate principalele strangulri ale nodurilor
terminale, mpreun cu cauzele i soluiile lor. Prima strangulare are loc
deoarece structurile sistemului de operare convenional impun copierea
pachetelor de date ntre domeniile protejate; situaia se complic i mai
mult n cazul serverelor de Web prin copieri similare pentru sistemul de
fiiere i alte manevre, ca sumele ciclice de control, care verific toate
pachetele de date. Se descriu un numr de tehnici de reducere a acestor
supraincarcari, meninnd ca scop abstractizrile sistemului, ca protecia
i structura. A doua suprancrcare major este cea generat de control,
cauzat de comutarea ntre firele de control (sau domeniile de protecie) n
timpul procesrii unui pachet.
Strangulare

Cauze

Copierea

Protecia, structura

Comutarea
contextului

Planificarea complex

Apelurile de sistem

Protecia, structura

Contoarele de timp
Demultiplexarea
Sumele de control/
CRC-uri
Codul protocolului

Exemple de soluii
Copierea mai multor blocuri
de date fr intervenia
sistemului de operare(ex.
RDMA)
Implemenetarea protocoalelor
la nivelul utilizatorului
Servere Web comandate de
evenimente
Canale directe de la aplicaii
spre drivere (ex. VIA)

Scalarea la numarul
contoarelor
Scalarea la numrul de
noduri terminale
Generalitatea
Scalarea la viteza legturilor
Generalitatea

Contoare de timp ciclice


BPF i Pathfinder/cuttor de
cale
Calculul multibit
Predicia antetului

Figura 1.1 Prezentarea strangulrilor nodurilor terminale

Aplicaiile de reea folosesc contoare de timp/temporizatoare pentru a


rezolva defeciunile. Cu un numr mare de legturi la un server
2

suprancrcarea dat de contoarele de timp poate deveni mare. De


asemenea, mesajele de la reea trebuie demultiplexate/orientate pentru a fi
recepionate de aplicaia corect. In final, mai exist alte cteva sarcini de
procesare obinuite ale protocoalelor, cum sunt alocarea bufferelor/tampoanelor de memorie i suma de control.
Strangulrile n rutere
Dei ne axm pe ruterele pentru Internet, aproape toate tehnicile descrise
pot fi folosite la fel de bine i n cazul altor echipamente de reea, cum
sunt punile/bridge, comutatoarele/switch, porile/gateway, monitoarele i
alte dispozitive de securitate, precum si pentru protocoale diferite de IP, ca
FiberChannel. De aceea, n continuare, ruterul este gndit ca un
dispozitiv generic de interconectare a reelei. Spre deosebire de nodurile
terminale, acesta este un dispozitiv cu scop special dedicat lucrului cu
reelele. Problemele fundamentale pe care le ntlnete un ruter sunt legate
de dimensiune/scal i servicii.
Scala: Dispozitivele de reea se confrunt cu dou tipuri de scalare:
scalarea benzii i scalarea populrii. Scalarea benzii are loc deoarece
legturile pe cale optic devin din ce n ce mai rapide, viteza legturilor
crescnd de la 1-Gbps la 40-Gbps, i deoarece traficul in Internet crete
continuu datorit unui set vast de aplicaii noi. Scalarea populrii are loc
deoarece tot mai multe noduri terminale sunt adugate la Internet odat cu
conectarea online a tot mai multor ntreprinderi.
Serviciile: Nevoia de vitez i dimensiune a crescut mult fa de
industria reelelor din anii 80 i 90, pe msur ce tot mai multe afaceri
deveneau online (de ex. Amazon), i au fost create noi servicii online( de
ex. Ebay). Dar succesul Internetului impune o atenie deosebit n
urmtoarea decad, pentru a-l face mai eficient, i a asigura garanii de
performan, securitate i siguran. La urma urmei, dac productorii (de
ex. Dell) vnd mai mult online dect prin alte mijloace, este important s
se ofere garanii ale reelei ntrzierea n timpul congestiei, protecia n
timpul atacurilor, i disponibilitatea cnd apar defeciuni. Gsirea unor
metode de implementare a acestor noi servicii la viteze mari va fi o mare
provocare pentru furnizorii de rutere n decada urmtoare.In figura 1.2
sunt prezentate principalele strangulri din rutere abordate aici, mpreun
cu cauzele i soluiile lor.
In primul rnd, toate dispozitivele de reea expediaz pachete destinaiei
prin consultarea (looking up) unui tabel de naintare(forwarding). Prin
consultarea celui mai simplu tabel de naintare se gsete o potrivire
exact (exact match) cu adresa destinaiei, ca de exemplu n cazul punilor.
Sunt descrise scheme de cutare rapide i scalabile, pentru potriviri
exacte. Din pcate, scalarea la dimensiunea populaiei a fcut ca pentru
rutere cutrile sa fie mult mai complexe. Pentru a trata populaiile mari de
pe Internet, ruterele rein o singur intrare numit prefix (analog cu codul
telefonic de zon) pentru un grup mare de staii. Astfel ruterele trebuie s
fac o cutare mult mai complex pentru potrivirea celui mai lung
prefix/the longest-prefix-match. Sunt descrise soluii la aceast problem,
scalabile la viteze mari i dimensiuni mari ale tabelelor.
Multe rutere ofer azi ceea ce este deseori numit diferenierea
serviciului, prin care diferite pachete pot fi tratate diferit pentru a oferi
garanii asupra serviciului i a securitii. Din pcate, acest lucru necesit o
3

form i mai complex de cutare numit clasificarea pachetelor, unde


cutarea se bazeaz pe destinaie, surs, i chiar serviciile pe care un
pachet le ofer.
Apoi, toate dispozitivele de reea pot fi considerate comutatoare ce
unteaz pachetele, care vin de la un set de legturi de intrare spre un set
de legturi de ieire. Problema fundamental este crearea unui comutator
de vitez mare. Acest lucru este dificil, mai ales dac ne gndim la
creterea diferenelor ntre vitezele optice i electronice. Soluia standard
este folosirea paralelismului printr-un comutator crossbar. Din pcate,
programarea unui comutator crossbar la viteze mari nu este uoar, i
paralelismul este limitat de fenomenul cunoscut ca HOL (head-of-line
blocking)/ blocare la nceputul liniei. Mai ru, creterea populaiei i
multiplexarea optic foreaz furnizorii de comutatoare s creeze
comutatoare cu un numr mare de porturi, care exacerbeaz aceste
probleme.
Strangulare
Cutri
exacte

Cauze

Exemple de soluii

Scalarea la viteza legturii

Dispersarea paralel/hashing

Cutri de
prefix

Scalarea la viteza legturii


Scalarea la dimensiunea bazei de
date pentru prefixe

Noduri ordonate multibit


comprimate

Clasificarea
pachetelor

Diferenierea serviciilor (DiffServ)


Scalarea la viteza legturii i la
dimensiune

Algoritmi cu arbori de
decizie
Paralelism hardware
(CAM-uri)

Comutare

Diferena ntre vitezele electronice


i cele optice
Blocare HOL

Comutator crossbar
Cozi de ieire virtuale

Diferenierea serviciilor
Scalarea la viteza legturii
Scalarea la dimensiunea memoriei

FQ ponderat
Servire carusel cu deficit
(Deficit round robin)
DiffServ,Nucleu fr stri
(Core Stateless)

Scalarea la viteza magistralelor


interne

Legturi directe sigure prin


magistrale interne

Scalarea la viteza legturii

DCU al firmei Juniper


Cutarea traseului cu filtre
Bloom
Extragerea worm sigatures

Tratarea
corect a
cozilor
FQ (fair
queueing)
Limea de
band
intern
Msurarea
Securitatea

Scalarea la numrul i intensitatea


atacurilor

FIGURA 1.2 Prezentarea strangulrilor nodurilor terminale

In timp ce strangulrile anterioare sunt cauzate de scalare, urmtoarea


strangulare este cauzat de nevoia de servicii noi. Alt strangulare care
devine o problem n cretere este limea de band a ruterului. Se
folosesc tehnici simple: conectarea direct prin magistrale interne/striping
i legturi chip-la-chip.
Dintre serviciile ce trebuie s fac parte dintr-un viitor Internet, bine
administrat, este includerea n rutere a unui suport pentru msurri,
deoarece msurrile sunt cheia pentru a proiecta reele care ofer garanii.
Ruterele de azi asigur ceva suport pentru msurri, contorizri si
nregistrri de NetFlow.
4

Suportul pentru securitate este parial inclus deja n rutere. Datorit


sofisticrii crescute, agresivitii, i ratei de atacuri asupra reelei, este
esenial implementarea securitii n rutere sau dispozitive de reea
specializate detectrii/prevenirii intruziunilor. Dar dac dispozitivul de
securitate nu poate ine pasul cu legturile de mare vitez, pot fi omise
informaii vitale, necesare pentru detectarea unui atac.
Filtre Bloom: structur de date aleatorizat ingenios pentru reprezentarea concis a unui
set/mulime, care suport
interogri/queries despre apartenena aproximativ la
mulime.Are o mare eficien spaial, iar riscul/costul este de a detecta falsuri pozitive.

1.2. TEHNICI: TEORIA ALGORITMILOR DE REEA


Vor fi discutate tehnici specifice: pentru ntreruperi, copiere, i contoare
de timp circulare/timing wheels; pentru Pathfinder i Sting; de ce unele
rutere sunt foarte ncete; i dac serverele de Web pot s se scaleze la noile
dimensiuni. Ceea ce leag mpreuna toate aceste probleme este
algoritmica de reea; algoritmica de retea admite importana primordial a
unei abordari sistemice, necesar pentru fluentizarea implementrilor de
reea.
Internet-ul este un sistem compus din rutere i legturi; dar este mai
puin vizibil faptul c fiecare dispozitiv de reea, de la un Cisco GSR la un
server Web Apache, reprezint sisteme, construite prin interconectarea
subsistemelor. De exemplu, un ruter nucleu este compus din carduri de
linie cu motoare de naintare i memorii de pachete, conectate printr-un
comutator crossbar. Comportamentul ruterului depinde de decizii luate la
diferite scale de timp, ncepnd cu momentul producerii lor (cnd
parametrii implicii sunt stocai n NVRAM) pn la momentul calculului
rutei (cnd ruterele calculeaz traseul) i la momentul expedierii
pachetelor (cnd pachetele sunt trimise ruterelor adiacente).
Astfel o observaie important n abordarea sistemic este c deseori
poate fi proiectat un subsistem eficient prin mutarea n spaiu (spre alte
subsisteme) a ctorva din funciile sale, sau mutarea n timp (anterior sau
posterior momentului aparent n care funcia este necesar). Intr-un anume
sens, cel care practic algoritmica de retea este un oportunist fr scrupule
care schimb regulile jocului n orice moment, pentru a-l face mai uor.
Singura condiie este ca funciile oferite de sistemul global s continue s
satisfac utilizatorul.
innd cont de constrngerile impuse implementrilor reelei la viteze
mari sarcini din ce n ce mai complexe, sisteme tot mai mari, memorii
mici de vitez mare, i un numr redus de accesri ale memoriei trebuie
folosit orice artificiu, orice metod sau resurs pentru a face fa vitezei i
dimensiunii din ce n ce mai mari ale Internetului. Proiectantul poate
ncerca s plaseze problema n hardware, s schimbe ipotezele sistemului,
s proiecteze un algoritm nou orice este necesar pentru a rezolva
problema.
1.2.1 Exemplu: depistarea pachetelor rele (evil packets)
Imaginati-va un monitor de reea terminal/front-end, sau un sistem de
detectare a intruilor, de la periferia unei reele de intreprindere, ce vrea s
marcheze pachetele de intrare suspecte, care ar putea conine atacuri
asupra unor calculatoare interne. Un atac des ntlnit este inundarea
5

bufferului/depirea capacitii bufferului, cnd codul mainii C se


plaseaz n antetul de reea F.
Daca staia destinaie aloc un buffer prea mic pentru cmpul F al
antetului i nu are grij s verifice depirea/inundarea, codul C poate
ajunge n stiva staiei destinaie. Cu un mic efort suplimentar, intrusul
poate face ca staia destinaie s execute codul ru C. C va prelua controlul
staiei destinaie. In figura 1.3 este reprezentat un astfel de atac, incorporat
ntr-un cmp familiar, Web URL (Uniform Resource Locator) destinaie.
Cum poate monitorul detecta prezena unui URL suspect? O cale este s
observm c URL-urile care conin un cod duntor sunt deseori prea
lungi (o verificare uoar) i deseori au o mare parte de caractere
neobinuite pentru URL-uri, cum este #. Monitorul poate marca astfel de
pachete (cu o lungime prea mare sau cu prea multe caractere neobinuite),
printr-o examinare amnunit.
Dar implicaiile acestei strategii asupra securitii trebuie gndite atent.
De exemplu, pot exista programe inofensive, cum sunt scripturi CGI n
URLuri, ce duc pe piste false. Fr a intra n prea multe amnunte legate
de toate implicaiile arhitecturale, s presupunem c aceasta a fost o
specificare trimis arhitectului de chip-uri, de ctre arhitectul de
securitate.Vom folosi o problem ca model, pentru a observa modul de
lucru al teoriei algoritmilor.Avnd de a face cu o astfel de specificare,
proiectantul de chip-uri poate folosi urmtoarele procese de proiectare,
care ilustreaz unele principii ale algoritmicii de reea. Procesul ncepe cu
proiectarea strawman i rafinarea proiectarii, prin proiectarea unui
algoritm mai bun, relaxarea specificaiilor i exploatarea hardware-ului.
Cod duntor
Sistem de
detecie al
intruilor

AIM://depire # * # ! * # ...... *

FIGURA 1.3 Gsirea unui pachet duntor, observand frecventa caracterelor nelistabile

Tabloul
Prag

Tabloul
Contor

2%

1%

Cod duntor
AIM://depire # * # ! * # ...... *

Incrementeaz

255
FIGURA 1.4 Soluia strawman pentru detectarea unui pachet duntor: se contorizeaz
fiecare caracter ntr-un tablou contor i apoi n pasul final se compar valorile cu cele din
tabloul de praguri

1.2.2 Soluia strawman


Verificarea lungimii totale este implementat direct, deci ne concentrm
la verificarea unor caractere suspicioase predominante. Prima soluie
strawman este ilustrat n figura 1.4. Chip-ul pstreaz dou tablouri, T i
C, cu cte 256 de elemente fiecare, unul pentru fiecare valoare posibil, pe
caractere de 8 bii. Tabloul de praguri, T, conine procentul acceptabil (ca
o fraciune din lungimea total a URLului) pentru fiecare caracter. Dac
apariiile unui caracter ntr-un URL trec peste prag, pachetul este marcat.
Fiecare caracter are un prag diferit.
Tabloul de contorizare C, n mijloc, conine contorul curent C[i] pentru
fiecare caracter i posibil. Cnd chip-ul citete un nou caracter i in URL,
se incrementeaz C[i] cu 1. C[i] are iniial valoarea 0 pentru toate valorile
lui i cnd un nou pachet este ntlnit. Procesul de incrementare ncepe
numai dup ce chip-ul analizeaz antetul HTTP i recunoate nceputul
URL-ului.
In HTTP, sfritul URL-ului este reprezentat cu dou caractere de rnd
nou; aa c lungimea unui URL se poate ti doar dup ce s-a parcurs
ntregul ir URL. Astfel, dup ce a fost ntlnit sfritul URLului, chip-ul
realizeaz o ultim parcurgere a tabloului C. Dac C [ j ] L T [ j ] pentru
orice j, unde L este lungimea URL-ului, pachetul va fi marcat.
Presupunem c pachetele vin cu vitez mare n monitor i dorim s
terminm procesarea pachetului nainte de sosirea urmtorului. Aceast
cerin, numit procesare la viteza liniei/wire speed processing, este des
ntlnit n reele; se previne amnarea procesrii chiar i n ce mai
defavorabil caz. Pentru a ndeplini cerinele de procesare la viteza liniei,
ideal chip-ul ar trebui s fac un numr mic i constant de operaii pentru
fiecare octet al URL-ului. Presupunem c pasul principal de incrementare
al contorului poate fi fcut pe durata recepiei octetului. Dar, cele dou
treceri prin tablou, pentru iniializare si verificare a depirilor de prag, fac
aceast proiectare lent. Dimensiunea minim a unui pachet este de 40 de
octei, incluznd doar antetele de reea. Adugnd 768 operaii n plus (1
scriere i 1 citire pentru fiecare element din C, i 1 citire din T pentru
fiecare din cei 256 indici) modelul de proiectare devine irealizabil.
1.2.3 Gndirea algoritmic
Intuitiv, a doua trecere prin tablourile C i T de la sfrit pare o risip.
De exemplu, este suficient avertizarea cnd orice caracter depete
pragul. Atunci de ce s verificam toate caracterele? Acest lucru sugereaz
s urmrim doar cel mai mare contor de caracter c; la sfrit algoritmul
trebuie s verifice doar dac c e deasupra pragului, innd cont de L
lungimea total a URL-ului.

Tabloul
Prag

Tabloul
Contor

2%

1%

2) Citire

Cod duntor
AIM://depasire

# * # ! * # ...... *

1) Incrementeaz
3) Dac C[i]/T[i] > Max, Max = C[i]/T[i]

255

FIGURA 1.5 Evitarea buclei finale prin tabloul cu praguri, urmrind doar Max, cel mai
mare contor relativ la valoarea de prag, ntlnit pn acum.

Metoda nu prea funcioneaz. Un caracter nesuspicios cum este e


poate aprea destul de des, i deci probabil c i se atribuie un prag ridicat.
Dar dac inem evidena numai pentru e, 20 de apariii de exemplu, s-ar
putea s nu mai inem evidena lui # cu 10 apariii. Dac pragul pentru
# este mult mai mic, algoritmul poate duce la un rspuns negativ fals:
chip-ul poate eua la alarmarea despre un pachet care ar trebui marcat.
Contraexemplul sugereaz urmtoarea corecie. Chip-ul ine ntr-un
registru evidena valorii maxime a contorului relativ la valoarea pragului.
Mai precis, chip-ul ine evidena celei mai mari valori a contorului
relativizat, Max, corespunztoare unui caracter k oarecare, astfel nct
C [ k ] / T [ k ] = Max este cel mai mare dintre toate caracterele contorizate
pn acum. Dac un caracter nou i este citit, chip-ul incrementeaz C [i ] .

Dac C [i ] / T [i ] > Max , atunci chip-ul nlocuiete valoarea curent a lui

Max memorat, cu C [i ] / T [i ] . La sfritul procesrii URL-ului, chip-ul

ne alerteaz dac Max L .


Iat de ce aceast soluie e bun: dac Max = C [ k ] / T [ k ] L , evident
c pachetul trebuie marcat, deoarece caracterul k depete pragul. Pe de
alt parte, dac C [ k ] / T [ k ] < L , atunci pentru orice i, avem

C [i ] / T [i ] C [ k ] / T [ k ] < L . Astfel dac Max cade sub prag, atunci nici

un caracter nu va trece peste prag. Astfel nu pot exista rspunsuri false


negative (vezi fig. 1.5).
1.2.4 Rafinarea algoritmului: exploatarea hardware-ului
Noul algoritm a eliminat bucla de final dar nc trebuie s realizeze
operaia de mprire n timpul procesrii fiecrui octet. Logica mpririi
este ceva mai complicat i trebuie evitat dac se poate dar cum?
Revenind la specificaii i scopul lor, probabil c pragurile nu trebuie s
fie numere reale exacte n virgul flotant. Puin probabil ca proiectantul
care deduce pragurile s poat estima precis valoarea; probabil c 2.78%
va fi aproximat cu 3% fr a afecta prea tare securitatea. Atunci de ce s
8

nu aproximm pragul cu o putere a lui 2, n loc s folosim valoarea exact


a pragului respectiv? Astfel dac pragul este 1/29, de ce s nu l
aproximm cu 1/32?
Tabloul Prag
plus Contor
0

2%

1%

Cod duntor
AIM://supraincarcare # * # ! * # ...... *

1) Citete un cuvnt lung


2) Compar i marcheaz dac e necesar
3) Scrie valoarea incrementat

255
FIGURA 1.6 Folosirea unui cuvnt lung i un tablou compus pentru a combina 2 citiri
ntr-una

Schimbarea specificaiei n felul acesta necesit o negociere cu arhitectul


sistemului. Presupunem c arhitectul este de acord cu propunerea. Un prag
ca 1/32 poate fi codat compact ca o putere a lui 2 ex. 5. Aceast valoare
de prag deplasat/shift poate fi memorat n tabloul de praguri, n locul
unei fracii.
Cnd este ntlnit un caracter j, chip-ul incrementeaz C [ j ] ca de obicei
i-l deplaseaz apoi spre stnga mprirea cu 1/ x este nlocuit cu
nmulirea lui x cu pragul indicat. Dac valoarea deplasat e mai mare
dect ultima valoare Max stocat, chip-ul nlocuiete vechea valoare cu
noua valoare i continu.
Astfel logica necesar pentru implementarea procesrii unui octet const
dintr-o deplasare i o comparaie. E necesar doar un registru pentru
memorarea valorii Max. Dar e necesar o citire a tabloului Prag (pentru a
citi valoarea deplasat), o citire a tabloului Contor (pentru a citi vechiul
contor) i o scriere in tabloul Contor (pentru a renscrie valoarea
incrementat).
Citirea memoriei dureaz acum 1-2nsec chiar i pentru cele mai rapide
memorii pe chip, dar poate dura pn la 10nsec pentru memoriile mai lente
deci e mai lent ca logica. ntrzierile porilor sunt de ordinul
picosecundelor, i logica de deplasare nu necesit prea multe pori. Astfel,
strangularea de procesare este dat de numrul de accesri ale memoriei.
Implementarea chip-ului poate combina cele dou citiri ale memoriei
ntr-o singur citire, reunind cele dou tablouri Prag i Contor ntr-unul
singur (fig.1.6). Ideea este de a face cuvintele din memorie destul de lungi
pentru a conine i contorul (15 bii pentru a manevra pachete cu lungimea
32K) i pragul (care depinde de precizia necesar, nu mai mult de 14 bii).
Astfel cele dou cmpuri pot fi uor combinate ntr-un cuvnt mai mare de
29 bii. In practic, hardware-ul poate manevra cuvinte mult mai mari, de
pn la 1000 bii. De altfel trebuie avut n vedere c extragerea celor dou
cmpuri dintr-un singur cuvnt, o sarcin laborioas prin software, este
9

banal prin hardware, prin cablarea adecvat a firelor ntre registre, sau
prin folosirea multiplexoarelor.
1.2.5 tergerea
Dei bucla terminal a fost eliminat, nu a fost rezolvat problema
delicat a buclei de iniializare. Pentru a trata aceast problem, chip-ul are
la dispoziie un timp de iniializare, dupa analiza URL-lui pachetului
curent i nainte de tratarea URL-lui urmtorului pachet.
Din pcate, dimensiunea minim a pachetelor poate fi mic, de pn la
50 bytes, inclusiv antetul HTTP. Presupunnd c sunt 40 bytes non-URL
i 10 bytes URL, iniializarea unei zone de 256 de bytes nu poate fi
fcut fr un cost suplimentar de 256/40 =6 operaii per byte, necesare
prelucrrii unui URL. Ca i la bucla de procesare a URL-lui, fiecare
iniializare presupune o citire i o scriere a zonei comasate.
O metod este amnarea lucrului pn nu e absolut necesar, n sperana
c nu va mai fi necesar. De fapt, chip-ul nu trebuie s iniializeze C [i ]
pn cnd caracterul i e accesat prima dat n pachetul urmtor. Dar cum
poate s tie chip-ul c acceseaz caracterul i pentru prima dat? Pentru a
implementa evaluarea relaxat, fiecare cuvnt de memorie, reprezentnd o
intrare n zona comasat, trebuie extins pentru a include G [i ] , numrul
generaiei. Acest numr de generaie, pe 3 bii, poate fi vzut ca un contor,
care numar de cte ori e ntlnit pachetul, cu excepia faptului c e limitat
la trei bii. Astfel, chip-ul are un registru suplimentar g pentru fiecare i, pe
lng G [i ] , cu 3 bii; registrul g este incrementat modulo 8 la fiecare
pachet intlnit.

In plus, de cte ori C [i ] este actualizat, chip-ul

actualizeaz i G [i ] pentru a reflecta valoarea curent a lui g.

Avnd numerele generaiei, chip-ul nu mai trebuie s iniializeze zona de


numrare dupa ce pachetul curent a fost procesat. Totui, s considerm
cazul unui pachet cu numrul generaiei h, care conine un caracter i n
URL-ul su. Cnd chip-ul ntlnete caracterul i n timpul procesrii
pachetului, citete C [i ] i G [i ] din zona de numrare. Dac G [i ] h
nseamn c intrarea i a fost accesat anterior de un pachet i nu a fost
iniializat n consecin. Astfel, logica va repune pe 1 valoarea lui
C [i ] (iniializare plus incrementare) i va pune pe h valoarea lui G [i ] (fig.
1.7).
Apare imediat o obiecie.Deoarece numrul generaiei are doar 3 bii, iar
valoarea lui g este ciclic, pot apare erori. Dac G [i ] = 5 iar intrarea i nu
este accesat pn cnd nu au trecut deja 8 pachete, valoarea curent a lui
g este 8. Dac urmtorul pachet conine caracterul i, C [i ] nu va mai fi
iniializat i contorul va numra eronat valoarea de ordine a caracterului i
din pachetul curent, cu valoarea din urm cu opt pachete.
Chip-ul poate evita aceast eroare printr-o bucl de filtrare separat, care
citete tabelul i iniializeaz toate contoarele cu numerele de generaie
nvechite. Pentru corectitudine, chip-ul trebuie s realizeze o scanare
complet a zonei pentru toate cele opt pachete procesate. Incetinirea
existent, de 40 non-URL octeti per pachet, garanteaz o ncetinire de 320
10

bytes non-URL pentru cele opt pachete, ceea ce este suficient pentru a
iniializa o zon de 256 de elemente, utiliznd o citire i o scriere per octet
indiferent de tipul de octet, URL sau non-URL. Se poate ctiga mai mult
ntrziere dac este nevoie, crescand numrul de bii ai numrului
generaiei, cu preul unei uoare creteri a necesarului de memorare a
zonei.

Fig 1.7 Soluia finala cu numere de generaie pentru rafinarea buclei de iniializare

In acest caz, chip-ul trebuie s conin dou stri, una de procesare a


biilor aparinnd URL-lui i una de procesare a biilor non-URL. Cnd un
URL este complet procesat, chip-ul trece n starea de filtrare/scrub. Chipul dispune de un alt registru, care indic intrarea s a urmtoarei zone de
filtrat. Dac G [ s ] g , G [ s ] este resetat la valoarea g, iar C [ s ] este
iniializat pe 0.
Deci utilizarea a 3 biti suplimentari, pentru numrul generaiei pentru
fiecare intrare de zon, a dus la reducerea ciclurilor de iniializare cu preul
creterii zonei de memorare. Intrarea zonei comasate are acum doar 32 de
bii, 15 bii pentru contor, 14 bii pentru valoarea de prag de comutare, i 3
bii pentru numrul generaiei. Verificrile adugate iniializrii, necesare
n timpul procesrii byte-lor URL nu cresc numrul de referiri la memorie
(strangulare) ci cresc puin logica de procesare. In plus, mai e nevoie de
dou registre pe chip pentru memorarea irurilor g i s.
1.2.6 Caracteristicile algoritmilor de reea
Detectarea un pachet malefic pune n eviden trei aspecte importante:
a) Algoritmica reelelor este un domeniu interdisciplinar. Datorit
vitezelor mari de procesare n reele, proiectanul de rutere va fi presat s
nu utilizeze implementri hardware.Exemplul exploateaz cteva
caracteristici ale hardware-ului. Astfel, se presupune c: sunt posibile, fr
dificultate, cuvinte lungi de diferite dimensiuni; deplasarea este mai uoar
dect mprirea; referirile la memorie conduc la strangulri; este fezabil
implemetarea unor memorii rapide pe chip, cu zone de 256 de
elemente;este fezabil adugarea unor registre suplimentare; modificrile
aduse logicii pentru a combina procesarea URL i iniializarea sunt uor de
implementat.
Inelegerea unor aspecte ale proiectrii hardware poate ajuta, chiar pe un
programator software, s neleag fezabilitatea diferitelor implemantri
hardware. Abordarea interdisciplinar poate conduce la o proiectare
optim. Sunt prezentate cteva modele hardware care ofer posibilitatea
11

soluionrii i rafinrii unor probleme de implementare. De asemenea, sunt


prezentate modele simple de sisteme de operare, deoarece pentru
mbuntirea performanelor, terminalele (serverele web) i clienii
trebuie s neleag problemele sistemelor de operare, dup cum ruterele i
dipozitivele de reea implic o bun cunoatere i adaptare a hardwareului.
b) Algoritmica de reea admite primordialitatea gndirii sistemice.
Specificaiile au fost relaxate permind praguri aproximative, ca puteri ale
lui 2, ceea ce simplific hardware-lui.Relaxarea specificaiilor i
translatarea activitii de la un subsistem la altul este o tehnic obinuit,
dar care nu este ncurajat n sistemul educaional din universitile n care
fiecare domeniu este predat izolat de celelalte domenii. De aceea, n zilele
noastre, exist cursuri de algoritmi, de sisteme de operare i de reele.
Acest fapt are tendina de a promova gndirea la nivel de cutie neagr n
loc de o gndire global, sau sistemic.Exemplul a fcut aluzie la alte
tehnici cum ar fi evaluarea relaxata (lazy evaluation) i compromisul
memorie pentru procesare cu scopul de a elimina zonele de
contorizare.Aadar s-a ncercat sintetizarea principiilor sistemelor utilizate
n algoritmic (15 principii), precum i explicarea i analiza
implementrilor realizate pe baza acestor principii.
c) Algoritmica de reea poate beneficia de pe urma gndirii
algoritmice. Di gndirea la nivel de sistem este important pentru a
rafina de cte ori este posibil, o problem, sunt multe situaii n care
constrngerile impuse sistemelor nu permit eliminarea unor probleme. Ca
exemplu, dupa sublinierea importanei gndirii algoritmice prin relaxarea
specificaiilor, problema falsului pozitiv a condus la luarea n calcul a
contorului maxim relativ la valoarea sa de prag. Alt exemplu este
comutarea etichetelor/tag switching, cnd s-a ncercat rafinarea cutrii
IP/lookup prin comutarea etichetelor, dei multe rutere au recurs la ali
algoritmi eficieni de cutare.
Deoarece modelele sunt diferite de modelele teoretice standard, deseori
nu e suficient s fie reutilizai orbete algoritmii existeni. Ca exemplu,
necesitatea de a programa un comutator crossbar n 8ms conduce la luarea
n considerare a potrivirii maxime prin ncercri, mai simpl dect
algoritmii complicai care duc la asocieri optimale.
Alt exemplu descrie cum implementarea BSD a procedurii de cutare
(lookup) reutilizeaz orbete o structur de date denumit proba Patricia,
ce utilizeaz un contor de omisiuni, pentru cutarea IP. Algoritmul rezultat
necesit o urmrire recursiv complex. O simpl modificare, care
pstreaz biii omii, elimin urmrirea recursiv. Dar acest lucru
presupune o ptrundere n cutia neagr (algoritmul) i aplicrii sale.
Algoritmul a fost muli ani considerat o capodoper i a fost implementat
n hardware, n multe rutere. Dar de fapt nu este dect o implementare
hardware a BSD Patricia tries with backtracking. E util de tiut c o simpl
modificare a algoritmului poate simplifica hardware-ul substanial.
In concluzie, folosirea fr discernmnt critic a algoritmilor standard
poate duce la euarea perfecionrilor, prin msuri inadecvate (e.g., pentru
filtrele de pachete ca BPF, introducerea unui nou clasificator duce la timpi
mai mari decat timpii de cutare), datorit modelelor nepotrivite (ignorarea
liniilor cache n software i a paralelismului n hardware) i datorit
12

analizelor neadecvate (e.g., ordinul complexitii ascunde constant factorii


eseniali ce asigur naintarea rapid a pachetelor pe liniile fizice).
Aadar, un alt scop este de a urmri implementri care ptrund n
esena algoritmilor, i folosirea tehnicilor fundamentale algoritmice (ca de
exemplu tehnica divide et impera/dezbin i cucerete, i aleatorismul).
Acestea conduc la urmtoarele concluzii.
Definiie: Algoritmica de reea este folosirea abordrii sistemice
interdisciplinare, combinat cu gndirea algoritmic, pentru proiectarea
implementrilor rapide ale sarcinilor de procesare n reea, la nivelul
serverelor, ruterelor i a altor dispozitive de reea.
Obiectiv
Modele

Motiv
Subiecte simple
Inelegerea modelelor
Tehnologii de memorii :ntreesere,
simple de sisteme de
combinare SRAM/DRAM
operare,hardware,reele
Strategii
Inelegerea principiilor
Pasarea indicaiilor, evaluarea
sistemelor pentru evitarea
relaxat, suplimentarea strilor,
strangulrilor
exploatarea localizrii
Probleme
Practic aplicarea
Proiectarea unui motor de
principiilor la probleme
verificare(lookup) pentru monitorul
simple
reelei
Fig.1.8 Algoritmica de reea (cu modele, strategii i probleme simple).

1.3 Exerciiu: Implementarea Chi-Square. Statistica chi-square se


folosete pentru a vedea dac frecvenele caracterelor observate sunt
neobinuit de diferite (comparativ cu variaia aleatoare normal) fa de
frecvenele estimate ale caracterelor. Acesta este un test mai sofisticat
dect un simplu detector de prag. Se presupune c pragurile reprezint
frecvenele ateptate. Statistica se calculeaz pentru toate valorile
caracterelelor i prin:

( Frecventa estimata [i ] Frecventa observata [i ])

Frecventa estimata [i ]
Chip-ul ar trebui s semnalizeze dac rezultatul final depete un
anumit prag (ca exemplu, o valoare de 14,2 semnific c sunt 1,4% anse
ca diferena s se datoreze unor variaii aleatoare). Gsii o cale de
implementare eficient a acestei metode, presupunnd c lungimea este
cunoscut doar la sfrit.

13

CAPITOLUL 2
MODELE DE IMPLEMENTARE A RETELELOR
Pentru a mbunti performanele nodurilor terminale i a
ruterelor, un implementator trebuie s cunoasc regulile jocului. O
dificultate central este aceea c algoritmii de reea cuprind patru domenii
diferite: protoacoale, arhitecturi hardware, siteme de operare i algoritmi.
Inovaiile n domeniul reelelor apar cnd experii din diferitele domenii
conlucreaz pentru a obine soluii sinergice. Poate oare un proiectant
hardware s neleag problemele legate de protocoale, iar un proiectant de
algoritmi s neleag problemele hardware, fr un studiu temeinic?
Se ncepe cu modele simple, capabile s explice i s anticipeze, fr
detalii inutile. Modelul ar trebui s ofere posibilitatea ca o persoan
creativ din afara unui domeniu s poat crea proiecte, ce pot fi verificate
de un expert din interiorul domeniului. De exemplu, un proiectant
hardware de chip-uri ar trebui s fie capabil s sugereze schimbri de
software n driver-ul chip-lui, iar un teoretician din domeniul
calculatoarelor ar trebui s fie n stare s viseze la algoritmi de asociere
pentru switch-uri.
2.1 Protocoale
Seciunea 2.1.1 descrie protocolul de transport TCP i protocolul de
rutare IP. Aceste dou exemple sunt utilizate pentru a asigura un model
abstract de protocol i funciile acestuia din &2.1.2. Seciunea 2.1.3 se
ncheie cu ipoteze asupra performanelor reelelor. Cititorii familiarizai cu
TCP/IP ar putea dori s sar peste &2.1.2.
2.1.1 Protocoale de transport i dirijare
Aplicaiile se bazeaz pe o transmitere fiabil, sarcin ce revine
protocolului de transport, aa cum este protocolul TCP (Transport Control
Protocol). Sarcina protocolului TCP este de a asigura transmiterea i
recepionarea aplicaiilor, ca i cum ar fi dou cozi de ateptare separate,
una n fiecare direcie, chiar dac emitorul i receptorul sunt separate de
o reea cu pierderi. Aadar, orice ar scrie aplicaia emitoare n coada sa
de ateptare local TCP, ar trebui s apar, n aceeai ordine, n coada de
ateptare local TCP a receptorului i viceversa. Protocolul TCP
implementeaz acest mecanism prin fragmentarea cozii de ateptare a
datelor aplicaiei n segmente i transmiterea fiecrui segment pn cnd sa recepionat confirmarea.
Dac aplicaia este, de exemplu, o videoconferin care nu necesit
neaprat o garanie a fiabilitii, se poate alege protocolul denumit UDP
(User Datagram Protocol) n locul TCP-lui. Spre deosebire de TCP, UDP
nu necesit ateptarea unor confirmri sau retransmisii deoarece nu
garanteaz transmisia fiabil.
Protocoalele de transport cum sunt TCP i UDP lucreaz prin
transmiterea unui segment de la un nod emitor la un nod receptor prin
intermediul internetului. Sarcina actual de transmitere a unui segment
revenind protocolului internet de rutare IP.
14

Rutarea n Internet este imprit n dou pri forwarding and routing,


naintare/dirijare. Inaintarea reprezint procesul prin care pachetele sunt
transmise ntre surs i destinaie trecnd prin ruterele intermediare.
Pachetul reprezint un segment TCP care are ataat un antet de rutare care
conine adresele internet destinaie.
In timp ce procesul de naintare trebuie s se realizeze la viteze mari,
tabelele de rutare din cadrul fiecrui ruter trebuie construite de ctre un
protocol de rutare, mai ales n cazul unor modificri de topologie cum este
cazul unor legturi ntrerupte. Sunt cteva protocoale de rutare mai
cunoscute, cum este protocolul bazat pe vectorii distan (RIP), sau pe
starea legturii (BGP).
2.1.2 Model abstract de protocol
Un protocol reprezint o stare a mainii pentru toate nodurile participante
la protocol, mpreun cu interfeele i mesajele. Un model pentru un
protocol este prezentat n figura 2.1. Specificaiile trebuie s descrie cum
diagrama de stri a mainii evolueaz i rspunde la interfeele utilizator,
la mesajele recepionate i la contorul de evenimente. De exemplu, cnd o
aplicaie face o cerere de conectare, diagrama de stri a mainii TCP
emitoare se iniializeaz prin alegerea unui numr de secven iniial,
ajunge la aa numita stare SYN-STATE i trimite un mesaj SYN. Ca un al
doilea exemplu, un protocol de rutare cum este OSPF are cte o diagram
de stare a mainii corespunztoare fiecrui ruter; cnd un pachet de stare
LSP (Link State Packet) ajunge la un ruter cu numr de secven mai mare
dect ultimul LSP transmis de ctre surs, noul LSP ar trebui s fie
memorat i transmis ctre toate ruterele nvecinate. In timp ce protocolul
de stare a liniei este foarte diferit de protocolul TCP, ambele protocoale
pot fi abstractizate de ctre diagrama de stri prezentat n figura 2.1. In
afara protocoalelor TCP i IP, vor fi luate n considerare i alte protocoale,
aa cum este protocolul HTTP. Un asemenea model este prezentat n
figura 2.2 fiind folosit drept referin.
In primul rnd, (fig.2.2 jos), diagrama de stri trebuie s
recepioneze/trimit pachete de date. Aceasta implic manevrarea datelor
sau operaii de scriere i citire a fiecrui octet dintr-un pachet. De
exemplu, TCP trebuie s copieze datele recepionate n buffer-ele
aplicaiilor, n timp ce ruterele trebuie s comute pachetele ntre liniile de
intrare i cele de ieire. Antetul TCP specific, de asemenea, o sum de
control ce trebuie calculat n funcie de toate datele. Copierea datelor
necesit de asemenea alocarea de resurse, cum sunt buffer-ele.
In al doilea rnd, (fig.2.2, sus), diagrama de stri trebuie s
demultiplexeze datele ctre unul sau mai multi clieni. In unele cazuri,
programele client trebuie activate, necesitnd un transfer costisitor al
controlului. De exemplu, cnd TCP receptioneaz o pagin web, trebuie s
demultiplexeze datele ctre aplicaiile de tip web-browser utiliznd
cmpurile cu numrul portului i s-ar putea s fie nevoie s lanseze
procesul rulnd browser-ul. Figura 2.2 descrie cteva funcii generice
utilizate de mai multe protocoale. In primul rnd, protocoalele trebuie s
ndeplineasc condiia crucial de a se putea bloca la viteze mari iar uneori
de a putea fi manipulate. De exemplu, un pachet TCP recepionat face ca
protocolul TCP s caute n tabela de stri a conexiunii, n timp ce
15

pachetele IP recepionate fac ca protocolul IP s caute o tabel de


expediere.

Figura 2.2 Funcii comune ale protocolului, folosind tabela de stri (negrit)

In al doilea rnd, protocoalele au nevoie s seteze eficient contoarele


pentru a controla, de exemplu, retransmisiile protocolului TCP. In al
treilea rnd, dac un modul al protocolului gestioneaz mai muli clieni
trebuie s-i programeze eficient. De exemplu, TCP trebuie s programeze
procesarea diferitelor conexiuni, n timp ce un ruter trebuie s se asigure
c dominarea conversaiilor ntre cteva perechi de calculatoare nu
blocheaz alte conversaii. Multe protocoale permit ca mari cantiti de
date s fie fragmentate n buci mai mici care necesit o reasamblare
ulterioar. Asemenea funcii generice sunt uneori costisitoare, costul lor
putnd fi atenuat utiliznd tehnici potrivite.Aadar fiecare funcie generic
a protocolului merit s fie studiat individual.
2.1.3 Performan i msurri
Aceast seciune descrie cteva msurtori importante i presupuneri de
performan. Se consider un sistem (cum este o reea sau chiar un singur
ruter) unde sarcinile (cum ar fi transmiterea mesajelor) sosesc, iar dup
realizarea lor, pleac. Cei mai importani parametri n reele sunt
16

debitul/traficul util (throughput) i latena (latency). Debitul indic


numrul de operaii realizate cu succes per secund. Latena msoar
timpul (cel mai slab posibil) de realizare a unei operaii. Posesorii
sistemelor (ISP, ruterele) caut s maximizeze debitul util pentru a-i mri
ctigurile, pe cnd utilizatorii sistemului doresc o laten cap-la-cap mai
sczut de cteva milisecunde. Latena afecteaz de asemenea viteza de
calcul n reea.
Urmtoarele observaii legate de performana mediului Internet sunt utile
cnd se iau n considerare compromisurile implementrii.
Vitezele liniilor : viteza liniilor principale de tranzit (backbone) poate fi
marit pn la 10Gps i 40Gbps, iar viteza liniilor locale ajunge la ordinul
Gbps. Legturile wireless i cele de acas sunt la momentul curent mult
mai ncete.
Dominana TCP i Web : traficul Web reprezint peste 70% din traficul
de bytes sau pachete, iar traficul TCP reprezint 90% din trafic.
Transferurile reduse : majoritatea documentelor Web accesate sunt de
dimensiuni reduse ; un studiu SPEC arat c 50% din fiierele accesate
sunt de 50 kilobytes sau mai puin.
Latena slab : ntrzierea n timp real depete limitrile impuse de
viteza luminii: msurtorile efectuate au semnalat o ntrziere de 241 msec
dealungul Statelor Unite, n comparaie cu ntrzierile datorate vitezei
luminii care este de 30 msec. Latena crescut se datoreaz eforturilor de
mbuntire a debitului, cum ar fi compresia n modemuri i pipeliningului n rutere.
Localizarea slab : studiul asupra traficului din backbone-ul reelei
indic 250.000 de perechi diferite surs-destinaie ce trec printr-un ruter
ntr-un interval redus de timp. Estimri mai recente indic n jur de un
milion de transmisii concurente. Reunind grupurile de antete care au
aceeai adres destinaie sau alte resurse comune, nu se reduce
semnificativ numrul de clase al antetelor. Astfel, localizarea, sau
probabilitatea de reutilizare a calculului, investit ntr-un pachet, pentru un
pachet viitor, este mic.
Pachetele de dimensiuni reduse: aproximativ jumtate din pachetele
recepionate de ctre un ruter sunt pachete de confirmri de dimensiune
minim de 40 octei. Pentru a se evita pierderea de pachete importante
ntr-un flux de pachete de dimensiuni minime, majoritatea productorilor
de rutere i adaptoare de reea intesc ctre expedierea la viteza
liniilor/wire speed forwarding.
Msurri critice : trebuie fcut distincia ntre msurri globale ale
performanei (ntrzirea cap-la-cap i lrgimea de band), i msurri
locale ale performanei (viteza de cutare/lookup a ruterelor). Msurrile
globale sunt cruciale pentru o evaluare global a reelei. Aici ne
concentrm numai asupra msurrilor locale ale performanei, i anume
performanele de expediere (forwarding) i resursele (logice, de memorie).
Instrumente : majoritatea instrumentelor de management a reelelor,
cum este HPs Open View, lucreaz cu msurri globale. Instrumentele
necesare pentru msurrile locale sunt instrumente de msurare a
performanei din interiorul calculatoarelor, aa cum este profiling
software.
17

Exemplele includ: Rationals Quantify (http://www.rational.com) pentru


aplicaii software, Intels Vtune (www.intel.com/software/products/vtune),
i chiar osciloscoape hardware. De asemenea sunt utile programele de
monitorizare a reelelor aa cum este tcpdump (www.tcpdump.org).
2.2 Hardware
Pe msur ce legturile de date se apropie de viteze de 40 gigabit/s
(OC-768), un pachet de 40 bytes trebuie transmis n 8 nsec. La aa viteze,
transmisia mai departe a pachetelor este de obicei implementat hardware,
i nu de un procesor programabil. Nu se poate participa la procesul de
proiectare a unui astfel de hardware, fr nelegerea condiiilor impuse
proiectanilor i mecanismelor unui asemenea hardware competitiv.
Cteva modele simple pot permite nelegerea i faciliteaz lucrul cu astfel
de modele de hardware.
Cutrile Internet sunt implementate de obicei folosind logica
combinational, pachetele Internet sunt stocate n memoriile ruterelor, i
un ruter Internet este pus laolalt cu comutatoare i chip-uri de cutare. n
consecin, se ncepe cu implementarea logic, se continu cu descrierea
memoriilor, i se termin cu schema bazat pe componente. Pentru detalii,
dm spre referina clasicul VLSI, care nc se mai folosete, i arhitectura
clasic a calculatorului.
2.2.1 Logica combinatorie
Modelele foarte simple pentru porile logice de baz cum ar fi:
Inversorul, SI-NU i SAU-NU pot fi nelese chiar i de un programator.
Totui, nu este necesar s tim cum sunt implementate porile logice de
baz, pentru a avea o privire de ansamblu asupra proiectrii hardware.
Primul pas spre nelegerea proiectrii logice este observaia urmtoare.
Fiind date porile inversoare, SI-NU i SAU-NU, algebra boolean arat c
poate fi implementat orice funcie boolean f ( I1 ,..., I n ) , de n variabile de
intrare. Fiecare bit al multibitului de ieire poate fi considerat ca o funcie
de biii de intrare. Minimizarea logicii folosete la eliminarea porilor
redundante i uneori la creterea vitezei. De exemplu, dac + nseamn
poart SAU i poart SI, atunci funcia :
O = I1 I 2 + I1 I 2
poate fi simplificat la:
O = I1 .
Exemplul 1: Calitatea serviciului (QOS) i codoarele de prioritate: s
presupunem c avem un ruter de reea care menine pentru pachete n cozi
de ateptare per legtur de ieire, unde coada i are o prioritate mai mare
dect coada j dac i < j . Aceasta este o problem de QOS. Planificatorul
transmisiei din ruter trebuie s aleag un pachet din prima coad nevid, n
ordinea prioritilor. Planificatorul menine un vector pe N-bii (bitmap): I,
aa nct I [ j ] = 1 dac i numai dac coada j este nevid; atunci
planificatorul poate gsi coada nevid cu cea mai mare prioritate, prin
gsirea celei mai mici poziii din I cu bitul setat. Proiectanii hardware
cunosc aceast funcie sub denumirea de codor de prioritate. Totui, chiar
18

i un proiectant de software trebuie s-i dea seama c aceast funcie se


preteaz la o implementare hardware, pentru un n rezonabil. Funcia este
descris mai detaliat n exemplul 2.
2.2.2 Sincronizare i putere
Pentru transmisia mai departe a unui pachet de 40 bytes la viteza unui
OC-768, orice funcie de reea aplicat pachetului trebuie terminat n 8
nsec. De aceea intrzierea maxim la transmisia semnalului de la intrare la
ieire, pe orice cale logic, nu trebuie s depeasc 8 nsec. In acest scop,
e necesar un model al timpului de intrziere introdus de un tranzistor. In
ansamblu, fiecare poart, NU sau SI-NU, poate fi gndit ca un set de
capacitoare i rezistoare care trebuie ncrcate (cnd se schimb valorile de
intrare) ca s se poata calcula valorile de ieire. Chiar mai ru, ncrcarea
unei pori de intrare poate determina ca ieirile unor pori ulterioare s
ncarce intrri urmtoare, i aa mai departe. In consecin, pentru o
functie combinaional, ntrzierea n calcularea funciei este suma
ntrzierilor de ncrcare i de descrcare introduse de cile cele mai
defavorabile ale tranzistoarelor. Timpii de ntrziere introdui de astfel de
ci trebuie s se ncadreze n timpul minim de sosire al pachetelor.
De asemenea este nevoie de energie pentru a ncrca condensatoarele;
energia pe unitatea de timp (puterea) este proporional cu capacitatea,
ptratul tensiunii, i frecvena cu care se poate schimba
intrarea P = C V 2 f . Noile procese reduc nivelul tensiunii i al
capacitii, iar circuitele de vitez mare trebuie s creasc frecvena de
ceas. Paralelism nseamn c mai multe capaciti trebuiesc ncrcate
simultan. In consecin, multe chip-uri de mare vitez disip foarte mult
caldur, necesitnd tehnici deosebite de rcire. ISP-urile i facilitile de
colocare sunt mari consumatori de putere. Desi nu tratm schimbul de
caldur, e bine de tiut c chip-urile i ruterele sunt cteodat limitate n
putere. Cteva limite practice de astzi sunt: 30 W/cm2 si respectiv 10 000
W/foot2 ntr-un centru de date (1 foot =0.305m).
Exemplul 2: Proiectarea codoarelor de prioritate: S considerm
problema estimrii sincronizrii necesare codorului de prioritate din
exemplul 1, pentru o legtur OC-768, folosind pachete de 40 bytes. In
consecin circuitul are la dispoziie 8 nsec s produc ieirea.
Considernd c intrarea I i ieirile O sunt vectori pe N biti ca O [ j ] = 1
dac i numai dac I [ j ] = 1 i I [ k ] = 0 pentru toate k < j . Trebuie

observat c ieirea este reprezentat n unar (de multe ori numit


reprezentare 1 hot) i nu n binar. Specificaia conduce direct la ecuaia
combinaiilor logice: O[ j] = I[1]...I[ j 1]I[ j] pentru j > 0.
Acest model poate fi implementat direct folosind N pori SI, una pentru
fiecare bit de ieire, unde cele N pori au un numr de intrri care variaz
de la 1 la N. Intuitiv, din moment ce N pori de intrare SI iau
O ( N ) tranzistoare, avem un model. Modelul 1, cu O N 2 tranzistoare

( )

care pare c iau O (1) timp. Chiar i acest nivel de proiectare este util dei
s-ar putea i mai bine.
19

Un alt model mai economic din punct de vedere al suprafeei este bazat
pe observaia c fiecare bit de ieire O ( j ) necesit poarta SI component
a primilor j 1 bii de intrare. In consecin definim rezultatele pariale

P[ j] = I[1]...I[ j 1] pentru j = 2...N . Este clar c O [ j ] = I [ j ] P [ j ] . Dar P [ j ]

poate fi construit recursiv folosind ecuaia P[ j] = P[ j 1] I[ j] care poate fi


implementat folosind N pori SI de cte dou intrri, conectate n serie.
Aceasta conduce la un model, modelul 2 care necesit O ( N ) tranzistoare
dar care ia O ( N ) timp.
Modelul 1 este rapid i mare, i modelul 2 este lent i redus. Acesta este
un compromis familiar spaiu-timp care sugereaz c putem avea o soluie
intermediar. Calculul lui P [ j ] n modelul 2 seaman cu un arbore binar

neechilibrat de nlime N. Totui, este evident c P [ N ] poate fi calculat


folosind un arbore binar complet echilibrat de pori SI cu 2 intrri, de
nlime log N . Rezultatele pariale ale arborelui binar pot fi combinate n
feluri simple astfel nct s avem P [ j ] pentru toate j < N folosind
acelai arbore binar.
De exemplu dac N=8, pentru calculul lui P[8] calculm X = I[0]...I[3] i
Y = I[4]...I[7] i calculm SI din X i Y la rdcin. Deci este uor s
calculm P[5] spre exemplu, folosind una sau mai multe pori SI,
calculnd X I[4] . O astfel de metod este foarte utilizat de proiectanii
hardware pentru nlocuirea lanului de calcul aparent lung de O ( N ) , cu

lanuri de lungime 2 log N . Deoarece a fost folosit prima dat ca s


grbeasc lanurile carry, este cunoscut sub denumirea de carry lookahead
sau simplu look-ahead. Chiar dac tehnicile look-ahead par complexe,
chiar i programatorii le pot stpni pentru c la baza lor, folosesc tehnica
dezbin-i-cucerete.
2.2.3 Creterea nivelului de abstractizare a proiectrii hardware
Proiectarea manual a fiecrui tranzistor dintr-un nou cip de reea, care
const n 1 milion de tranzistoare, ar fi consumatoare de timp. Procesul de
proiectare poate fi redus la cteva luni folosind blocurile constructive (vezi
tehnologiile de construire a blocurilor funcionale, ca PLA, PAL i a
celulelor standard).
Un lucru important este faptul c la fel ca i programatorii care
refolosesc codurile, proiectanii de hardware refolosesc implementri de
funcii frecvent utilizate. In afar de blocurile de calcul comune, ca
blocurile de adunare, multiplicare, comparare i codare a prioritatilor,
proiectanii folosesc de asemenea blocuri decodoare, blocuri de deplasare
cu mprumut (barrel shifter), multiplexoare i demultiplexoare.
Un decodor convertete o valoare log N bii la una N bii unar de
aceeai valoare; reprezentrile binare sunt mai compacte, dar
reprezentrile unare sunt mai convenabile pentru calcul. Un bloc de
deplasare cu mprumut deplaseaz o intrare I cu s pozitii la stnga sau la
dreapta, cu biii mutai circular de la un capt la cellalt.

20

Un multiplexor (mux) conecteaz una din mai multe intrri la o ieire


comun, n timp ce dualul su: demultiplexorul, ruteaz o intrare la una
din mai multe posibile ieiri. Mai precis, un multiplexor conecteaz unul
din n bii de intrare I j la ieirea O dac un semnal de selecie S de log n
bii codeaz valoarea j n binar. Dualul su, demultiplexorul, conecteaz
intrarea I la ieirea O j dac semnalul S codeaz valoarea j n binar.

FIGURA 2.3: Multiplexor cu 4 intrri cu biii de selecie

S0 i S1 , pornind de la trei

multiplexoare cu 2 intrri (multiplexorul are simbolul standard trapezoidal).

Astfel trebuie descompus o funcie logic complex n funcii standard,


folosind recursivitatea cnd este nevoie. Aceasta este o reducere i urmeaz
principiul dezbin-i-cucerete fiind folosit de programatori cu uurin. De
exemplu, figura 2.3 arat problema tipic Lego cu care se confrunt
proiectanii hardware: construii un multiplexor de 4 intrri pornind de la
multiplexoare de 2 intrri. Incepei prin a alege una dintre intrrile I 0 si
I1 folosind un multiplexor cu 2 intrri i apoi una dintre I 2 i I 3 folosind un
alt multiplexor de 2 intrri. Rezultatele multiplexoarelor de 2 intrri din primul
etaj, trebuie combinate folosind un al 3-lea multiplexor de 2 intrri; singura
observaie este c semnalul de selecie pentru primele 2 multiplexoare este cel
mai puin semnificativ bit S0 al semnalului de selecie de 2-bii, iar al treilea
multiplexor selecteaz jumtatea de sus sau cea de jos, astfel nct folosete S1
ca bit de selecie.
Urmtorul exemplu de reea arat c reducerea este o unealt de proiectare
puternic pentru proiectarea funciilor de reea.
Exemplul 3: Planificarea crossbar i codoare de prioritate programabile:
Exemplele 1 i 2 au motivat proiectarea unui codor de prioritate rapid (PE).
Un mecanism obinuit de arbitrare de ruter folosete o form mbuntit de
codor de prioritate numit codor de prioritate programabil (PPE). Avem o
intrare I de N bii ca mai nainte, mpreun cu o intrare adiional P de log N
bii. Circuitul PPE trebuie s calculeze o ieire O astfel nct O [ j ] = 1 , unde j
este prima pozitie dup P (tratat ca valoare binar) care are o cifr binar
diferit de zero n I. Dac P = 0 , aceast problem se reduce la un codor de
prioritate simplu. PPE-urile apar natural n arbitrarea switchurilor. Deocamdat
presupunem c un ruter conecteaz N legturi de comunicaie Presupunem c
mai multe legaturi de intrare vor s transmit un pachet la legtura de ieire L.
Pentru a evita coliziunea la ieirea L, fiecare intrare trimite o cerere la L n
primul interval de timp; L alege legtura de intrare creia i va servi cererea n
21

slotul al doilea; intrarea aleas expedieaz un pachet n al treilea interval


temporal.
Pentru a lua decizia de servire, L poate s stocheze cererile primite la
sfritul slotului 1 ntr-un vector R de N-bii, unde R [i ] = 1 dac legtura de
intrare i dorete s transmit la L. Pentru corectitudine, L ar trebui s rein
ultima intrare P servit. Dup aceea, L ar trebui s serveasc prima legtur
de intrare de dup P, care are o cerere. Aceasta este o problem PPE cu R i P
ca intrri. Deoarece un ruter trebuie s fac o arbitrare pentru fiecare poziie
temporal i pentru fiecare legtur de ieire, este nevoie de un model PPE
rapid i eficient ca arie. Chiar i un programator poate s neleag, i posibil s
repete procesul folosit pentru a proiecta PPE-ul din Tiny Tera, un switch
construit la Stanford i mai trziu comercializat. Ideea de baz este reducerea:
reducerea proiectrii unui PPE la proiectarea unui PE (exemplul 2).
Prima idee este simpl. PPE este n esen un PE a crui prioritate mazim
ncepe de la pozitia P n loc de 0. Un barrel-shifter poate fi folosit pentru a
deplasa I mai nti spre stnga cu P bii. Dup aceasta se poate folosi un
simplu PE. Bineineles c vectorul bitilor de iesire este acum deplasat; deci
trebuie restabilit ordinea original deplasnd ieirea lui PE la dreapta cu P
bii. Un bloc de deplasare cu mprumut pentru N-biti de intrare poate s fie
implementat folosind un arbore de multiplexoare de 2 intrri ntr-un timp n
jur de log N . Astfel dou blocuri de deplasare cu mprumut i un PE
echivaleaz cu aproximativ 3log N ntrzieri de pori.
Un proiect mai rapid, care necesit numai 2 log N ntrzieri de pori
este urmtorul. Problema se poate mpri n dou pri. Dac intrarea
are nite bii setai la poziia P sau mai mare, atunci rezultatul poate fi
gsit folosind un PE care opereaz pe intrarea original dup ce au fost
setai pe 0 toi biii de intrare a cror poziie este mai mic dect P. Pe pe
de alt parte, dac intrarea nu are nici un bit setat la poziia P sau mai
mare, atunci rezultatul poate fi gsit folosind PE-ul care opereaz pe
intrarea original fr nici o mascare. Acest rezultat din modelul din
figura 2.4, testat pe Texas Instrument Cell Library, a fost aproape de
dou ori mai rapid i a nsemnat folosirea unei suprafee de trei ori mai
mic dect modelul blocului de deplasare cu mprumut, pentru un ruter
cu 32-porturi.
Deci logica modelului pentru o component de timp critic, un switch,
poate fi realizat folosind reduceri i modele simple.
2.2.4 Memorii
In punctele terminale i rutere, naintarea/expedierea pachetelor se face
folosind logica combinaional, dar pachetele i strile necesare naintrii
trebuiesc stocate n memorii. Deoarece accesarea memoriilor este
semnificativ mai lent dect ntrzierile logice, memoriile sunt cele care
genereaz strangulri masive n rutere i n puncte terminale.
n plus, diferitele subsistemele necesit memorii cu caracteristici diferite.
De exemplu, vnztorii de rutere cred c este important un buffer de 200 de
msec pentru a evita pierderea pachetelor n timpul perioadelor de congestie.
La, s zicem 40 Gbit/sec per legtur, un astfel de buffer de pachete necesit o
cantitate enorm de memorie. Pe pe de alt parte, cutrile ruterelor necesit o

22

cantitate mai mic de memorie, accesat aleator. Astfel este bine s avem
modelele simple pentru memorii cu diferite tehnologii.
REGISTRE
Un bistabil (flip-flop) conecteaz dou sau mai multe tranzistoare ntr-o
bucl, astfel nct (n absena cderilor tensiunii) cifra binar s stea nedefinit
de mult timp pe ieire fr s se modifice valoarea tensiunii. Un registru este o
colecie ordonat de bistabile. Cele mai moderne procesoare au registre pe
chip de 32 sau 64 bii. Un registru pe 32 bii conine 32 de bistabile,
fiecare pentru a memora 1 bit. Accesul de la logic la un registru, pe
acelai chip, este extrem de rapid, n jur de 0.5-1 nsec.
SRAM
O memorie static cu acces aleator (SRAM) conine N registre adresate cu o
adres A, pe log N bii. SRAM este numit astfel deoarece remprosptarea
bistabilelor este de tipul static. n afar de bistabile, SRAM are nevoie i de un
decodor care decodeaz A, ntr-o valoare unar, folosit pentru accesarea
registrului potrivit. Accesarea unui SRAM pe-chip este doar puin mai lent dect
accesarea unui registru, din cauza ntrzierii introduse de decodare. n momentul
actual, este posibil s se obin SRAM pe chip cu timp de acces de 0.5 nsec. Timpi de
acces de 1-2 nsec pentru SRAM pe-chip i 5-10 nsec pentru SRAM care nu este pe chip,
se ntlnesc n mod uzual.
DRAM
O celul binar SRAM necesit cel puin cinci tranzistoare. Astfel
SRAM este ntotdeauna mai puin dens sau mai scump dect tehnologia
de memorie bazat

FIGURA 2.4: Proiectul Tiny Tera PPE folosete codor de prioritate 1, pentru a gsi
setul cel mai mare de bii, dac exist, a tuturor biilor mai mari dect P folosind o masc
de codare a lui P. Dac nu e gsit nici un bit, e validat ieirea codorului 2 de prioritate
(poarta SI de jos). Rezultatele celor dou codoare sunt apoi combinate cu o poart SAU
cu N intrri.

pe DRAM (Dynamic RAM). Ideea de baz este s se nlocuiasc bucla de


rspuns (i implicit tranzistoarele suplimentare) folosit pentru a memora
un bit ntr-un bistabil, cu o capacitate care poate s stocheze bitul; sarcina
se scurge, dar ncet. Pierderea datorat descrcrii este compensat
remprosptnd celula DRAM n mai puin de o milisecund. Bineneles,
fabricarea unei capaciti mari folosind puin siliciu e complex.
23

Capacitatea chip-urilor DRAM pare c devine de 4 ori mai mare la fiecare


3 ani i tinde spre 1 Gbit pe un singur chip. Adresarea acestor bii, chiar
dac ei sunt construii mpreun n aceeai capsul sub forma unor registre
de 4 sau 32 de bii, este dificil. Adresa trebuie s fie decodificat de la, s
zicem 20b la una din 220 valori. Complexitatea unei astfel de logici de
decodare sugereaz folosirea tehnicii dezbin i cucerete. Dar de ce s nu
se foloseasc o decodare n doi pai n schimb?

FIGURA 2.5: Memoriile mai mari sunt organizate pe dou dimensiuni n rnduri i
coloane. Selectarea unui cuvnt const n selectarea mai inti a rndului i apoi a coloanei
din acel rnd.

Figura 2.5 arat c cele mai multe memorii sunt organizate intern pe
dou dimensiuni, n rnduri i coloane. Cifrele binare de adres de sus sunt
decodificate pentru a selecta rndul, i dup aceea cifrele binare de adres
de jos sunt folosite pentru a decodifica coloana. Utilizatorul furnizeaz
mai nti biii de adres a rndului i activeaz un semnal numit RAS(Row
Address Strobe); apoi utilizatorul furnizeaz biii de adres ai coloanei i
activeaz un semnal numit CAS(Column Address Strobe). Dupa un timp
specificat, cuvntul dorit din memorie poate fi citit. Presupunnd rnduri i
coloane egale, se reduce complexitatea porii de decodare de la O ( N ) la
O ( ( N ) ) cu preul creterii ntrzierii cu timpul necesar pentru nc o
decodare. In afar de timpul de ntrziere necesar, dintre RAS i CAS, mai
este de asemenea necesar i o ntrziere de prencrcare ntre invocri
succesive ale lui RAS i CAS, timp ce permite ncrcarea
condensatoarelor.Cele mai rapide chip-uri DRAM au nevoie n jur de 40-60 nsec
(latena) pentru acces, cu timpi mai lungi ca de exemplu 100 nsec, ntre citiri
succesive (consum) din cauza restriciilor de prencrcare. Acesta laten include
timpul necesar pentru a adresa liniile externe de interfa la pinii memoriei DRAM;
inovaiile recente permit realizarea de DRAM pe chip, cu timpi de acces mai mici,
n jur de 30 nsec. DRAM va fi ntotdeauna mai dens dar mai lent dect SRAM..

Page-Mode DRAM
Unul din motivele nelegerii DRAM este nelegerea artificiului
utilizat pentru accelerarea timpului de acces, numit page mode/modul
pagin. Acest mod de acces este benefic pentru a accesa structuri de date
care au o localizare spaial, n care cuvintele de memorie adiacente sunt

24

accesate succesiv. Dar accesnd un rnd (fig. 2.5), se pot accesa cuvinte
din rnd, fr ntrzieri suplimentare de RAS i prencrcare. RAMurile
video exploateaz aceast structur avnd o citire de rnd ntr-un SRAM,
care poate fi citit serial, pentru a remprospta un ecran (display) la viteze
nalte. In afara de page mode i video RAM, mai sunt i alte idei care
exploateaz structura DRAM, care pot fi folositoare n reele.
Multe chip-uri de DRAM au avantajul c adresele de linii i coloane nu sunt cerute n
acelai timp astfel ca pot fi multiplezate pe aceeai pini, reducnd necesarul de pini per
chip.

FIGURA 2.6: Ideea RAMBUS, SDRAM, etc., este crearea unui singur chip cu
DRAM multiple paralele, ctignd astfel lime de band de memorie i folosind doar
un set de linii de adrese i de date.

DRAM -uri ntreesute


n timp ce latena memoriei este critic pentru viteza de calcul, debitul
memoriei (numit i lime de band) este de asemenea important pentru multe
aplicaii de reea. Cu o memorie DRAM care are cuvinte de 32b i ciclul de 100
nsec, debitul de ieire, folosind o singur copie a memoriei DRAM este limitat la
32 bii la fiecare 100 nsec. Debitul de ieire poate fi mbuntit folosind accesrile
la DRAM-uri multiple (fig. 2.6), numite bancuri de memorie, care pot avea o
singur magistral. Utilizatorul poate s nceap o citire a bancului1 punnd adresa
pe magistrala de adres. Presupunem c fiecare banc DRAM are nevoie de 100
nsec pentru a returna datele selectate.
n loc s atepte inactiv n acest timp de ntrziere de 100-nsec, utilizatorul poate
s pun o a doua adres pentru bancul 2 pe magistral, a treia pentru bancul 3, i aa
mai departe. Dac punerea fiecrei adrese ia 10 nsec, utilizatorul poate alimnta 10
bancuri DRAM nainte s ajung rspunsul la cererea fcut asupra primului banc
DRAM, urmat 10 nsec mai trziu de rspunsul la cererea fcut asupra celui de-al
doilea banc DRAM, i aa mai departe. Deci limea de band net de memorie
folosit n acest exemplu este de 10 ori mai mare dect cea a unei singure memorii
DRAM, atta timp ct utilizatorul poate face n aa fel nct s aib adresri
consecutive la bancuri consecutive.
In timp ce ideea folosirii de bancuri de memorie multiple este una veche, n ultimii
5 ani proiectanii memoriilor au integrat mai multe bancuri ntr-un singur chip (fig.
2.6), n care liniile de adres i de date pentru toate bancurile de memorie sunt
multiplexate folosind o reea comun de mare vitez numit magistral/bus. In plus,
accesurile de tip page mode sunt de cele mai multe ori permise pe fiecare banc.
Exist multiple tehnologii de realizare a memoriilor folosind aceast idee de baz,
cu diferite valori pentru mrimea DRAM, protocolul de citire i scriere i numrul

25

bancurilor. Exemple importante includ SDRAM cu 2 bancuri i RDRAM (Remote


DRAM)cu 16 bancuri.
Exemplul 4. Cutri/lookup de fluxuri pipeline: un flux este caracterizat de
existena unei adrese IP a sursei i a destinaiei, i de porturi TCP. Unii clieni doresc
ca ruterele s in evidena pachetelor trimise de fiecare flux de reea, pentru
contorizare. Sunt deci necesare structuri de date care s stocheze un contor pentru
fiecare flux ID i care s suporte dou operaii: Insert (FlowID) pentru inserarea
unui nou ID de flux i Lookup (FlowID) pentru gsirea locaiei contorului de flux
ID. Cutarea necesit o potrivire exact a ID-ului fluxului care este n jur de 96 bii
n timpul recepionrii pachetului. Aceasta poate fi fcut prin orice algoritm de
potrivire exact, cum ar fi cel de dispersare/hashing.
Totui, pe msur ce tot mai muli vnztori de rutere vor s limiteze timpul
de lookup pentru cazul cel mai defavorabil, cutarea binar este cea mai bun.
Presupunem c aceste cutri ale ID-urilor fluxurilor trebuie fcute la viteza
liniei, pentru cazul cel mai defavorabil de pachete de 40 bytes la viteze de 2.5
Gbit/sec/viteze OC-48. In consecin chip-ul are la dispoziie 128 nsec pentru a
gsi un ID de flux.
Pentru a mrgini ntrzierile de cutare, considerm un arbore binar simetric, ca
arborele B. Logica parcurgerii arborelui este uoar. Pentru creterea vitezei, ar
trebui ca ID-urile fluxurilor i numrtoarele s fie stocate ntr-o memorie
SRAM.. Estimrile actuale actuale n ceea ce privete nucleul ruterelor arat n
jur de 1 milion de fluxuri concurente. Pstrarea strii pentru 1 milion de fluxuri n
SRAM este scump. Chiar dac folosim doar DRAM-uri, cu arbori binari cu
factor de branament de 2, ar necesita log21.000.000=20 accese de memorie.
Chiar cu un timp de acces optimist al memoriei DRAM de 50 nsec, timpul
necesar ntregii cutri este de 1 sec, care este prea lent
O soluie este folosirea pipelining-ului (fig. 2.7), n care accesul logic prin
pipeline la ID-urile fluxurilor stocate ntr-o memorie RDRAM cu 16 bancuri este
ca n figura 2.6. Toate nodurile de nlime i din arborele binar sunt stocate n
bancul i al RDRAM-ului. Chip-ul de cutare face16 cutri de ID-uri de fluxuri
(pentru 16 pachete) deodat. De exemplu dup ce a cutat n nodul rdcin
pentru pachetul 1 n bancul 1, chip-ul poate s caute, la nodul arborelui de nivel
doi, dup pachetul 1 n bancul 2 i (foarte repede dupa asta) poate s caute la
nodul rdcin al arborelui pentru pachetul 2 din bancul 1. Cnd firul/thread
procesului de cutare a pachetului 1 acceseaz bancul 16, firul procesului de
cutare a pachetului 16 acceseaz bancul 1. Deoarece RDRAM-ul direct
funcioneaz la 800 Mhz, timpul dintre cererile de adresare a magistralei RAMului este mic comparativ cu timpul de acces de citire de 60 nsec. Astfel, n timp
ce unui singur pachet i trebuie16 60 nsec, procesarea concurent a 16 pachete
permite debitul de o gsire de ID de flux la fiecare 60 nsec.

26

FIGURA 2.7: Gsirea identitii fluxului, cu un chip de cutare pipeline, care lucreaz la gsirea a
pn la 16 ID-uri de fluxuri n acelai timp, fiecare din ele accesnd un banc DRAM independent. Chipul de cutare returneaz un index procesorului de reea care actualizeaz numrtorul ID a fluxului.

Dar, un arbore binar cu 16 nivele permite doar 216 = 64 K ID-uri de flux, prea
puin. Din fericire RAMBUS permite o variant de page mode, unde 8 cuvinte de
32 bii pot fi accesate aproape n acelai timp ca 1 cuvnt. Astfel putem gsi dou
chei de 96 bii i 3 pointeri de 20 bii ntr-un acces la memorie de 256 bii. Se
poate deci folosi un arbore cu branament de 3, care permite potenial 316 sau 43
milioane de ID-uri de fluxuri.
2.2.5 Tehnici de proiectare a subsistemelor de memorii
Problema gsirii ID-urilor fluxurilor de date ilustreaz 3 tehnici majore folosite
de obicei n proiectarea subsistemului memoriei pentru chip-urile de reea.
Intreeserea memoriilor i tehnica pipeline: Tehnici similare sunt folosite
n cutarea IP-urilor i algoritmilor de planificare care implementeaz QOS.
Bancurile multiple pot fi implementate folosind cteva memorii externe, o
singur memorie extern ca RAMBUS, sau un SRAM pe chip care contine i
logica de procesare.
Procesarea paralel a cuvintelor lungi: Multe modele de reea, ca schema
vectorilor binari de la Lucent, folosesc cuvinte de memorie lungi care pot fi procesate n
paralel. Aceasta poate fi implementat cu DRAM si folosind page-mode-ul, sau cu SRAM
i fcnd fiecare cuvnt de memorie mai mare.
Combinarea DRAM i SRAM: Tinnd cont de faptul c SRAM este scump i
rapid iar DRAM este ieftin i lent, este de aeptat o combinaie a acestora. Folosirea SRAM
ca i cache pentru bazele de date DRAM este clasic, dar sunt multe aplicaii creative a
memoriei ierarhizate. In exerciii e analizat efectul unui SRAM mic n proiectarea unui chip
cutator de ID. O aplicae mai neobinuit a acestei tehnici de implementare a unui numr
mare de numrtoare, este stocarea n SRAM a biilor de rang inferior.
E mai important ca tnarul proiectant s neleag aceste tehnici de proiectare (dect s
stie detalii de implementare a memoriilor) ca s produc implementri hardware creative a
funciilor de reea.
2.2.6 Proiectarea la nivel de componente
Metodele din ultimele dou seciuni pot fi folosite pentru a realiza o
main de stri/state machine care implementeaz o prelucrare oarecare.
O main cu stri are starea curent stocat n memorie; maina
proceseaz datele de intrare folosind logica combinaional, citete starea
curent i eventual memoreaz starea. Un exemplu de main complex cu
stri este procesorul Pentium, a crui stare curent este o combinaie de

27

registre, memorie cache i memorie principal. Un exemplu de main cu


stri mai simpl este chip-ul de cutare a ID-ului fluxului (flow ID lookup)
din figura 2.7, a crui stare e dat de registrele folosite pentru urmrirea
fiecreia din cele 16 cutri concurente i RDRAM-ul care memoreaz
arborele binar B.
Doar puine chip-uri cheie trebuie proiectate pentru a realiza un ruter sau
o plac de reea, iar restul proiectrii este la nivelul componentelor:
organizarea i interconectarea chip-urilor pe plac i amplasarea plcii n
carcas innd cont de factorul de form, de putere i de rcire. Un aspect
cheie n proiectarea la nivel de componente este nelegerea limitrii
impuse de numrul de pini (pin-count) care de obicei permite verificrii
de paritate rapid a proiectelor fezabile.
Exemplul 5. Influena numrului de pini asupra bufferelor din rutere:
considerm un ruter cu 5 legturi, fiecare de 10Gb/s. Necesarul de buffer-e
va fi 200ms*50Gb/s, deci 10Gb. Din cauza costului i a puterii se folosesc
DRAM-uri pentru memoriile tampon/buffer de pachete. Deoarece fiecare
pachet trebuie s intre i s ias n/din buffer, limea total de band
trebuie s fie dublul limii de band de intrare (ex.100Gb/s). Dac
presupunem o suprancrcare de 100% pentru antetele pachetelor interne,
legturile dintre pachetele din cozile de ateptare i lime irosit de band
de memorie, atunci este rezonabil s considerm o lime de band de
200Gb/s pentru memorie.
Pentru o singur memorie RDRAM direct cu 16 bancuri, specificaiile
dau o lime maxim de band a memoriei de 1.6Gb/s, sau 13Gb/s.
Accesarea fiecrei memorii RDRAM necesit 64 de pini de interfa
pentru date i 25 de pini pentru adrese i control, deci un total de 90 pini.
Pentru a obine 200Gb/s avem nevoie de 16 memorii RDRAM, care
necesit 1440 de pini n total. O limit superioar conservativ a
numrului de pini per chip este de circa 1000. Chiar dac productorul de
rutere ar construi un chip foarte rapid, personalizat conform cererii
clientului, capabil s trateze toate pachetele la rata maxim, tot mai este
nevoie de mcar un chip pentru manevrarea traficului n/din buffer-ul de
pachete RAMBUS. n concluzie limitarea numrului de pini este o
condiie cheie n partiionarea proiectrii ntre chip-uri.
2.2.7 Concluzii despre hardware
Din partea de hardware cele mai importante sunt tehnicile de proiectare
din &2.2.5. Urmtorii parametri sunt utili pentru proiectanii de sisteme:
Scalarea complexitii chipului: numrul total de componente per
chip se dubleaz la fiecare doi ani. La momentul de fa un ASIC
(Application Specific Integrated Circuit) poate conine mai multe milioane
de pori logice plus nc 50 Mbii ntr-o memorie SRAM pe chip. DRAM
ncorporat pe chip este o opiune comun, pentru a avea mai mult spaiu
pe chip chiar cu ntrzieri mai mari.
Viteza chip-ului: frecvene de 1GHz sunt comune, unele chip-uri
ajungnd pn la 3GHz. Un ciclu de tact pentru un chip care lucreaz la
1GHz este de 1ns. Dac se opteaz pentru operarea n paralel prin
pipeline-uri i memorii cu cuvinte extinse, se pot efectua mai multe
operaii pe un singur ciclu de tact, mrindu-se astfel substanial viteza de
procesare.

28

I/E chip-ului: numrul de pini per chip crete de la an la an, dar


deocamdat limitarea superioar este de 1000 pini per chip.
I/E seriale: sunt disponibile legturi seriale ntre chip-uri de pn la
10Gb/s.
Scalarea memoriei: exist memorii SRAM pe chip cu timpi de acces
de 1ns, iar memoriile SRAM externe au de obicei timpi de acces de 2.5ns.
Pentru memoriile DRAM avem 30ns pentru cele integrate pe chip i 60ns
pentru cele externe chipului. Desigur se pot folosi memorii DRAM
ntreesute pentru a mbunti rata de transfer a subsistemului memoriei
pentru anumite aplicaii. Costul DRAM e de 4-10 ori mai mic dect
SRAM la aceeai capacitate.
Puterea i carcasa: consumul mare de putere a ruterelor de mare
vitez necesit o proiectare adecvat a sistemului de rcire/ventilaie. De
asemenea exist i o cerin de minimizare a dimensiunilor ruterelor
pentru a putea fi montate n rack-uri dedicate ct mai compacte.
Valorile acestor parametri au o influen clar asupra proiectrii de reele
de mare vitez. De exemplu, la viteze OC-768, un pachet de 40 octei
ajunge n 3.2ns, deci este clar c toate strile prin care trece prelucrarea
pachetului trebuie s fie puse n memorii SRAM integrate pe chip. Din
pcate capacitatea acestor memorii pe chip nu crete att de repede ca i
numrul de fluxuri din ruter. Cu o memorie SRAM de 1ns, cel mult 3
operaii de acces a memoriei pot fi efectuate spre un singur banc de
memorie n timpul sosirii unui pachet.
Deci tehnicile de proiectare din &2.2.5 trebuie folosite n interiorul
chip-ului pentru a obine paralelismul n chip-uri, folosind bancuri
multiple de memorie i cuvinte extinse, i pentru a crete memoria
utilizabil combinnd memoriile de pe chip cu memoriile externe. Dar
deoarece densitatea de chip-uri i constrngerile de putere limiteaz
paralelismul la un factor de maxim 60, concluzia este c toate funciile de
prelucrare a pachetelor la vitez mare trebuie s foloseasc cel mult 200
accesri ale memoriei i o memorie pe chip limitat.
2.3. Arhitectura echipamentelor de reea
Optimizarea performanelor reelelor necesit optimizarea cilor datelor
prin nodul surs i prin fiecare ruter. Din acest motiv este important
nelegerea arhitecturii interne a nodurilor terminale i a ruterelor. n
esen i ruterele i nodurile terminale sunt maini cu stri, dar arhitectura
fiecruia este optimizat pentru scopuri diferite. Nodurile terminale au o
arhitectur mai general pentru relizarea unor operaii comune, n timp ce
ruterele sunt specializate pentru comunicaia de tip Internet.
2.3.1 Arhitectura nodurilor terminale
Un procesor cum este Pentium este o main cu stri, care ia o secven
de instruciuni i date de intrare, dup care trimite ieirea spre anumite
echipamente de I/E, precum imprimante i terminale. Pentru a asigura
programelor un spaiu mare de memorare a strilor, cea mai mare parte a
informaiei este stocat n memorii externe ieftine precum DRAM. n PCuri aceast memorie reprezint memoria principal i este implementat
folosind 1GB sau mai mult de memorii DRAM ntreesute, precum
SDRAM. Dar memoriile DRAM necesit un timp de acces mare (60ns) i

29

dac strile proceselor ar fi memorate numai n DRAM, atunci o


instruciune ar necesita 60ns pentru a scrie i a citi din memorie.
Procesoarele mai folosesc o memorie pentru a ctiga vitez care se
numete cache. Memoria cache este o memorie relativ mic format din
memorii SRAM, care memoreaz buci de stri folosite des, mrind
astfel viteza de acces. Unele memorii SRAM (ex. L1 cache) se afl n
procesor pe cnd altele (ex. L2 cache) sunt externe procesorului. O
memorie cache este un tablou care mapeaz adresele de memorie ale unor
locaii i coninutul acestora. Cache-ul procesorului folosete o funcie
simpl de cutare: extrage civa bii din adres pentru a-i indexa ntr-un
tablou i apoi caut n paralel toate adresele care se potrivesc cu elementul
din tablou. Cnd o locaie de memorie tebuie citit din DRAM ea este
stocat n cache i un element deja existent din cache poate fi eliberat.
Datele folosite des sunt stocate ntr-o memorie cache de date n timp ce
instruciunile folosite des sunt stocate ntr-o memorie cache de intruciuni.
Memorarea in cache este eficient dac instruciunile i datele prezint o
localizare temporal (poziia corespunztoare este reutilizat frecvent ntro perioad scurt de timp) sau o localizare spaial (accesarea unei locaii
este urmat de accesarea unei locaii vecine). Localizrile spaiale sunt
avantajoase deoarece accesarea unei locaii din DRAM implic accesarea
unei linii R i apoi a unei coloane din acea linie. Deci citirea cuvintelor de
le linia R este mai puin costisitoare dup ce linia R a fost accesat. Astfel,
procesorul Pentium extrage anticipat 128 de bii vecini n memoria cache
(mrimea unei linii din cache), de fiecare dat cand sunt accesai 32 de bii
de date. Accesarea celor 96 de bii adiaceni nu va atrage o disfuncie n
memoria cache.
Multe benchmark-uri (programe pentru testarea performantei calculelor)
prezint localizri temporale i spaiale, dar n cazul fluxurilor de pachete
cel mai probabil se va ntlni doar fenomenul localizrilor spaiale.
Imbuntirea performanelor protocoalelor nodurilor terminale necesita o
analiza atenta a efectelor memoriei cache.
n figura 2.8 se prezint arhitectura unui nod terminal:
CPU

Memorie

MMU, Cache
Magistral sistem
Adaptor magistral

Interfa reea
Magistral I/E
Figura 2.8: Arhitectura unei staii de lucru

Procesorul, CPU, este conectat la o magistral/bus (similara cu o retea ca


Ethernet, dar optimizata prin faptul ca dispozitivele sunt apropiate), prin
30

care comunic cu celelalte componente trimind mesaje pe magistrala.


Echipamentele de I/E sunt de regul memory mapped, adic pentru
procesor toate dispozitivele de I/E (placa de reea sau discul) reprezint
locaii de memorie. Astfel se asigur o comunicare uniform ntre CPU i
orice echipament, folosind aceleai convenii ca la accesarea memoriei. Cu
terminologia din retele, o citire/scriere se poate vedea ca un mesaj trimis
pe magistral, adresat unei locatii de memorie, locatie la care se poate afla
si un dispozitiv de I/E.
Mainile moderne permit accesul direct la memorie DMA (Direct
Memory Acces), prin care echipamente precum discul/adaptorul de reea
trimit datele de citit/scris pe magistral, direct la memorie fr intervenia
procesorului. Dar la un moment dat doar o entitate poate folosi magistrala,
motiv pentru care adaptorul trebuie s concureze pentru magistral.
Fiecare echipament care ocup magistrala va fura cicluri procesorului,
deoarece procesorul e obligat sa astepte pentru accesul la memorie cat
timp dispozitivul trimite mesaje pe magistrala.
Tot n figura 2.8 se observ c adaptorul de magistral este conectat la
magistrale diferite (magistrala de sistem sau de memorie) iar toate
echipamentele sunt conectate la magistrala de I/E. Magistrala de memorie
este proiectat pentru viteze mari, i este reproiectat pentru fiecare
procesor nou. Magistrala de I/E este standard (ex. magistrala PCI) ea fiind
aleas pentru a rmne compatibil i cu echipamentele de I/E mai vechi,
astfel ca ea este mai lent dect cea de memorie.
Trebuie reinut c rata de transfer a unei aplicaii de reea este limitat
de viteza celei mai lente dintre magistrale, de obicei magistrala de I/E.
nc i mai ru este faptul c sunt necesare i copii suplimentare pentru
diverse sisteme de operare, astfel ca fiecare pachet transmis sau
recepionat de staia de lucru va traversa magistrala de cateva ori.(vezi
capitolul 5 pentru tehnicile de evitare a traversrii multiple a magistralei).
Procesoarele moderne folosesc tehnica pipeline/seriala pentru extragerea
instruciunii, decodarea instruciunii, citirea i scrierea datelor, care sunt
divizate n mai multe stri intermediare. Mainile superscalare i cele cu
multiple fire de execuie/multithreaded trec dincolo de tehnica pipeline
prin tratarea mai multor instruciuni n acelai timp n mod concurenial. n
timp ce aceste metode nltura congestia cauzata de calcule, ele nu
mbuntesc congestia cauzata de transferul de date. Se consider
urmtorul exemplu de arhitectura:
Exemplul 6: arhitectur de nod terminal cu comutator crossbar: in figura
2.9 magistrala nodului terminal este nlocuit de un comutator hardware
programabil, folosit deseori la rutere.
Comutatorul conine un numr de magistrale paralele a.. fiecare set de
perechi de puncte terminale disjuncte poate fi conectat n paralel prin
intermediul comutatorului. Astfel, n figur, procesorul este conectat la
memoria 1, n timp ce placa de reea este conectat la memoria 2. n acest
fel, pachetele care sosesc din reea pot fi stocate n memoria 2 fr a
interfera cu procesorul care citete din memoria 1. n momentul n care
procesorul dorete s citeasc pachetul de date sosit, comutatorul poate fi
reprogramat pentru a conecta procesorul cu memoria 2 i placa de reea cu
memoria 1.
31

Comutator programabil
paralel
Procesor

Memorie 1

Plac de reea

Memorie 2

Figura 2.9. Folosirea conexiunilor paralele ntr-un nod terminal pentru a permite
procesarea concurent i trafic de reea printr-un comutator paralel.

Acest mod de funcionare este eficient dac coada bufferelor de pachete


goale, folosita de placa de reea, alterneaz ntre cele dou memorii. Exist
propuneri recente de nlocuire a magistralei de I/E din procesoare cu
tehnologia de comutare Infiniband. Ideea ce trebuie retinuta din acest
exemplu este ca, nu este neaparat buna arhitectura in fig.2.9, ci schimbari
simpe ale arhitecturii pot fi concepute chiar si de catre proiectantii de
protocoale, conform unor modele simple de hardware si arhitecturi.
2.3.2 Arhitectura ruterelor
Modelul unui ruter care acoper att ruterele high-end (seria de rutere
Juniper M) precum cat i ruterele low-end (Cisco Catalyst), este
prezentat n figura 2.10. n principiu, un ruter este un echipament cu un
set de legaturi de intrare, i un set de legturi de ieire. Sarcina ruterului
este de a comuta pachetul de pe legtura de intrare pe legtura de ieire
corespunztoare adresei destinaie din pachet. n timp ce legturile de
intrari i de ieire sunt reprezentate separat, cele dou legturi n fiecare
direcie ntre dou rutere sunt deseori mpachetate mpreun. Exist trei
congestii principale ntr-un ruter: cutarea adresei, comutarea i coada de
ieire.

Ruter
B2

Legturi
de ieire

Comutare
B3

Legtura de
intrare i

Planificare
B1
Cutare adres
Figura 2.10 Model de ruter cu cele 3 congestii principale in calea de inaintare:
cutarea adresei (B1), comutarea (B2) i planificarea ieirii (B3).

32

Cutarea adresei (lookup)


Un pachet care sosete pe legtura de intrare i poart o adres IP de 32
bii (desi majoritatea utilizatorilor lucreaza cu nume de domenii, acestea
sunt translatate in adrese Ipde serviciul DNS, inainte ca pachetul sa fie
transmis). Presupunem c primii 6 bii ai adresei destinaie din pachet sunt
100100. Un procesor din ruter va inspecta adresa destinaie pentru a
determina ncotro s dirijeze pachetul n cauz.
Procesorul consult o tabel de rutare/inaintare pentru a determina
legtura de ieire pentru pachet. Acest tabel mai poart denumirea de FIB
(Forwarding Information Base) baza de informaii pentru dirijare. FIB
conine un set de prefixe i legatura de ieire corespunztoare. Un prefix
poate fi privit ca fiind un cod de jude/zona de lungime variabil care
reduce substanial mrimea tabelei FIB. Un prefix ca 01 (unde poate
insemna oricte alte simboluri), se potrivete cu toate adresele IP care
ncep cu 01.
Presupunem un prefix 100 care are atribuit legtura de ieire 6, n
timp ce prefixul 1 are atribuit ieirea 2. n acest caz adresa 100100 se
potrivete cu ambele prefixe i avem o problem de ambiguitate. Pentru
nlturarea incertitudinii, ruterele IP asociaz adresa cu prefixul cel mai
lung/the longest prefix matching cu care se potrivete, astfel c n
exemplul de fa se va alege legtura de ieire 6 pentru pachetul de date.
Procesorul care realizeaz cutarea/identificarea i procesarea de baz
asupra pachetelor poate s fie un procesor dedicat/partajat de uz
general/chip specializat. Ruterele din primele generaii foloseau
procesoare partajate, dar acest lucru s-a dovedit a fi o congestie.
Generaiile mai noi de rutere (familia Cisco GSR) folosesc un procesor
dedicat pentru fiecare legtur de intrare. La nceput s-au folosit
procesoare de uz general, dar mai nou (Juniper M-160) se folosesc chipuri
specializate (ASIC) cu un oarecare grad de programabilitate.Clientii
pretind ruterelor functii noi, ca echilibrarea incarcarii Web. Ruterele mai
noi folosesc procesoare de reea (exemplul 7), care sunt procesoare de uz
general optimizate pentru reele.
Exista o serie de algoritmi folosii pentru identificarea prefixului. Multe
rutere de azi ofer un mod de cutare mai complex numit clasificarea
pachetelor, unde pentru cutare se folosete ca intrare adresa destinaie,
adresa surs i portul TCP.
Comutarea
Dup identificarea adresei, procesorul spune sistemului de comutaie
intern s transfere pachetul de pe intrarea i spre ieirea corespunztoare
(ieirea 6 din exemplu). n procesoarele mai vechi, comutatorul era o
simpl magistral, ca n figura 2.8. Acest mod de abordare s-a dovedit a fi
o mare limitare de vitez, deoarece, daca comutatorul are N intrri, fiecare
cu B bii/s, magistrala trebuia s aib o lime de band de BN. Pe msur
ce N crete, efectele electrice (capacitatea electrica a magistralei) vor
deveni predominante, limitnd viteza magistralei.
Din acest motiv ruterele cele mai rapide de azi folosesc un comutator
paralel (figura 2.9). Rata de tranfer a comutatorului crete folosind N
magistrale paralele, una pentru fiecare intrare i una pentru fiecare ieire.

33

O intrare este conectat cu o ieire prin comandarea tranzistoarelor care


conecteaz magistralele de intrare i ieire corespunztoare. n timp ce
realizarea legturii ntre magistrale este relativ simpl, partea mai dificil
este planificarea comutatorului, deoarece mai multe intrari ar putea s
doreasc s comunice cu o anumit ieire n acelai timp. Problema
planificrii comutatorului se rezum la identificarea intrrilor i ieirilor
disponibile la fiecare interval de sosire a pachetelor.
Memorarea n coada de ateptare
Dupa ce pachetul (figura 2.10) a fost identificat i comutat spre ieirea 6,
ieirea 6 s-ar putea s fie congestionat, i deci pachetul s-ar putea s
trebuiasc s fie pus ntr-o coad de ateptare pentru ieirea 6. Majoritatea
ruterelor mai vechi pun pur si simplu pachetele ntr-o coad de transmisie
de tip FIFO. Alte rutere folosesc insa metode mai sofisticate de planificare
a ieirii pentru a asigura alocri echitabile de band i ntrziere.
Pe lng cutare, comutare i memorarea n coada de ateptare mai
exist un numr de alte sarcini care trebuie efectuate, mai putin critice ca
timp.
Validarea antetului i sumele de control
Este verificat numrul versiunii fiecrui pachet i pentru opiuni este
verificata lungimea antetului. Opiunile sunt directive de procesare
suplimentare ctre procesor, dar care sunt folosite rar; astfel de pachete
sunt de cele mai multe ori untate spre un procesor special. i antetul are o
sum de control simpl ce trebuie validat. n cele din urm mai trebuie
decrementat contorul de timp de viata TTL (time to live) i suma de
control a antetului trebuie recalculat. Suma de control se poate actualiza
incremental. Validarea antetului i calculul sumelor de control se fac prin
hardware.
Procesarea rutei
Ruterele din interiorul unor domenii implementeaz RIP i OSPF, n
timp ce ruterele care leag domenii diferite trebuie s implementeze i
BGP(*). Aceste protocoale sunt implementate n unul sau mai multe
procesoare de rutare. De exemplu dac un pachet de stare a legturii este
trimis spre ruterul din figura 2.10, procesul de cutare va recunote c
acest pachet este destinat ruterului nsui i va determina comutarea
pachetului spre procesorul de rutare. Procesorul de rutare menine baza de
date cu starea legturilor i calculeaz drumurile cele mai scurte. Dup
calcul, procesorul de rutare ncarc noua tabel de rutare n fiecare dintre
procesoarele de rutare, fie prin comutator, fie printr-o cale separat din
afara benzii. La nceput CISCO procesa nu numai pachete Internet dar i
alte protocoale precum DECNET, SNA sau Appletalk. La ora actual s-a
introdus comutarea multi-protocol dup etichet (MPLS Multi Protocol
Label Switch) care este esenial pentru ruterele core, ale retelelor de
tranzit. n MPLS, antetului IP i se adauga un alt antet care conine indici
ntregi simpli, care pot fi identificai direct fr cautarea prefixului.
(*)E posibilla achizitionarea acestor protocoale, dar software-ul trebuie personalizat
conform cu noile platforme hardware. O problema si mai delicata este, in special pentru
BGP si OSPF, ca multe dintre primele implementari ale acestora variaza in mod subtil
fata de specificatiile actuale. Noile implementari care indeplinesc specificatiile ar putea sa

34

nu poata interopera cu ruterele existente. Astfel ca ISP-urile opun rezistenta la


cumpararea noilor rutere, daca acestea nu asigura calitateacodului BGP, in sensul
capacitatii de interoperare cu ruterele existente.

Procesarea protocolului
Toate ruterele din ziua de azi trebuie s implementeze protocolul SNMP
(Simple Network Management Protocol) i s furnizeze un set de contoare
care s poat fi verificate de la distan. Pentru a permite comunicarea la
distan cu ruterele, majoritatea ruterelor implementeaz i protocoalele
TCP i UDP. Pe lng acestea ele mai trebuie s implementeze protocolul
ICMP (Internet Control Message Protocol) care este de fapt un protocol de
transmisie a mesajelor de eroare, precum depirea timpului de viata
TTL.
Fragmentarea, redirecionarile i ARP
Este clar c procesarea rutei i a protocolului este ndeplinit cel mai
bine de un procesor de rutare pe o aa numit cale nceat, dar sunt
cateva funcii mai ambigue ale ruterului. De exemplu dac un pachet de
4000 octei trebuie transmis pe o legtur cu o limit maxim a pachetelor
MTU (Maximum Transfer Unit) de 1500 octei, pachetul va trebui s fie
fragmentat in doua. Desi aceasta fragmentare este in general facuta de
sursa, multe rutere fac acest lucru in calea rapida. O alt funcie este cea de
trimiteri de Redirecionri. Dac un nod terminal trimite un mesaj spre un
ruter greit, atunci ruterul trebuie s trimit napoi o redirecionare
sprenodul terminal. O a treia funcie de acest fel este transmiterea cererilor
de identificare a adresei ARP (Adress Resolution Protocol). Ruterele din
ziua de azi mai au i alte funcii care trebuie rezolvate. Multe rutere din
ntreprinderi manevreaz pachetele pe baza coninutului, astfel c
procesarea de pachet se face n funcie de irurile de caractere din pachet.
De exemplu ruterele care primesc traficul Web pentru mai multe servere ar
putea sa doreasca sa transmita pachetele cu acelasi URL aceluiasi server
Web. In plus, mai exist i funciile de msurarea i contorizare a
traficului.
Exemplul 7: Procesoare de reea: sunt procesoare programabile de uz
general, optimizate pentru traficul de reea. Crearea lor a fost justificata de
caracterul impredictibil al naturii sarcinilor ruterelor (ca livrarea pe baza
continutului), ceea ce ar face riscanta crearea unor rutere implementate
exclusiv hardware. Procesorul de reea Intel IXP1200 conine ase
procesoare interne, fiecare rulnd cu 177MHz, i avnd un ciclu de tact de
5.6ns. Fiecare procesor recepioneaz pachete de la o coad de intrare
(pachetele sunt stocate ntr-o memorie DRAM mare). Dup ce procesorul
a identificat legtura de ieire, pachetul este pus n coada de ieire cu o
etichet ce specific legtura de ieire spre care trebuie dirijat.
Problema principal este c procesoarele sunt responsabile de transferul
pachetelor n/din memoria DRAM. La IPX1200 mutarea a 32 de octei din
coad spre DRAM necesit 45 tacte i 55 de tacte pentru mutarea din
DRAM n coad. Deoarece dimensiunea minim a unui pachet este de 40
octei sunt necesare 200 cicluri de tact = 1.12 s, ceea ce se traduce ntr-o
rat de rutare de numai 900K pachete/s. Acest neajuns se nltura folosind
6 astfel de procesoare paralele i o idee numit multithreading/fire de
35

execuie multiple. Ideea principal este c fiecare procesor lucreaz pe mai


multe pachete, fiecare pachet reprezentnd un fir de execuie; cnd
procesarea unui pachet stagneaz din cauza referirii la memorie se reia
execuia urmtorului fir de execuie. Folosind comutarea rapid de context
ntre firele de execuie i patru contexte per procesor, procesorul IPX1200
poate obine teoretic 6 4 900 = 21.4 Mpachete/s.
Procesoarele de reea ofer i instruciuni speciale pentru identificarea
adreselor i funcii uzuale de dirijare. Unele procesoare de reea
fluentizeaza miscarea pachetelor de date folosind motoare hardware care
arat procesorului doar antetul fiecrui pachet. Ceea ce rmne din
pachetul de date este transferat direct spre coada de ieire.
Procesorul/procesoarele citeste antetul, identific legtura de ieire i scrie
antetul reactualizat n coada de ieire. Partea hardware concateneaz
antetul reactualizat i pachetul original i pstreaz toate pachetele n
ordine. Desi aceast metod evit transferarea prin procesor a datelor din
pachet, ea nu mbuntete tratarea pachetelor de dimensiune minim.
Studiu de caz 2: Memorarea in tampoane i comutarea optic.
Legturile pe fibr optic ofer viteze din ce n ce mai mari, dar partea
implementarea electronic a logicii i memoriile din ruterele core
reprezint o strangulare. Pachetele sosesc pe legturi de fibr optic,
fiecare bit fiind codat ca un impuls luminos. La receptor se convertete
lumina n semnal electric i apoi partea electronic implementeaz
comutarea i rutarea. Pachetul este depus ntr-o coad de ieire din care
biii sunt convertii iar n impulsuri luminoase. Pentru nlturarea
congestiei se pot crea rutere total optice.
Din pcate identificarea optica a adresei IP i mai ales realizarea unor
memorii optice dense pentru pachete este nc destul de dificil, dar
comutarea luminii ntre diferite noduri terminale este realizabil. Un
comutator optic de circuit, conecteaza intrarea X cu ieirea Y pe o durat
relativ lung, comparativ cu durata unui singur pachet din comutatoarele
de pachete. Astfel de comutatoare de circuit sunt folosite ca rutere core
flexibile din reeaua unui ISP (Internet Service Provider) pentru a
interconecta ruterele convenionale. Dac de exemplu, traficul dintre
ruterul R1 i R2 crete, un operator de servicii internet poate schimba
comutatoarele de circuit spre a mri banda legturii R1R2 (pe durata mai
multor minute). Ruterele cu comutare de pachete probabil ca vor exista
nc o perioad lung n viitor, innd cont de caile rezervate de fluxurile
de scurta durata.
2.4. Sistemele de operare
Un sistem de operare OS (Operating System) este software-ul care sta
deasupra componentelor hardware-ului facilitand sarcina programatorilor
de aplicatii. Pentru cele mai multe rutere de Internet, pachetele la care
timpul de transmisie este critic sunt tratate direct prin hardware (fig. 2.10)
si nu sunt mediate de sistemul de operare. Coduri care sunt mai putin
critice ca timp ruleaza pe sistemul de operare al unui ruter, descris mai jos
(IOS Cisco). Totusi, pentru a imbunatati performantele cap-la-cap pentru
navigare Web, de exemplu, un proiectant trebuie sa inteleaga costurile si
beneficiile folosirii sistemului de operare.

36

Abstractizarile sunt idealizari sau iluzii pe care le inventam pentru a ne


descurca cu ciudateniile lumii reale. Pentru a reduce dificultatile, sistemul
de operare ofera abstractizari pentru programatorii aplicatiilor. La lucrul
cu hardware-ul apar trei probleme importante: intreruperile, administrarea
memoriei, si controlul dispozitivelor de I/O. Pentru a trata aceste
dificultati, sistemele de operare ofera abstractizari cum sunt calculul
neafectat de intreruperi, memoria infinita si I/O simple.
O abstractizare corecta creste productivitatea programatorilor, dar are
doua costuri. Primul, mecanismul de implementare a abstractizarii are un
pret. De exemplu, planificarea proceselor poate cauza supraincarcarea
serverului Web. Al doilea cost, mai putin evident, este acela ca
abstractizarea poate masca puterea, impiedicand programatorul sa
foloseasca optim resursele. De exemplu, managementul memoriei la un
sistem de operare, poate impiedica programatorul unui algoritm de cautare
pe internet sa-si tina in memorie structura de date a cautarii pentru a
maximiza performantele sistemului.
2.4.1. Calculul neintrerupt prin procese
Un program nu poate rula foarte mult pe un procesor fara a fi intrerupt
de adaptorul de retea. Daca programatorii aplicatiilor trebuie sa foloseasca
intreruperi, rularea unui program de 100 de linii de cod ar fi un miracol. In
consecinta sistemele de operare ofera programatorilor abstractizarea unui
calcul secvential neintrerupt sub numele de proces.
Abstractizarea procesului este realizata prin trei mecanisme: comutarea
contextului, planificarea si protectia, primele doua fiind descrise in figura
2.11. In figura, procesul P1 are iluzia ca el ruleaza singur pe procesor . In
realitate, cum se vede si pe axa timpului, procesul P1 poate fi interupt de o
intrerupere de ceas, care lanseaza in lucru pe procesor planificatorul OS .
Inlocuirea lui P1 pretinde OS-ului sa-i salveze starea in memorie.
Planificatorul poate rula rapid si decide sa-i dea controlul procesului P2.

Figura 2.11 Programatorul are iluzia timpului continuu, neintrerupt,dar timpul


procesorului e impartit intre mai multe procese

Relansarea in rulaj a procesului P2 necesita readucerea starii lui P2 din


memorie in procesor. Astfel ca actuala axa a timpului pentru procesor
poate implica schimbari frecvente de context intre procese, dirijate de
planificator. In plus, protectia asigura ca anumite comportamente incorecte
sau daunatoare al unui proces sa nu poata afecta alte procese.

37

Figura 2.12 Procesul de primire a pachetelor de pe internet este impartit intre adaptorul
de retea, nucleu si procesul destinatie

Ca agenti ai calculului, procesele sunt de trei tipuri manipulatorul de


intreruperi, firele de procese si procesele utilizator clasificate in ordinea
cresterii gradului de generalitate si al costului. Manipulatoarele/handler-e
de intreruperi sunt programe mici folosite pentru rezolvarea cererilor
urgente, cum ar fi sosirea unor mesaje la placa de retea; ele au un numar
redus de stari, folosind doar cateva registre de stare. Procesele utilizator
folosesc complet starile masinii, memoria si registrele; astfel este scumpa
comutarea intre procesele utilizator, la comanda planificatorului. In
cadrul unui singur proces, firele de procese ofera o alternativa mai ieftina
decat procesele. Un fir de proces este un proces simplu care ocupa mai
putine registre de stare, deoarece firele aceluiasi proces partajeaza aceeasi
memorie (si deci aceleasi variabile) . Astfel comutarea contextului intre
doua fire de executie ale aceluiasi proces este mai ieftina decat comutarea
proceselor, deoarece memoria nu trebuie sa fie realocata. Urmatorul
exemplu arata relevanta acestor concepte pentru nodului terminale ale
retelei.
Exemplul 8. Receptorul Livelock in BSD Unix. In BSD UNIX (fig.
2.12), sosirea unui pachet genereaza o intrerupere. Intreruperea este un
semnal hardware care determina procesorul sa salveze starea proceselui
ce ruleaza (de exemplu , un program Java). Procesorul sare apoi la codul
manipulatorului de intreruperi, si evita planificatorul pentru a creste viteza.
Manipulatorul de intreruperi copiaza pachetul in nucleu, intr-o coada
pentru pachete IP in asteptarea servirii, si face o cerere pentru un fir de
executie al sistemului de operare (numita intrerupere software), si iese.
Presupunand ca nu mai apar alte intreruperi, la iesirea din intrerupere se
cedeaza controlul planificatorului, care probabil va ceda procesorul
intreruperii software, care are prioritate mai mare decat procesele
utilizator.
Firele de executie ale nucleului fac o procesare de tip TCP si IP si
memoreaza pachetul in coada de aplicatii adecvata, numita coada socket
(fig. 2.12). Sa presupunem ca aplicatia este un browser cum ar fi Netscape.
Netscape ruleaza ca un proces adormit in asteptarea datelor si acum este
considerat de planificator ca fiind in rulaj pe procesor. Dupa ce se termina
38

intreruperea software si controlul revine planificatorului, planificatorul


poate decide sa ruleze Netscape in locul programului initial Java.
Daca reteaua e foarte incarcata, calculatorul poate intra in starea numita
receiver livelock, in care petrece tot timpul procesand pachetele care
sosesc, numai pentru a le arunca mai tarziu deoarece aplicatiile nu ruleaza
niciodata. In exemplul nostru, daca pachetele sosesc unul dupa altul,
planificatorul pentru intreruperi va trata doar prioritatea cea mai mare, si
este posibil sa nu mai ramina timp pentru intreruperi software si sigur nu
ramine deloc timp pentru procesul de navigare. Deci se vor umple ori
cozile IP ori cele socket, si pachetele vor fi aruncate, dupa ce au fost
investite resurse in prelucrarea lor.
Intarzierea si debitul codului de retea din nodul terminal al unei retele
depind de timpii de activare ai proceselui. De exemplu, datele actuale arata
ca pentru procesoarele Pentium IV, latenta intreruperii este in jur de 2s
pentru un apel nul de intrerupere, in jur de 10s pentru un comutator
Context Process de pe o masina Linux cu doua procese, si mult mai mult
timp pentru Windows si Solaris pe aceeasi masina. Acesti timpi par mici,
dar in 10 s pot ajunge 30 de pachete de dimensiune minima (40-bytes)
pe o legatura Gigabit Ethernet.
2.4.2 Memoria infinita folosind memoria virtuala
La memoria virtuala (fig.2.13), programatorul lucreaza cu
o
abstractizare a memoriei care consta dintr-o zona liniara, in care
compilatorul asigneaza diferite locatii. Variabila X poate fi stocata in
locatia 1010 in aceasta zona imaginara (sau virtuala). Abstractizarea
memoriei virtuale este implementata folosind mecanismul dublu, de
asociere de tabele de pagini si cerere de pagini. Intelegerea ambelor
mecanisme este cruciala pentru optimizarea costulului transferului datelor
prin nodul terminal.
Orice adresa virtuala trebuie sa corespunda unei adrese fizice de
memorie. Cea mai usoara mapare este folosirea unei deplasari (offset) in
memoria fizica. De exemplu, o zona virtuala de 15.000 de locatii, poate fi
mapata in memoria fizica de la locatia 12.000 pana la 27.000. Aceasta are
doua dezavantaje: mai intai, cand programul ruleaza, trebuie gasite 15.000
de locatii alaturate. Apoi, programatorul nu are voie sa foloseasca o
memorie mai mare decat cea fizica.

39

Figura 2.13 Programatorul are iluzia unei memorii virtuale continue; in realitate este
asociata din parti ale memoriei principale si pagini de pe discul de memorie, folosind
tabele de pagini

Ambele probleme pot fi evitate prin maparea bazata pe o tabela de


cautare (table lookup). Deoarece implementarea maparii dintre orice
locatie virtuala catre orice locatie fizica consuma prea multa memorie, se
foloseste o mapare mult mai resctrictiva bazata pe pagini este folosita.
Consideram ca pentru orice adresa virtuala, bitii cei mai semnificativi(de
exemplu 20 de biti) dau numarul paginii iar cei mai putin semnificativi
(de exemplu 12 de biti) dau pozitia din interiorul paginii. Toate locatiile
din interiorul unei pagini virtuale sunt mapate fata de aceeasi locatie
relativa, dar paginile virtuale individuale pot fi mapate la locatii arbitrare.
Memoria principala este de asemenea divizata in pagini fizice, astfel ca
fiecare grup de 212 cuvinte de memorie constituie o pagina fizica.
Pentru a asocia o adresa virtuala cu una fizica, pagina virtuala
corespunzatoare (in exemplu, cei 20 de biti cei mai semnificativi) este
asociata numarului unei pagini fizice, dar mentinand aceeasi locatie in
interiorul paginii. Asocierea se face prin cautarea in tabela de pagini,
indexata cu numarul paginii virtuale. O pagina virtuala poate fi localizata
in orice pagina a memoriei fizice. Mai general, unele pagini pot sa nu fie
rezidente in memorie (de exemplu, pagina virtuala 2 in fig. 2.13) si pot fi
marcate ca fiind pe disc. Cand este accesata o astfel de pagina, hardwareul va genera o exceptie, determinand sistemul de operare sa citeasca
pagina de pe disc intr-o pagina a memoriei principale. Acest mecanism
secundar se numeste cerere de pagini/demand paging.
Asocierea/cererea de pagini rezolva impreuna doua probleme: de
alocare si de limitare a alocarii memoriei . In loc sa rezolve problema mai
dificila de alocare a informatiilor stocate in locatii de marime variabila, OS
are nevoie doar sa tina minte o lista cu paginile libere de marime fixa si sa
asigneze noului program cateva pagini libere. Astfel, programatorul poate
lucra cu o memorie abstracta, cu dimensiunea limitata doar de capacitatea
discului si de numarul de biti de adresa ai instructiunii.
Maparea suplimentara poate incetini considerabil fiecare instructiune. O
citire/Read de locatie virtuala X, poate necesita doua accesari ale memoriei
principale: un acces la tabelul de pagini pentru a translata X catre o adresa
40

fizica P, urmat de o citire/Read a acestei adrese P. Procesoarele moderne


evita aceasta activitate suplimentara prin memorarea cache a celor mai
recente asocieri adrese virtuale-adrese fizice intr-un buffer TLB (traslation
lookaside buffer), care este o memorie cache rezidenta in procesor.
Translatia curenta (fig.2.8) o face o componenta hardware specializata
pentru managementul unitatii de memorie, numita MMU (memory
management unit).
Maparea tabelului de pagini ofera un mecanism de protejare interprocese. Cand un proces face o citire/Read a unei locatii virtuale X, daca
nu este o intrare prevazuta in tabelul de pagini, hardware-ul va genera o
exceptie de pagina defecta (page fault exception). Daca se prevede faptul
ca doar sistemul de operare sa poata schimba intrarile in tabelele de
pagini, sistemul de operare poate asigura ca nici un proces sa nu poata
citi/scrie neautorizat memoria altui proces.
In timp ce la transmiterea prin ruter se lucreaza direct cu memoria
fizica, toate nodurile finale si codurile serverelor de retea lucreaza cu
memoria virtuala. Dar desi memoria virtuala reprezinta un potential cost
(e.g.pierderi TLB), ea ofera si o oportunitate. Astfel e posibil sa se faca
mai eficienta copierea pachetelor intre sistemul de operare si aplicatii
folosind tabelele de pagini (exemplul 8).
2.4.3 I/O simple prin Apeluri de Sistem
Persoana care programeaza aplicatiile nu poate fi constienta de varietatea
si complexitatea fiecarui dispozitiv de I/O. De aceea sistemele de operare
ofera programatorului o abstractizare a dispozitivelor ca piese de memorie
care pot fi citite si scrise (fig.2.14).
Codul care asociaza apelul interfetei I/O simple unei citiri fizice a
dispozitivului (cu toti parametrii completati), este numit driver de
dispozitiv (device driver). Daca singura preocupare ar fi abstractizarea,
codul driverului de dispozitiv poate fi instalat intr-o biblioteca de coduri
comune disponibile, care pot fi verificate de fiecare aplicatie. Totusi, cat
timp dispozitive precum discul trebuie sa fie partajate intre toate
aplicatiile, daca aceste aplicatii ar controla direct discul, un proces eronat
ar putea strica discul. Proiectarea unui sistem de operare securizat necesita
insa ca numai aplicatiile proaste sa dea gres.
Astfel, are sens ca apelurile de I/O sa fie manevrate de catre driverele de
dispozitiv care se afla intr-o portiune securizata a sistemului de operare
care nu poate fi afectata de catre procesele care dau gres. Aceasta portiune
securizata, numita nucleu/kernel , furnizeaza cateva servicii esentiale, ca
I/O si actualizarea tabelelor de pagini, operatii pentru care nu exista
suficienta incredere in aplicatii, incat acestea sa le realizeze direct.
Cand un browser, ca Netscape, vrea sa acceseze discul pentru a citi o
pagina Web, trebuie sa faca un asa numit apel de sistem/system call peste
granitele nucleului de aplicatii. Apelarea sistemului este o forma protejata
de apelare a unei functii. Se spune ca instructiunea hardware este o
capcana pentru a ajunge la un nivel mai privilegiat (modul nucleu), care
permite accesul in interiorul sistemului de operare. Cand apelul functiei
revine dupa incheierea I/O, codul aplicatiei ruleaza cu un nivel normal de
privilegiu. Un apel de sistem este mult mai costisitor decat un apel de
functie, din cauza ca nu mai beneficiem de avantajul implementarii in

41

hardware si sunt necesare cautari suplimentare de parametri incorecti. Un


apel sistem simplu poate fi executat in cateva microsecunde pe masinile
moderne.

Figura 2.14 Programatorul vede dispozitivele, ca discul sau adaptorul de retea, ca piese
disparate ale memoriei, care pot fi citite/scrise utilizand apelul de sistem, dar de fapt
nucleul administreaza o gazda cu detalii specifice dispozitivului.

Relevanta pentru retele este ca atunci cand un browser doreste sa trimita


un mesaj prin retea (de exemplu procesul 2 din fig. 2.14), trebuie sa faca
un apel la sistem pentru a activa procesarea TCP. Cateva microseconde
pentru o apelare a sistemului poate parea putin, dar de fapt produce o
incarcare foarte mare pentru un Pentium rapid. Vom vedea daca aplicatiile
pot sa mareasca viteza retelei renuntand la apelurile la sistem, si in caz
afirmativ, daca se poate renunta si la protectia OS.
2.5 Sumar
S-a lucrat pe patru niveluri de abstractizare care afecteaza performanta:
hardware-ul, arhitectura, sistemul de operare si protocoalele. Acest fapt
este util deoarece viteza de procesare a pachetelor poate fi limitata: de
traseele cu tranzistoare care implementeaza procesarea pachetelor, de
limitarile arhitecturale ca viteza magistralei, de suprasolicitarea sistemului
generata de abstractizarile OS ca apelurile la sistem, si in final chiar de
mecanismele protocolului.
Proiectantii, care vor incerca sa tina cont de simultan de toate cele
patru nivele de abstractizare pentru fiecare problema, se vor pierde in
detalii. Totusi, sunt cateva rezultate importante referitoare la performanta
si decizii arhitecturale majore pentru care intelegerea simultana a tuturor
nivelelor de abstractizare este esentiala. De exemplu, modelele simple
prezentate in acest capitol permit lucrul impreuna al arhitectilor,
proiectantilor de circuite, de logica, de microcodoare si implementatorilor
de protocoale software pentru a crea rutere de clasa mondiala. Ele permit
proiectantilor de sisteme de operare, expertilor in algoritmi si celor care
creaza aplicatii sa lucreze impreuna pentru a concepe un server Web de
clasa. La viteza de 40 Gps pe legatura, echipele interdisciplinare devin
extrem de importante.
Exista un alt aspect al creativitatii. Am vorbit despre mari contributii
individuale, dar atunci cand creezi tehnologie este necesara o activitate in
grup, deoarece astazi tehnologia este atat de complexa incat trebuie sa fie
interdisciplinara, in esenta, fiecare isi vorbeste propriul limbaj, chiar
42

daca despre aceleasi concepte. Stabilirea unui limbaj comun dureaza luni
de zile o tehnica pentru a face oamenii sa-si depaseasca limitele
gandirii ar fi : se da o problema, de procesare a semnalelor lingvistilor, si
vice versa, fiind lasati sa aplice cunostintele cu care sunt familiarizati unei
probleme complet diferite. Abordarea rezultata este in majoritatea
cazurilor una complet noua, la care expertii in domeniul original nici nu sar fi gandit. Munca in echipa da creativitatii o noua dimensiune.
2.6. Exercitii
1. Protocoalele TCP si atacuri de tip refuz de serviciu DOS (DenialOf-Service Attacks ). De obicei, un hacker incearca sa atace un serviciu
cunoscut, precum Yahoo, printr-un atac de tip DOS. Un atac DOS simplu
este cel de tip TCP Syn-flooding, in care hacker-ul trimite cateva pachete
SYN catre destinatia aleasa D (ex. Yahoo), folosind adrese sursa alese la
intamplare. D trimite inapoi un SYN-ACK catre presupusa sursa S si
asteapta raspunsul de la S. Daca S nu este o adresa IP activa, atunci nu va
primi un raspuns de la S. Din pacate, starea lui S este mentinuta in coada
de asteptare a conexiunilor lui D, pana la expirarea sa. Trimitand periodic
incercari false de conectare, pretinzand ca sunt de la surse diferite,
atacatorul se poate asigura ca la D, coada de asteptare finita va fi
intodeauna plina. Prin urmare, o cerere legitima de conectare spre D va fi
refuzata.
Presupunand ca exista un monitor care supravegheaza tot traficul, ce
algoritm poate fi folosit pentru a detecta atacurile de tip DOS ?
Presupunem ca programul monitor realizeaza ca are loc un atac prin
inundare TCP. De ce e greu sa deosebseti traficul legitim de cel prin
inundare?
2. Proiectarea numerica: Multiplexoarele si Barrel Shifters (*) sunt
foarte folositoare in partea hardware a retelei, deci lucrul la aceasta
problema poate ajuta chiar si un softist sa construiasca un hardware in mod
intuitiv.
(*) Barrel shifter este un dispozitiv hardware care poate depasa sau roti un cuvant de
date cu oricate pozitii intr-o singura operatie. E implementat ca un multiplexor, fiecare
iesire iesire putand fi conectata cu fiecare intrare

Creati un multiplexor cu 2-intrari cu porti primare (SI,SAU,NU).


Generalizati ideea creand un multiplexor cu N intrari din multiplexoare
cu N/2 intrari. Cu acestea descrieti un model cu log N intarzieri de porti si
O ( N ) tranzistoare.
Aratati cum se creaza un barrel shifter folosind o reductie catre
multiplexoare (i.e. folositi cate multiplexoare aveti nevoie). In solutia
propusa, care sunt complexitatile timpului si portilor?
Incercati sa creati un barrel shifter direct la nivel de tranzistor. Care
este complexitatea de tranzistor si de timp a lui? Creatia directa e mai buna
decat reducerea simpla folosita anterior?
3. Proiectarea memoriei: Pentru proiectarea schemei seriala/pipelined
de cautare a ID-ului descrisa anterior, desenati diagramele in timp pentru
cautarile din pipeline. Folositi numerele descrise in capitol, si schitati clar
o mostra de arbore binar cu 15 noduri si arata cum poate fi inchis dupa
patru cautari in patru blocuri diferite. Presupune un arbore binar nu un
arbore tertial. De asemenea, calculati numarul de chei care poate fi
43

suportat folosind 16 blocuri de RAMBUS daca primele k nivele al


arborelui sunt depozitate in SRAM-ul de pe chip.
4. Memorii si arbori pipeline: Aceasta problema studiaza cum sa faci
un pipeline unei stive/heap. O stiva/heap este importanta pentru aplicatii
precum QoS, unde un ruter doreste sa transmita primul, pachetul cu
eticheta de timp cea mai recenta. In consecinta are sens sa ai o stiva
aranjata dupa eticheta de timp. Pentru a o face eficienta stiva/heap, trebuie
sa fie serializata/pipelined in aceeasi maniera ca si exemplul de arbore
binar de cautare din capitol; totusi sa faci o stiva asa de mare este greu.
Figura 2.15 arata un exemplu de P-stiva capabila sa stocheze 15 chei. O Pstiva este un arbore binar complet, ca si o stiva/heap standard, exceptand
faptul ca nodurile de oriunde din stiva/heap pot fi vide cat timp toti copiii
nodului sunt de asemenea vizi (ex. nodurile 6, 12, 13).
(*) colectie de obiecte, plasate una peste alta ; arbore binar cu n-noduri complet, in care
toate nodurile, altele decat nodul radacina, satisfac proprietatea de heap .

Figura 2.15 Un exemplu de insiruire in cinci poze care se citesc de la stanga la dreapta
si apoi de sus in jos. In fiecare poza indexul reprezinta adancimea a subarborelui si
pozitia este numarul nodului asa ca valoarea este adaugata lui.

Pentru urmatoarele explicatii consultati figurile 2.15 si 2.16. Considerati


adaugarea cheii 9 in stiva/heap. Presupunand ca fiecare nod N are un
numarul care reprezinta numarul de noduri goale din subarbore (care
pleaca din nodul radacina N). De vreme ce 9 este mai mic decat valoarea
radacina 16, 9 trebuie sa fie dedesubt. De vreme ce atat ramurile dreapta
cat si stanga au noduri goale in subarborii lor, am ales arbitrar sa adaugam
9 la subarborele stang (nodul 2). Indexul, valoarea si pozitia valorilor
aratate in figura la stanga fiecarui arbore sunt registrele folosite pentru a
arata starea operatiei curente. Astfel in figura 2.15, partea (b), cand 9 este
44

adaugat subarborelui stang, indexul reprezinta adancimea subarborelui


(adancimea 2) si pozitia este numarul nodului (i.e. nod 2) la care valoarea
9 este adaugata..
Pe urma, din moment ce 9 este mai putin dacat 14 si de vreme ce
doar copilul drept are spatiu in subarborele sau, 9 este adaugat
subarborelui inradacinat la nodul 5. Acum 9 este mai mare dacat 7, deci 7
este inlocuit cu 9(la nodul 5) si 7 este impins in jos la nodul liber 10. Chiar
daca in Figura 2.15, part(d), valoarea indexului este 4 (i.e. operatia este la
adancimea 4) si pozitia este 10. Desi in figura 2.15 doar unul dintre
registrii la index/adancime are informatie nevida, si tine registrii separati
pentru fiecare index este permis pipelining-ul.

Figura 2.16 Inlaturarea celui mai mare element

Consideram operatia de scoatere din coada (indepartarea celui mai


mare element). Indeparteaza 16 si incearca sa impingi in jos golul creat
pana cand un subarbore vid este creat. Deci in pasul, 3 golul este mutat la
nodul 2 (deoarece valoare sa, 14, este mai mare decat fratele cu valoare
10), apoi la nodul 4 si in final la nodul 9. De fiecare data cand un gol este
mutat in jos, valoarea nevida de mai jos inlocuieste vechiul gol.
Pentru a face operatia de incarcare in coada sa mearga corect, trebuie
mentinuta numararea nodurilor subarborilor goi. Explica sumar cum
numararea
trebuie
mentinuta
pentru
fiecare
operatie
de
introducere/extragere din coada (structura va fi serializata/pipelined la un
moment dat, deci numararea valorilor respecta scopul).
Logic este sa serializam/pipeline per nivel. Totusi, e o problema. La
fiecare nivel (sa zicem, inserarea lui 9 in radacina ) operatia trebuie sa
consulte cei doi copii, de la nivelul urmator. Astfel, cand prima operatie
coboara la nivelul 2, nu se poate aduce a doua operatie la nivelul 1, sau va
45

fi o coliziune de memorie. Asteptarea ca operatia sa se termina complet va


functiona, dar se va reduce la procesarea secventiala a operatiilor. Care
este rata maxima la care poate fi serializata/pipeline o stiva/heap?
Considera operatiile introduce in coada 9; introduce in coada 4,5;
extrage din coadaserializte/pipelinedanterior. Deseneaza 6 stari
consecutive ale arborelui in timpul acestor 3 operatii.
Presupune ca fiecare nivel de memorie este pe un SRAM pe-chip, care
are nevoie de 5 nanosecunde pentru accesarea memoriei. Presupune ca
poti citi, scrie valoarea si numerota campurile, impreuna intr-un singur
acces. Tine minte ca unele memorii pot fi interogate in paralel. Care este
valoarea stationara a debitului stivei/heap in operatiuni pe secunda?
Poate fi imbunatatit numarul de referiri la memorie folosind un acces
de memorie mai extins si o plasare adecvata a arborelui?
Inainte de a folosind o memorie mai extinsa si arborele adecvat,
proiectarile anterioare foloseau un element de memorie pentru fiecare
element din stiva/heap precum si logica aferenta. Astfel logica necesara
este direct proportionala cu marimea stivei/heap, care se adapteaza prost in
termeni de densitate si putere.In aceasta proiectare, memoria este
proportionala cu numarul de elemente ale stivei si deci cu densitatile si
puterea SRAM, dar logica este mult mai redusa. Explicati.
5. Arhitecturi, memorii-caches si functii hash rapide: Memoria cache
L1 din procesor furnizeaza in esenta o functie hash rapida, care mapeaza
de la adrese fizice de memorie spre continutul sau, prin memoria cache
L1. Presupunem ca vrem sa invatam un caine batran (memoria cache L1)
cu un nou truc (sa faca cautari de IP). Scopul este sa folosim memoria
cache L1 ca o tabela hash, ca sa mapam adrese IP de 32 de biti la numere
de porturi de 7 biti. Presupunem o memorie cache L1 de 16-KB, cu primii
4KB rezervati tabelei hash, si o marime a blocului cache de 32 bytes.
Presupune o masina adresabila pe octet, adrese virtuale de 32-biti si
marimea paginii de 4KB. Asadar sunt 512 blocuri de 32 bytes in cache.
Presupunem ca memoria cache L1, este indexata direct/direct mapped.
Deci bitii 5-13 ai unei adrese virtuale sunt folositi pentru a indexa unul din
cele 512 blocuri, cu bitii 0- 4 identificand octetul din fiecare bloc.
In ipoteza ca paginile sunt de 4 KB si masina este adresabila pe byte,
cati bytes din adresa virtuala identifica pagina virtuala? Cati biti din
numarul paginii virtuale se intersecteaza cu bitii 5-13 folositi pentru
indexarea memoriei cache L1?
Singura cale de a asigura ca tabela hash nu este aruncata afara din
memoria cache L1 cand sosesc alte pagini virtuale, este marcarea la
inceput a oricarei pagini, care s-ar putea pozitiona in aceiasi portiune a
memoriei cache L1, ca nedepozitabila in cache. Conform cu raspunsurile
anterioare si cu faptul ca tabelele hash folosesc primi 4KB a memoriei
cache L1, identifica precis care pagini trebuie marcate ca nedepozitabile.
Pentru a face o cautare a unei adrese de IP de 32-byte, prima oara
convertiti adresa ca o adresa virtuala prin setarea pe 0 a tuturor bitilor
exceptand bitii 5-11 (bitii 12 si 13 sunt zero deoarece doar sfertul de sus a
L1 cache este folosit). Presupune ca aceasta este translatata in exact
aceeasi adresa fizica.Cand se face o Citire de la aceasta adresa, hardwareul L1 cache va returna continutul primelor cuvintelor de 32-biti ale
blocului cache corespunzator. Fiecare cuvant de 32-bit va contine o
46

eticheta de 25-biti si un port numeric de 7-biti. Pe urma, compara toti bits


din adresa IP, altii decat bitii 5-11, cu eticheta, si fa asta pentru fiecare
intrare de 32-biti din bloc.Cat de multe accesuri L1 cache sunt necesare in
cel mai rau caz pentru o cautare hash? De ce ar fi asta mai rapida decat o
cautare standard hash in software?
6. Sisteme de operare si procesarea relaxata a receptoarelor
lenese/lazy receiver processing: Exemplul 8 descrie cum protocoalele de
procesare BSD pot conduce la receptorul livelock. Procesarea relaxata a
receptoarelor combate aceasta problema prin doua mecanisme.
Primul mechanism este sa inlocuim coada de asteptare de procesare IP
unica partajata, prin cate o coada separata per socket destinatie.De ce
aceasta ajuta? De ce aceasta nu ar putea fi usor de implementat?
Mecanismul secund este implementarea procesarii de protocol la
prioritatea procesului de receptie, si ca parte a contextului procesului
receptionat (si nu ca o intrerupere software separata). De ce aceasta ajuta?
De ce aceasta nu poate fi usor de implementat?

47

CAPITOLUL 3
PRINCIPII DE IMPLEMENTARE
I- Principiile sistemelor
II- Cresterea eficientei, cu mentinerea modularitatii
III-Accelerarea
3.1. Motivarea folosirii principiilor
Actualizarea memoriilor ternare cu continut adresabil
Numim un sir ternar daca contine oricare din caracterele: 0, 1 sau *,
unde * denota un wildcard care se potriveste si cu un 0 si cu un 1.
Exemple de siruri ternare de lungime 3 sunt: S1=01* si S2=*1*; de fapt,
sirul binar 011 se potriveste si cu S1 si cu S2, in timp ce 111 se potriveste
doar cu S2.
Numar
P1
P2
P2a
P2b
P2c
P3
P3a
P3b
P3c
P4
P4a
P4b
P4c

Principiu

Folosit in

Evitarea risipei evidente


Schimbarea calcului in timp
Precalculare
Evaluare treptata
Impartirea costurilor,a pachetelor
Cerinte pentru destinderea sistemului
Compromis certitudine/timp

Interfete Zero-copy
Canale cu aplicatie pe dispozitiv
Copiere pentru scriere
Procesarea integrata in niveluri

Compromis precizie/timp
Schimbarea calcului in spatiu
Egalizarea componentelor sistemului
Exploatarea localizarii
Compromis memorie - viteza
Exploatarea hardware-ului existent

Servirea stohastica corecta a


cozilor de asteptare
Comutare functie de incarcare
Fragmentare IPv6
Receptor actionat local
Procesare; cautare de tip
Lulea IP
Calcul rapid al sumei de
control TCP

Suplimentare hardware
Folosirea metodei de intretesere si
Citire IP pipelined
pipeline in memorie
Folosirea paralelismului extins
Comutare cu memorie
P5b
Combinarea eficace DRAM si
partajata
P5c
SRAM
Mentinerea contoarelor
Fig. 3.1 Sumarul principiilor 1-5 Gandirea/conceptia sistemului
P5
P5a

48

Numar
P6
P7
P8
P9

Principiu
Exemple de procese in retele
Creare de rutine speciale eficiente
Control UDP
Evitarea generalitatilor inutile
Fbufs
Fii flexibil in implementare
Upcalls
Paseaza indicatii interfetelor dintre
Filtre de pachet
niveluri
Paseaza indicatii antetelor protocolului
Comutarea etichetelor
P10
Fig. 3.2 Sumarul principiilor 6-10 Refacerea eficientei pastrand modularitatea

Numar
P11
P11a
P12
P12a
P13
P14
P15

Principiu
Exemple de procese in retele
Optimizarea cazului probabil
Predictia antetului
Folosirea memoriilor Cache
Buffere rapide Fbufs
Suplimentarea starilor pentru a creste
Lista de circuite virtualeVC active
viteza
Calcul incremental
Recalcularea CRC- urilor
Optimizarea gradelor libertatii
Tentativa de cautare IP
Folosirea sortarii bucket, a bitmapSincronizare
urilor
Crearea de structuri de date eficiente
Comutarea de nivel 4
Fig. 3.3 Sumarul principiilor 11-15 accelerarea rutinelor cheie

Prefix
Liber
010001*
110001*

110*
111*

Pasul
urmator
Liber
P5
P5

P3
P2

00*
01*
10*
0*

P1
P3
P4
P4

110001

P1
P2
P3
P4
P5

Ruter

Fig. 3.4. Exemplu utilizarii unei CAM ternare pentru cautari de prefixe

O memorie ternara cu continut adresabil(CAM) este o memorie


continand siruri ternare de lungime specifica, cu informatie asociata; cand
i se prezinta un sir la intrare, CAM va cauta in toate locatiile sale de
memorie in paralel pentru a genera la iesire(intr-un ciclu) locatie de
memorie cu cea mai mica dresa, al carei sir ternar se potriveste cu cheia de
intrare specicata.
Figura 3.4 arata o aplicatie de CAM ternara referindu-se la problema
celei mai extinse potriviri de prefix pentru router-ele de Internet. Pentru
fiecare pachet primit, fiecare router de Internet trebuie sa extraga o adresa
IP destinatie de 32 biti din pachetul de intrare si sa caute potrivirea intr-o
baza de date de prefixe IP pentru urmatorul nod la care sa fie trimis
pachetul. Un prefix IP este un sir ternar de lungime 32, in care toate
wildcard-urile se afla la sfarsit.Vom schimba notatia treptat si vom lasa *
49

sa indice orice numar de caractere wildcard astfel ca 101* se potriveste cu


10100 si nu doar cu 1010.
Astfel, in fig. 3.4, un pachet trimis la o adresa destinatie care incepe cu
010001 se potriveste prefixelor 010001* si 01* dar ar trebui trimis la
portul P5 deoarece expedierea pachetelor prin Internet cere ca acestea sa
fie trimise utilizand cea mai lunga potrivire.Vom vorbi mai mult despre
aceasta problema in Capitolul 11. Deocamdata, este de retinut faptul ca
prefixele sunt aranjate intr-o CAM ternara astfel incat toate prefixele mai
lungi sa fie inaintea tuturor prefixelor mai scurte(ca in fig. 3.4); CAM
ternara sustine potrivirea saltului urmator intr-un ciclu de memorie.
Desi CAM-urile ternare sunt extrem de rapide in trimiterea mesajului,
ele cer ca prefixele mai lungi sa apara inaintea prefixelor mai scurte. Dar,
protocoalele de rutare/dirijare adauga sau sterg prefixe deseori.
Sa presupunem ca in fig. 3.4 un nou prefix, 11* , cu urmatorul nod
indicat la portul P1 trebuie sa fie adaugat in baza de date a ruter-ului.
Calea cea mai simpla de a-l insera ar produce spatiu in grupul de prefixe
de lungime 2 prin inaintarea cu o pozitie a tuturor prefixelor de lungime 2
sau mai mare.
Din pacate, pentru o baza de date mare cu aproximativ 100000 prefixe
detinuta de un router tipic, ar dura 100000 de cicluri de memorie, care ar
determina o adaugare lenta a unui prefix. Am putea obtine sistematic o
solutie mai buna prin aplicarea urmatoarelor doua principii(descrise mai
tarziu in acest capitol, ca si principiile P13 si P15).
Intelegerea si exploatarea gradelor libertatii
Privind tabelul din stanga fig. 3.4, vedem ca toate prefixele de aceeasi
lungime sunt aranjate impreuna si toate prefixele de lungime i apar dupa
toate prefixele de lungime j>i.

Spatiu liber

Y
Prefixe de lungime (i+1)
Crearea unui gol aici
prin mutarea lui X in
pozitia lui Y

X
Prefixe de lungime i

Fig. 3.5 Cautarea unui loc pentru noul prefix mutand X in pozitia lui Y , ne cere repetat
sa gasim un loc pentru a-l muta pe Y.

50

Totusi in figura toate prefixele de aceeasi lungime sunt si ele sortate


dupa valoare. Astfel, 00* apare inainte de 01*, care apare inainte de 10*.
Dar acest lucru nu impune CAM-ului sa returneze corect potrivirea de
prefixe cele mai lungi; se cere numai ordonarea prefixelor de lungimi
diferite, nu ordonarea prefixelor de aceeasi lungime.
Din fig. 3.4 abstractizata ca fig. 3.5, se vede ca daca vrem sa adaugam o
inregistrare la inceputul grupului de prefixe cu lungime i, trebuie sa cream
un spatiu liber la sfarsitul grupului de prefixe cu lungime (i+1). Astfel
trebuie sa mutam inregistrarea X, care exista deja in aceasta pozitie la alta
pozitie. Daca mutam X cu un pas mai sus, vom fi fortati la solutia
anterioara ineficienta.
Oricum, observatia despre gradele libertatii ne permite sa plasam pe
X oriunde intre alte prefixe adiacente de lungime (i+1). Astfel, o alta idee
este sa mutam X la pozitia detinuta de Y, ultimul prefix de lungime
(i+2),ceea ce ne forteaza sa gasim o noua pozitie pentru Y. Cum facem?
Avem nevoie de al doilea principiu.
Folosirea tehnicilor algoritmice
Problema recurentei se impune de la sine: rezolvam o problema prin
impartirea ei in etape mai mici. In acest caz, noua problema de asignare a
lui Y pe o noua pozitie este mai redusa deoarece grupul de prefixe de
lungime (i+2) este mai aproape de spatiul liber din varful CAM-ului decat
grupul de prefixe de lungime (i+1). Astfel mutam Y la sfarsitul grupului
de prefixe de lungime (i+3), etc.
Deoarece recursivitatea este solutia fireasca de a gandi,o implementare
mai buna este sa incepem din varful CAM-ului si sa o parcurgem
descendent creand un gol la sfarsitul grupului de prefixe de lungime 1,
apoi creand un gol la sfarsitul grupului de prefixe de lungime 2, etc. pana
cand cream un gol la sfarsitul grupului de prefixe de lungime i. Astfel,
cazul cel mai defavorabil de accesari ale memoriei este 32-i, care este in
jur de 32 pentru un i foarte mic.
Putem sa exploatam mai departe gradele libertatii. In primul rand, in fig.
3.5 am presupus ca spatiul liber este in varful CAM-ului. Dar spatiul liber
poate fi plasat oriunde. In particular, poate fi plasat dupa prefixele de
lungime 16. Aceasta reduce la jumatate cazul cel mai defavorabil de
accesari ale memoriei.
Un grad de libertate mai sofisticat este urmatorul. Pana acum,
specificatia algoritmului de inserare in CAM cerea ca un prefix de
lungime i trebuie sa apara inaintea unui prefix de lungime j daca i>j. O
asemenea specificatie este suficienta pentru corectitudine dar nu si
necesara. De exemplu, 010* poate aparea inainte de 111001* deoarece nu
exista nici o adresa care sa se poata potrivi ambele prefixe.
Astfel o specificatie mai putin exacta este: daca doua prefixe P si Q se
pot asocia aceleasi adrese, atunci P trebuie sa apara inaintea lui Q in CAM
doar daca P este mai lung decat Q. Aceasta este folosita in Shah si Gupta
[SG01] pentru a reduce mai mult numarul cel mai defavorabil de accesari
ale memoriei prin inserarea unor baze de date practice.
Desi ultima imbunatatire e discutabila din cauza complexitatii, ea
conduce spre un alt principiu important. Noi, deseori impartim o problema
mare in subprobleme si transmitem altora subproblema pentru rezolvare

51

insotita de anumite specificatii. De exemplu, proiectantul de hardware a


CAM-ului poate transmite problema de actualizare a unui microcoder,
specificand ca prefixele mai lungi sa fie plasate inaintea celor mai scurte.
Dar, ca si mai inainte, o asemenea specificatie poate sa nu fie singura
cale de rezolvare a problemei originale. Astfel schimbarile in
specificatii(principiu P3) pot oferi o solutie mai eficienta. Bineinteles,
aceasta cere persoane curioase si increzatoare in fortele proprii, care
inteleg problema in ansamblul ei si au curajul sa puna intrebari riscante.
3.2. Algoritmi si studiul algoritmilor
Ar fi posibil sa argumentezi faptul ca exemplul anterior este o metoda
esentialmente algoritmica esentiala si nu necesita o gandire sistematica?
Problema analizei securitatii judiciare. In multe sisteme de detectie de
intruziune, un manager deseori gaseste ca un flux (definit prin antetul
pachetelor, spre exemplu o sursa de adrese IPare o comportare
necorespunzatoare, lucru constatat prin metode probabilistice. Spre
exemplu, o sursa care face o scanare a unui port poate fi identificata dupa
ce a trimis 100000 de pachete daunatoare la diferite masini intr-o subretea.
Desi exista metode de identificare a unor asemenea surse, o problema
este faptul ca evidenta (celor 100000 de pachete trimise de sursa) a
disparut in timpul in care sursa vinovata este identificata. Problema este
ca, controlul probabilistic cere acumularea unor stari(sa zicem, un tabel de
suspiciune) pentru fiecare pachet primit intr-o anumita perioada de timp,
inainte ca o sursa sa fie declarata suspecta. Daca o sursa e considerata
suspecta dupa 10 secunde, cum poate cineva sa revina in timp si sa
recupereze pachetele trimise in timpul celor 10 secunde?
Pentru aceasta, in fig. 3.6 tinem un sir cu ultimele 100000 pachete care
fusesera trimise de catre router. Cand un pachet este trimis mai departe,
vom adauga o copie a acestui pachet (sau doar un pointer spre pachet) in
capul sirului. Pentru a pastra sirul limitat, atunci cand acesta e plin, vom
sterge pachetele de la coada. Principala dificultate la aceasta schema este
atunci cand un flux vinovat este detectat ,pot fi multe alte fluxuri de
pachete in sir(fig. 3.6). Toate aceste pachete trebuiesc plasate in rezerva
judiciara pentru transmisia lor la un manager. Metoda naiva de cautare
printr-un buffer DRAM mare este foarte lenta.

52

Pachetul P
soseste pe
fluxul F

Forward P

Test rapid
probabilistic
de suspiciune

Adauga
copia lui P in
antet

Daca e stare de alerta, adauga F in tabel;

Daca F e in tabel, stare de update

Tabel de
suspiciune

ir cu
ultimele
N
pachete

F
Raport catre
manager periodic
sau dupa detectia
unui flux suspect

Memoria
judiciara

Mod cutare memorie


pentru pachete trimise cu
fluxul cu ID F, de adugat
la memoria judiciara

Fig. 3.6 Pastrarea unui sir cu ultimele 100000 de pachete care contine informatii
judiciare despre fluxurile suspecte care fusesera trimise in trecut.

Abordarea didactica permite adaugarea unor structuri de indecsi pentru


cautarea rapida a ID-urilor fluxurilor. Spre exemplu, am putea mentine un
tabel de dispersie(hash-table) cu ID-urile fluxurilor, in care fiecare flux
este asociat cu o lista de pointeri ale tuturor pachetelor avand ID-ul in sir.
Cand un nou pachet este introdus in sir, ID-ul fluxului este cautat in
tabelul de dispersie si adresa noului pachet din sir este plasata la sfarsitul
listei fluxului. Bineinteles, atunci cand pachetele parasesc coada,
inregistrarile lor trebuiesc eliminate din lista, si lista poate fi lunga. Din
fericire, inregistrarea ce trebuie stearsa este sigur in capul sirului pentru
acel ID de fluxului.
In ciuda acestui fapt, abordarea didactica are cateva dificultati. Ea
adauga mai mult spatiu pentru a mentine aceste extra-siruri per ID si
spatiul poate fi crucial pentru implementari rapide. De asemenea, adauga
complexitate in procesarea pachetelor pentru a mentine tabelul de
dispersie si cere inregistrarea tuturor pachetelor fluxului in rezerva
judiciara inainte ca pachetul sa fie suprainscris de un pachet care soseste
cu alte 100000 de pachete mai tarziu. Mai degraba urmatoarea solutie
sistematica poate fi mai eleganta.
Solutie. Nu incercati imediat sa identificati toate pachetele fluxului F,
cand F este identificat, dar identifica-le relaxat atunci cand ajung la
sfarsitul sirului de pachete (fig. 3.7). Cand adaugam un pachet in capul
sirului, trebuie sa inlaturam un pachet de la sfarsitul sirului( atunci cand
sirul este plin).
Daca acel pachet ( sa zicem Q, vezi fig. 3.6) apartine fluxului F care
este in Tabelul de Suspiciuni si fluxul F a depasit niste praguri de
suspiciune, atunci adaugam pachetul Q la Rezerva judiciara. Rezerva
poate fi trimisa la un manager. Avem de facut doi pasi pentru procesarea
pachetului, unul pentru trimiterea pachetului mai departe si unul pentru
53

inlaturarea lui din sir. Dar acesti doi pasi pentru procesarea pachetului sunt
ceruti si in cazul abordarii didactice; pe de alta parte, schema eleganta cere
sa nu facem dispersarea si sa utilizam un minim de memorie(fara pointeri
intre 100000 pachete).
Test rapid probabilistic de suspiciune
Pachetul P
soseste pe
fluxul F

Forward P
Adauga o copie a lui
P in cap

Daca e stare de alerta, adauga F in tabel;


Daca F e in tabel, stare de update

Sirul
ultimelor N
pachete

Tabel de
suspiciune
Q
Raport catre
manager periodic
sau dupa detectia
unui flux suspect

Memoria
Judiciara

Daca pachetul Q
al fluxului F este declarat
suspect in Tabelul de
suspiciune, adauga Q

Fig. 3.6 Pastrarea unui sir cu ultimele 100000 de pachete care contine informatii
judiciare despre fluxurile suspecte care fusesera trimise in trecut.

(proprietate P)

(proprietate Q)

Subsistem 2

Subsistem 2

Specificaii S

Specificaii W
mai slabe

Subsistem 1

Subsistem 1

Fig. 3.7 Pastrarea unui sir cu ultimele 100000 de pachete care contine informatii
judiciare despre fluxurile suspecte care fusesera trimise in trecut.

3.3 -Principiile sistemelor


I. Primele cinci principii folosesc faptul ca orice sistem este construit
din subsisteme. Abordarea intregului sistem ca o entitate unica poate duce
la imbunatatirea performantelor.
P1. Evitarea risipei evidente in situatii comune
In sisteme exista foarte multe cazuri de risipire a resurselor, ca de
exemplu atunci cand apar in mod repetat anumite secvente de operatii.
Unul din exemple este repetarea anumitor expresii, in cazul
compilatoarelor, altul este crearea de copii multiple, in cazul retelelor, in
diverse etape de procesare a pachetelor. De remarcat este faptul ca fiecare
operatie in sine nu constituie o risipa evidenta, ci doar repetarea
54

secventelor de operatii. Identificarea situatiilor care conduc la risipe este


mai mult o problema de intuitie, dar optimizarea poate fi facuta utilizand
programe de test specializate (benchmarks).
P2. Deplasarea in timp a calculelor
Sistemele pot fi abordate in timp si in spatiu. In spatiu, sistemele pot fi
privite ca fiind compuse din subsisteme, eventual distribuite geografic. In
spatiu, sistemele pot fi caracterizate la momente diferite de timp, incepind
cu momentului fabricatiei, momentul compilarii momentul initializarii
parametrilor, respectiv momentul rularii propriu zise. Exista trei metode de
baza referitoare la deplasarea in timp a calculelor:
P2a. Calculul anticipat (precalculul): anumite calcule se pot face
anticipat, pentru a realiza o economie de timp la momentul in care e
nevoie de ele.Un exemplu este cautarea in tabele (lookup table)
precalculate. Astfel, in loc sa calculam la momentul necesar o functie f, al
carui calcul dureaza mult, se creaza in avans o tabela de valori ale lui f
pentru fiecare din argumentele sale. Operatia de cautare in tabela este
oricum mai rapida. La retele se pot precalcula antetele IP sau TCP pentru
pachetele unei conexiuni; efortul de scriere a antetelor se reduce, deoarece
de la pachet la pachet se schimba doar putine dintre campurile antetului.
P2b. Evaluarea relaxata : se refera la aminarea in momentele critice, a
unor operatii consumatoare de timp, in speranta ca fie nu va mai fi nevoie
de ele, fie executia lor se va face intr-un moment in care sistemul nu mai
este atit de ocupat.
Un exemplu de evaluare relaxata este copiere pentru scriere (copy-onwrite) din sistemul de operare Mach. Presupunem ca avem un spatiu de
memorie ce contine o copie la adresa virtuala A si ca mai avem nevoie la
adresa B de un spatiu cu aceeasi copie, pentru o inscriere viitoare. Solutia
generala ar fi sa avem doua copii si la adresa A si la B, permitind astfel
inscrierea lor independenta. Metoda insa aloca pentru B o tabela care
indica paginile corespunzatoare din A. Doar cand procesul lui B are nevoie
sa faca o scriere intr-o anumita pagina, se creaza copia respectivei pagini
pentru B si are loc operatia de scriere propriu zisa. Sunt evitate astfel
copiile inutile, deoarece e de asteptat ca numarul de pagini scrise in B sa
fie mai mic decat numarul total de pagini.
Un exemplu din retele este sosirea unor octeti de date in alta ordine decat
cea asteptata de nodul X de destinatie.Este preferabil sa se modifice doar
acele secvente care vor fi de fapt citite, si nu toate secventele.
P2c. Impartirea efortului, se refera la plasarea operatiilor cu consumuri
mari in alte parti ale sistemului. Un exemplu important de operatii de
mare consum este prelucrarea in loturi (batching) unde este executia
comasata a unor instructiuni de consum mare este mai economica decat
executia lor separata. Procesarea in loturi se practica de multa vreme in
calculatoare, mai ales pe vremea calculatoarelor de capacitate si viteza
foarte mari (mainframes), inainte chiar de a aplica tehnicile de divizare a
timpului.
P3. Relaxarea conditiilor impuse initial sistemului
Cand se incepe proiectarea unui sistem, de sus in jos, functiile se
impart unor subsisteme. Dupa ce se impun conditii sistemelor si se
stabilesc interfetele, se trece la proiectarea separata a subsistemelor. Daca
55

apar dificultati la implementare, trebuie refacuta structura sistemului (vezi


fig. 3.8).
Uneori dificultatile pot fi rezolvate relaxand conditiile impuse unuia
dintre subsisteme. Se relaxeaza de exemplu conditia impusa subsistemului
1 (conditia S mai severa devine conditia W mai putin severa), dar in
schimb conditia impusa sistemului 2 devine mai severa (P mai putin
severa devine Q mai severa).
Pot fi puse in evidenta trei tehnici ce rezulta din principiul relaxarii
conditiilor impuse initial sistemului.
P3a. Compromisul siguranta-timp. Proiectantii de sisteme se leagana in
iluzia ca sistemele lor ofera o comportare determinista, cand de fapt
comportarea este probabilista. Astfel ca, atunci cand algoritmii
deterministi sunt prea lenti e bine sa apelam la metode aleatoare.
In sisteme, milioane de utilizatori Ethernet folosesc aleatorizarea pentru
transmiterea de pachete dupa coliziuni. In retele un exemplu de
aleatorizare este software-ul de masurare a traficului NetFlow al firmei
Cisco. Daca ruteru nu are capacitatea sa contorizeze tot traficul de sosire,
el va lucra cu esantioane aleatoare de trafic fiind capabile sa identifice
fluxurile mari prin mijloace statistice. Al dolilea exemplu in retele este
servirea corecta stohastica a cozilor de asteptare (stochastic fair queuing),
in care in loc sa se urmareasca exact conversatiile care trec prin ruter, ele
sunt urmarite probabilistic, folosind dispersarea (hashing).
P3b. Compromisul precizie - timp. La fel, analiza numerica ne induce
iluzia preciziei calculatoarelor. Astfel am putea relaxa conditia preciziei de
dragul vitezei. In sisteme, multe tehnici folosesc compresia cu pierderi
prin interpolare (vezi MPEG).
Pentru a inlocui impartirile cu deplasari se folosesc praguri
aproximative. In retele, anumiti algoritmi de planificare a pachetelor
folositi in rutere implica sortarea pachetelor dupa termenle de timp de
plecare ; in retelele de viteze mari exista propuneri de reducere a antetelor
de sortare printr-o sortare aproximativa, care desi mai scade putin din
calitatea serviciului QOS, reduce din timpul de procesare.
P3c. Deplasarea in spatiu a calculelor. Exemplele de pina acum se
refereau la relaxarea conditiilor : esantionarea duce la omiterea unor
pachete, si astfel imaginea transmisa poate sa nu mai fie identica cu cea
originala. Dar alte parti ale sistemului, de exemplu subsistemul 2, trebuie
sa se adapteze acestor conditii ce conduc la pierderi. De aici rezulta si
ideea de deplasare in spatiu a calculului. De exemplu, recent,in retele, se
evita fragmentarea pachetelor in rutere obligand sistemele terminale sa
calculeze dimensiunile de pachete permise de rutere.
P4. Egalizarea componentelor sistemului
Proiectarea sistemului la nivel de schema bloc presupune
descompunerea sistemului in subsisteme si proiectarea separata a fiecarui
subsistem.desi aceasta abordare de sus in jos e convenabila din punct de
vedere al modularitatii, in practica, anumite componente critice ca
performanta sunt deseori create, cel putin partial si de jos in sus.Ca de
exemplu, algoritmii sunt adapatati la hardware-ul existent. Sunt date mai
jos cateva tehnici conforme acestui principiu :
-P4a : Exploatarea localizarii ; in cap.2 s-au aratat avantajele exploatarii
memoriilor atunci cand datele sunt continue/succesive-de exemplu acelasi
56

sector de disc, sau aceeasi pagina de DRAM. Algoritmii de cautare pe disc


folosesc acest lucruprin cautarea in arbore a radacinii superioare, ca la
arborii de tip B. Algoritmii de cautare in tabele IP folosesc acelasi artificiu
pentru a reduce timpul de cautare, plasind cateva chei in cuvintul extins.
-P4b : Compromisul memorie-viteza ; tehnica evidenta este extinderea
memoriei, ca de exemple tabelele de cautare (lookup tables), pentru a
economisi timpul de procesare. O tehnica mai putin evidenta este
comprimarea structurilor de date ca sa incapa in memoria cache, deoarece
accesul la cache este mai rapid decat la memoria obisnuita.
-P4c: Exploatarea facilitatilor hardware ; compilatoarele folosesc
reducerea complexitatii pentru optimizarea inmultirilor in bucla; de
exemplu, intr-o bucla in care adresele au 4 octeti si indexul i creste cu 1 la
fiecare pas, in loc sa se calculeze produsul 4*I, compilatorul calculeaza
noul index crescindu-l cu 4 fata de pasul precedent, deoarece inmultirile
sunt mai lungi decat adunarile. La fel se manevreaza datele, in multiplii ai
cuvintelor calculatorului, ca de ex. algoritmul sumei ciclice de control IP.
Evident ca daca se exagereaza cu aplicarea acestui acest principiu se
pune in pericol modularitatea sistemului. Pentru a evita acest lucru se
folosesc doua tehnici. Mai intai trebuie avut in vedere ca daca se folosesc
anumite caracteristici ale sistemului doar pentru a imbunatati
performantele sistemului, atunci schimbarile acestor caracteristici
afecteaza doar performanta si nu corectitudinea. Apoi, aceasta tehnica se
foloseste doar pentru componentele sistemului care se prevad a fi
strangulari .
P5 : Suplimentarea harware-ului
pentru imbunatatirea
performantei
Cand totul esueaza, foloseste forta bruta. Adaugarea de hardware
suplimentar, ca de exemplu cumpararea de procesoare mai rapide poate fi
pina la urma mai simpla si mai economica decat implementarea de tehnici
sofisticate. Pe linga abordarea de tip forta bruta, prin folosirea unor
infrastructuri mai rapide (procesoare,memorii,magistrale si legaturi),
exista cateva compromisuri inteligente. Dar daca hardware-ul este mai
putin flexibil si implica costuri mari de proiectare, atunci este preferabil
ca suplimentarea de hardware sa fie minima.Pe masura cresterii dramatice
a vitezelor procesoarelor si densitatii memoriei sugereaza algoritmi noi in
software si dotarea cu procesoare mai rapide pentru cresterea vitezei.
Sistemele de calculatoare abunda de compromisuri hardware-software
stralucite. De exemplu, in sistemele multiprocesor, daca un procesor
doreste sa scrie date, el trebuie sa informeze toate celelalte procesoare care
acceseaza respectivele date din memoria cache. Aceasta interactiune poate
fi evitata, daca fiecare procesor are o componenta hardware care
supravegheaza magistrala pentru operatiile de scriere a altor procesoare si
cand e nevoie invalideaza automat locatiile respective din memoria cache.
Acest controler simplu de spionare a memoriei cache permite restului
algoritmului dedicat memoriei cache sa-si pastreze eficienta software.
Descompunerea functiilor intre harware si software este insa o arta in
sine. Hardware-ul ofera anumite avantaje. In primul rand nu e necesar
timp de aducere a instructiilor, deoarece instructiile sunt codate hard. In al
doilea rand, secvente de calcul commune (care ar necesita cateva
instructiuni in software) pot fi facute intr-un singur ciclu harware de ceas.
57

De exemplu, gasirea primului bit dintr-un cuvant de 32 de biti, ar necesita


cateva instructii pe o masina RISC, dar poate fi facuta cu un simplu codor
de prioritati (vezi capitolul precedent). In al treilea rand, haedware-ul ne
permite sa beneficiem de aplicarea paralelismului inerent problematicii.In
fine, productia hardware de masa poate fi mai ieftina decat a unui
procesor specializat. De exemplu un Pentium poate costa 100$ in timp ce
un ASIC cu performante similare pote costa doar 10$.
Pe de alta parte, proiectarea software poate fi usor translatata spre
urmatoarea generatie de chip-uri mai rapide. Hardware-ul, in ciuda
folosirii chip-urilor programabile, ramine mai putin flexibil. Totusi,
aparitia unor mijloace de proiectare ca VHDL pentru sintetizarea
hardware-ului, face ca timpul alocat pentru proiectarea hardware-ului sa
scada considerabil. Astfel, in ultimii ani, au fost proiectate chip-uri care
realizeaza functii complexe, ca de exemplu compresie de imagini sau
verificare de tabele IP.
Pe linga imbunatatirea unor anumite performante, noile tehnologii pot
determina abordari complet noi. Un proiectant vizionar ar putea sa
reproiecteze complet un sistem in vederea noilor aplicatii. De exemplu,
inventarea tranzistorului si a memoriilor rapide ne-a permis sa folosim
digitizarea vocii in retelele telefonice.
Cresterea densitatii chip-urilor a facut proiectantii de calculatoare sa
chibzuiasca asupra facilitatilor de calcul adugate memoriilor pentru a evita
strangularea procesor-memorie. In retele, aparitia liniilor de mare viteza in
anii 80, a condos la folosirea adreselor si antetelor extinse . Ca o ironie,
folosirea calculatoarelor portabile in anii 90, a dus la folosirea de banda
ingusta a legaturilor fara fir, si in consecinta a aparut problema
comprimarii antetelor.Tendintele tehnologice sunt oscilante.
-P5a:Folosirea pentru memorii a tehnicilor de intretesere si
serializae/pipelining.Tehnici similare sunt folosite la verificarea tabelelor
IP, la clasificare si in algoritmii de planificare care implementeaza QOS.
Bancurile multiple pot fi implementate folosind cateva memorii externe,
asu o memorie externa cum este RAMBUS, sau un SRAM pe un singur
chip care contine si logica de procesare.
-P5b : Folosirea paralelismului pe cuvinte extinse. O tema comuna in
multe proiectari de retele, ca de exemplu schema vectorului de biti de la
Lucent, este folosirea unor cuvinte de memorie extinse, care pot fi
procesate in paralel. Acest lucru se implementeaza folosind DRAM si
modul page-mode, sau folosind SRAM-uri si extinzand fiecare cuvint de
memorie.
-P5c : Combinarea DRAM cu SRAM. Stiind ca SRAM-urile sunt mai
scumpe si mai rapide, iar DRAM-urile sunt mai ieftine si mai lente, are
sens sa le combinam astfel incat sa obtinem un optim pentru amandoua.
Folosirea SRAM-urilor ca si memorii cache si a DRAM-urilor pentru
baze de date este clasica deja, dar exista multe plicatii mult mai creative
pentru ierarhizarea memoriilor. Pe moment se analizeaza efectul unui
volum redus de de SRAM la proiectarea chipurilor pentru tabelele de
verificare a fluxurilor ID. In capitolul 16 sunt descrise tehnici mai nonuzuale de aplicare a acestei tehnici la implementarea unui numar mare de
numaratoare, unde bitii cei mai putini semnificativi sunt memorati in
SRAM.
58

II. Principii pentru modularitate si eficienta


Lucrari de profil (Dave Clark) au aratat ineficienta implementarilor
stratificate si a modularitatii, dar raspunsul altora (Radia Perlman) a fost ca
acest lucru nu arata decat faptul ca s-a ajuns in faza in care ne putem
plinge de ceva. Ideea este desigur, ca sitemele complexe cum sunt
protocoalele de retea nu pot fi implementate decat folosind stratificarea si
modularitatea. Urmatoarele principii arata cum poate fi redobindita
eficienta, pastrind modularitatea.
P6. Crearea unor rutine specializate eficiente si inlocuirea rutinelor
cu scop general
Folosirea abstractizarilor in proiectarea sistemelor de calcul poate face
sistemul mai compact, ortogonal si modular. Totusi cu timpul, folosirea
rutinelor cu scop general a dus la ineficienta. In cazurile importante trebuie
proiectate si optimizate rutine specializate.
Un exemplu poate fi gasit in cazul memoriilor cache pentru baze de
date. Cea mai generala strategie de utilizare a memoriilor cache prevede
mutarea pe disc a celor mai vechi inregistrari. Totusi sa consideram o
rutina a procesului de interogare (query-processing), care proceseaza in
bucla o secventa de tuple ale bazei de date. In acest caz, cea mai recenta
inregistrare va fi cel mai tirziu folosita in viitor, deci e candidatul ideal
pentru inlocuire. Astfel ca aplicatiile mai noi ale bazelor de date inlocuiesc
rutinele sistemului de memorare in cache cu ritine mai specializate. E bine
ca aceste specializari sa se faca doar pentru rutinele cheie, pentru a evita
extinderea peste masura a codului. Un exemplu din retele sunt rutinele
rapide de procesare UDP.
P7. Evitarea generalizarilor inutile
Tendinta de a proiecta subsisteme abstracte si generale poate duce la
crearea unor facilitati inutile sau rar folosite. Astfel, in loc sa mai
trebuiasca sa facem rutine specializate suplimentare (e.g. P6) cu care sa
inlocuim rutinele generale, am putea sa eliminam diverse facilitati
crescand astfel performanta. Ca si in cazul P3, eliminarea acestor rutine
impune utilizatorilor sa se dezobisnuiasca sa le foloseasca. De exemplu, la
procesoarele RISC, eliminarea instructiunilor complexe cum sunt
inmultirile, implica emularea lor prin firmware. Un exemplu din retele este
cazul fbuf-urilor care ofera un serviciu specializat memoriilor virtuale, ce
asigura o copiere eficienta intre spatiile de memorie virtuala.
P8. Nu te incurca cu implementarile de referinta.
Specificatiile sunt scrise pentru claritate, nu ca sa sugereze o
implementare eficienta. Deoarece limbajele abstracte ale specificatiilor
sunt nepopulare, multe specificatii contin indicatii ferme despre care
anume functie trebuie calculata si cum sa fie implementat calculul. Acest
fapt are doua efecte secundare.
Mai intai exista o tendinta reala spre specificarea exagerata. Apoi, multi
implementatori copiaza implementarea de referinta in specificatii, ceea ce
constituie o problema cand implementarea de referinte a fost aleasa pentru
claritate si nu pentru eficienta. Implementatorii sunt liberi sa schimbe
implementarea de rferinta atita timp cat efectele externe ramin aceleasi. De
fapt pot fi structurate alte implementari, care sa fie si eficiente si modulare.

59

In sisteme, Clark a sugerat folosirea la sistemele de operare a apelurilor


spre nivelurile superioare (upcalls). La aceste upcalls-uri un nivel inferior
poate apela unul superior, pentru avizare sau a cere date, incalcand
apparent regulile de decompozitie ale proiectarii de sisteme. Aceste apeluri
sunt astazi utilizate frecvent in implementarile protocoalelor.
P9. Paseaza indicatii interfetelor modulelor
O indicatie (hint) sau o sugestie este o informatie pasata de la client la
serviciu, care poate scuti serviciul de volume mari de calcul, daca este
corecta. Cuvintele cheie aici sunt paseaza si daca este corecta. Prin
pasarea indicatiei in cererea sa serviciul poate evita necesitatea unei citiri
asociate in tabele, necesare pentru accesul la memoria cache. De exemplu,
o indicatie poate fi folosita pentru a furniza receptorului un index direct in
starea de procesare. Dar, spre deosebire de memoria cache, nu se
garanteaza ca indicatia este corecta, astfel ca trebuie verificata cu alte
informatii a caror corectitudine este verificabila. In majoritatea cazurilor,
indicatiile imbunatatesc performanta, daca sunt corecte
Din insasi definitia hint-ului rezulta necesitatea verificarii corectitudinii
sale, scutind astfel receptorul de aceasta etapa. Un hint verificat se
numeste tip (sfat). Sfaturile sunt greu de utilizat, tocmai din cauza
conditiei de a le asigura corectitudinea. Un exemplu din sisteme este
sistemul Alto-File care are fiecare bloc de fisiere dotat cu un pointer
indicand urmatorul bloc de fisiere. Acest pointer este tratat doar ca hint,
si este verificat cu numele fisierului si numarul blocului memorate chiar
in interiorul blocului. Hinturile incorecte nu trebuie sa pericliteze
corectitudinea sistemului ci doar sa scada din performante.
P10. Paseaza indicatiile in antetele protocolului
Pentru sistemele distribuite, extensia logica a principiului P9 este sa se
paseze informatia ca indicatii in antetul mesajului. Acest lucru poate sa
constituie un principiu separat, pentru sistemele distribuite. Pentru
sistemele paralele acest principiu e folosit de arhitecti pentru a evita
ineficientele in pasarea mesajelor. Una din ideile de la mesajele active
este sa avem un mesaj ce transporta adresa handlerului de intreruperi
pentru expedierea rapida. Alt exemplu este comutarea etichetelor (tag
switching), in care pachetele transporta un indice suplimentar pe linga
adresa destinatie, pentru a permite verificarea rapida a acestei adrese.
Etichetele sunt folosite ca sugestii, deoarece nu este verificata
corectitudinea etichetelor ; pachetele pot fi dirijate spre o destinatie gresita
si acolo ele trebuie verificate.
III Principii pentru accelerarea rutinelor
Principiile anterioare se refereau la structura sistemului, iar cele ce
urmeaza se refera la accelerarea rutinelor vazute izolat.
P11. Optimizarea cazurilor probabile
Sistemele pot sa manifeste o gama larga de comportamente, care pot fi
impartite in mici categorii, numite cazuri probabile. De exemplu, chiar
si cele mai bine proiectate sisteme pot functiona in regimul fault sau
exception-free. Alt exemplu este cel al unui program care manifesta o
localizare spatiala, datorata accesarii in principal a unor zone mici de

60

memorie. Astfel, merita sa facem mai eficiente comportarile uzuale, chiar


daca devin mai costisitoare comportarile neuzuale.
Optimizarea euristica a cazurilor probabile nu da satisfactie
teoreticienilor, ei preferind mecanisme ale caror beneficii pot fi cuantizate
cu precizie, fie in medie fie pentru cazul cel mai defavorabil. In apararea
metodelor euristice, trebuie spus insa ca fiecare calculator in functie astazi,
optimizeaza cazurile cele mai probabile de cel putin un milion de ori pe
secunda.
De exemplu, la folosirea paging-ului, cel mai defavorabil numar de
referiri la memorie pe care le poate avea o instructiune de PC este de
patru, (extragerea nstructiei din memorie, citirea primului nivel al
tabelului de pagini, citirea celui de al doilea nivel al tabelului de pagini si
extragerea operandului din memorie). Dar, folosind memoriile cache
numarul de accese la memorie poate fi redus la zero. In general, memoriile
cache permit proiectantilor sa foloseasca structuri modulare si adresari
indirecte, castigand astfel in flexibilitate si in final in performanta pentru
cazurile cele mai probabile. Deci merita sa tratam si sa subliniem
importanta memorarii in memorii cache.
P11a : Folosirea memoriilor cache
Principiul cazului probabil are utilizari subtile, asociat cu folosirea
memoriilor cache. De exemplu, daca in editorul EMACS dorim sa
schimbam bufferele, editorul ne ofera numele ultimului buffer folosit
(default buffer name). Acest lucru economiseste timpul de tiparire in cel
mai probabil caz, adica atunci cand se comuta mereu intre doua buffere.
Folosirea predictiei antetului este un alt exemplu de optimizare in retele a
cazului cel mai probabil. Costul procesarii pachetului poate fi mult redus
daca se presupune ca urmatorul pachet ce va fi receptionat e strans legat de
ultimul pachet procesat (de exemplu este urmatorul pachet din secventa),
si nu necesita exceptii la procesare.
Trebuie precizat ca determinarea cea mai buna a cazurilor cele mai
probabile se face prin masuratori si prin scheme care inregistreaza automat
cazurile comune. Dar depinde de multe ori si de intuitia proiectantului.
Cazul cel mai probabil poate fi incorect in situatiile speciale sau se poate
schimba in timp.
P12. Adauga sau foloseste starile pentru a castiga viteza
Daca o operatie este costisitoare, trebuie luata in considerare o stare
suplimentara dar redundanta, pentru accelerarea operatiei. La bazele de
date, un exemplu este adaugarea unui indice suplimentar. Bancurile de
inregistrari pot fi memorate si cautate folosind o cheie primara, ca de
exemplu numarul asigurarii sociale a clientului. Daca mai apar chestionari
suplimentare referitoare la numele acelui client (balanta de cont, etc.), se
poate plati folosind un index suplimentar (de exemplu o tabela hash sau un
arbore B). Dar starea suplimentara implica prevederea posibilitatii de
schimbarea a sa atunci cand apar modificari.
Totusi, uneori, acest principiu poate fi aplicat fara adaugarea de stari
suplimentare, doar folosind starile existente, fapt subliniat de principiul
P12a.
P12a. Calculul incremental
La sosirea sau plecarea unui client trebuie actualizata tabela de asteptare
pentru clienti. La fel este si in compilatoare, la siruri (vezi exemplul de la
61

P4c) unde se calculeaza incremental noua tabela de indecsi din cea veche,
si nu se folosesc inmultiri pentru calculul valorii absolute a indecsilor. In
retele, un exemplu de calcul incremental este calculul sumelor ciclice de
control IP, unde se modifica doar o mica parte din campurile pachetelor.
P13. Optimizarea gradelor de libertate
E utila la determinarea caror variabile se afla sub control si a celor care
le controleaza, precum si la determinarea criteriilor de obtinere a unei bune
performante. Apoi se trece la optimizarea acestor variabile pentru
maximizarea performantei. De exemplu clientii sunt inscrisi in tabele de
asteptare pe masura ce apar locuri libere, dar optimizarea asteptarii se
poate face prin asignarea la un set de tabele continue a fiecarui client in
asteptare.
Un alt exemplu, din compilatoare, este algoritmul coloring algorithm,
prin care se face asignarea registrelor in timp ce se minimizeaza depasirea
capacitatii registrelor. Un exemplu din retele este algoritmul de testare
multibit a tabelelor IP de cautare. In acesta un grad de libertate care poate
fi prezentat este ca numarul de biti care poate fi utilizat intr-un nod de test
poate fi variabil, si depinde de calea de test, si nu este fix la fiecare nivel.
Numarul de biti utilizati poate fi optimizat prin programare dinamica
pentru a cere cel mai mic volum de memorie la o viteza impusa.
P14: Folosirea unor tehnici specifice universurilor finite (cum sunt
numerele intregi)
Cand avem de-a face cu universuri mici, ca de exemplu intregii de
valori moderate, se folosesc tehnici specifice ca bucket sorting, array
lookup, bitmaps, care sunt mai eficiente decat algoritmii generali de
sortare si cautare.
Pentru a translata o adresa virtuala intr-p adresa fizica procesorul
incearca mai intai o memorie cache numita TLB. Daca nu reuseste,
procesorul trebuie sa caute in tabela de pagini.Se foloseste un prefix al
bitilor de adresa cu care tabela de pagini este indexata direct. Folosirea
cautarii in tabele evida folosirea tabelelor de dispersare (hash) sau cautarea
binara, dar duce la dimensiuni mari ale tabelelor de pagini. Un exemplu
din reteleal acestei tehnici sunt contoarele de timp,(vezi capitolul 7) unde
este construit un algoritm eficient pentru un ceas de timp cu domeniu
limitat, folosind zone circulare.
P15: Folosirea tehnicilor din teoria algoritmilor pentru crearea unor
structuri eficiente de date
Chiar in prezenta unor strangulari majore, ca translatarea adreselor
virtuale, proiectantii sistemelor resping algoritmii inteligenti cum sunt
transmiterea de indicatii, folosirea memoriilor cache sau a tabelelor de
cautare performante. Algoritmii eficienti pot imbunatati mult performanta
sistemelor. Primele 14 principii trebuie sa fie aplicate inainte ca oricare
dintre rezultatele teoriei algoritmilor sa duca la strangulari, cum se
intimpla in multe cazuri.
Abordarea algoritmica include folosirea structurilor standard de date la
fel ca si a tehnicilor algoritmice cele mai generale, ca de exemplu
aleatorizarea sau dezbina si cucereste. Pe de alta parte, proiectantul unui
algoritm trebuie sa fie pregatit sa faca fata si situatiei in care sa vada ca
algoritmul sau a devenit perimat, din cauza schimbarilor de tehnologie sau
de structura. Progresul real poate aparea mai degraba din aplicarea

62

gandirii algoritmice decat din reutilizarea vechilor algoritmi. In


calculatoare exista numeroase exemple stralucite de folosire a unor
algoritmi ca de exemplu: algoritmul de compresie Lempel-Ziv folosit in
utilitarul gzip din UNIX, algoritmul Rabin-Miller de test a proprietatii de
a fi numar prim din sistemele cu chei publice, si folosirea arborilor B
(datorat lui Bayer-McCreight) din bazele de date. In retele, exemple deja
prezentate includ algoritmul Lulea-IP-lookup si schema RFC pentru
clasificarea pachetelor.

63

CAPITOLUL 4
PRINCIPIILE IN ACTIUNE
n capitolul precedent s-au evideniat 15 principii pentru implementarea
eficient a protocoalelor de reea. Aici se dau exemple de aplicare a
principiilor.
4.1. Validarea buffer-elor pentru canalele dispozitivului aplicaie
ADC(Application Device Channel)
De obicei, programele aplicaiilor pot trimite date n reea numai prin
nucleul sistemului de operare, i doar nucleul are dreptul s comunice cu
adaptorul de reea. Aceast restricie previne ca diferite aplicaii
(rutcioase sau accidentale) s citeasc sau s scrie n datele celorlalte
aplicaii. De altfel, comunicarea prin intermediul kernel-ului aduce
suprancrcri, sub forma apelurilor de sistem. Ideea la ADC-uri
(Application Device Channels), s permit unei aplicaii s trimit date
ctre/dinspre retea prin scrierea direct n memoria adaptorului de reea.
Un mecanism de protecie, n locul medierii de ctre kernel, este ca
nucleul s seteze adaptorul cu un set de pagini valide de memorie pentru
fiecare aplicaie. Adaptorul de reea trebuie apoi s asigure c datele
aplicaiei pot fi trimise i recepionate doar prin memoria din setul valid.
Memorie
CPU

Recepionarea
urmtorului
pachet n A

Aplicatia P
Kernel/nucleu

Lista valida
pt P

X, Y, ..., L, A

Pagina X
...
Pagina A

ADAPTOR

RETEA
Figura 4.1. n APDs, adaptorul de reea primete un set de pagini valide (X, Y, L, A, etc.)
pentru o anumit aplicaie P. Cnd aplicaia P face o cerere de primire a datelor n pagina
A, adaptorul trebuie s verifice dac A este n lista paginilor valide, nainte de a permite
recepia lui.

n figura 4.1, aplicaiei P i se permite s trimit/primeasc date din/in


setul de pagini valide X, Y, ..., L, A. Presupunem c aplicaia P ncarc n
coad o cerere spre adaptor s-i primeasc urmtorul pachet, destinat lui
P, ntr-un buffer din pagina A. Deoarece cererea este trimis direct
adaptorului, nucleul nu poate verifica dac acest buffer este valid pentru P.
n schimb, adaptorul trebuie s valideze aceast cerere asigurndu-se c A
64

este n setul de pagini valide. Dac adaptorul nu face aceast verificare,


aplicaia P ar putea oferi o pagin invalid, aparinnd altei aplicaii, i
adaptorul ar scrie informaia destinat lui P n pagina greit. Necesitatea
acestei verificri conduce la urmtoarea problem.
Problem: Cnd aplicaia P face o receptie, adaptorul trebuie s
valideze c pagina aparine setului de pagini valide pentru P. Dac setul de
pagini este organizat ca o lista liniar, atunci validarea poate costa O(n),
unde n este numrul de pagini din set. In figura 4.1, deoarece A este la
sfritul listei de pagini valide, adaptorul trebuie s parcurg ntreaga list
pn l gsete pe A. Dac n este mare, atunci acest lucru poate fi scump i
poate duce la ncetinirea ratei cu care adaptorul poate trimite sau
recepiona pachete. Cum poate fi crescut viteza procesului de validare?
Indicaie: O abordare bun pentru a reduce complexitatea validrii
este folosirea unei structuri de date mai bune dect o list (P15). Poate fi
mbuntit comportarea n cazul cel mai defavorabil, i pe viitor, i gsii
factori constani mai mici, folosind o gndire sistemic i pasnd indicaii
interfeelor.
O gndire algoritmic ar conduce imediat la ideea implementrii setului de
pagini valide ca un tabel de dispersie, hash table, si nu ca o list. Acest
lucru ar oferi un timp mediu de cutare de O(1). Dispersarea are dou
dezavantaje: (1) funciile perfomante de dispersie cu o probabilitate mic
de coliziune sunt scumpe computaional; (2) dispersarea nu ofer o limit
bun pentru cazul cel mai defavorabil. Cutarea binara asigur un timp de
cutare logaritmic pentru cazul cel mai defavorabil, dar e scump (necesit
i pstrarea unor seturi sortate) dac setul de pagini e mare i rata de
transmisie a pachetelor e mare. In schimb, putem nlocui verificarea
tabelei de dispersie cu o tabel de verificare indexat, dup cum urmeaz.
Soluie: Adaptorul va stoca un set de pagini valide pentru fiecare
aplicaie ntr-un tablou, (fig.4.2). Acest tablou este actualizat numai cnd
nucleul actualizeaz setul de pagini valide pentru aplicaie. Cnd aplicaia
face o recepie n pagina A, transmite adaptorului un indicator. Acest
indicator este indexul poziiei din tablou unde este stocat A. Adaptorul
poate s foloseasc aceast informaie ca s confirme rapid dac pagina
din cererea de recepie se potrivete cu pagina din indicator. Costul
validrii e mrginit, dat de o cutare n tablou (verificarea c indexul e
valid) i o comparaie.

65

Memorie
CPU
Aplicatie P

Page X

Recepionarea
urmtorului
pachet n A

...
Page A

Kernel

Lista valida
pt P

X, Y, ..., L, A

ADAPTOR

RETEA
Figura 4.1. n APDs, adaptorul de reea primete un set de pagini valide (X, Y, L, A,
etc.) pentru o anumit aplicaie P. Cnd aplicaia P face o cerere de primire a datelor n
pagina A, adaptorul trebuie s verifice dac A este n lista paginilor valide, nainte de a
permite recepia lui.

Figura 4.2: Evitarea necesitii actualizrii tabelei de dispersie, prin pasarea manevrei
prin interfaa aplicaie-adaptor

Exercitii
Este ghidajul/handle o indicaie/hint sau un tip ? s revenim la P1:
daca e un handle de ce s pasm numrul paginii (e.g.A) interfeei? De ce
s eliminm accelerarea uoar a vitezei task-ului de confirmare a
numrului paginii?
Pentru a gsi tabela corespunztoare aplicaiei P e necesar o cutare
n tabelele de dispersie, folosind P ca i cheie. Acest lucru atenueaz
argumentul de a scpa de cutarea n tabelele de dispersie ca s verificm
dac o pagin e valid sau nu, cu excepia rafinrii cutrii n tabelele de
dispersie. Cum poate fi fcut acest lucru ?
4.2. Planificator pentru controlul fluxului la ATM
In modul ATM ( Asynchronous Transfer Mode), adaptorul ATM poate
avea sute de circuite virtuale,VC(Virtual Circuit) care pot transmite
simultan date (numite celule). Deseori, se controleaz fluxul fiecrui VC,
ntr-o form sau alta, pentru a limita rata de transmisie a acestuia. De
exemplu, la controlul fluxului bazat pe rata de transmisie, un circuit virtual
VC poate primi credite, ca s transmit celulele la momente de timp fixe.
66

Pe de alt parte, la controlul fluxului bazat pe credite, creditele pot fi


transmise de nodul urmtor de pe cale cnd se elibereaz buffer-ele.
Astfel (fig.4.3), adaptorul are un tabel care pstreaz starea VC. Sunt
patru VC setate (1, 3, 5, 7). Dintre acestea, doar VC1,5 i 7 au celule de
transmis. Dar VC5 e inactiv, astfel c numai VC1 i 7 au credite pentru a
transmite celule. Astfel urmtoarea celul trimis de adaptor ar trebui s
fie dintr-un VC disponibil: 1 sau 7. Selecia dintre VC disponibile ar trebui
fcut corect, de exemplu prin tehnica round-robin. Dac adaptorul alege
s transmit o celul din VC7, el va decrementa la 1numrul de credite al
VC7. Cum nu mai sunt alte celule de transmis, VC7 devine acum
nedisponibil. Alegerea urmtorului VC disponibil duce la urmtoarea
problem.
Problem: Un planificator naiv ar putea parcurge ciclic tabloul cu
circuite virtuale cutnd unul eligibil. Dac multe dintre VC sunt
nedisponibile, atunci planificatorului i va lua mult timp pn va gsi unul
disponibil, lucru care este ineficient. Cum poate fi evitat aceast
ineficien?
Indicaie: Apelm la P12, suplimentarea strilor pentru accelerarea
buclei principale. Ce stare trebuie adugat pentru a evita parcurgerea
strilor VC neeligibile ? Cum poate fi meninut eficient aceast stare ?
Soluie: Se ine o list a circuitelor virtuale eligibile, n plus fa de
tabelul de VC (fig. 4.3). Singura problem este meninerea eficient a
acestei stri. Aceasta e dificultatea major a principiului P12. Dac aceast
eviden este prea scump de meninut, adugarea altor stri este o calitate
nu o necesitate. tim c un VC este disponibil dac are att celule de
transmis ct i credite. Astfel un VC este scos din list dac devine inactiv
sau nu mai are credite; altfel e adugat la coada listei pentru asigurarea
corectitudinii; adugarea se face fie cnd sosete o celul la coada de
ateptare vid a unui VC sau cnd VC fr credite primete credite.
Exercitii
Cum putei fi siguri c un VC nu e adugat de mai multe ori listei
eligibile?
Poate fi generalizat schema pentru a permite unor VC mai multe
posibiliti de a transmite dect altora, pe baza unor ponderi alocate de
manager?
4.3 Calcularea rutei folosind algoritmul lui Dijkstra
Cum decide un ruter S asupra rutei/traseului unui pachet spre destinaia
D? Fiecare legtur ntr-o reea are un cost, i ruterele trebuie s calculeze
drumul cel mai scurt/de cost minim ctre destinaie n domeniul local.
Costul e un numr ntreg, de valoare mic. Cel mai folosit protocol de
dirijare intradomeniu este OSPF (Open Shortest Path First), bazat pe starea
legturilor.
n cadrul rutrii dup starea legturii, fiecare ruter dintr-o subreea
trimite un pachet cu starea legturii LSP (Link State Packet) care conine
lista legturilor cu toi vecinii si. Fiecare LSP este transmis spre toate
celelalte rutere din subreea folosind un protocol de inundare. Odat ce
fiecare ruter a primit cte un LSP de la oricare din celelalte rutere, atunci
fiecare ruter are harta ntregii reele. Presupunnd c topologia ramne
stabil, fiecare ruter poate acum s calculeze cel mai scurt drum ctre

67

fiecare nod din cadrul reelei, folosind un algortim standard de cale


minim, ca de exemplu algoritmul lui Dijkstra.
n figura 4.5, sursa S dorete s calculeze arborele de drum minim ctre
restul nodurilor (A, B, C, D) din reea. Reeaua este prezentat n stnga
figurii cu legturile i costurile lor. n algoritmul Dijkstra, S ncepe prin a
se plasa doar pe el n arborele de cost minim. S actualizeaz costul pentru
a ajunge la vecinii adiaceni (ex. B, A). La fiecare iteraie, algoritmul
Dijkstra adaug la arborele curent, nodul cel mai apropiat arborelui curent.
Costurile vecinilor noului nod adugat sunt actualizate. Procesul se repet
pn toate nodurile din reea aparin arborelui.
De exemplu, n figura 4.5., dup ce a adugat S, algoritmul alege nodul
B i apoi A. La aceasta iteraie, arborele arat ca cel din dreapta figurii 4.5.
Liniile continue arat arborele existent, iar cele ntrerupte arat cele mai
bune conexiuni curente spre nodurile care nu sunt nc n arbore. Cum A
are un cost de 2 i este o legatur de cost 3 de la A la C, C este marcat cu
5. Asemntor, D este marcat cu un cost egal cu 2 pentru drumul prin B.
La urmtorul pas, algoritmul alege nodul D ca nod cu costul cel mai mic
ce nu aparine arborelui. Costul legturii ctre C este actualizat folosind
ruta prin D. n final, C este adugat n ultimul pas.
Aceast soluie necesit determinarea nodului cu cel mai mic cost care
nu se afl n arbore la fiecare pas. Structura de date standard, pentru a ine
evidena elementului de valoare minim, ntr-un mediu care se modific
dinamic, este o coad de ateptare cu prioriti. Acest lucru conduce la
urmtoarea problem.
Problem: Algoritmul Dijkstra necesit o coad de ateptare cu
prioriti la fiecare din cele N iteraii, unde N este numrul nodurilor de
reea. Cele mai bune cozi de prioriti cu scop general, ca depozitele/heap
au un cost de O ( log N ) pentru a gsi elementul minim. Acest lucru
implic un timp total de rulare de O ( N log N ) . Rezult, pentru o reea de
dimensiuni mari, un timp de rspuns mare la defeciuni i modificri de
topologie.
Indicaie: Trebuie exploatat situaia c legturile au ca i costuri numere
ntregi mici (P14), folosind un tabel cu costurile legturilor. Cum putei
gsi eficient urmtorul nod de cost minim pentru a-l include n arborele
cilor minime?
Soluia: Faptul c costurile legturilor sunt valori mici ntregi poate fi
exploatat pentru construcia cozii de ateptare cu prioriti, folosind
sortarea de tip gleat/bucket sorting (P14). Presupunem c cel mai mare
cost de legtur este MaxLinkCost. Astfel costul maxim al unei ci nu
poate fi mai mare de Diam MaxLinkCost, unde Diam este diamterul
reelei. Presupunem c Diam este un numr ntreg de valoare mic. Astfel
putem folosi un tablou cu o poziie pentru fiecare cost posibil c n gama
1...Diam*MaxLinkCost. Dac n timpul algoritmului Dijkstra costul curent
al nodului X este c, atunci nodul X poate fi plasat n lista indicat de
elementul c alt tabloului. (fig.4.6). Acesta ne conduce la urmtorul
algoritm.
De fiecare dat cnd un nod X i schimb costul de la c la c , nodul
X este scos din lista pentru c i adugat n lista pentru c. Dar cum se
gsete elementul minim n tablou? Se folosete un indicator numit
68

CurrentMin iniial pus pe 0 (ce corespunde costului lui S). De fiecare dat
cnd algoritmul dorete s gseasc nodul de cost minim care nu aparine
arborelui, CurrentMin este incrementat cu 1 pn este gsita o locaie de
tablou care conine o list nevid. Orice nod din aceast list poate fi
adugat la arbore. Costul algoritmului este O ( N + Diam MaxLinkCost )
deoarece aciunea care d n avans CurrentMin poate fi cel mult de
dimensiunea tabloului. Aceasta este mult mai bine dect N log N ,dac N
este mare i Diam i MaxLinkCost sunt mici.
Factorul crucial care permite folosirea eficient a cozii de ateptare cu
sortare prin gleat a prioritilor este faptul c costurile nodurilor sunt
ntodeauna naintea valorii lui CurrentMin. Aceasta este condiia de
monotonie. Dac nu ar fi aa algoritmul ar ncepe de la 1 la fiecare iteraie,
n loc sa nceap de la ultima valoare a lui CurrentMin, i s nu mai revin
niciodat. Aceast condiie de monotonie este evident pentru algoritmul
Dijkstra deoarece costul nodurilor care nu aparin arborelui trebuie s fie
mai mari dect costurile nodurilor din arbore.
Figura 4.6. arat starea cozii de ateptare cu sortarea prioritii cu gleat
dup ce A a fost adugat arborelui (cadrul din dreapta n fig.4.5). La acest
moment CurrentMin=2, care este egal cu costul lui A. La urmtorul pas,
CurrentMin va deveni 3, i D va fi adugat arborelui. Acest lucru duce la
reducerea costului lui C la 4. Astfel C va fi scos din lista din poziia 5 i
adugat n lista vid din poziia 4. CurrentMin devine 4 i abia atunci C
este adugat arborelui.
Exerciii:
Algoritmul cere ca un nod s fie extras dintr-o list i adugat altei
liste, precedent. Cum poate fi fcut acest lucru eficient ?
In fig.4.6 cum tie algoritmul c a terminat, dup adugarea nodului C
arborelui, i s nu mai parcurg tabloul pna la capt ?
In reelele unde apar defectri, conceptul de diametru este foarte
suspect, deoarece el se poate modifica mult n caz de defectare.
Considerm o topologie circular, unde toate cele N noduri au diametrul 2
prin nodul zis central; dac acesta se defecteaz, diametrul scade la N/2.
Deobicei, n practic, diametrul este mic. Acest lucru poate crea probleme
n dimensionarea tabloului ?
Putem evita complet problema diametrului nlocuind tabloul liniar din
fig.4.6 cu unul circular de dimensiune MaxLinkCost ? Explicai. Soluia
rezultat se numete algoritmul Dial.
4.4 Monitor Ethernet cu o punte hardware
Alice Hacker a lucrat la Acme Network cu o punte Ethernet a firmei
Acme. O punte este dispozitivul care face legtur ntre mai multe reele
Ethernet. Pentru a transmite pachete de la o reea Ethernet la alta, puntea
caut adresa destinaie pe 48 bii din pachetul Ethernet, la viteze mari.
A. Hacker a decis s transforme puntea ntr-un monitor de trafic
Ethernet, care s asculte pasiv reeaua, pentru a obine statistici asupra
structurii traficului Ethernet. Monitorizarea se face ntre perechi sursdestinaie arbitrare, astfel c pentru fiecare pereche activ surs-destinaie,
ca A i B, se rein n variabilele PA,B numrul de pachete trimise de la A
spre B, de la nceputul monitorizrii. Cnd un pachet este trimis de la A la
69

B, programul de monitorizare (care ascult toate pachetele transmise) va


prelua o copie a pachetului. Dac sursa este A i destinaia B se
incrementeaz PA,B. Operaia trebuie facut n 64 sec, timpul minim ntre
pachete n Ethernet. Strangularea apare la verificarea strii PA,B asociate
unei perechi de adrese pe cte 48 bii A,B.
Din fericire, puntea hardware are un motor de cutare ce poate verifica
starea asociat unei singure adrese de 48 biti n 1,4 sec. Un apel spre
hardware poate fi fcut de forma Lookup(X,D), unde X este cheia pe 48
bii i D este baza de date n care se face cutarea. Apelul returneaz starea
asociat cu X n 1,4 sec pentru baze de date cu un numr mai mic de
64.000 chei. Problema ce trebuie rezolvat este urmtoarea:
Problem: Programul de monitorizare trebuie s actualizeze starea pentru AB
cnd ajunge la B un pachet de la A. Programul are un motor de cutare care
poate gsi doar adrese singulare i nu perechi.Cum poate motorul actual s
caute perechi de adrese? (figura 4.7).
Indicaie: Trebuie folosit P4 pentru a exploata puntea hardware existent.
Deoarece 1,4 sec << 64 sec putem folosi n proiectare mai mult de o
cutare hardware. Cum poate fi redus o cutare de 96 de bii la o cutare de
48 de bii, folosind trei cutri ?
Soluia naiv este folosirea a dou cutari pentru a converti sursa A i
destinaia B n indici mai mici (<24 biti), I A i I B . Aceti indici pot fi
apoi folosii pentru cutare ntr-un tablou bidimensional care memoreaz
starea pentru AB. Aceasta pretinde doar dou cutari hardware i un acces
la memorie, dar poate implica un volum mare de memorie. La 1000 de
surse posibile i tot 1000 destinaii posibile, tabelul trebuie s aib un
milion de intrri. In practic sunt active deobicei doar 20.000de perechi
surs-destinaie. Cum poate fi adaptat volumul necesar de memorie
proporional cu numrul actual al perechilor surs- destinaie ?
Soluie: Inti se face cte o cutare pentru a converti sursa A i destinaia B n
indici mai mici (<24 biti), IA si IB. Apoi se folosete o a treia cutare pentru a
face asocierea ntre IAIB i starea AB. Soluia este ilustrat n figura 4.8. Cea dea treia cutare face compresia tabloului bidimensional din soluia naiv. Soluia
are ca autori pe Mark Kempf i Mike Soha.
Exerciii
Poate fi problema rezolvat cu doar dou cutri ale punii hardware i
fr memorie suplimentar ?
Setul perechilor surs-destinaie se poate schimba n timp, deoarece
anumite perechi de adrese devin inactive lungi perioade de timp. Cum
poate fi manevrat situaia fr a ine cte o stare pentru fiecare pereche
posibil de adrese, care are de comunicat de la pornirea monitorului ?
4.5 Demultiplexarea n nucleul-X
Nucleul-x asigur o infrastructur software pentru implementarea de
protocoale n staii/gazde. Sistemul nucleului-x asigur baza pentru un
numr de funcii de protocoale necesare. O funcie folosit este protocolul
de demultiplexare. De exemplu, cnd IP, nivelul reea Internet, primete
un pachet, trebuie s foloseasc cmpul de protocol pentru a vedea dac
pachetul trebuie trimis la TCP sau la UDP.

70

Majoritatea protocoalelor fac demultiplexarea pe baza unor identificatori


n antetul/header-ul protocolului. Aceti identificatori pot s varieze ca
lungime n diferite protocoale. De exemplu, cmpurile pentru Ethernet pot
fi de 5 octei, iar numerele portului TCP au 2 octei. Astfel x-kernel-ul
permite demultiplexarea pe baza identificatorilor de protocol cu lungime
variabil. Cand se iniializeaz sistemul, rutina protocolului nregistreaz
legturile ntre identificatori i protocolul destinaie cu nucleul-x. In timpul
rulrii, cnd un pachet sosete, rutina protocolului poate extrage
identificatorul protocolului din pachet i apeleaz rutina nucleului-x de
demultiplexare pentru protocolul destinaie. Cum pachetele pot veni la
viteze mari, rutina de demultiplexare trebuie s fie rapid. Rezult
urmtoarea problem.
Problem: In medie, cea mai rapid cale de a face o cutare este folosirea
unui tabel de dispersie. Cum este prezentat n figura 4.9, sunt necesare folosirea
unor funcii de dispersie asupra identificatorului K pentru generarea unui index
de dispersie, folosirea acestui index pentru a accesa tabelul de dispersie, i
compararea cheii L, reinut la intrarea n tabelul de dispersie, cu K. Dac se
potrivesc, rutina de demultiplexare poate recupera protocolul destinaie asociat
cheii L. Presupunem c funcia de dispersie a fost aleas s fac coliziunile rare.
Deoarece lungimea identificatorilor este un numar arbitrar de octei,
rutina pentru comparaie pentru cele dou chei trebuie, n general, s fac
comparaia octet cu octet. Oricum, presupunem cazul cel mai des ntlnit a
identificatorilor pe 4 octei, care este dimensiunea unui cuvnt. In acest
caz, este mult mai eficient s facem comparatia la nivel de cuvnt. Astfel
scopul este (P4) s exploatm comparaia eficient pe cuvnt pentru
optimizarea cazului cel mai probabil. Cum putem opera, daca se
manevreaz diferite protocoale ?
Indicaie: Dac x-kernel-ul are de demultiplexat un identificator de 3
octei, trebuie s foloseasc rutina de comparaie octet cu octet; dac
identificatorul e pe 4 octeti, i maina lucreaz cu cuvinte de 4 octei,
poate fi fcut comparaia pe cuvnt. Primul grad de libertate care poate fi
folosit este s avem rutine de comparaie diferite pentru cele mai comune
cazuri (comparare pe cuvnt, comparare pe cuvinte lungi) i o rutin de
avarie/default pentru compararea pe octet. Acesta este un compromis
spaiu-timp (P4b). Pentru corectitudine, trebuie tiut care rutin de
comparaie trebuie folosit n cazul fiecrui protocol. Trebuie invocate
principiile P9 de pasare de indicaii interfeelor i P2a de realizare a
precalculelor.
Soluie: Fiecare protocol trebuie s declare identificatorul i protocolul
destinaie nucleului-x cnd se iniializeaz sistemul. Cand s-a realizat acest
lucru, fiecare protocol poate s-i predeclare lungimea identificatorului, ca
nucleul-x s foloseasc rutine de comparaie specializate pentru fiecare
protocol. Efectiv, informaia este transmis ntre protocolul client i nucleul-x
mai devreme. Presupunem c nucleul-x are un tabel de dispersie pentru fiecare
protocol client i c nucleul-x tie contextul pentru fiecare client astfel nct s
foloseasc codul specializat pentru acel client.
Exerciii
Codai comparaiile octet-cu-octet i pe cuvnt pe calculatorul vostru,
facei un numr mare de comparaii i apoi comparai timpul global
necesar fiecrui tip.
71

In primele soluii ADC cautarile tabelelor hash au fost rafinate prin


pasarea unui index (n loc de lungimea identificatorului, ca la nceput). De
ce poate fi aceast soluie dificil n acest caz ?
4.6 Arbori cu prefix cu compresia nodului
Un arbore cu prefix sau arbore ordonat/trie este o structur de date de
forma unui arbore de noduri, unde fiecare nod este un tablou de M
elemente. Figura 4.10 prezint un exemplu simplu cu M=8. Fiecare tablou
poate reine fie o cheie (ex. KEY 1, KEY 2, sau KEY 3 n figura 4.11) sau
un pointer ctre alte noduri ale arborelui cu prefix (ex. primul element n
nodul test cel mai de sus din figura 4.10, care este rdcina). Arborele cu
prefix este folosit pentru a cuta potriviri exacte (i potriviri de cele mai
lungi prefixe) cu un ir de intrare. Arborii cu prefix sunt utili n reele
atunci cnd se caut o adres IP, o punte, i filtre de demultiplexare.
Nu ne intereseaz acum algoritmul exact al arborelui cu prefix. Singurul
lucru ce trebuie tiut este cum se face cutarea n arborele cu prefix.
Presupunem c c=log2M este dimensiunea unei buci de arbore cu prefix.
Pentru a cuta n arborele cu prefix,nti se separ irul de caractere
introdus, n buci de dimensiunea c. Cutarea folosete bucile succesive,
ncepnd cu cea mai semnificativ, indexnd nodurile unui arbore cu
prefix, ncepnd cu nodul rdcin. Cand cutarea folosete bucata j pentru
a indexa n pozitia i a nodului curent al arborelui cu prefix , pozitia i poate
conine un pointer sau o cheie. Dac poziia i conine un pointer nenul
ctre nodul N, cutarea continu din nodul N cu bucata j+1; altfel cutarea
ia sfrit.
Pe scurt, fiecare nod este un tablou de pointeri sau chei, i procesul de
cutare trebuie s indexeze n aceste tablouri. Oricum, dac multe din
nodurile arborelui cu prefix sunt mprtiate, se face risip de spaiu (P1).
De exemplu, n figura 4.10, doar 4 din 16 locaii conin informaie util. In
cel mai ru caz, fiecare nod al arborelui cu prefix poate conine un pointer
sau o cheie i ar putea fi un factor M n memorie nefolosit. Presupunem
M 32 n cele ce urmeaz. Chiar daca M este aa mic, o cretere cu 32 a
memoriei poate duce la mrirea semnificativ a costului proiectrii.
O abordare evident este nlocuirea fiecarui nod al arborelui cu prefix
cu o list liniar de perechi de forma (i,val), unde val este o valoare nevid
(pointer sau cheie) n poziia i a nodului. De exemplu, nodul arborelui cu
prefix rdcin n figura 4.10 poate fi nlocuit cu o list (1,ptr);(7,KEY1),
unde ptr1 este un pointer la nodul arborelui cu prefix de jos. Din pcate,
acest lucru poate ncetini cutarea arborelui cu prefix cu un factor M,
deoarece cutarea fiecarui nod al arborelui cu prefix duce la cutarea intr-o
lista de M locaii, n locul unei simple operaii de indexare. Asta ne
conduce la urmtoare problem.
Problema:Cum pot nodurile arborelui cu prefix s fie comprimate prin
eliminarea pointerilor nuli fr a ncetini cutarea dect cu un factor mic?
Indicatie: Dei nodurile sunt comprimate, indexarea tabelelor trebuie s
fie eficient. Dac nodurile sunt comprimate, cum ar putea fi reprezentat
informaia despre nodurile care au fost eliminate ? Considerm o egalizare
faptul c M este mic, respectnd P14 (exploatarea dimensiunii ntregilor
mici) i P4a (exploatarea localizrii).

72

Soluie: Cum M<32, un bitmap de dimensiune 32 poate uor s ncap ntrun cuvnt. Astfel pointerii nuli sunt scoi dup ce se adaug un bitmap cu zero
bii indicnd pozitia original a pointerilor nuli. Acest lucru este artat n figura
4.11. Nodul arborelui cu prefix poate fi acum nlocuit cu un bitmap i un nod al
arborelui cu prefix comprimat. Un nod al arborelui cu prefix comprimat este un
tablou ce conine doar valorile nenule din nodul original. Astfel n figura 4.11
nodul rdcina al arborelui cu prefix original (de sus) a fost nlocuit cu nodul
arborelui cu prefix comprimat (de jos). Bitmapul contine un 1 n prima i a
aptea pozitie, unde nodul rdcin conine valori nenule. Tabloul necomprimat
conine acum doar 2 elemente, primul pointer i KEY 3.
Avnd n vedere c att nodurile comprimate ct i cele necomprimate
sunt tablouri i procesul de cutare ncepe cu un index I n nodul
necomprimat, procesul de cutare trebuie s consulte bitmapul pentru a
converti indexul necomprimat I ntr-un index comprimat C n nodul
comprimat. De exemplu, dac I este 1 n figura 4.11, C ar trebuie s fie 1;
daca I este 7, C ar trebui s fie 2. Dac I este oricare alt valoare, C ar
trebui s fie 0, indicnd c este un singur pointer nul.
Conversia din I la C poate fi realizat uor innd cont de urmtoarele.
Daca poziia I n bitmap conine un 0, atunci C=0. Altfel, C este un numr
de 1-uri n primii I bii ai bitmapului. Astfel dac I=7, atunci C=2,
deoarece sunt doi bii setai n primii apte bii ai bitmapului. Acest calcul
necesit cel mult dou referiri la memorie: una pentru a accesa bitmapul
(deoarece bitmapul e mic, P4a) i una pentru a accesa tabloul comprimat.
Calculul numarului de bii setai ntr-un bitmap poate fi fcut folosind
registre interne (n software) sau logica combinaional (n hardware).
Astfel ncetinirea efectiv este cu un factor ceva mai mare de 2 n software
i exact 2 n hardware.
Exerciii
Cum putei folosi cutarea tabelelor (P14, P2a) pentru accelerarea
contorizrii numrului de bii din set, n software? Ar fi necesar al treilea
apel la memorie ?
Presupunem c bitmap-ul e mare (sa zicem,M=64K). Ar prea c
contorizarea numrului de bii din set cu asemenea bitmap mare e
imposibil de lent, n software sau hardware. Putei gsi o cale de
accelerare a contorizrii biilor n bitmap-urile mari (P12 si P2a) ?
4.7 Filtrarea pachetelor in rutere
Exist protocoale care seteaz resursele la rutere pentru trafic care
necesit garantarea performanelor, cum e traficul video sau audio. Astfel
de protocoale folosesc concepte ca filtrarea pachetelor, numite i
clasificatoare. Astfel, n figura 4.12 fiecare receptor ataat unui ruter poate
specifica un filtru de pachete descriind pachetele pe care dorete s le
recepioneze. De exemplu, n fig.4.12 receptorul 1 poate fi interesat de
recepia NBC, care e specificat de filtrul 4. Fiecare filtru e conform unor
specificaii ale cmpurilor care descriu pachetele video trimise de NBC.
De exemplu, NBC poate fi specificat de pachetele care folosesc adresa
surs a transmitorului NBC din Germania i utilizeaz o anumit
destinaie TCP i numrul de port surs.
La fel, n fig.4.12 receptorul m poate fi interesat n recepionarea ABCSport i CNN, care sunt descrise de filtrul 1i 7. Pachetele sosesc la ruter

73

la viteze mari i trebuie trimise tuturor receptoarelor care cer pachetul. De


exemplu, receptorul 1 i receptorul 2 pot dori ambele s recepioneze
NBC, fapt ce duce la urmtoarea problem.
Problem Fiecare pachet recepionat trebuie ncercat la fiecare filtru i trimis
la toi receptorii care l las s treac. O scanare liniar simpl a tuturor filtrelor
e scump dac numrul de filtre e mare. Presupunem numrul de filtre e peste o
mie. Cum poate fi grbit un pic acest proces?
Indicaie Ne-am putea gndi s optimizm cel mai probabil caz
utiliznd cache-ul pentru memorare (P11a). Totui caching-ul e dificil de
folosit aici, i de ce ? Considerm adugarea unui unui cmp (P10) la
antetul pachetului pentru a face cachingul mai usor. Care nivel de protocol
ar trebui ideal adugat ?Adugnd un cmp fix bine cunoscut pentru
fiecare tip de video posibil nu e un panaceu, deoarece implic o
standardizare global, i filtrele trebuie s fie bazate pe alte cmpuri, ca de
exemplu adresa sursei. Presupunem c cmpurile adugate de noi nu
necesit identificatori standardizai global. Ce proprieti trebuie s asigure
sursa acestor cmpuri?
Soluia Folosirea memorilor cache (P11a), vechiul cal de bataie al
proiectanilor de sisteme, nu e direct pentru aceast problem.In general n
cache se memoreaz asocierile dintre o intrare a i o ieire oarecare f(a).
Cache-ul const deci dintr-un set de perechi de valori, de forma (a,f(a)),. Baza
de date poate fi implementat ca un tabel de dispersie (software) sau o memorie
cu coninut adresabil (hardware). Avnd valoarea a i trebuind s calculm f(a),
se consult baza de date ca s vedem dac a nu a fost deja introdus. Dac da
atunci se poate da direct, rapid valoarea lui f(a). Dac nu atunci se va face
calculul folosind o alt metod de calcul (posibil scump) i perechea (a,f(a))
este introdus n baza de date cache. Pe urm intrrile de valoare a pot fi
calculate foarte rapid.
In problema filtrrii pachetelor, scopul este s calculm setul de
receptoare asociate unui pachet P. Problema e c ieirea este o funcie de,
posibil, un numr mare de cmpuri antet ale pachetului P. Astfel pentru a
folosi memoria cache, trebuie stocate o parte mare de antetele lui P
asociate setului de receptoare pentru P. Memorarea asocierilor dintre cei
64 de octei ai antetului pachetului e o propunere foarte costisitoare.Este
costisitoare n timp, deoarece cutarea cache-ului poate fi mai lung
deoarece cheile sunt vide.Este costisitoare i ca spaiu de memorare.
Stocrile masive implic un numr mai mic de asocieri care pot fi stocate
ntr-o memorie cu o capacitate dat, adic n final un hit-rate mai prost.
Se prefer reinerea n cache a asocierilor dintre unul/dou cmpuri de
pachete i setul de receptoare de la ieire. Acest lucru ar accelera timpul
de cutare prin cache i ar mbunti hit-rate-ul. E preferabil c aceste
cmpuri s fie plasate n antetul de rutare, verificat oricum de
ruter.Problema e c acolo ar putea s nu fie un asemenea cmp care s
amprenteze unic pachetul P ?
Totui, presupunnd c suntem proiectani de sisteme, i avem de
proiectat un protocol de rutare.Am putea aduga un cmp antetului de
rutare. Problema pare banal dac am putea asigna fiecrui flux de
pachete posibil un identificator global unic.De exemplu, dac am putea
asigna lui NBC identificatorul 1, lui ABC identificatorul 2, iar lui CNN
identificatorul 3, atunci am putea memora n cache folosind identificatorul
74

ca i cheie. O asemenea soluie ar implica o form oarecare de comitete


de standardizare global responsabile cu botezarea fiecrui flux aplicaie.
Chiar dac s-ar putea face acest lucru, filtrul receptor ar putea cere toate
pachetele NBC de la o anumit surs, iar filtrul ar putea depinde i de alte
cmpuri ale pachetului.Acest lucru a condus la urmtoarea idee final.
Soluia la care s-a ajuns este modificarea antetului de rutare prin
adugarea unui identificator de flux F (fig.4.13), cu semnificaie
dependent de surs. Cu alte cuvinte, surse diferite pot folosi acelai
identificator de flux deoarece este o combinaie, a sursei i a
identificatorului de flux, care este unic. Aa nu e necesar standardizarea
global a identificatorilor de flux (i nici alt coordonare
global).Identificatorul de flux e doar un contor local meninut de surs
Ideea este c la transmitor o aplicaie care transmite poate cere nivelului
de rutare un identificator de flux. Acest identificator este adugat antetului
de rutare la toate pachetele aplicaiei.
Ca deobicei, cnd un pachet aplicaie sosete prima dat, ruterul face o
cutare liniar (lent) pentru a determina setul de receptoare asociate cu
antetul pachetului. Deoarece identificatorii nu sunt unici de la o surs la
alta, ruterul reine n cache asocierile folosind concatenarea adreselor surs
a pachetului si identificatorul de flux ca i cheie. Evident c corectitudinea
depinde de condiia ca aplicaia transmitorului s nu schimbe cmpurile
care ar putea afecta filtrul, fr s schimbe deasemenea i identificatorul
de flux din pachet.
Exerciii
Ce poate merge prost cnd cade sursa i revine fr s-i mai
aminteasc ce identificatori au fost asignai diferitelor aplicatii? Ce poate
merge prost cnd receptorul adaug un filtru nou? Cum pot fi aceste
probleme rezolvate?
In soluia curent identificatorul de flux e folosit ca un tip i nu ca un
hint. Ce costuri suplimentare ar presupune tratarea perechii identificatorul
de flux-adresa sursei ca un hint
i nu ca un tip?
4.8 Evitarea fragmentarii pachetelor de stare a legaturii
Problema care urmeaza a aparut in timpul proiectarii protocoalelor de
dirijare conform cu starea legaturii, OSI si OSPF. Ea se refera la
proiectarea si nu la implementarea protocolului, odata ce proiectarea a fost
facuta. Se vede acum cat de tare afecteaza performanta protocolului
solutiile adoptate in timpul proiectarii.
La dirijarea conform cu starea legaturii, ruterul trebuie sa transmita un
pachet cu starea legaturii LSP(Link State Packet) tuturor vecinilor sai.
Protocolul de dirijare conform cu starea legaturii consta din doua procese
separate. Primul este procesul de actualizare care transmite pachete cu
starea legaturii in siguranta de la ruter la ruter, folosind protocolul cu
inundare, care aloca un numar de secventa unic fiecarui pachet de stare a
legaturii. Numarul de secventa e folosit pentru a rejecta copiile duplicate
ale unui LSP. De cate ori un ruter primeste un nou LSP numerotat cu x de
la sursa S, el va memora valoarea x, si va rejecta orice LSP-uri urmatoare
avand numarul de secventa x. Dupa ce procesul de actualizare isi termina
treaba, procesul de decizie din fiecare ruter aplica algoritmul lui Dijkstra
tabelei de retea formate de pachetele de stare a legaturilor.

75

Un ruter poate avea putine rutere vecine, sau poate avea vecine multe
calculatoare gazda/host-uri (noduri terminale), conectate direct la ruter in
acelasi LAN. De exemplu, in fig.4.14, ruterul R1 are 500 de noduri
terminale vecine, E1...E500. Marile LAN-uri pot avea si mai multe noduri
terminale vecine, ceea ce conduce la problema urmatoare.
Problema:La cei 8 bytes alocati fiecarui nod terminal (6 bytes pentru
identificarea nodului in sine, iar 2 bytes reprezinta informatia de cost adica
LSP-uri), LSP-ul poate fi foarte mare (pentru 5000 de noduri terminale,
dimensiunea poate ajunge la 40,000 bytes). Aceasta valoare este mult prea
mare pentru ca LSP-ul sa incapa intr-un cadru chiar si de dimensiune
maxima din majoritatea legaturilor de date obisnuite. De exemplu,
protocolul Ethernet are dimensiune maxima a cadrelor de 1500 bytes, iar
protocolul FDDI, 4500 bytes. Acest lucru implica fragmentarea LSP-urilor
mari intr-un numar mare de cadre de nivel legatura de date, la fiecare nod,
si apoi reasamblarea lor de catre urmatorul nod, s.a.m.d. Pentru a
determina daca toate fragmentele de LSP au fost receptionate, este
necesar, din pacate, un proces de reasamblare costisitor in fiecare nod.

Figura 4.14 Pachetul de stare a legaturii a ruterului R1 (cu 500 de noduri vecine) poate
fi prea mare ca sa incapa intr-un cadru de nivel legatutra de date. Acest lucru implica
fragmentari si reasamblari ineficiente, la fiecare salt.

Figura 4.15 Evitarea fragmentarii hop-by-hop impartind ruterele mari in pseudorutere

De asemenea, creste latenta propagarii LSP-ului. Presupunem ca


fiecare LSP incape in M cadre de nivel legatura de date, ca diametrul
retelei este D, iar timpul de transmitere pe legatura al unui cadru de nivel
legatura de date este de o unitate de timp. Atunci, timpul de propagare al
unui LSP, tinind cont de reasamblarea in fiecare nod va fi D M . Daca
ruterele in cauza nu ar fi avut de asteptat pentru reasamblarea LSP-urilor
pas cu pas, intarzierea datorata propagarii ar fi fost doar M + D . Cand a
fost proiectat protocolul pentru starea legaturii, aceste probleme au fost
detectate de cei care au revizuit ulterior specificatiile.
Pe de alta parte, pare imposibil ca fragmentele sa fie transmise
independent unul de celalalt, deoarece LSP-ul poarta un singur numar de
secventa care este crucial in procesul de actualizare. Simpla copiere a
numarului de secventa in fiecare fragment nu ajuta, deoarece duce la
76

rejectarea a fragmentelor ulterioare, pe motiv ca au acelasi numar de


secventa cu primul. Rezolvarea cestei probleme aparent imposibila se face
prin deplasarea calculului in spatiu, pentru a evita nevoia de fragmentare
pas cu pas. Sunt permise schimbari in protocolul de rutare LSP.
Sugestie: trebuie oare ca toti cei 5000 de octeti de informatie de la
nodurile finale sa se afle in acelasi LSP ? Vezi principiul P3c, deplasarea
calculului in spatiu (nodurile terminale vor fi astfel proiectate incat sa
calculeze dimensiunile maxime ale fragmentelor care pot trece prin orice
retea si sa faca ele insele fragmentarea).
Solutie. Daca fragmentele individuale ale LSP-ului original al ruterului
R1 s-ar propaga independent unul de altul, fara reasamblarea pas cu pas,
atunci fiecare fragment trebuie sa fie un LSP in sine, cu un numar de
secventa separat. Aceasta observatie extrem de importanta duce la o idee
eleganta.
Se modifica protocolului de rutare a informatiilor de stare LSP pentru a
permite oricarui ruter R1 sa apara ca mai multe pseudo-rutere R1a , R1b , R1c
(figura 4.15). Astfel, grupul initial de noduri terminale este impartit intre
aceste pseudo-rutere, si in consecinta LSP-ul fiecarui pseudo-ruter va
incapea in majoritatea cadrelor de nivel legatura de date fara a mai fi
nevoie de fragmentare. De exemplu, daca majoritatea dimensiunilor de
nivel legatura de date este de minim 576 bytes, intr-un cadru de nivel
legatura de date pot incapea 72 de noduri terminale.
Cum ar fi implementat acest concept de pseudo-ruter? In propagarea
initiala a LSP-ului, fiecare ruter avea un ID de 6 bytes, introdus in LSP-ul
global transmis de ruter. Pentru a permite existenta pseudoruterelor
schimbam protocolul si permitem ca LSP-ul sa aiba 7 bytes de ID (6 bytes
ID + 1 byte pseudoruter). ID-ul pseudoruterului poate fi asignat de catre
ruterul actual care contine toate pseudoruterele. Permitand 256 de
pseudorutere pe un singur ruter, atunci acest ruter va putea suporta in jur
de 18,000 de noduri terminale.
Propagarea LSP-urilor trateaza pseudoruterele separat, dar pentru
calculul rutei este crucial ca pseudoruterele separate sa fie tratate ca un
singur ruter. In exemplul nostru toate nodurile terminale sunt de fapt
conectate direct la acelasi ruter R1. Acest lucru este usor de realizat,
deoarece toate LSP-urile cu primii 6 bytes identici pot fi recunoscute ca
provenind de la acelasi ruter.
Pe scurt, ideea de baza este aceea de a deplasa calculul in spatiu (P3c),
asigurand ca procesul de fragmentare a LSP-ului original in LSP-uri
independente, sa fie facut de catre sursa S si nu de fiecare legatura de date.
Acest exemplu permite intelegerea gandirii sistemice. Bineinteles,
implementatorii au preferat solutiei originale, aceasta solutie, inventata de
Radia Perlman.
Exercitii:

Cum poate un ruter asigna noduri terminale unui pseudoruter? Ce


se intampla daca un ruter are la inceput o multime de noduri terminale (si
deci o multime de pseudorutere) iar la un moment dat, majoritatea
nodurilor terminale dispar? Aceasta poate genera situatia in care raman o
multime de pseudorutere, fiecare avand doar cateva noduri terminale. De
ce nu e bine asa si cum putem remedia situatia ?
77


La fel ca in exemplele de reducere a severitatii conditiilor, aceasta
solutie poate genera conditii incorecte neasteptate (temporare deobicei si
fara sa fie foarte grave). Tinand cont de solutia gasita la exercitiul
precedent, descrieti un scenariu in care un anume ruter, de exemplu R2,
poate gasi (la un moment dat) eroarea in care, in baza sa de date pentru
LSP-uri, acelasi nod terminal (de ex E1) apartine la doua pseudorutere,
R1a si R1b. De ce nu este acest caz mai rau decat rutarea obisnuita a LSPurilor ?
4.9 Supravegherea structurii traficului
Anumite protocoale de retea pretind ca sursele sa nu transmita niciodata
datele mai rapid decat cu o rata impusa. In loc de a specifica rata medie pe
o perioada lunga de timp, protocolul poate deasemenea specifica volumul
maxim de trafic, B, in biti pe care sursa-i poate transmite in orice perioada
de T secunde. Acest lucru limiteaza sursa la rata medie de B / T biti pe
secunda. De altfel, acest lucru limiteaza si gradul de rafala a traficului
utilizatorului la maxim o rafala de dimensiune B la fiecare T unitati de
timp. Alegand, de exemplu, o valoare mica a parametrului T, se limiteaza
considerabil rafalele de trafic. Rafalele fac probleme retelei, deoarece
perioadele cu trafic mare si pierderi de pachete sunt urmate de perioade de
inactivitate.
Daca fiecare sursa isi indeplineste contractul (nu transmite peste volumul
de trafic specificat pe o perioada data), reteaua poate oferi garantii de
performanta si sa asigure ca nimic din trafic sa nu fie pierdut, precum si
livrarea la timp a traficului. De cele mai multe ori regulile sunt respectate,
fie pentru ca sunt considerate corecte de catre unii, fie de teama
penalizarilor, de catre altii. Dar acest lucru nu se intampla intotdeauna,
astfel ca urmarirea traficului e foarte importanta. Fara ea, unii utilizatori ar
putea profita, incorect, de banda retelelor.
Presupunem ca fluxurile de trafic sunt identificate prin adresa sursei si a
destinatiei, precum si prin tipul de trafic. Fiecare ruter trebuie sa sa se
asigure ca nici un flux sa nu transmita mai mult de B biti in nici o perioada
de T secunde.Pentru ruter, cea mai simpla solutie este sa foloseasca un
singur timer care ticaie la fiecare T secunde, si sa numere bitii trimisi in
fiecare perioada, folosind cate un contor per flux. Daca la sfarsitul fiecarei
perioade contorul depaseste B, ruterul detecteaza o violare de contract.
Dar folosind un singur timer pot fi supravegheate doar anumite perioade.
Presupunem de exemplu, fara a pierde din generalitate, ca timer-ul
porneste la momentul 0 de timp.Atunci singurele perioade verificate vor fi
[0, T ] , [T , 2T ] , [ 2T ,3T ] ,.... , ceea ce nu asigura ca fluxul sursei nu violeaza

contractul de trafic in perioade ca [T / 2,3T / 2] , suprapuse peste perioadele


supravegheate. De exemplu, in stanga figurii 4.16, fluxul transmite o
rafala de lungime B, chiar inainte ca ceasul/timerul sa ticaie la momentul
t, si trimite a doua rafala de lungime B chiar dupa ticaitul de la momentul
T.
O solutie ar fi utilizarea timer-elor si contoarelor multiple. De exemplu,
avem un ruter care poate utiliza un timer ce incepe la momentul 0, iar
urmatorul timer, la momentul T/2. Din pacate, sursa poate viola in
continuare contractul, trimitand legal, B biti in fiecare perioada
78

supravegheata, dar ilegal, mai mult de B biti intr-o perioada ce se


suprapune celor supravegheate. In partea dreapta a figurii 4.16 avem o
sursa ce nu se incadreaza in contract. Aceasta trimite o rafala de B bits la
sfarsitul primei perioada, si o a doua rafala la inceputul celei de-a treia
perioade, in total trimitand 2B biti intr-o perioada cu putin mai mare decat
T/2. Din pacate nici unul dintre timer-e nu vor vedea acest lucru drept un
viol. Acest lucru duce la urmatoarea problema.

Figura 4.16 Folosirea naiva a unuia sau a mai multor timer-e (pentru a verifica daca
sursa nu transmite un volum de trafic mai mare decat B biti la fiecare T secunde)

Aleator

Aleator

Figura 4.17 Daca se iau pauze aleatoare intre intervalele de supraveghere ruterele vor
detecta violarile de contract cu o probabilitate mare

Problema. Folosirea timerelor multiple este scumpa si nu garanteaza ca


traficul de date va respecta contractul. Este usor de vazut faptul ca,
utilizand chiar si un singur timer, sursa nu poate trimite mai mult de 2B
biti in orice perioada de T secunde. Un mod de rezolvare ar fi sa
consideram ca un viol de gradul 2 nu merita efortul de a supraveghea
traficul. Dar in cazul in care avem o legatura transcontinentala in care
banda este extrem de importanta, violul de gradul 2 este o reala problema.
Cum ar putea fi prins un viol de trafic cu un singur timer?
Indiciu: Considerand exploatarea unui grad de libertate (P13), presupus
fixat in solutia naiva. Intervalele de supraveghere ar trebui sa inceapa la
intervale fixate de timp? Considerati folosirea lui P3a.
Solutie: Intervalele de supraveghere nu trebuie sa fie fixe, deci pot
exista spatii goale distribuite arbitrar intre acestea. Cum ar putea fi
localizate spatiile goale? Deoarece o sursa ce nu respecta contractul poate
sa isi aleaga in orice moment inceputul perioadei de viol a contractului, o
idee simpla (P3a) conduce la urmatoarea solutie (figura 4.17)
Ruterul utilizeaza un singur timer de T unitati si un singur contor, la fel
ca in cazul precedent. Un interval de supraveghere se termina cu un tact de
timer; daca contorul este mai mare decat B, a fost detectat un viol. Apoi,
este setat un indicator sa arate ca timerul este folosit acum doar pentru a
introduce un spatiu aleator. Dupa care timerul este resetat pentru un
interval aleator de timp, cuprins intre 0 si T. Cand timerul indica
79

momentul, indicatorul este pus pe valoare nula, contorul va fi initializat,


iar timerul resetat pentru o perioada T.
Exercitiu: Presupunem contorul initializat si mentinut in aceasta stare
atat in timpul perioadelor de pauza, cat si in timpul intervalelor de
supraveghere. Poate ruterul sa faca o deductie corecta in timpul unei
asemenea perioade, chiar si in cazul in care perioada pauzei este mai mica
de T unitati?
4.10 Identificarea celor care monopolizeaza resursele
Sa presupunem ca un dispozitiv doreste sa urmareasca resursele, cum ar
fi memoria de pachete alocata diferitelor surse din ruter. Dispozitivul
respectiv ar dori sa localizeze simplu sursa ce consuma cea mai mare
parte de memorie, astfel incat, ulterior, sa poata recupera memoria furata
de acest monopolizator de resurse. Figura 4.18 arata cinci surse diferite,
avand fiecare propriul consum de banda: 1, 9, 30, 24 si 7 unitati.
Monopolizatorul de resurse este sursa S3.
O solutie simpla de a identifica un monopolizator de resurse ar fi aceea
de a utiliza o gramada dezorganizata/heap.Dar, la viteze ridicate si daca
numarul surselor depaseste numarul 1000, solutia ar fi prea scumpa.
Indicarea gradului de folosire al memoriei se face folosind numere intregi
de la 1 la 8000, caz in care sortarea cu galeti/bucket sorting nu mai
functioneaza bine, deoarece trebuie cautate 8000 de intrari pentru a gasi
monopolizatorul de resurse.

Figura 4.18 Gasirea sursei care monopolizeaza resursele

Daca dispozitivul nu doreste sa gaseasca neaparat sursa cu debit maxim,


ci se multumeste si cu cea de pe locul doi (corectitudinea maxima nu este
importanta in P3b), in exemplul de mai sus, raspunsul va fi S4 (24) in loc
de S3 (30). Aceasta duce la urmatoarea problema.
Problema. Un modul software sau hardware trebuie sa urmareasca
resursele necesare diferitilor utilizatori. De asemenea, modulul are nevoie
ca, printr-o metoda ieftina, sa gaseasca utilizatorul ce consuma cele mai
multe resurse. Deoarece gramezile dezordonate simple sunt de viteza
mica, inginerii de protocoale de retea sunt dispusi sa mai scada cerintele
de sistem (P3b) si sa se multumeasca si cu al doilea consumator d.p.d.v.
ierarhic. Cum se poate ca aceasta diminuare a exactitatii cautarii sa fie
transpusa intr-un algoritm mai eficient?
Indiciu: Sa consideram utilizarea a trei principii: cea a compromisului
volum de calcul - in defavoarea preciziei (P3b), sortarea prin metoda
galetilor si utilizarea tabelelor de corespondenta (P4b, P2a).
Solutie: Deoarece rezultatul cautarii poate fi gasit cu o inexactitate de
ordinul 2, este normal sa includem utilizatorii a caror resurse consumate se
afla pe locul 2, in acelasi grup de utilizatori de resurse. Acest lucru ar
80

putea fi un castig daca numarul rezultant de grupuri este mult mai mic
decat numarul initial de utilizatori; deci, gasirea celui mai mare grup va fi
mai rapida decat gasirea celui mai mare utilizator de resurse. Aceasta idee
este foarte asemanatoare cu cea de la asamblarea din rutarea ierarhica, in
care numarul destinatiilor sunt grupate sub un prefix comun; acest lucru
poate face ca procesul de rutare sa fie unul mai putin precis dar poate sa
reduca numarul intrarilor de rutat. Rezulta urmatoarea idee.

Figura 4.19 Agregarea utilizatorilor, cu factor 2 de consum, duce la un numar mic de


agregari, ai caror membri pot fi reprezentati folosind un bitmap

Gruparea binomiala poate fi folosita (figura 4.19) toti utilizatorii fiind


plasati in grupe/galeti conform cu consumul de resurse folosit; galeata i
contine toti utilizatorii a caror consum de resurse este intre 2i si 2i+1 1 . In
figura 4.19, utilizatorii S3 si S4 se afla in intervalul [16, 31], deci se gasesc
in aceeasi galeata.
Fiecare galeata contine o lista nesortata a inregistrarilor resurselor
tuturor utilizatorilor ce intra in limitele intervalului sau. De aceea, in figura
4.19, S3 si S4 sunt in aceeasi lista. Structura de date contine si o
harta/bitmap, cu un bit corespunzator pentru fiecare galeata, care este setat
sa arate daca galeata asociata lui este plina. In consecinta, bitii
corespunzatori galetilor [1, 1], [4, 7], [8, 15], si [16, 31] sunt setati pe
valoarea 1, in timp ce bitul corespunzator lui [2, 3] este setat pe 0. Deci,
pentru a gasi monopolizatorul de resurse, algoritmul trebuie doar sa caute
bitul cu pozitia i aflat in pozitia extrema dreapta a hartii. Apoi, algoritmul
va returna utilizatorul aflat in capul listei galetii corespunzatoare pozitiei i.
In consecinta, (fig.4.19), algoritmul va returna valoarea acceptabila S4, in
loc de valoarea corecta S3.
Exercitii:
Cum este mentinuta structura datelor? Ce se intampla daca un
utilizator isi reduce nivelul necesar de resurse de la 30 la 16? Ce fel de
liste sunt necesare pentru o mentenanta eficienta ?
Cat de mare e fiecare harta? Cum sa gasm eficient cel mai din dreapta
bit?
4.11 Debarasandu-ne de lista de conexiuni TCP deschise
Un protocol de transport ca TCP, aflat in calculatorul X, va tine seama de
absolut toate conversatiile simultane pe care statia de lucru respectiva le
are cu alte PC-uri. O conexiune reprezinta starea partajata intre doua
puncte terminale ale unei conversatii. Daca un utilizator doreste sa trimita
un mail de pe statia X pe statia Y, atunci programul de mail de pe statia X
trebuie sa stabileasca o conexiune (stare partajata) cu programul de mail

81

din statia Y. Un server ocupat, ca cel de Web, poate avea o multime de


conexiuni concurente.
Starea conexiunii consta din lucruri ca numarul de pachete trimise de
statia X, neconfirmate de statia Y. Orice pachet de date neconfirmat de
statia Y intr-un anumit interval de timp, trebuie retransmis de X. Pentru a
face retransmisia, protocoalele de transport obisnuiesc sa aiba timere
periodice ce declanseaza retransmisia oricarui pachet a carui confirmare
intarzie sa apara dupa o anumita perioada de timp.

Figura 4.20 Implementarea x-kernel-ului foloseste o tabela hash de asociere a


conexiunilor pentru stare (pentru expedierea pachetelor)si o lista inlantuita de conexiuni
(pentru timere)

Codul TCP Berkeley (BSD), disponibil gratis, tine o lista a conexiunilor


deschise (fig. 4.20) pentru a examina, la fiecare declansare a timerului,
daca e nevoie sa faca o retransmisie. Oricum, daca soseste un pachet la
statia X, TCP-ul lui X trebuie sa stabileasca rapid carei conexiuni apartine
pachetul, pentru a reactualiza starea conexiunii. Fiecare conexiune este
identificata de un identificator de conexiune, transportat de fiecare pachet.
Pentru determinarea conexiunii careia apartine un anumit pachet, ar fi
necesara cautarea lui in intreaga lista (cazul cel mai defavorabil), ceea ce
ar fi prea lent pentru serverele cu multe conexiuni. In consecinta,
implementarea x-kernel a adaugat un tabel de dispersie implementarii
BSD (P15) pentru a asocia eficient identificatorii de conexiune din
pachetele de date cu starea conexiunii corespunzatoare. Tabela de
dispersie este un vector de indicatori, indexati cu valoarea dispersiei care
indica spre listele de conexiuni, ce disperseaza catre aceeasi valoare. In
plus, lista originala de conexiuni inlantuite a fost retinuta pentru procesari
de timer, in timp ce tabela de dispersie ar fi trebuit sa mareasca viteza
procesarii de pachete.
Ciudat, dar masuratorile efectuate in cazul noii implementari au aratat o
incetinire a vitezei. Dupa masuratori riguroase, s-a constatat faptul ca
problema ar fi stocarea redundanta, a informatiilor despre conexiuni, lucru
ce a dus la reducerea eficientei memoriei cache din procesoarele moderne.
Acesta este un exemplu despre cum o imbunatatire evidenta a unei
anumite componente poate afecta alte parti din sistem. Trebuie mentionat
ca memoria principala poate fi ieftina, dar memoria rapida precum
memoria de date cache este deseori limitata. Structurile folosite uzual, ca
listele de conexiuni, ar trebui sa ramana in memoria cache de date, daca
sunt destul de mici ca sa incapa in ea.
Solutia evidenta este evitarea redundantei. Tabelul de dispersie e necesar
pentru o gasire rapida. De asemenea, rutina de timer trebuie sa caute
82

periodic si eficient prin toate conexiunile existente. Acest lucru duce la


urmatoarea problema.
Problema. Se poate scapa de pierderea cauzata de lista de conexiuni
explicita, dar sa se retina si tabela de dispersie? E rezonabila adaugarea
unei mici informatii suplimentare tabelei de dispersie. Cand facem acest
lucru, se poate observa ca lista originala de conexiuni a fost creata cu
dublu inlantuita, pentru a permite la terminare o stergera facila a
conexiunilor. Dar acest lucru duce la depozitare si dilueaza memoria de
date cache. Cum ar putea fi utilizata o lista simplu inlantuita, fara
incetinitirea procesului de stergere?
Indiciu: Prima parte este usor de reparat, inlantuind intrarile valabile din
tabela de dispersie intr-o lista. Cea de-a doua parte este mai dificil de
realizat (evitarea listei cu dubla inlantuire, care ar necesita doi indicatori
per intrare a tabelei de dispersie). O lista de legatura consta din noduri,
fiecare din ele contine o identitate a conexiunii (96 de biti pentru IP), plus
doi indicatori (sa zicem 32 biti fiecare) pentru o stergere facila. Din
moment ce tabela de disperse este necesara pentru o demultiplexare
rapida, lista de legaturi poate fi indepartata daca intrarile valide din tabela
de dispersie sunt conectate ca in figura 4.21, iar un indicator este pastrat in
capul listei. La un ticait de timer, rutina de retransmitere va scana periodic
lista. Scanarea intregii tabele de dispersie are o eficienta redusa, deoarece
pot exista o multime de locatii goale in interiorul sau.
Solutia implicita ar fi aceea de a adauga doi indicatori la fiecare intrare
valida a tabelei de dispersie in scopul de a implementa o lista cu dubla
legatura. Din moment ce acesti indicatori pot fi indecsi ai tabelei de
dispersie in loc de indicatori arbitrari catre memorie, indecsii nu trebuie sa
aiba dimensiunea mai mare decat dimensiunea tabelei de dispersie. Chiar
si cea mai mare tabela de dispersie ce contine conexiuni, nu ar avea nevoie
de mai mult de 16 bits (in general , mult mai putin). Solutia implicita da
rezultate bune, adaugand cel mult 32 de bits, in loc de 160 per intrare, deci
o economie de 128 de bits. In orice caz, este posibil de a face mai mult, in
sensul de a adauga numai 16 bits per intrare. Considerati utilizarea
evaluarii de viteza redusa (P2b) si specificatiile mai putin severe (P3).

Figura 4.21 Inlantuirea intrarilor tabelei valide de dispersie cu pointeri de inaintare si


stergere relaxata. Cu linie intrerupta s-a u notat inregistrarile marcate ca sterse dar care
vor fi procesate doar in urmatoarea iteratie

83

Solutie: O lista dublu inlantuita este utila doar pentru stergeri eficiente.
Cand o anumita conexiune este terminata, ar fi indicat ca rutina de stergere
sa gaseasca intrarea valida anterioara celei sterse, pentru a putea lega lista
precedenta de urmatoarea. Acest lucru ar necesita ca fiecare intrare din
tabela de dispersie sa memoreze un indicator catre intrarea valida
anterioara din lista.
In schimb, considerati principiul P3, relaxarea conditiilor impuse
sistemului. In mod normal, se presupune ca atunci cand o conexiune este
terminata, locul ei din memorie este recuperat imediat. Pentru a recupera
un loc de depozitare, intrarea din tabela de dispersie ar trebui pusa intr-o
lista goala, din care sa poata fi folosita de catre o alta conexiune. In orice
caz, daca tabela de dispersie este mai mare decat este strict necesar, nu
este esential ca locul de depozitare utilizat de conexiunea ce tocmai a fost
terminata sa fie reutilizat imediat.
Fiind date cerinte mai putin severe, implementarea poate sa stearga cu
incetineala starea conexiunii. Cand o conexiune este terminata, intrarea
respectiva trebuie marcata ca fiind libera. Acest lucru necesita un extrabit
de stare, la fel ca in P12, fiind ieftin. Stergerea intrarii nefolosite din tabela
de dispersie E, implica legatura dintre intrarea aflata inaintea lui E cu cea
aflata dupa E. de asemenea, necesita returnarea lui E unei liste goale.
Aceasta stergere poate fi facuta la urmatoarea trecere prin lista, atunci
cand este intalnita o intrare nefolosita.
Exercitii
Scrieti un pseudocod pentru adaugarea unei noi conexiuni, terminarea
unei conexiuni si terminarea sa (bazata pe timer).
Cum putem face sa avem liste cu legaturi simple pentru listele de
conexiuni in fiecare lista a tabelelor dispersie?
Cineva, interesat in trucuri inteligente si care nu gandeste niciodata
pana la capat o problema anume, sugereaza o cale pentru a evita folosirea
indicatorilor inapoi, in orice lista cu dubla legatura. Presupunem ca nodul
X trebuie sters. In mod normal, rutinei de stergere i se indica manevra de
regasire a lui X, deobicei un indicator spre X. In schimb, manevra ar
putea fi un indicator catre nodul respectiv inaintea lui X in lista inlantuita
(cu exceptia cazului cand X se afla in fruntea listei si manevra este un
pointer nul). Acest mod va permite implementarii sa localizeze eficient
atat nodul anterior lui X, cat si cel de dupa X, utilizand doar
indicatoriinspre inainte ? Prezentati un contra exemplu care invalideaza
acest mod de lucru.
4.12 Retinerea confirmarilor
Protocoalele de transport, ca TCP, asigura ca datele sa fie livrate la
destinatie cu confirmarea (ack) primirii fiecarui fragment de date
receptionat. Aceasta actiune este similara cu mailul de confirmare.
Pachetele si confirmarile sunt numerotate. Confirmarile sunt, de obicei
cumulative, un ack pentru pachetul N confirma implicit toate pachetele
primite anterior, numere mai mici sau egale cu N.
Confirmarile cumulative permit receptorului flexibilitatea de a nu
transmite un ack de fiecare data cand primeste un pachet. In schimb,
confirmarile pot fi comasate (P2c). In figura 4.22 programul de transmisie

84

a fisierelor trimite blocuri de fisiere, unul in fiecare pachet. Blocurile 1 si 2


sunt confirmate individual, dar blocurile 3 si 4 printr-un singur ack pentru
blocul 4.
Reducerea confirmarilor este un lucru bun atat pentru emitator, cat si
pentru receptor. Desi confirmarile au dimensiuni reduse, ele contin antete
ce trebuie procesate de fiecare ruter, de sursa si de destinatie. Mai mult,
fiecare pachet primit, oricat de mic ar fi, poate cauza o intrerupere,scumpa,
la destinatie. Ideal ar fi ca receptorul sa comaseze cat de multe confirmari
poate. Dar care ar fi criteriul dupa care receptorul comaseaza confirmarile?
Rezulta urmatoarea problema.
Problema. Retinerea confirmarilor este dificil de realizat la un receptor
care nu are un software bine pus la punct. In figura 4.22, de exemplu, daca
blocul 3 este receptionat primul si procesat rapid, cat ar trebui sa mai
astepte receptorul dupa blocul 4, inainte de a confirma blocul 3 ? Exista
sansa ca blocul 4 sa nu mai ajunga, deci retinerea confirmarii pentru blocul
3 ar cauza o functionare incorecta. Solutia clasica ar fi aceea de a crea un
contor de timp pentru confirmarile retinute; la expirarea sa, va fi trimisa o
confirmare cumulativa. Astfel se limiteaza timpul maxim cat o confirmare
oarecare va putea fi retinuta. Dar acest contor de timp creaza anumite
probleme. Unele aplicatii sunt sensibile la intarzieri. Adaugarea acestui
contor de timp poate creste intarzierea in cazurile in care emitatorul nu mai
are date de transmis. Daca protocolul de transport ar putea fi modificat, ce
informatie trebuie adaugata pentru a evita intarzierile nedorite, permitand
totusi, comasarea efectiva a confirmarilor?
Indiciu : Intr-o aplicatie ca FTP, care modul software stie ca mai
exista date de trimis ? Pentru retinerea confirmarilor, care modul ar fi ideal
sa stie ca ar mai fi date de trimis? Considerati utilizarea lui P9 si P10.

Figura 4.22 Ack-urile cumulative permit receptorului sa confirme cateva pachete cu


un singur ack.(ex : blocurile 3 si 4), dar pretind monitorizarea ack-urilor la receptor

Solutie : Intr-o aplicatie ca transferul de date, aplicatia de la emisie stie


ca mai exista date ce trebuiesc transmise (de exemplu: va urma blocul 4
dupa blocul 3). Aplicatia de la emisie va fi dispusa si sa tolereze latenta
datorata comasarii confirmarilor. In orice caz, trebuie ca aceasta informatie
sa fie cunoscuta de nivelul transport la receptorului. Aceasta observatie
duce la urmatoarea propunere.
Aplicatia de la emisie va transmite un bit catre nivelul transport al
emitatorului (interfetei de transport a aplicatiei) care este pus pe 1 atunci
cand aplicatia mai are de transmis date. Presupunem ca protocolul de
transport poate fi modificat astfel incat sa aiba un bit de retinere. Nivelul

85

transport de la emisie poate utiliza informatia data de aplicatie pentru a seta


un bit w de retinere, in fiecare pachet pe care il transmite; bitul w va fi
anulat cand emitatorul doreste o confirmare imediata.
De exemplu, in figura 4.23 nivelul transport de la emisie este informat de
catre aplicatia transfer de fisiere, ca fisierul de trimis are patru blocuri.
Astfel, nivelul transportde la emisie va valida bitul de retinere pentru
primele trei pachete, respectiv il va invalida pentru al patrulea pachet.
Receptorul va trimite in consecinta, o singura confirmare, in loc de patru.
Dar o aplicatie care este sensibila la intarzieri, poate sa nu trimita nici o
informatie privitoare la datele de transmis. Bitul de retinere este un indiciu,
pe care receptorul poate sa-l ignore si sa trimita oricum o confirmare. Desi
solutia pare ingenioasa, nu e o idee buna pentru protocolul TCP actual.
Exercitii:
O tehnica de reducere a numarului de confirmari este returnarea
confirmarilor in pachetele de date dinspre receptor spre emitator. In acest
scop, majoritatea protocoalelor de transport, ca TCP, au campuri
suplimentare in pachetele de date pentru confirmarile in sens opus.
Returnarea confirmarilor in pachete de date e compromisul clasic
latenta/eficienta. Cat timp ar trebui sa astepte nivelul transport datele din
sens opus? Dar, exista aplicatii uzuale in care aplicatia de la emisie
cunoaste aceasta informatie. Cum poate fi extinsa solutia precedenta pentru
a permite si returnarea confirmarilor prin pachete de date, si comasarea lor?

Figura 4.23 Telegrafierea intentiei transmitatorului, folosind bitul w de retinere

Exercitii:
O tehnica de reducere a numarului de confirmari este returnarea
confirmarilor in pachetele de date dinspre receptor spre emitator. In acest
scop, majoritatea protocoalelor de transport, ca TCP, au campuri
suplimentare in pachetele de date pentru confirmarile in sens opus.
Returnarea confirmarilor in pachete de date e compromisul clasic
latenta/eficienta. Cat timp ar trebui sa astepte nivelul transport datele din
sens opus? Dar, exista aplicatii uzuale in care aplicatia de la emisie
cunoaste aceasta informatie. Cum poate fi extinsa solutia precedenta pentru
a permite si returnarea confirmarilor prin pachete de date, si comasarea lor?
Evaluarea imbunatatirilor pretinse se poate face cu intrebari de test. De
exemplu, schimbarea poate afecta restul sistemului ? De ce ar putea ca

86

retinerea confirmarilor sa afecteze alte parti ale protocolului de transport,


cum ar fi controlul fluxului si al congestiilor ?
4.13 Citirea incrementala a bazelor mari de date
Presupunem ca un utilizator citeste continuu o baza de date mare de pe
un site web. Continutul paginii web se poate schimba, dar cititorul doreste
doar actualizarile incrementale fata de ultima citire. In figura 4.24 avem o
baza de date ce contine cateva produse alimentare foarte raspandite, citite
constant de catre cititorii din lumea larga, ce doresc sa fie la curent cu
moda culinara. Din fericire, moda culinara variaza lent.
2pm

3pm

6pm

Figura 4.24 Schimbari lente a bazei de date cu alimente la orele 2pm, 3pm, 6pm. Cel
care urmareste baza de date vrea sa vada doar schimbarile (aici, de la 2pm la 3pm s-a
schimbat pretul la bauturi nealcoolice, si de la 3pm la 6pm, la cereale)

Un cititor vrea la ora 18 sa vada doar diferenta fata de ora 14 : Coke fata
de Pepsi, Wheaties fata de Cheerios. Alt cititor vede pagina la ora 15:00 si
apoi la ora 18:00 vrea sa vada ce s-a schimbat la Wheaties fata de
Cheerios. Acest lucru genereaza urmatoarea problema.
Problema. Cum sa realizeze eficient baza de date asemenea interogari
incrementale (incremental queries) ? Ar fi dificil ca baza de date sa-si
aminteasca ce a citit fiecare utilizator ultima data, avand milioane de
utilizatori.
Indiciu: Daca baza de date nu memoreaza nici o informatie referitoare la
ultima citire a unui utilizator, solicitarea de citire a utilizatorului trebuie sa
contina ceva informatie (P10) despre ultima sa citire. Transmiterea
detaliilor despre ultima citire inseamna un efort urias si e total ineficienta.
Care ar fi partea de informatie care sa caracterizeze succint ultima cerere a
utilizatorului? Putem adauga o stare redundanta suplimentara (P12) la
baza de date ce permite usor indexarea, folosind informatia de la utilizator
pentru a facilita interogarea incrementala.
Solutie: Cererile de vizualizare ale utilizatorului trebuie sa contina o
anumita cantitate de informatie (P10) despre ultima solicitare de
vizualizare facuta de acesta. Cea mai succinta si relevanta informatie este
timpul la care a fost facuta ultima cerere. Daca cererea utilizatorului
contine timpul ultimei citiri, atunci baza de date trebuie organizata astfel
incat sa-si actualizeze eficient continutul la intervale date de timp.
Memorarea unor copii ale bazei de date din momentele anterioare este o
metoda
ineficienta, si poate fi evitata daca se memoreaza doar
modificarilor incrementale (P12a). Acest lucru duce la urmatorul algoritm.
Se poate adauga bazei de date o lista a actualizarilor, care are in capul
listei ultimele actualizari. Cererile de citire contin momentul T al ultimei
87

citiri, deci cererea poate fi procesata prin scanarea inceputului listei, pentru
a gasi toate actualizarile ulterioare lui T.
De exemplu, in figura 4.25 in capul listei de actualizari se afla ultimele
modificari (comparati cu figura 4.24) la ora 18:00 de la Wheaties la
Cherios, si modificarea precedenta, de la ora 15:00 de la Coke la Pepsi.
Consideram o cerere de citire efectuata la ora 17:00. Cand scanam lista din
varf, procesarea cererilor va gasi actualizarea de la ora 18:00 si se va opri
cand va ajunge la actualizarea de la ora 15:00, deoarece 15:00 < 17:00,
deci cererea va returna doar prima actualizare.
Ultima reactualizare
6 pm

Coke Pepsi
3 pm

Wheaties Cheerios
6 pm

Pepsi
Mere
Placinte
Cheerios

Actualizarea listei

Figura 4.25: Rezolvarea problemei reactualizrii incrementale folosind o list de


reactualizare

Exercitii:
Daca o intrare se modifica de mai multe ori, atunci modificarea acelei
intrari poate fi memorata redundant in lista, dar cu costuri suplimentare de
timp si spatiu. Ce principiu poate fi folosit pentru a evita redundanta?
Presupunem c baza de date este doar o colecie de nregistrri i se dorete
ca fiecare nregistrare s apar cel mult o dat n aceast list incremental.
Dac numrul nregistrrilor este mare sau metoda de mai sus nu este
aplicat, atunci dimensiunea listei incrementale va crete foarte mult.
Sugerai o metoda de reducere periodic a dimensiunii listei incrementale.
Dac numrul nregistrrilor este mare sau metoda de mai sus nu este
aplicat, atunci dimensiunea listei incrementale va crete foarte mult.
Sugerai o metoda de reducere periodic a dimensiunii listei incrementale.
4.14 Cautarea binara a identificatorilor lungi
Generaia viitoare de Internet (IPv6) i propune s foloseasc adrese pe
128bii pentru a putea gzdui mai multe terminale. Dac se dorete
identificarea unei adrese pe 128 bii, i algoritmul ruleaz pe un procesor
cu 32 bii pe cuvant, atunci fiecare comparaie a dou adrese lungi va dura
128/32=4 operaii n cazul general presupunem c fiecare identificator este
compus din W cuvinte (n exemplu W=4), atunci cutarea binar naiva va
avea nevoie de W log N comparaii, ceea ce e scump. Dac toi
identificatorii au identice primele W 1 cuvinte, atunci sunt suficiente doar
log N comparaii. Problema e de modificare a algoritmului de cutare
binar a.. s se ajung la un numr de log N + W comparaii. Strategia este
de a lucra pe coloane, ncepnd cu cel mai semnificativ cuvnt i efectund
cutarea binar n acea coloan, pn cnd se gaseste o egalitate n acea
coloan. n acest punct, algoritmul trece la urmtorul cuvnt din dreapta i
continu cutarea binar de unde a rmas.

cuvinte de dimensiune
A

W
C

88

D
cuvinte de dimensiune

C
W

A
C
E
A
D
C
A
Testul 3
M
Testul 4
W
B
M
W
Testul 1
B
Testul 2
N
X
B
N
Y
B
N
Z
A
Testul 3
M
Testul 4
W
B
M
W
Testul 1
B
Testul 2
N
X
B
N
Y
B
N
Z
C
N
D
Figura 4.26 Cautarea binara a identificatorilor lungi poate duce la un factor de multiplicare
W (numarul de cuvinte din identificator). Metoda naiva, de reducere la un factor aditiv
prin mutare la dreapta in egalitate, esueaza.

Generaia viitoare de Internet (IPv6) i propune s foloseasc adrese pe


128bii pentru a putea gzdui mai multe terminale. Dac se dorete
identificarea unei adrese pe 128 bii, i algoritmul ruleaz pe un procesor
cu 32 bii pe cuvant, atunci fiecare comparaie a dou adrese lungi va dura
128/32=4 operaii n cazul general presupunem c fiecare identificator este
compus din W cuvinte (n exemplu W=4), atunci cutarea binar naiva va
avea nevoie de W log N comparaii, ceea ce e scump. Dac toi
identificatorii au identice primele W 1 cuvinte, atunci sunt suficiente doar
log N comparaii. Problema e de modificare a algoritmului de cutare
binar a.. s se ajung la un numr de log N + W comparaii. Strategia este
de a lucra pe coloane, ncepnd cu cel mai semnificativ cuvnt i efectund
cutarea binar n acea coloan, pn cnd se gaseste o egalitate n acea
coloan. n acest punct, algoritmul trece la urmtorul cuvnt din dreapta i
continu cutarea binar de unde a rmas.
n figura 4.26 se consider W=3, i se dorete cutarea identificatorului
BMW. Se consider c fiecare liter este un cuvnt. Comparaia ncepe cu
elementul central de pe coloana din stnga (Testul 1). Deoarece cuvntul
din coloan este identic cu cel cutat se trece la coloana urmtoare din
dreapta. Testul 2 identific N>M i se continu testul n jumtatea jumtii
de sus a coloanei (Testul 3) unde se identific M. Apoi se trece la coloana
urmtoare unde se gsete W (Testul 4), dar din nefericire pe aceast linie
s-a identificat AMW i nu BMW, nseamn c exist o problem.
C

Problema: Gsirea unei condiii care adugat algoritmului de mai sus


asigura log N + W comparaii.
Indicatie: Problema apare din cauza ca, atunci cand cautarea binara se
muta la pozitia a patra din coloana 2, se presupune ca acea pozitie incepe
cu B, ipoteza in general falsa. Ce stare trebuie adaugata pentru a evita
aceasta ipoteza falsa, si cum se modifica cautarea in aceasta ipoteza ?
Soluia: Artificiul consta in adaugarea unei stari fiecarui element al
fiecarei coloane, care impune cautarii binare sa ramina intr-un interval de

89

garda (fig.4.27) Trebuie limitat domeniul de cutare. Pentru fiecare cuvnt


B din coloana cea mai semnificativ se adaug un pointer care indic
limitele liniilor celorlalte cuvinte care conin B pe prima poziie. De data
aceasta, n figura 4.27 se ine cont i de domeniul de gard, care include
rndurile 4 7. Acest domeniu este memorat la prima comparaie a lui B.
Atunci cnd cutarea trece la coloana 2 i se gsete N > M, algoritmul
va ncerca s njumteasc domeniul de cutare i deci va ncerca s
compare rndul 3. Dar cum 3 < 4 (limita inferioar a domeniului de gard)
nu se va efectua comparaia, i algoritmul va ncerca s njumteasc din
nou domeniul de cutare binar. Acum se ncearc rndul 4, care e n
domeniul de gard, se identific M i se trece spre coloana din dreapta,
indentificndu-se corect BMW.

Testul 1

A
A
A
*B
B
B
*B
C

W cuvinte

Tentativ 3
Testul 4
Testul 2

C
D
M
*M
N
N
N
N

Testul 5

E
C
W
W
X
Y
Z
D

Figura 4.27: Adugarea unui domeniu de gard fiecarui element din coloana, pentru
cutarea binar corecta la schimbarea coloanelor

n general fiecare intrare a unui cuvant multiplu W1 ,W2 ,..., Wn va memora


un domeniu de gard precalculat. Domeniul pentru Wi indic domeniul
care conine W1 , W2 ,...,Wi n primele i cuvinte. n acest fel se asigur
cutarea pe coloana i+1 doar n domeniul de gard. Folosind aceast
strategie se asigur log 2 N + W comparaii daca avem N identificatori.
Costul suplimentar este adugarea a doi pointeri de 16 bii pentru fiecare
cuvnt Wi . Cum majoritatea cuvintelor sunt pe cel puin 32 bii nseamn
ca vor trebui adugai doi pointeri pe 32 bii pentru ficeare cuvnt, ceea ce
nseamn dublarea memoriei folosite. O a doua idee pe lng limitarea
domeniului de cutare este folosirea preprocesrii (P2a) care permite
obinerea unor cutri mai rapide (ideea lui Butler Lampson).
Exerciiu: Actualizarea structurii de cutare binar necesit reconstruirea
ntregii structuri. Totul poate fi reprezentat ca un arbore binar de cutare,
fiecare nod avnd un pointer <, > dar i =, care corespunde trecerii la
urmtoarea coloan din dreapta. Subarborele format din pointerii =
reprezint domeniul de gard. Folosii aceast observaie i tehnicile de
actualizare standard pentru arbori binari echilibrai i obinei timpi de
reactualizare logaritmici.
4.15 Videoconferin prin ATM (Asynchronous Transfer Mode)
n ATM reeaua stabilete un circuit virtual, printr-o serie de switch-uri,
nainte ca datele s fie transmise. Standardul ATM permite realizarea unor
circuite virtuale (CV) de la o surs la mai multe receptoare. Datele
90

transmise de surs sunt multiplicate i transmise fiecarui receptor prin


circuitul virtual unu-la-mai muli.
Chiar si fara standardizare, e relativ uor sa avea circuite vituale de la
mai muli la mai muli, n care fiecare terminal poate fi att surs ct i
receptor. Principala problem a CV mai muli la mai muli este atunci cnd
mai multe staii vorbesc n acelai timp. n acest caz datele de la cele dou
surse vor fi ntreesute n mod arbitrar la receptor i se va nate confuzie.
n figura 4.28 se prezint un sistem de videoconferin care conecteaz N
staii prin intermediul unui comutator. Soluia din figur folosete N
circuite virtuale unu-la mai muli, conectnd astfel partea audio si video a
fiecrui utilizator cu ceilali utilizatori. Stiind care e banda minim video
Bmin i banda switch-ului ATM (B) se poate determina numrul maxim de
staii participante la videoconferin: B/Bmin. Nu cumva exist o soluie mai
buna ?

Switch
ATM

N CV 1-la-mai muli

Figura 4.28: Sistem de videoconferin via ATM

Soluia este folosirea circuitelor virtuale de la mai muli la mai muli,


care s nlocuiasc cele N circuite unu-la-muli. n acest mod se poate scala
banda switch-ului la mai muli utilizatori.
Dac considerm o singur conexiune muli la muli pe care o numim C,
atunci o soluie ar fi folosirea unui protocol de tipul round-robin care
asigur ca la un moment dat doar o singur staie s-i conecteze ieire
video la conexiunea C. Un astfel de protocol necesit coordonare i deci va
introduce ntrzieri. Proiectanii sistemului au observat, c ar fi suficient ca
doar interlocutorul curent s fie afiat. Din acest cauz a fost introdus un
detector de voce (P5) la fiecare staie. Dac se detecteaz activitate la o
staie X, atunci detectorul va conecta intrarea video la conexiunea C. n caz
contrar intrarea video nu este conectat la C. Deoarece aceast component
hard era destul de ieftin, creterea numrului de utilizatori conectai a
implicat un pre rezonabil al terminalelor.
n continuare s-a observat c dac se pstreaz i imaginea ultimului
interlocutor se pstreaz o continuitate vizual mai bun, i deci s-a propus
91

folosirea a dou conexiuni virtuale muli la muli, una C pentru


interlocutorul curent i una L pentru ultimul interlocutor ca n figura 4.29

Interlocutorul

Interlocutorul anterior
Switch
ATM

2 CV muli-la- muli

Figura 4.29: Folosirea a dou CV muli la muli

Exerciii:
Scriei pseudocodul prii hardware a fiecrei staii care actualizeaz
conexiunile la C i L. Se presupune c detectorul de voce este o funcie.
Ce se ntmpl daca mai muli utilizatori vorbesc deodat? Ce
component hard se poate aduga staiei a.. aplicaia s afieze ceva
rezonabil? De exemplu, nu ar fi rezonabil ca imaginile celor doi
interlocutori s fie combinate?

92

Tratarea nodurilor terminale


Algoritmii de nod terminal sunt o aplicaie a algoritmilor de reea, pentru
a construi implementri de protocoale rapide n nodurile terminale, mai
ales n servere. Acetia pot fi privii ca tehnici de construire a serverelor
rapide, aplicate cu precdere n software. O mare parte dintre ele evit
structurile sistemelor de operare, pentru a permite transferuri de date de
mare vitez. Vom vedea cum s reducem antetele implicate de: copiere,
controlul transferului, demultiplexarea, timerele, i alte sarcini de baza din
procesarea protocoalelor.

CAPITOLUL5
COPIEREA DATELOR
Intr-un birou, fiecare scrisoare primit este mai nti trimis la transport
si recepie, unde scrisoarea este deschis i se decide crui departament i
este adresat i se face o fotocopie pentru ndosariere.Este apoi nmnat
departamentului de securitate care verific fiecare linie a scrisorii cutnd
semne de spionaj industrial. Departamentul de securitate face si el o
fotocopie a scrisorii, pentru o eventual utilizare ulterioar. Situaia pare
ridicol, dar majoritatea serverelor Web i calculatoarele n general, fac un
numr de copii suplimentare ale mesajelor recepionate i transmise.Spre
deosebire de fotocopii, care consum doar o mic cantitate de hrtie,
energie i timp, copierea suplimentar n calculator consum dou resurse
preioase: limea de band de memorie i memoria n sine. n cele din
urm, dac sunt k copii implicate n procesarea unui mesaj ntr-un server
Web, ieirea serverului Web poate fi de k ori mai nceat.
Deci se trateaza aici eliminarea pierderilor (P1) generate de copiile
inutile. O copie este inutil dac nu este impus de hardware. De exemplu,
hardware-ul cere copierea, biilor recepionai de un adaptor, n memoria
calculatorului. Totui, acesta nu este un motiv esenial (n afara de cele
impuse de structurarea sistemelor de operare convenionale) pentru
copierea ntre bufferul aplicaie i bufferul sistemului de operare.
Eliminarea copiilor redundante permite software-ului s se apropie de
capacitatea hardware-ului, unul din elurile algoritmilor de reea.
Sunt expuse pe scurt alte operaii (ca sumele de control i criptarea) ce se
refer la toate datele din pachet i alte tehnici pentru a unifica conditiile
impuse de software-ul protocolului si cele impuse de hardware, ca limea
de band a magistralelor i memoriei cache.Sunt revzute sistemele de
operare mai reprezentative i arhitecturile relevante, precum i tehnicile de
93

reducere a costului manipulrii datelor, pstrnd modularitatea i fr


schimbri majore n proiectarea sistemului de operare.
n & 5.1. se
arat de ce/cum apar copii n plus ale datelor, &5.2 descrie o serie de
tehnici de a evita copiile prin restructurri locale ale sistemului de operare
i ale codului reelei la un nod final (endnode). In &5.3 se vede cum s se
evite copierea i suprasarcinile din cazul transferurilor mari, utiliznd
DMA la distan, care implic modificri de protocol. In $5.4 se extinde
problema pentru sistemul de fiiere dintr-un server Web i se arat cum s
se evite copiile inutile dintre memoria cache pentru fiiere i aplicaie. In
&5.5. sunt discutate operaii care includ toate datele (ca suma de control i
criptarea) i se introduce tehnica procesrii integrate pe niveluri (integrated
layer processing).n &5.6 se extinde discutia dincolo de copiere, i se arat
c fr analiza atent a efectelor memoriei cache, efectele instruciunilor
cache pot eclipsa efectele copierii pentru mesaje mici.
Numr
P13

Principiul
Localizarea memoriei(in adaptor) ca grad de
libertate
Copiere nceat utiliznd copierea-la-scriere
Asocierea unei memorii cache virtuale per
cale
Uniformizarea pe procese a bufferelor rapide
fbuf

Utilizat n
Afterburner

P10

Paseaz n pachet numele buffer-ului i a


deplasrii

Sisteme
RDMA

P4

Asociere de memorie virtuala pentru a evita


copiile din cache i n aplicaii
Asocierea unei memorii cache virtuale per
cale

Flash

Noi apeluri la sistem mbinate cu I/O


Evitarea accesului repetat la memorie
n timpul manevrrii
Dispunerea codului pentru a minimiza
ratrile de I cache
Ordonarea pe niveluri a procesrii
(grad de libertate)

Sendfile()
ILP

P2b
P11a
P7

P11a
P6
P1
P13
P13

Mach
Solaris fbufs

Flash-lite

x-kernel
LDRP

Figura 5.1. Tehnici de evitare a copierii i eficiena cache discutate n acest capitol,
mpreun cu principiile corespunzatoare

5.1. Necesitatea copierii datelor.


In figura 5.2. se arat secvena transferurilor de date implicate n citirea
fiierelor de date de pe disc (n cazul cel mai defavorabil) la trimiterea
segmentelor corespunztoare prin adaptorul de reea. Principalele
componente hardware din figura 5.2. sunt procesorul, magistrala de
memorie, magistrala de I/O, discul i adaptorul de reea. Principalele
componente software sunt aplicaia de server Web i kernel-ul. Sunt
implicate dou subsisteme principale ale kernel-ului, sistemul de fiiere i
sistemul de reea. Pentru simplitate e dat doar un CPU (multe servere sunt
multiprocesor) n server i se pune accent doar pe cereri cu coninut

94

static(multe cereri sunt pentru continut dinamic fiind servite de un proces


CGI, computer-generated imagery).
Intuitiv, problema este simpl. Fiierul este citit de pe disc n buffer-ul
aplicaiei printr-un apel la sistem, read()de exemplu. Combinaia dintre
rspunsul HTTP i buffer-ul aplicaiei este trimis apoi reelei prin
conexiunea TCP ctre client printr-un apel de sistem, de exemplu write().
Codul TCP din subsistemul pentru reea al kernel-ului mparte datele
rspunsului n segmente de cte un bit i le trimite adaptorului de reea
dup ce adaug fiecrui segment o sum de control TCP.
CPU
Aplicatia server-ului Web
write()
read()

Copia 3
Buffer-ul server-ului

Copia 2

Kernel
TCP/IP

Sist. de fisiere

Buffer-ul socket
Buffer-ul fis. cache

Magistrala
de memorie
Copia 1
Copia 4

Disc
Magistrala I/O

Adaptor de retea
Retea
Figura 5.2. Copii redundante implicate n manipularea unei cereri GET la un server

Detaliile reale sunt mai dificile. n primul rnd fiierul este citit ntr-o
regiune a memoriei kernelului numit file cache (copia 1). Ideea este bun
deoarece cererile succesive la un fiier des utilizat pot fi servite din
memoria principal fr operaiile lente de I/O la disc. Fiierul este apoi
copiat de serverul Web din file cache n buffer-ul aplicaiei (copia 2).
Deoarece bufferul aplicaiei i file cache sunt n zone diferite a memoriei
principale, copierea se poate face doar de CPU, care citete datele din
prima locaie de memorie i le scrie n cea de-a doua, prin magistrala de
memorie.
Serverul Web face apoi un apel write() la socketul corespunztor.
Deoarece aplicaia i poate reutiliza bufferul n orice moment (sau chiar
s-l dezaloce) dup apelul write(), subsistemul de reea din kernel nu poate
s retransmit pur i simplu din buffer-ul aplicaiei. Software-ul TCP
poate avea nevoie s retransmit unele pri din fiier dup un anumit timp,
timp n care aplicaia poate reutilizarea buffer-ul n alte scopuri.
Astfel, UNIX i multe alte sisteme de operare, ofer semantica copierii.
Buffer-ul aplicaiei specificat n apelul write() este copiat ntr-un buffer
socket (un alt buffer din kernel la o adres de memorie diferit att de file
95

cache ct i de buffer-ul aplicaiei) (copia 3). n final, fiecare segment este


transmis reelei (dup ce au fost adugate antetele de nivel legtura de date
i IP-ul) copiind datele din buffer-ul socket-ului n memoria adaptorului de
reea (copia 4).
nainte de transmisia la reea software-ul TCP din kernel trebuie s
parcurg datele pentru a calcula suma de control TCP, pe 16 bii, pentru
fiecare segment.
Fiecare din cele 4 copii i suma de control consum resurse: limea de
band a magistralei de memorie. Copierile ntre locaiile de memorie
(copiile 2 i 3) sunt mai dezavantajoase dect celelalte, deoarece necesit
un read i un write pentru fiecare cuvnt transferat prin magistral. Suma
de control TCP necesit doar un read pentru fiecare cuvnt i un singur
write pentru a ataa suma final. Copiile 1 i 4 pot fi la fel de costisitoare
ca i copiile 2 i 3 dac procesorul face o copiere folosind o I/O
programat; totui dac dispozitivele fac singure copierea (DMA), costul
este un singur read sau write per fiecare cuvnt ce trece prin magistral.
Copiile consum i limea de band a magistralei de I/O i limea de
band de memoriei. O memorie care furnizeaz un cuvnt de W bii la
fiecare x nanosecunde are o limit fundamental la ieire de W/x bii/ns.
Chiar i dac folosim DMA aceste copii folosesc magistrala de memorie de
7 ori pentru fiecare cuvnt al fiierului trimis de server. Astfel ieirea
server-ului Web nu poate depi T/7, unde T este cea mai mic dintre
vitezele memoriei i a magistralei de memorie.
Mai important, copiile suplimentare consum memorie. Acelai fiier
(figura 5.2.) ar putea fi stocat n memoria cache pentru fiiere, buffer-ul
aplicaiei i buffer-ul socket. Dei memoria este ieftin i mult, ea are
unele limitri i server-ele Web vor s foloseasc ct mai mult memorie
cache pentru fiiere ca s evite operaiile lente de I/O cu discul. Astfel,
exitena a trei copii pentru un fiier poate reduce de trei ori memoria cache
de fiiere, care la rndul su poate reduce rata de bit a cache-ului i deci
performana global a server-ului.
n concluzie, copiile redundante afecteaz performana n dou moduri
fundamentale disjuncte. n primul rnd, prin utilizarea unei limi de band
a magistralei i a memoriei mai mare dect strictul necesar, server-ul Web
ruleaz mai ncet dect viteza magistralei chiar i cnd trimite documente
care sunt n memorie. n al doilea rnd, utiliznd mai mult memorie dect
ar trebui, server-ul Web va trebui s citeasc mai multe fiiere de pe disc n
loc s le citeasc din file cache. A fost descris doar scenariul n care este
servit un coninut static. n realitate, testele cu SPECweb afirm c 30%
din cereri sunt pentru coninut dinamic. Acesta este de multe ori servit de
un proces CGI separat (altul dect aplicaia server) care comunic acest
coninut server-ului prin intermediul unor mecanisme de comunicare interproces cum ar fi UNIX pipe care implic de multe ori nc o copie.
Ideal, aceste traversri n plus ale magistralei ar trebui eliminate. Copia 1
nu este necesar dac datele sunt n cache. Copia 2 pare inutil: de ce nu
pot fi trimise datele direct la reea din locaia de memorie file cache? Copia
3 pare inutil. Copia 4 nu poate fi evitat.

96

5.2. Reducerea copierii prin restructurri locale


Copia 3 este copia principal fcut de aplicaie n buffer-ul kernelului
(sau vice versa) cnd un mesaj este trimis/primit pe reea. Aceasta este o
problem fundamental a reelelor, independent de problemele sistemului
de fiiere. Soluiile generale de eliminare a copiilor I/O redundante se
bazeaz pe tehnicile prezentate n seciunea &5.4. Se presupune c
protocolul este fix dar implementarea local poate fi restructurat (cel puin
kernel-ul). E de dorit un numar minim de restructurri pentru a echilibra
sarcinile software-ului de aplicaie i ale kernelului. In & 5.2.1. sunt
descrise tehnici bazate pe o exploatare mai buna a memoriei adaptorului.
&5.2.2. descrie ideea principal pentru evitarea copiilor (prin reasocierea
paginilor fizice comune) i pericololele sale. & 5.2.3. prezint optimizarea
reasocierii paginilor utiliznd pre-procesarea i cache-uri pentru fluxurile
I/O, tehnici ce implic ns modificarea API (interfaa programabila de
aplicaie). & 5.2.4. descrie o tehnic ce utilizeaz memorie virtual dar nu
modific API.
5.2.1. Exploatarea memoriei adaptorului
Ideea este folosirea unui grad de libertate (P13) stiind c, ntr-o
arhitectur cu memorie asociat, memoria poate fi localizat oriunde pe
magistral. Asocierea memoriei/memory mapping presupune c procesorul
vorbete cu toate dispozitivele, ca adaptorul i discul, prin citirea/scrierea
unei locaii fizice, din spaiul de memorie alocat dispozitivului.
Dei memoria kernelului se afl deobicei rezident pe subsistemul de
memorie, nu exist nici un motiv ca o parte din ea s nu fie plasat n
adaptor, care conine i el memorie. Prin mpartirea echitabil a memoriei
adaptorului i folosind acest grad de libertate putem plasa memoria kernel
n adaptor. Asa c, dup ce datele au fost copiate din aplicaie n memoria
kernel, ele se afl deja n adaptor i nu trebuie copiate din nou pentru
transmisia n reea (fig. 5.3).
Comparnd figura 5.3.cu 5.2, observm c n figura 5.3 nu apare nici un
transfer de la disc la memorie. Copia 3 inutil (fig. 5.2) e acum combinat
cu copia 4 care este esenial i formeaz o singur copie (figura 5.3).
Ideea principal la suma de control (&5.5), este aplicarea principiului de
partajare a efortului P2c. Cnd datele sunt mutate, din buffer-ul aplicaiei
n memoria kernel rezident n adaptor, de ctre procesor (printr-o I/O
programat sau PIO, care este o operaie de I/O sub controlul
procesorului), oricum procesorul citete fiecare cuvnt al pachetului.
Deoarece astfel de citiri ale magistralei sunt laborioase, procesorul ar putea
mbina calculul sumei de control cu procesul de copiere, innd un registru
care s acumuleze sumele cuvintelor pe msur ce acestea sunt transferate.
Ideea, numit metoda Witless (sau gndirea-simpl), dar expus prima
dat de Van Jacobson, nu a fost implementat niciodat. Mai trziu Banks
i Prudence au aplicat-o la laboratoarele Hewlett-Packard crend adaptorul
Afterburner. n abordarea afterburner procesorul nu transfer datele din
memorie n adaptor. Acest transfer este realizat de adaptor utiliznd
accesul direct la memorie sau DMA. Dar pentru c procesorul nu mai
particip la procesul de copiere, adaptorul ar trebui s fac suma de
control. n acest scop, adaptorul afterburner are un hardware specializat
simplu, care face suma de control n timpul transferului DMA.

97

Ideea, dei bun, are trei defecte. n primul rnd adaptorul de reea ar
trebui s aib mult memorie pentru a manevra mai multe conexiuni TCP,
iar suplimentarea memoriei pate crete preul adaptorului prea mult. n al
doilea rnd, n metoda Witless, unde CPU calculeaz suma, copierea
pachetului recepionat n buffer-ul aplicaiei n timpul calculrii sumei,
poate duce la scrierea unor date eronate n buffer-ul aplicaiei. Dei aceasta
poate fi descoperit la sfrit cnd suma de control nu corespunde, ea
cauzeaz dificulti n prevenirea citirii de date incorecte de ctre aplicaii.
A treia problem cu confirmrile ntrziate este studiat n execiii.
CPU

Memorie

Aplicatie
write()
Kernel

Buffer-ul server-ului

TCP/IP

Magistrala
de memorie
O singura copie

Magistrala I/O

Buffer socket

Adaptor de retea

Retea
Figura 5.3. Metoda Witless (afterburner) elimin nevoia copierii din kernel n adaptor
plasnd buffer-ele kernelului n adaptor

5.2.2. Folosirea copierii- la- scriere


La metoda Witless ideea de baz este eliminarea copiei kernel-adaptor,
dar n urmtoarele trei paragrafe ideea este eliminarea acestei copii prin
reasocierea memoriei virtuale. Unul din motivele copierii separate era
posibilitatea ca aplicaia s vrea s modifice buffer-ul nclcnd astfel
semantica TCP. Al doilea motiv e c aplicaia i kernel-ul utilizeaz spaii
diferite de adrese virtuale.
Unele sisteme de operare (Mach) ofer o facilitate numit copiere-lascriere, COW(copy-on-write) care permite unui proces s duplice o pagin
virtual n memorie la un cost sczut. Copia trebuie s indice pagina fizic
P original din care a fost copiat. Aceasta implic doar actualizarea unori
descriptori (cuvinte de memorie) i nu copierea ntregului pachet (1500
bytes de date). Remarcabil la COW este c, dac proprietarul datelor
originale modific datele, sistemul de operare detecteaz aceast condiie
automat i genereaz dou copii fizice separate P i P. Proprietarul
original pointeaz acum ctre P i poate face modificri asupra lui P;
98

proprietarul paginii copiate pointeaz ctre vechea copie P. Treaba merge


bine dac majoritatea paginilor rmn nemodificate (sau se modific doar
cteva pagini) de ctre proprietarul original.
Astfel, n sistemul cu copiere-la-scriere, aplicaia ar putea face o copie
COW pentru kernel. n cazurile rare n care aplicaia i modific buffer-ul,
kernel-ul face o copie fizic (scump), dar asta nu se prea ntmpl.
Evident, se utilizeaz o evaluare nceat (P2b) pentru minimizarea
ncrcrii pentru cazurile cele mai probabile (P11). n figura 5.4. suma de
control poate fi returnat fie ntr-o copie spre/dinspre memoria adaptorului,
fie folosind circuite specializate pentru calculul CRC, aflate n adaptor.
Din pcate, multe sisteme de operare, precum UNIX(*) i Windows nu
ofer copiere-la-scriere. Totui, rezultate asemntoare se pot obtine
sesizand ideea care sta la baza COW si anume utilizarea memoriei
virtuale.
(*) Ssistemul V-UNIX folosete COW cnd apare un fork; paginile partajate de
procesele printe i fiu sunt partajate folosind poziionarea unui bit.

Implementarea serviciului copiere-la-scriere


Majoritatea calculatoarelor moderne utilizeaz memoria virtual.
Programatorul lucreaz cu abstractizarea unei memorii infinite, adic un
ir liniar n care el (de fapt compilatorul) asigneaz locaii variabile; de
exemplu, locaia X va fi locaia 1010 n acest ir imaginar sau virtual.
Aceste adrese virtuale sunt apoi asociate cu memoria fizic (rezident pe
disc sau n memoria principal) utiliznd un tabel de pagini. Pentru orice
adres virtual biii de ordin superior (20 n exemplu) dau numrul paginii
i biii de ordin inferior (12 n exemplu) dau poziia n pagin. Memoria
principal este divizat i ea n pagini fizice astfel nct fiecare grup de 212
cuvinte de memorie formeaz o pagin fizic. Asocierea adres virtualadres fizic se face asociind pagina virtual-pagina fizic, printr-o cutare
n tabelul de pagini indexat cu numrul paginii virtuale corespunztoare.
Dac pagina dorit nu este rezident n memorie, hardware-ul genereaz o
excepie, care face ca sistemul de operare s citeasc pagina de pe disc n
n memoria principal.
Suprancrcarea aprut prin citirea tabelelor de pagini din memorie
poate fi deobicei evitat folosind TLB(translation look-aside buffer) (*),
care este un cache rezident n procesor.
(*)TLB este o tabel folosit n sistemele cu o memorie virtual, care conine lista cu
numerele paginilor fizice asociate numrului fiecrei pagini virtuale. TLB este folosit
mpreun cu o memorie cache avnd indicii bazai pe adresele virtuale. Adresa virtual
este simultan prezent la TLB i la cache, astfel c accessul la cache i translatarea adres
virtuale-adres fizic se face n paralel. Dac adresa cerut nu se afl n cache atunci data
se ncarc ntr-o adres fizic din memoria principal. Tabela cu translaii ar putea fi
plasat i ntre cache i memoria principal, ca s poat fi activate simultan cnd adresa nu
se afl n cache.

Schema de copiere-la-scriere se bazeaz pe memoria virtual.


Presupunem c pagina virtual X pointeaz la o pagin P rezident n
memoria fizic, i c sistemul de operare dorete s duplice coninutul lui X
ntr-o nou pagin virtual, Y. Calea mai grea pentru a face aceasta ar fi
alocarea unei noi pagini fizice P, copierea coninutului lui P n P i apoi
asociind pe Y cu P n tabelul de pagini. Calea mai simpl concretizat n
copiere-la-scriere este asocierea noii pagini virtuale Y tot cu vechea pagin
fizic P, modificnd intrarea din tabelul de pagini. Deoarece majoritatea
99

sistemelor de operare moderne utilizeaz pagini lungi, modificarea unei


intrri n tabelul de pagini este mai eficient dect copierea dintr-o pagin
fizic n alta.
n plus, kernel-ul seteaz i un bit de protecie COW ca parte a intrrii, n
tabelul de pagini, pentru pagina virtual original X. Dac aplicaia
ncearc s scrie n pagina X hardware-ul va accesa tabelul de pagini pentru
X, va observa bitul de protecie setat i va genera o excepie, care apeleaz
sistemul de operare. n acest moment sistemul de operare va copia pagina
fizic P ntr-o alt locaie P, i va face ca X s pointeze spre P, dup ce a
modificat bitul COW. Y continu s indice ctre vechea pagin fizic. Desi
fiecare bit e la fel de costisitor ca i copierea unei pagini fizice, ideea e ca
acest cost apare doar n cazurile cnd aplicaia scrie ntr-o pagin COW.

Memorie

CPU

Server +buffer socket

Aplicatie
write()
Kernel

TCP/IP

Copiere la o
pagina libera
doar daca
aplicatia scrie

Magistrala de memorie

O singura copie (cu suma


de control calculata prin
hard/soft)
Magistrala I/O

Buffer socket

Adaptor
de retea

Retea
Figura 5.4. Utilizarea copierii-la-scriere

Modul de funcionare al COW ofer o ans i acelor sisteme de operare,


ca UNIX sau Windows, care dei nu au COW au memorie virtual.
Memoria virtual prezint o indirectivitate care, pentru a evita copierea
fizic, poate fi exploatat prin modificarea intrrilor tabelului de pagini.
Trebuie gsit o alt soluie, dect la COW, de protejare la tentativele de
scriere ale aplicaiei.

100

Pachet
date
Procesul 1
Tabel pagini

VP 10

Scrie

Procesul 2
Tabel pagini

VP 8

Figura 5.5. Operaiile de baz implicate n copierea unei pagini utiliznd


memoria virtual

5.2.3. Fbufs: optimizarea reasocierii paginilor


Chiar dac ignorm aspectul proteciei mpotriva scrierilor aplicaiei,
figura 5.5. implic faptul c un buffer mare poate fi transferat din aplicaie
n kernel (sau vice versa) cu o scriere n tabelul de pagini. Aceast viziune
simplist a remaprii paginilor este cam naiv i greit.
Figura 5.5. arat un exemplu concret al remaprii paginilor. Presupunem
c sistemul de operare dorete s fac o copie rapid a datelor procesului 1
(aplicaia) din pagina virtual (VP10) ntr-o pagin virtual (VP 8) din
tabelul de pagini a procesului 2 (kernel-ul).Aparent, ar fi necesar doar
modificarea intrrii corespunztoare lui VP 8 (din tabelul de pagini a
procesului 2), s indice spre pachetul de date la care deja indic pagina
virtual 10 (din tabelul de pagini a procesului 1). Apar cteva ncrcri
suplimentare, nespecificate nc:
Tabele de pagini multinivel: majoritatea sistemelor moderne folosesc
asocieri pe mai multe niveluri ale tabelelor de pagini, deoarece este nevoie
de prea mult memorie pentru asocierea tabelelor de pagini cu 20 bii de
pagin virtual. Astfel, maparea real poate cere modificri ale maprilor
n cel puin primul i al doilea nivel al tabelului de pagini pentru
portabilitate. Exist deasemenea att tabele independente de calculator ct
si dependente de calculator. Astfel, sunt implicate cteva scrieri, nu doar
una.
Obinerea blocrilor i modificarea intrrilor tabelului de pagini:
tabelele de pagini sunt resurse comune i deci trebuie protejate folosind
blocri care trebuiesc obinute i eliberate.
Folosirea TLB-urilor: pentru a economisi timpul de translaie,
asocierile pentru tabelele de pagini utilizate mai des sunt memorate n
TLB. Cnd este scris o nou locaie de pagin virtual pentru VP 8, orice
intrare TLB pentru VP 8 trebuie gsit i eliminat sau corectat.
Alocarea VM n domeniul destinaie: dei s-a presupus c paginii
destinaie i s-a alocat locaia 8 din memoria virtual, trebuie fcute, nainte
s aib loc copierea, calcule de gsire a unei intrri libere n tabelul de
pagini din procesul destinaie.
Blocarea paginilor corespondente: anumite pagini fizice de pe disc pot
fi nlocuite, ca sa faca loc altor pagini virtuale. Pentru a preveni nlocuirea,
paginile trebuie s fie blocate, ceea ce reprezint un cost suplimentar.
Toate aceste suprasarcini cresc foarte mult n sistemele multiprocesor.
Rezultatul net este c, dei asocierea tabelelor de pagini pare foarte bun
101

(asocierea pare c dureaza un timp constant, independent de dimensiunea


pachetelor de date), factorii constani (Q4) genereaz o suprasarcin mare.
Aceast suprancarcare, sesizat deja la nceputul anilor 90 (Druschel i
Peterson) a crescut permanent de atunci. Ei au propus o facilitate a
sistemului de operare numit fbufs (fast buffers), ce elimin majoritatea
celor 4 surse de suprancrcare n cazul asocierii paginilor.
Fbufs
Ideea principal n fbufs este c: dac o aplicaie trimite prin kernel mai
multe pachete de date reelei, atunci probabil ca un buffer va fi reutilizat
de mai multe ori, i astfel sistemul de operare poate precalcula n avans
(P2a) toat informaia de asociere a paginii pentru buffer, evitnd astfel
mare parte din suprasarcina asocierii paginii din timpul transferului de
date. Sau, asocierile pot fi calculate mai ncet (P2b) cnd este pornit
transferul de date pentru prima oar (genernd o suprasarcin pentru
primele cteva pachete) dar care poate fi memorat (P11a) pentru
pachetele urmtoare, eliminnd suprancrcarea pentru cazurile obinuite.
Cea mai simpl cale de implementare a acestui mod de lucru este prin
folosirea memoriei partajate. Se asociaz simultan un numr de pagini
P1,...,Pn n tabelele de memorie virtual ale kernel-ului i simultan se
transmit aplicaiile A1,...,Ak. Dei ideea e tentanta, s-ar putea ca aplicaia
A1 s trebuiasc s citeasc pachetele trimise de aplicaia A2. S-ar nclca
astfel securitatea i separarea greelilor.
Mai sigur ar fi rezervarea (sau stabilirea lent) paginilor partajate
mapate pentru fiecare transfer aplicaie-kernel, i vice versa. De exemplu,
ar putea fi un set de buffer-e (pagini) pentru FTP, unul pentru HTTP, i
aa mai departe. Mai general, unele sisteme de operare definesc multiple
subsisteme de securitate, pe lng kernel i aplicaie. Proiectanii fbufsurilor numesc cale o secven de domenii de securitate. In exemplul
anterior, e suficient s gndim o cale kernel-aplicaie si alta aplicaiekernel (FTP-kernel, kernel-HTTP). Cile sunt unidirecionale, deci
aplicaia are nevoie simultan de dou ci, cte una n fiecare direcie.
Figura 5.6. arat un exemplu mai complex de ci, unde software-ul
Ethernet este implementat ca un driver la nivelul kernelului, stiva TCP/IP
este implementat ca un domeniu de securitate la nivelul utilizatorului, iar
aplicaia Web este implementat la nivelul aplicaie. Fiecare domeniu de
securitate are propriul set de tabele de pagini. Cile receptoare sunt
Ethernet, TCP/IP, Web i Ethernet, OSI, FTP.
Pentru a implementa ideea fbuf, sistemul de operare ar putea lua cteva
numere din paginile fizice P1,...Pk i s le premapeze n tabelul de pagini
al driver-ului Ethernet, codului TCP/IP i aplicaiei Web. Aceeai operaie
ar putea fi realizat cu un set de pagini fizice diferite pentru Ethernet, OSI
i FTP. Astfel, folosim P2a pentru a precalcula maprile. Rezervarea
paginilor fizice pentru fiecare cale poate fi o risip serioas, deoarece
traficul este n rafale; o idee mai bun este P2b, maparea lent doar cnd o
cale devine ocupat.
P2b evit suprancrcarea cauzat de: actualizarea multinivel a tabelelor
de pagini, obinerea blocrilor, eliminarea TLBurilor i alocarea memoriei
virtuale de destinaie dup sosirea si expedierea primelor cteva pachete.
Aceast treab se face odat, la nceputul transferului. Pentru a face fbuf
funcional, este crucial ca la sosirea unui pachet, driver-ul de nivel minim
102

(sau chiar adaptorul nsui) s fie capabil s realizeze rapid calea complet
pe care pachetul va fi mapat (demultiplexare anticipat). Intuitiv, (fig. 5.6)
aceasta este realizat examinnd toate antetele pachetelor pentru a
determina (pe moment) dac un pachet, cu un antet Ethernet, IP i HTTP
aparine cii 1.

Web

FTP

(Domeniu 2)
Calea 1

Calea 2
IP

OSI ?

(Domeniu 1)
(Domeniu 0)

Calea 1 Buffer cache

Ethernet

Calea 2 Buffer cache

Figura 5.6. Preasocierea paginilor buffer in tabele de pagini ale fiecarui domeniu
intr-o cale evita costul remaparii paginii in calea de timp real dupa setarea initiala

Driver-ul/adaptorul va avea atunci o list cu buffer-ele libere pentru acea


cale, care vor fi utilizate de adaptor pentru a scrie pachetele n ele; cnd
adaptorul termin, va transmite descriptorul buffer-ului urmtoarei
aplicaii de pe cale. Un descriptor de buffer este doar un pointer spre o
pagin partajat, i nu pagina n sine. Cnd ultima aplicaie din cale
termin cu pagina, o retrimite primei aplicaie din cale, unde devine din
nou un buffer liber, .a.m. d.
n acest punct, se pune problema de ce cile sunt unidirecionale. Cile
sunt fcute unidirecionale deoarece primul proces de pe fiecare cale este
presupus a fi scriitor i procesele rmase sunt presupuse a fi cititoare.
Acest lucru poate fi impus n timpul premaprii prin setarea unui bit de
permisiune-scriere pentru prima aplicaie n intrarea tabelului su de
pagini, i un bit doar-citire n intrrile tabelelor de pagini ale celorlalte
aplicaii. Apare asimetrie ntre sensuri i necesitatea cilor unidirecionale.
Dar se asigur astfel un anumit grad de protecie. In figura 5.7. sunt doar
dou domenii pe o cale. De observat c scriitorul scrie pachetele n nite
buffere (descrise de o coad de fbufs libere) i apoi pune descriptorul scris
ntr-o coad de fbufs scrise, care vor fi citite de urmtoarea aplicaie (n
figura 5.7. este artat doar unul).
Mai departe, este posibil ca pagina 8, premapat unei ci n prima
aplicaie, s fie asociat paginii 10 n a doua aplicaie. Lucrul e neplcut,
deoarece cnd a doua aplicaie citete un descriptor pentru pagina 8
trebuie s tie cumva c el corespunde cu propria sa pagin virtual 10.
Dar proiectanii au evitat a generalizrile inutile (P7) i au insistat ca
fbuf-ul s fie mapat n aceeai pagin virtual n toate aplicaiile de pe
cale. Aceasta se poate face prin rezervarea unui numr iniial de pagini n
memoria virtual a tuturor proceselor, pentru a fi pagini fbuf.
103

Mai exist cteva probleme dificile. Pentru a obine protecie s-a


permis un singur scriitor i mai muli cititori. Dar asta nseamn c
paginile sunt fixe; doar scriitorul le poate atinge. Dar, cum rmne cu
adugarea antetelor n stiv ? Soluia problemei este artat n figura 5.8.
n care un pachet, este de fapt o structur de date agregat, cu pointeri spre
fbuf-uri individuale astfel ca s poat fi adugate antetele, prin adugarea
unui buffer obinuit sau a unui fbuf la structura agregat.
Pachet
date
Cititor

Scriitor
Proces 1
Tabel de pagini
VP 10

Proces 2
Tabel de pagini

Scris
odata
initial

VP 10
(prealocat)

Fbufs scriitoare
Fbufs libere

Figura 5.7. Optimizarea cu un singur scriitor

Structura agregata

Figura 5.8.Folosirea obiectelor agregate pentru a permite suplimentarea


nivelurilor pentru adugarea de antete, cnd e permis doar un scriitor

Nu e aa de complicat cum pare, deoarece mbufs-urile utilizate de obicei


n UNIX sunt deasemenea compuse din buffer-e legate mpreun. Mai
precis acolo legarea se face ntr-o topologie liniar, n timp ce bufferele
agregate au o topologie arbore mai general, dar ctigul de performan,
datorat nlnuirii i indexrii, este asemntor.
Pn acum schema cu fbuf-uri a utilizat ideile de mapare VM de baz
din figura 5.4, dar le-a fcut mai eficiente ( prin amortizarea costurilor
maprii pe un numr mare de transferuri de pachete). Deobicei sunt
104

eliminate actualizrile tabelelor de pagini, lucru fcut n sistemele de


operare obinuite. De fapt, Thadani i Khalidi au extins ideea fbufs i au
implementat-o n sistemul de operare al lui Sun Solaris. Dar cum se
pstreaz semanticile copiilor standard? Ce se ntmpl dac aplicaia face
o scriere? Un sistem de operare standard ca UNIX nu poate depinde de
copierea-la-scriere (figura 5.4).
Rspunsul este c nu se pstreaz semanticile copiilor standard. API este
schimbat. Aplicaiile care scriu trebuie s fie atente s nu scrie ntr-un fbuf
cnd acesta a fost alocat kernel-ului pn cnd fbuf-ul este returnat de
kernel listei de buffere goale. Pentru a proteja mpotriva unui cod ce
contine erori sau este ru intenionat, kernel-ul poate activa bitul de scriere
cnd un fbuf este transferat de la aplicaie la kernel; bitul este setat din nou
cnd fbuf-ul este returnat. Dac aplicaia face o scriere fara s aib
permisiunea de scriere, este generat o excepie i aplicaia eueaz, lsnd
celelalte procese neafectate.
Deoarece activarea biilor de scriere necesit o activitate suplimentar pe
care fbufs ncearc s o evite, facilitatea fbuf permite i o alt form de
fbufs numit volatil. De observat c, dac procesul care scrie este o
entitate de ncredere (cum ar fi kernel-ul), nu are rost s fie impus
protecia la scriere. Dac kernel-ul are o eroare (bug), care l face s
realizeze scrieri neateptate, sistemulse va defecta oricum.
Schimbarea API-ului n acest fel sun dramatic. Ar trebuie rescrise toate
aplicaiile software ale UNIXului? Pentru a evita aceasta, exist soluii.
API-ul existent poate fi completat cu noi apeluri de sistem. Extensiile
Solaris adaug un apel uf_write() n plus fa de apelul standard write().
Aplicaiile performante pot fi rescrise utiliznd aceste noi apeluri.
Apoi, pot fi folosite extensiile n implementarea substraturilor I/O
comune (ca biblioteca UNIX stdio) care sunt pri ale mai multor aplicaii.
Aplicaiile legate de aceast bibliotec nu trebuie s fie schimbate, dar le
creste totui performana.
Problema nu este modificarea API-ului, ci ct de greu este s modificm
aplicaiile pentru a beneficia de schimbrile din API. Thadani i Khalidi,
respectiv Pai au prezentat cteva aplicaii la care modificrile, necesare ca
respectivele aplicaii s foloseasc un API cu fbuf, au fost mici si locale.
5.2.4. Emularea transparent a semanticilor copiilor
Pentru noul API cu fbuf aplicaia poate fi modificat pentru a-i crete
performana. Dei modificrile pot fi simple i locale, se modific drastic
conceptia programatorului despre buffer. n API-UNIX standard, aplicaia
asigneaz adresele de buffer-e; n fbufs buffer-ele sunt asignate de kernel,
din spaiul de adrese fbuf. n API-UNIX standard, programatorul poate
proiecta buffer-ul cum doreste, inclusiv folosirea buffer-elor succesive. n
fbufs datele recepionate de la reea pot fi dispersate n pri, legate ntre
ele prin buffer-ul agregat, i programatorul aplicaiei trebuie s lucreze cu
noul model de buffer ales de kernel. Beneficiile fbufs pot fi obinute fr
modificarea API-UNIX ? Teoretic software-ul aplicaiei va rula
neschimbat, i s-ar putea obine performane fr rescrierea aplicaiilor.
Un mecanism inteligent de copiere-la-scriere rapid este TCOW
(transient copy-on-write). Teoretic se pstreaza API-ul neschimbat si
aplicaiile vor avea performane mai bune, dar propunerea nu e verificat

105

experimental. In practic, probabil c aplicaiile vor trebui modificate, mai


mult intuitiv, pentru a profita de schimbrile fundamentale ale
implementrii kernel-ului.
API standard trebuie s permit oricnd unei aplicaii s scrie sau s
dezaloce un buffer pasat kernel-ului. Proiectarea fbuf modific API
interzicnd unei aplicaii s fac asta. Dar, pentru a pstra API cand se fac
doar mapri de memorie virtual, sistemul de operare trebuie s lucreze cu
cele dou ameninri posibile (scrierea/dezalocarea aplicaiei), timp n care
buffer-ul este utilizat de kernel pentru a trimite/retransmite un pachet. n
sistemul Genie maparea VM e utilizat la fel ca n fbufs, iar cele dou
ameninri sunt tratate dup cum urmeaz.
Contorizarea ameninrilor de scriere prin modificarea managerului de
erori VM: cnd o aplicaie face mai nti o scriere, buffer-ul este marcat n
mod special, ca Read-Only. Astfel, dac aplicaia face o scriere, este
invocat managerul de erori VM. n mod normal, acest lucru ar trebui s
genereze o excepie dar, dac sistemul de operare pstreaz semanticile
copiilor, nu ar trebui s fie o eroare. Genie modific handlerul de excepii
astfel. n primul rnd pentru fiecare pagin/buffer Genie urmrete dac
exist transmisii de rezolvat (transmisii spre reea) utiliznd un numartor,
incrementat cnd ncepe transmisia i decrementat cnd transmisia este
complet. n al doilea rnd, handlerul de erori e modificat ca sa fac o
copie separat a paginii pentru aplicaie (care conine noul Write) dac
exist un Send nerezolvat. Desigur, performana este afectat, dar se
pstreaz semanticile copiilor standard ale API, ca n UNIX. Aceast
tehnic numit protecie tranzitorie la COW e folosit doar la nevoie
cnd buffer-ul este citit si de subsistemul de reea.
Contorizarea ameninrilor de de-alocare prin modificarea Pageout
Daemon: ntr-un sistem standard de memorie virtual, exist un proces
responsabil pentru punerea paginilor dezalocate ntr-o list liber, din care
paginile pot fi scrise pe disc. Acest Pageout Daemon poate fi modificat sa
nu dezaloce o pagin, cnd e folosit pentru a trimite/recepiona pachete.
Aceste dou idei sunt exemple ale principiului P3c, deplasarea
calculelor n spaiu. Aciunea de verificare a scrierilor neateptate este
pasat handlerului de erori VM, i aciunea de dezalocare este pasat
rutinei de dezalocare a paginii. Cele dou idei sunt suficiente pentru a
trimite un pachet dar nu i pentru recepie. La recepie, Genie trebuie s se
bazeze, la fel ca fbufs, pe suportul hardware din adaptor, ca s despart
antetele pachetelor ntr-un buffer, i datele rmase ntr-alt buffer de
dimensiunea unei pagini, care poate fi schimbat cu buffer-ul aplicaiei.
Pentru ca aceast aciune s nu implice i o copiere fizic, buffer-ul de
date al kernel-ului trebuie s nceap la acelai offset din pagin ca i
buffer-ul de recepie al aplicaiei. Pentru un buffer mare, probabil c ar fi
mai eficient ca pentru prima i ultima pagin (care pot fi parial
completate) s fie fcut o copie fizic; totui, paginile intermediare care
sunt pline pot fi simplu schimbate de la kernel la aplicaie printr-o mapare
corect a tabelelor de pagini. Exist i optimizarea numit copiere revers.
Datorit complexitii remaprii tabelelor de pagini, nu e clar cum se
face eficient remaparea paginilor n Genie. O posibilitate este c Genie
foloseste aceeai idee fbuf a memorrii maprilor VM bazat pe ci,
pentru a evita suprancrcarea prin eliminarea TLB, cnd avem mai multe
106

tabele de pagini, etc. Experimentele Genie au fost fcute pe reele ATM,


unde cu identificatorul cii virtuale remaparea cii se face rapid.
Cum poate TCOW s beneficieze de implementarile anterioare? Nu
exist confirmri experimentale ale acestei idei, deoarece experimentele
au folosit un simplu banc de test de copiere i nu o aplicaie cum ar fi un
server Web. Pare dificil pentru o aplicaie existent s beneficieze de noua
implementare a kernelului cu API-urile existente.
Considerm o aplicaie ce ruleaz TCP, care-i d un buffer TCP-ului.
Deoarece nu exist o reacie spre aplicaie (ca la fbufs) aplicaia nu tie
cnd poate reutiliza buffer-ul n siguran. Dac aplicaia rescrie prea
devreme buffer-ul pe care TCP l inea pentru retransmisie, atunci nu este
compromis sigurana, ci doar performana, datorit copiei fizice implicat
n copierea-la-scriere. E puin probabil ca o aplicaie nemodificat s-i
poat sincroniza momentele modificrii buffer-elor cu momentele
transmisiilor TCP, i ar trebui s-i poat alinia buffer-ele sale destul de
bine pentru a permite un schimb de pagini corect.
Astfel, aplicaiile trebuie modificate pentru a beneficia de sistemul
Genie. Chiar i atunci, ar trebui s tie cnd s reutilizeze un buffer,
deoarece lipsete reacia. Aplicaia ar putea monitoriza erorile TCOW i s
i modifice, funcie de acestea, modelul de reutilizare. Dar dac aplicaiile
trebuie modificate subtil, pentru a beneficia de noul kernel, nu e clar ce
beneficiu au obinut din pstrarea API-ului.
5.3. Evitarea copierii utiliznd DMA la distant (RDMA)
Fbufs ofer o soluie rezonabil pentru evitarea copiilor redundante
aplicaie-kernel, dar exist o soluie mai direct de eliminare a
suprasarcinii cauzata de control. Dac un fiier de 1MB este transferat
ntre dou staii de lucru pe Ethernet, e divizat n pri de 1500-byte. CPU
trateaz fiecare parte de 1500-byte pentru a face procesarea TCP i
copierea fiecrui pachet (posibil printr-o interfa zero-copii cum ar fi
fbufs) n memoria aplicaiei.
Dar CPU poate face un DMA ntre disc i memorie pentru a transfera s
zicem 1MB. CPU seteaz DMA, spune discului zona de adrese n care
datele trebuiesc scrise i i vede de treburile sale. Dup transfer, discul
ntrerupe CPU pentru a-i spune c a terminat. Procesorul nu controleaz
n detaliu transferul, ca in cazul anterior al transferului n reea.
Aceast analogie sugereaz execuia unui DMA prin reea, RDMA
(Remote-DMA). Aceast soluie de reea a fost propus n VAX Clusters,
de proiectantii de calculatoare. Intenia este ca datele s fie transferate prin
reea ntre memoriile celor dou calculatoare, fr intervenia celor dou
procesoare la fiecare pachet. Cele dou adaptoare coopereaz la citirea
dintr-o memorie i scrierea n alta. La DMA prin reea trebuie rezolvate
dou probleme: (1) cum tie adaptorul receptor unde s plaseze datele el
nu poate cere ajutor calculatorului fr a compromite ideea; (2) cum este
meninut securitatea. Nu e discutata posibilitatea pachetelor solitare care
sosesc de pe reea i rescriu pri cheie de memorie.
5.3.1.Evitarea copierii n cluster
n ultimii ani, clusterele de staii de lucru au fost acceptate ca
nlocuitoare mai ieftine i mult mai utile decat calculatoarele mari. Multe

107

servere Web sunt compuse dintr-o reuniune de servere. Dei tehnologia


pare recent, DEC (Digital Equipment Corporation) a introdus acum 20 de
ani un produs comercial de succes numit VAX Clusters, pentru a asigura
baza unor operaii scalabile (aplicaii cu baze de date). Inima sistemului a
fost o reea de 140-Mbit numit CI (Computer Interconnect) avnd un
protocol asemntor cu Ethernet. Clienii puteau conecta la CI, un numr
de calculatoare VAX i discuri ataate reelei. Copierea eficient a fost
cauzat de necesitatea transferului unor mari cantiti de date ntre discul
ndeprtat i memoria VAX-lui. Asa a aparut RDMA.
RDMA impune ca pachetele de date, coninnd pri dintr-un fiier
mare, s ajung la destinaia final odata sosite n adaptorul destinaiei.
Lucrul este mai greu de facut dect pare. n reelele tradiionale, pachetul
sosit oblig CPU s-l examineze si sa-i decida destinatia. Chiar dac CPU
se uit la antete, el poate specifica doar coada bufferelor de recepie (bazat
pe aplicaia destinatie).
Presupunem c aplicaia de recepie memoreaza in coada aplicaiei 1 de
la adaptorul de recepie, paginile 1, 2 i 3. Primul pachet sosete i este
trimis la pagina 1, al treilea pachet sosete n afara secvenei i este pus n
pagina 2, n loc de pagina 3. CPU poate ntotdeauna remapa paginile la
sfrit, dar remaparea tuturor paginilor la sfritul transferului, pentru un
fiier mare, poate fi dificil. Datorit pierderii de pachete, sosirile n afara
secvenei pot aprea ntotdeauna, chiar i ntr-o legtur FIFO.
La VAX-Clusters ideea este ns este ca mai nti aplicaia destinaie s
blocheze un numr de pagini fizice (paginile 11 i 16 din figura 5.9.)
pentru memoria destinaie de transfer a fiierului. Logic ar fi ca bufferul, B
s zicem, s aib pagini consecutive (paginile 1 i 2 din figura 5.9.).
Numele acestui buffer B este pasat la aplicaia de transmisie. Sursa
paseaz acum (P10 pasarea informaiei n antetele de protocol) numele
buffer-ului i decalajul cu fiecare pachet trimis. Astfel, cnd trimite
pachetul 3 n afara secvenei din ultimul exemplu, acesta va conine B i
pagina 3 i deci, nu poate fi memorat n pagina 2 a buffer-ului chiar dac
sosete naintea pachetului 2. Astfel, dup ce toate pachetele sosesc, nu
mai este nevoie de o remapare a paginilor.
Pentru ca procesorul s nu mai fie ocupat la fiecare sosire de pachet
luate nite msuri. n primul rnd adaptorul trebuie s implementeze
protocolul de transport (i s verifice toate duplicatele,etc.) ca n
procesarea TCP. n plus, adaptorul trebuie s fie capabil s determine unde
se termin antetul i unde ncep datele, astfel ca n buffer-ul destinaie s
fie copiate doar datele.
n sfrit, s permitem fiecrui pachet, care transport IDul buffer-ului
de la reea, s fie scris direct n memorie, ar putea fi o lacun n securitate.
Pentru a evita acest lucru, ID-ul buffer-ului conine un ir aleator, greu de
ghicit.Astfel, clusterele VAX sunt utilizate doar ntre gazdele de ncredere
din cluster, ceea ce evident c ar fi mai difcil pentru transferul de date la
scala Internet-ului.

108

Numele buffer-ului B

Pagina 11
B, 1

B, 2

B1
B2

Pagina 16
ADAPTORUL
DESTINATIE

Figura 5.9 Realizarea DMA prin reea

5.3.2. RDMA actual.


Clusterele VAX au introdus foarte devreme ceea ce se numete reea cu
zon de stocare SAN (storage area network). SAN sunt reele n culise
(back-end) care conecteaz mai multe calculatoare care partajeaz
memoria, adic discurile ataate reelei. Civa succesori receni ai
clusterelor VAX care folosesc tehnologia SAN sunt: canalul pe fibra
optic (Fiber Channel) mai vechi, sau mai modernele InfiniBand i
iSCSI(Small Computer System Interface)
Fiber Channel
n 1988 ANSI Task Group X3T11 a nceput s lucreze la un standard
numit FiberChannel. Unul din scopurile FiberChannel era s ia standardul
SCSI dintre o staie de lucru i un disc local i s l extind pe distane
mari. Astfel, n multe instalaii FiberChannel, SCSI este nc utilizat ca
protocolul care ruleaz pe FiberChannel.
FiberChannel merge la fundamentele reelei mai departe dect clusterele
VAX, utiliznd tehnologii noi de reele, cum ar fi legturile punct-la-punct
pe fibr conectate cu switch-uri. Aceasta permite viteze de pn la
1Gb/sec i distane mai mari dect n reeaua clusterelor VAX. Switchurile pot fi chiar conectate la distan, permind unei firme de comer s
aib pe un site ndeprtat o memorie de rezerv a tuturor tranzaciilor.
Utilizarea switch-urilor trebuie s aib n vedere controlul fluxului, care
trebuie fcut cu grij pentru a evita pierderea de pachete pe ct posibil.
FiberChannel face mai multe concesii asupra securitaii dect
clustereleVAX, unde orice dispozitiv cu un nume potrivit poate scrie n
memoria oricrui alt dispozitiv. FiberChannel permite reelei s fie
virtualizat n zone, si nodurile dintr-o zon nu pot accesa memoria
nodurilor din alte zone. Produse mai recente merg mai departe si propun
chiar tehnici de autentificare ; dar ideile de baz sunt aceleai.
Infiniband
Infiniband pornete de la faptul c PCI, magistrala intern I/O utilizat
n multe staii de lucru i PC-uri, e nvechit si trebuie nlocuit. Cu o
lime de band maxim de 533 Mb/sec, magistrala PCI este inundat de
perifericele moderne de mare vitez, ca plcile de interfa Gigabit
Ethernet. Dei exist cteva alternative temporare cum ar fi magistrala

109

PCI-X, magistralele interne din calculatoare trebuie redimensionate ca s


ina pasul cu modificri de genul de la 10-Mbit Ethernet la Gbit Ethernet.
De asemenea, observm c exist trei tehnologii de reea diferite ntr-un
calculator: interfaa de reea (ex.Ethernet), interfaa de disc (ex.SCSI prin
FiberChannel) i magistrala PCI. Principiul lui Occam,cea mai bun cale
este cea mai simpl, sugereaz substituirea acestora trei cu o tehnologie de
reea unic. Astfel, Compaq, Dell, HP, IBM i SUN au format Infiniband
Trade Association. Specificaiile Infiniband utilizeaz multe din ideile
tehnologiei FiberChannel. Interconectarea se face cu comutatoare i
legturi punct-la-punct. Infiniband are cteva schimbri: adresare IP pe
128 biti pentru Internet-ul de generaie urmtoare, virtualizarea legturilor
fizice individuale sub form de ci, faciliti pentru calitatea serviciului,
multicast si RDMA pentru evitarea copiilor.
iSCSI
FiberChannel pare s aib un cost mai ridicat la vitez echivalent,
pentru scrierea ntre pri dect scrierea ntre prile Gigabit Ethernet. Dat
fiind faptul c IP a ptruns n numeroase spaii de reea cum ar fi voce, TV
i radio, natural ar fi s ptrund i n spaiul de memorare. Aceasta ar
trebui s scad preurile (deschiznd noi piee pentru furnizorii de
reele).Pe mai departe, se extind FiberChannel i Infiniband s conecteze
prin Internet centre de date distante. Aceasta implic folosirea de
protocoale de transport care nu sunt neaprat compatibile cu TCP, n ceea
ce privete reacia la congestie. De ce s nu adaptm TCP n acest scop, n
loc s modificm celelalte protocoale ca s fie compatibile TCP?
Cel mai interesant lucru la iSCSI este modul de emulare a RDMA prin
protocoale IP standard. La RDMA, adaptorul gazd implementeaz n
hardware protocoalele de transport ale Internet-ului. Protocolul de
transport din Internet este TCP. Deci adaptoarele trebuie s implementeze
TCP n hardware. Chip-uri care realizeaz TCP, fr a crete efortul de
calcul, sunt pe cale s devin accesibile pe scar larg.
Mai dificile sunt urmtoarele pri. n primul rnd, TCP este un protocol
orientat pe flux. Aplicaia scrie octeii ntr-o coad, i aceti octei sunt
segmentai arbitrar n pachete. RDMA, pe de alt parte, este bazat pe
mesaje, fiecare din acestea are un cmp nume buffer. n al doilea rnd,
RDMA prin TCP necesit un antet pentru numele buffer-elor.
Propunerile
RDMA rezolv ambele probleme stratificnd trei
protocoale peste TCP. Primul protocol, MPA, adaug un antet care
definete limitele mesajelor n fluxul de bii. Al doilea i al treilea protocol
implementeaz cmpurile antetelor RDMA dar sunt separate dupa cum
urmeaza. Cnd un pachet transport date are nevoie doar de numele
bufferului i deplasarea. Acest antet este abstractizat prin antetul DDA
(Direct Data Access) mpreun cu o comand (read sau write).
Protocolul RDMA, stratificat peste DDA adaug un antet cu cteva
cmpuri n plus. De exemplu, pentru o citire RDMA la distan, cererea
iniial trebuie s specifice numele buffer-ului de la distan (de citit) i
numele bufferului local (de scris). Unul dintre numele acestor dou buffere poate fi plasat n antetul DDA, dar cellalt trebuie plasat n antetul
RDMA. Astfel, cu excepia mesajelor de control, cum ar fi iniierea unei
citiri, toate datele transport doar un antet DDA i nu un antet RDMA.

110

n evoluia de la clusterele VAX la RDMA, o generalizare interesant a


fost nlocuirea buffer-ului cu nume cu un buffer anonim. n acest caz
antetul DDA conine numele unei cozi i pachetul este plasat n primul
buffer liber, din capul cozii de la recepie.
5.4. Extinderea la sistemul de fiiere
Pn acum s-a tratat doar evitarea copiilor redundante ce apar cand se
transmit date ntre o aplicaie (ca serverul Web) i reea. Dar (fig.5.2) i
dup ndepartarea tuturor antetelor redundante datorate copierii prin reea,
nc mai sunt copii redundante care implic sistemul de fiiere. Tehnicile
de evitare a copierii, discutate pn acum, sunt extinse si la sistemul de
fiiere. Pentru a procesa o cerere pentru fiierul X (fig.5.2), serverul
trebuie s citeasc X de pe disc (copia 1) ntr-un buffer kernel
(reprezentnd fiierul cache) i apoi s fac o copie din cache n buffer-ul
aplicaiei (copia 2). Copia 1 este eliminat dac fiierul este deja n cache,
o presupunere corect pentru fiierele cu utilizare intensiv dintr-un server
cu memorie suficient. Principalul scop este eliminarea copiei 2. Intr-un
server Web dublarea inutil a numrului de copii njumtete lrgimea
de band efectiv i njumtete cache-ul serverului. Aceasta reduce
performana serverului, crescnd rata de pierderi, adic mai multe
documente sunt servite la viteza discului i nu la viteza magistralei.
Sunt prezentate aici trei tehnici pentru ndeprtarea copiei redundante a
sistemului de fiiere (copia 2): maparea memoriei partajate care poate
reduce copia 2, dar nu este bine integrat n subsistemul de reea; IO-Lite,
o generalizare a fbufs extins la sistemul de fiiere; I/O splicing, utilizat
de multe servere Web comerciale.
5.4.1. Memoria partajat
Variantele moderne de UNIX ofer un apel de sistem convenabil
mmap() pentru a permite unei aplicaii (un server) s mapeze un fiier n
spaiul su de adresare a memoriei virtuale. i alte sisteme de operare
ofer funcii echivalente. Cnd un fiier este mapat n spaiul de adrese al
unei aplicaii, este ca i cum aplicaia ar fi fcut o copie cache a fiierului
n memoria sa. Operaia pare redundant, deoarece sistemul de fiiere
reine fiierele i n cache. Dar folosind memoria virtuala (P4, egalizarea
componentelor sistemului), fiierul cache este doar un set de mapri,
pentru ca alte aplicaii i cache-ul serverului de fiiere s acceseze n
comun setul de pagini fizice pentru acel fiier.
Serverul Web Flash evit copia 1 i 2 (fig.5.2) impunnd ca aplicaia
server s mapeze n memorie fiierele des utilizate. Dar, fiind limitate att
numrul de pagini fizice ce pot fi alocate paginilor fiierului, ct i
maprile tabelului de pagini, serverul Web Flash trebuie s trateze aceste
fiiere mapate, ca un cache. n loc s memoreze n cache fiierele ntregi,
el memoreaz doar segmente din aceste fiiere i folosete o politic LRU
(Least Recently Used) pentru a demapa fiierele nefolosite de ceva vreme.
Funciile de mentenan cache sunt dublate prin cache-ul sistemului de
fiiere (care are o eviden mai precis asupra resurselor, cum ar fi
paginile libere, fiind rezident n kernel). Totui, aa se evit copiile 1 i 2
(figura 5.2). n timp ce Flush utilizeaz mmap() pentru a evita copierea
sistemului de fiiere, el ruleaz n UNIX API. Astfel c Flush e obligat s

111

fac o copie suplimentar pentru subsistemul de reea (copia 3, figura


5.2.). Chiar cnd s-a reuit eliminarea copiei 2, reapare copia 3 !
Copia 3 poate fi evitat combinnd emularea copierii, fcut de TCOW,
cu mmap() (desi TCOW are unele dezavantaje, menionate anterior).
Deasemenea, nu este o soluie general valabila pentru evitarea copierii la
interaciunea cu un proces CGI prin intermediul unui canal/pipe UNIX .
5.4.2. IO-Lite: o vedere de ansamblu asupra buffer-elor
Dei combinarea copiere emulat-mmap() elimin copierea redundant,
lipsesc totui cteva optimizri. n primul rnd, nu se face nimic pentru a
evita copierea ntre orice aplicaie CGI (care genereaz coninut dinamic)
i serverul Web. Acest tip de aplicaie se implementeaz deobicei ca un
proces separat, care-i trimite coninutul dinamic procesului server printrun canal/pipe Unix. Dar pipe-urile i alte comunicaii interprocese similare
presupun copierea coninutului ntre dou spaii de adrese.
n al doilea rnd, nici una din schemele de pn acum nu a rezolvat
problema sumei ciclice de control TCP, care este o operaie costisitoare.
Dac acelai fiier indic mereu memoria cache, n afar de primul
rspuns care contine antetul HTTP, toate pachetele succesive, care
returneaz coninutul fiierului, rmn aceleai pentru oricare cerere. De
ce nu s-ar putea memora n cache suma de control TCP? Asta ar
presupune o memorie cache care s poat cumva asocia coninutul
pachetului cu suma de control, treab ineficient ntr-o schem de
memorare convenional.
Schema de memorare IO-Lite generalizeaz ideile fbuf i la sistemul de
fiiere. IO-Lite nu numai c elimin toate copiile redundante din figura
5.2, ci i copierea redundant ntre procesele CGI i server. Ea are o
schema specializat de numerotare a buffer-elor care permite unui
subsistem (ca TCP) s realizeze eficient c retransmite un pachet anterior.
IO-Lite deriv din fbufs, dar extinderea la sistemul de fiiere adaug mai
mult complexitate. Spre deosebire de TCOW, fbufs nu pot fi combinate
cu mmap(), deoarece n mmap() aplicatia alege adresa i formatul bufferului aplicaie, n timp ce n fbufs kernel-ul selecteaz adresa i buffer-ul
rapid (fbuf). Astfel, dac aplicaia a mapat un fiier utiliznd un buffer n
spaiul adreselor virtuale al aplicaiei, buffer-ul nu poate fi trimis utiliznd
un fbuf (spaiul adreselor kernel) fr o copie fizic.
Deoarece fbufs nu pot fi combinate cu mmap, IO-Lite generalizeaz
fbufs pentru a include sistemul de fiiere, fcnd mmap inutil. IO-Lite este
implementat i ntr-un sistem de operare de interes general (UNIX), spre
deosebire de fbufs. Dar IO-Lite mprumut toate ideile principale de la
fbufs: noiunea partajrii read-only prin buffer-e invariabile (numite
felii/slices in IO-Lite), utilizarea buffer-elor compuse (numite buffer
agregates), i noiunea unui cache creat relaxat pentru o cale (numit I/O
stream in IO-Lite).

112

CPU

Memorie

Aplicatia server-ului Web


write()
Kernel

TCP/IP

Buffer server

Cached response
header

Buffer socket

read()

Cached checksum

Sistem fisiere

Buffer fisier
cache
Buffer IO-Lite

Bus memorie
Copia 1
Copia 2

Disc

Bus I/O
Adaptor de retea
Retea
Figura 5.10. IO-Lite elimin toate copiile redundante din figura 5.2. pasnd efectiv pointeri
(prin mapri VM) la un singur buffer IO-Lite. Presupunnd c fiierul, suma de control TCP i
rspunsul HTTP sunt toate memorate n cache, server-ul Web nu trebuie dect s transmit
aceste valori din cache ntr-o singur copie la interfaa de reea.

IO-Lite trebuie s rezolve problema dificil de integrare n sistemul de


fiiere. n primul rnd, IO-Lite trebuie s se ocupe de modelele complexe
de partajare, unde mai multe aplicaii pot avea buffer-e care pointeaz la
un buffer IO-Lite, mpreun cu codul TCP i cu serverul de fiiere. n al
doilea rnd, o pagin IO-Lite poate fi n acelai timp o pagin de memorie
virtual (returnat de fiierul de pagini de rezerva de pe disc) sau o pagin
de fiier (returnat de copia actual de pe disc a fiierului). Astfel, IO-Lite
trebuie s implementeze o politic complex de nlocuire, care integreaz
mpreun regulile standard de nlocuire a paginilor i cele de nlocuire a
fiierului cache. n al treilea rnd, ca s rulm pe UNIX trebuie gsit o
cale de a integra IO-Lite fr operaii majore asupra UNIX.
Figura 5.10. arat paii pentru a rspunde la cererea GET din figura 5.2.
Cnd fiierul este citit prima dat de pe disc n memoria cache a sistemului
de fiiere, paginile fiierului sunt memorate ca buffer-e IO-Lite. Cnd
aplicaia face un apel de citire a fiierului, nu se realizeaz nici o copie
fizic, dar este creat un buffer agregat cu un pointer spre buffer-ul IO-Lite.
Cnd aplicaia trimite fiierul TCP-ului pentru a fi transmis, sistemul
reelei primete un pointer la aceleai pagini IO-Lite. Pentru a preveni
apariia erorilor sistemul IO-Lite pstreaz un contor de referinta, pentru
fiecare buffer, i realoc bufferul doar cnd toi utilizatorii au terminat.
Figura 5.10. arat nc dou optimizri. Aplicaia ine o memorie cache
de rspunsuri HTTP pentru fiierele comune, i deseori poate aduga pur
i simplu rspunsul standard cu modificri minime. n al doilea rnd,
113

fiecrui buffer i este dat un numr unic (P12, adaug stri redundante) de
ctre IO-Lite, i modulul TCP ine un cache al sumelor de control indexate
cu numrul buffer-ului. Astfel, cnd un fiier este transmis de mai multe
ori, modulul TCP poate evita calcularea sumei de control, dup prima
transmisie. Aceste modificri elimin toat redundana din figura 5.2 care
mrete viteza de procesare a rspunsului.
IO-Lite poate fi utilizat i pentru implementarea unui program pipe
modificat, care elimin copierea. Cnd acest mecanism IPC este utilizat
ntre procesul CGI i procesul server, toate copiile sunt eliminate, fr a
compromite sigurana i izolarea defectelor, oferit de implementarea
celor dou programe ca procese separate. IO-Lite permite deasemenea
aplicaiilor s-i particularizeze strategia de memorare-cache a buffer-elor,
permind strategii de memorare-cache mai deosebite, pentru serverele
web bazate pe dimensiunea i frecvena accesului.
Este important de remarcat c IO-Lite realizeaz aceste performane fr
a elimina complet kernel-ul Unix i fr a lega strns aplicaia de kernel.
Serverul Web Cheetah, cu sistemul de operare Exokernel, e i mai radical,
permite fiecrei aplicaii (inclusiv serverului Web) s i individualizeze
complet reeaua i sistemul de fiiere. Mecanismele Exokernel permit
astfel de individualizari, pentru fiecare aplicaie, fr a compromite
sigurana. n virtutea acestor modificri, serverul Web Cheetah poate
elimina toate copiile din figura 5.2. i deasemenea poate elimina
calcularea sumei de control TCP utiliznd un cache.
n timp ce Cheetah permite cteva artificii suplimentare, enorma
provocare n ingineria software de proiectare i meninere de kernel-uri
individualizate pentru fiecare aplicaie, face mai atractive abordrile ca
IO-Lite. IO-Lite se apropie de performana kernel-urilor individualizate ca
Cheetah avand de rezolvat mult mai putine probleme de inginerie
software.
5.4.3. Evitarea copiilor sistemului de fiiere prin I/O Splicing
Server-ele Web sunt apreciate prin teste comerciale: SPECweb pentru
serverele Web i poligraf-Web pentru proxy-ul Web. n spaiul proxy,
exist un raport de recuren anual n care toate dispozitivele sunt
msurate mpreun pentru a calcula cea mai mare rat de gsire a fiierului
dorit n cache, normalizat la preul dispozitivului. Testerele SPECweb
utilizeaz un sistem diferit n care productorii i nregistreaz propriile
rezultate experimentale la sistemul de teste, chiar dac aceste rezultate
sunt verificate. n testele poligraf Web, la vremea scrierii, tehnologia unui
server Web bazat pe ideile IO-Lite era printre cele mai avansate.
De altfel, n testele SPECweb mai multe server-e Web prezint,
deasemenea, performane impresionante. Aceasta se datoreaz i unui
hardware mai rapid (i mai scump). Totui, exist dou idei simple care
pot evita nevoia de schimbri complete ale modelului ca n cazul IO-Lite.
Prima idee este de a plasa complet n kernel aplicaia serverului Web. n
acest fel n figura 5.2., toate copiile pot fi eliminate deoarece aplicaia i
kernelul sunt pri ale aceleai entiti. Problema major cu aceast
abordare este c astfel de servere, Web aflate n kernel, trebuie s se ocupe
de rezistena la schimbri de implementare a sistemelor de operare. De
exemplu, pentru un server popular de mare performan care ruleaza pe

114

Linux, fiecare modificare intern a Linux-ului poate invalida ipotezele


software-ului serverului, i cauza o blocare a sistemului. De menionat c
un server convenional din spaiul utilizatorilor nu are aceast problem
deoarece toate modificrile implementrii UNIX pstreaz API-ul.
A doua idee menine aplicaia server n spaiul utilizator dar se bazeaz
pe o idee simpl numit I/O splicing pentru a elimina toate copiile din
figura 5.2. I/O splicing artat n figura 5.11. a fost introdus pentru prima
data n Fall i Pasquale. Ideea este de a introduce un nou apel de sistem
care combin vechiul apel de citire a unui fiier cu vechiul apel (P6, rutine
specializate eficiente) de trimitere a unui mesaj n reea. Permind kernelului s mbine aceste dou sisteme de apel, separate pn acum, putem
evita toate copiile redundante. Multe sisteme au apeluri de sistem cum ar
fi sendfile () care acum sunt utilizate de civa productori comerciali. n
ciuda succesului acestui mecanism, mecanismele bazate pe sendfile nu pot
fi bine generalizate pentru comunicaia cu procesele CGI.
CPU

Memorie

Aplicatia sesver-ului Web


sendfile()
Kernel

Buffer fisier cache

Magistrala de memorie
Copia 1

Copia 2

Disc
Magistrala I/O

Adaptor de retea

Retea

Figura 5.11. n I/O splicing, toate indirectrile cauzate de copierea n i din buffer-e din
spaiul utilizator sunt ndepartate printr-un singur apel de sistem care mbin fluxul I/O
de la disc cu fluxul I/O de la reea. Ca de obicei, copia 1 poate fi eliminat pentru fiierele
din cache.

5.5. Extinderea dincolo de copii


Clark i Tennehouse, ntr-o lucrare de referin, generaliznd ideea lui
Van Jacobson (descris mai nainte), au sugerat integrarea sumei de
control i a copierii. Mai detaliat, ideea Jacobson a pornit de la urmtoarea
observaie. Cnd se copiaz un cuvnt de pachet dintr-o locaie (de
exemplu W10 n memoria adaptorului din figura 5.12.) ntr-o locaie de
memorie (de exemplu M9 din figura 5.12.), procesorul trebuie s ncarce
W10 ntr-un registru i apoi s memoreze acel registru n M9. Tipic, cele
mai multe procesoare RISC cer ca, ntre o ncrcare i o memorare
115

compilatorul s insereze un aa numit slot de ntrziere, sau ciclu gol,


pentru a asigura ca pipeline-ul s functioneze corect (aici nu motivm de
ce). Acel ciclu gol poate fi utilizat pentru alte operaii. De exemplu, el
poate fi folosit pentru a aduga cuvntul tocmai citit ntr-un registru care
conine suma de control curent. Astfel, fr cost n plus, bucla de copiere
poate fi deseori complementata s fie i bucl de sum de control.
Dar exist alte manevrri de date intensive cum ar fi criptarea de date i
conversiile de format. De ce s nu integrm toate aceste manevre n bucla
de copiere ? au susinut Clark i Tennehouse. De exemplu, n figura 5.2.
CPU ar fi putut citi W10 i dup aceea s decripteze W10 i s scrie
cuvntul decriptat M9 dect s fac asta ntr-o alt bucl. Ei au numit
aceast idee integrated layer processing, sau ILP. Ideea esenial este de a
evita pierderile evidente, (P1), la citirea (i posibil la scrierea) biilor
unui pachet, de mai multe ori pentru operaii de manevrare multipl a
datelor aceluiai pachet.

CPU
Stocare M9, R0
(adaugare R0 la suma de
control)
Incarcare W10, R0

M9

W10
Memoria adaptorului
Figura 5.12. Integrarea sumei de control i a copierii

Astfel, ILP este o generalizare a integrrii copiei sumei de control i


pentru alte manevrri(de exemplu, criptare). Totui, ea are cteva cerine.
Cerina 1: Informaia necesar manevrrilor e specific fiecrui nivel
(criptarea la nivelul aplicaie, verificarea sumei de control la nivelul TCP).
Integrarea codului n nivele e dificil fr sacrificarea modularitaii.
Cerina 2: Fiecare manevrare poate opera pe felii de diferite mrimi i
pe zone diferite ale pachetului. TCP lucreaz pe 16 bii pentru o suma de
control de 16 bii iar criptarea DES lucreaz pe 64 bii. Astfel, n timp ce
lucreaz cu un cuvnt de 32 bii, bucla ILP trebuie s se ocupe de dou
cuvinte de sum de control TCP i o jumtate de cuvnt DES.
Cerina 3: Unele manevrri pot depinde una de cealalt: nu ar trebui ca
un pachet s fie decriptat, dac suma de control nu este verificat.
Cerina 4: ILP poate mri rata de pierderi a cache, deoarece poate
reduce localizarea printr-o singur manevrare. Dac TCP i DES au fost
fcute separat, i nu ntr-o singur bucl, codul care ar fi fost folosit la
fiecare etap este mai redus pentru cele dou bucle luate separat dect cel
pentru o singur bucl. Aceasta face mai probabil ca, ntr-o implementare
mai naiv, codul s fie gsit n cache-ul instruciunii. Creterea integrrii,
116

dincolo de un anumit punct poate distruge localizarea codului ntr-o


asemenea msur nct, poate avea efectul opus.
Primele trei cerine arat c ILP este greu de realizat. A patra sugereaz
c integrarea a mai mult de cteva operaii odat, poate chiar reduce
performana. n sfrit, dac pachetul de date este utilizat de mai multe ori,
ar putea fi rezident n cache-ul de date (chiar i ntr-o implementare
naiv), fcnd inutil tot deranjul pentru integrarea buclelor. Posibil din
cauza acestor motive, ILP a rmas doar o idee tentant. nafar de
combinarea copierii cu verificarea sumei de control, au fost puine
manevrri care au mai fost integrate n sistemele academice sau
comerciale.
5.6. Extinderea dincolo de manevrrile datelor
Pn acum scopul a fost reducerea lrgimii de band a memoriei (i a
magistralei) cauzat de operaiile de manipulare a datelor. n primul rnd,
a fost problema eliminrii copierii de date redundante ntre reea i
aplicaie. Apoi a fost tratat copierea redundant dintre sistemul de fiiere,
aplicaie i reea. n final, s-a pus problema eliminrii citirilor i scrierilor
redundante n/din memorie, utiliznd procesarea integrat pe niveluri cnd
mai multe operaii de manevrri a datelor opereaz asupra aceluiai
pachet. Comun acestor tehnici este ncercarea de a reduce presiunea
asupra memoriei i a magistralei I/O, prin evitarea scrierilor i citirilor
redundante. Dar odat realizat, mai sunt alte surse de presiune care apar
ntr-o arhitectur endnode (fig.5.2). Aceasta se refer la urmtorul extras
dintr-un e-mail trimis dup lansarea etapei alpha a serverului rapid Web
Linux de nivel utilizator.
Cu un transfer de fiier cu zero copii, deplasarea datelor nu mai este o
problem, reteaua I/O asincron permite o planificare cu adevrat
necostisitoare, i invocarea apelului de sistem adaug un antet neglijabil
n Linux. Ce ne rmne acum sunt doar ciclurile de ateptare, CPU-urile
i NIC-urile, care rivalizeaz pentru lime de ban de memorie i de
magistral.
n esen, odat ce se are grij de efectele de ordinul nti (cum ar fi
eliminarea copiilor), performana poate fi mbuntit doar avnd grij la
ce ar putea fi considerat ca efecte de ordin doi. Dou astfel de efecte
arhitecturale cu impact mare asupra utilizrii lrgimii de band a
magistralei i a memoriei sunt utilizarea eficient a cache-urilor i alegerea
DMA versus PIO.
5.6.1. Utilizarea eficient a cache-urilor
Modelul arhitectural din figura 5.2, nu prezint dou detalii
importante. Reamintim c procesorul pstreaz una sau mai multe cacheuri de date (d-caches) i una sau mai multe cache-uri de instruciuni (Icaches). Cache-ul de date este un tabel care mapeaz de la adrese de
memorie la coninutul de date; dac exist citiri i scrieri repetate la
aceeai locaie L din memorie i L este n cache, atunci aceste citiri i
scrieri pot fi servite direct din cache-ul de date, fr a implica lime de
band de memorie i de magistral. Similar, reamintim c programele sunt
stocate n memorie; fiecare linie de cod executat de CPU trebuie adus
din memoria principal dac nu se gsete n cache-ul de instruciuni.

117

Acum, pachetul de date beneficiaz puin de un cache de date, deoarece


datele sunt puin reutilizate i copierea implic scrierea ntr-o nou adres
de memorie, spre deosebire de citiri i scrieri repetate din aceeai adres
de memorie. Astfel, tehnicile deja discutate de reducere a copiilor sunt
inutile, n ciuda prezenei n procesor a unei memorii cache de date mari.
Totui, exist dou alte elemente stocate n memorie care pot beneficia de
pe urma memoriei cache. n primul rnd, programul, care execut codul de
protocol pentru procesarea unui pachet, trebuie extras din memorie, dac
nu este stocat n I-cache. n al doilea rnd, starea necesar pentru a procesa
un pachet (tabelele de stri ale conexiunilor TCP) trebuie extras din
memorie, dac nu este stocat n d-cache. Din aceste dou posibile
concurente pentru limea de band de memorie, codul de executat este o
ameninare mai serioas. Aceasta deoarece starea (n bytes), necesar
pentru procesarea unui pachet (de exemplu intrarea ntr-un tabel de
conexiuni, sau ntr- un tabel de rutare), este n general mic. Totui, pentru
un pachet mic de 40 bytes pn i aceasta poate fi semnificativ. Astfel,
evitarea de cte ori este posibil, a utilizrii unor stri redundante (care
tinde s polueze d-cache),poate mbunti performana.
Codul necesar pentru executarea ntregii stive de reea (legturile de
date, TCP, IP, nivelul socket i intrrile/ieirile kernel) poate fi mult mai
mare. Masurrile la Blackwell arat un cod de 34 KB utiliznd
implementarea TCP NetBSD din 1995. innd cont c, chiar i pachetele
Ethernet mari au maxim 1,5 KB, efortul de a ncrca codul din memorie
face s par nesemnificativ efortul de a copia pachetul de mai multe ori.
Dac, de exemplu, I-cache are 8KB (tipic pentru sisteme mai vechi, cum
ar fi sistemele alpha utilizate n Blackwell) nseamn c cel mult un sfert
din stiva de reea poate intra n cache. Rezultatul e c toate codurile, sau
cea mai mare parte a lor, trebuie aduse din memorie, de fiecare dat cnd
un pachet trebuie procesat. Sistemele moderne nu i-au mbuntit
semnificativ dimensiunea I-cache. Pentium III utilizeaz 16 KB. Astfel,
utilizarea eficient a I-cache poate fi o soluie pentru mbuntirea
performanei, n special pentru pachetele mici.
Sunt descrise dou tehnici care pot mbunti eficiena I-cache:
aranjarea codului i procesarea pe nivele
Aranjarea codului
Este greu sa-ti dai seama cnd scrii un cod de reea, c plasarea codului n
memorie (deci n I-cache) are un grad de libertate (P13) care, cu puin
efort, poate fi exploatat. Ideea este de a plasa codul n memorie pentru a
optimiza situaiile comune (P11): codul utilizat frecvent s fie n I-cache
pentru ca efortul de ncrcare a I-cache s nu fie risipit.
Aparent, nu e necesar un efort suplimentar. Cache-ul ar trebui s
favorizeze codul frecvent utilizat fat de cel utilizat mai rar, deci operatia
ar trebui sa fie automat. Acest lucru nu se ntmpl ns din cauza
modului de implementare a I-cache-ului.
Maparea direct: Un I-cache este o mapare a adreselor de memorie la
coninutul lor; maparea este de obicei implementat de funcie hash simpl
optimizat pentru accesul secvenial. Astfel, majoritatea procesoarelor au
I-cache-uri mapate direct, unde biii de ordin inferior ai unei adrese de
memorie sunt utilizai pentru a indexa zona I-cache. Dac biii de ordin
superior se potrivesc, coninutul este returnat direct din cache; altfel, se
118

face o citire de memorie prin magistral, i se stocheaz n aceeasi locaie


noile date i biii de ordin superior.
Figura 5.13. arat efectul acestei implementri. n stnga se vede
dispunerea codului n memorie pentru dou funcii de reea, codul
neutilizat frecvent fiind cel cu negru. Deoarece dimensiunea I-cache este
doar jumatate din mrimea total a codului, este posibil ca dou linii de
cod accesate frecvent (cum ar fi X i Y, cu adrese care au acelai rest
modulo n dimensiunea I-cache) s mapeze ctre acceai locaie din Icache.Dac i X i Y sunt utilizate pentru a procesa fiecare pachet, ele se
vor evacueze una pe alta din cache, chiar dac amandou sunt utilizate
frecvent.
Mai multe instruciuni pe bloc: Multe I-cache-uri pot fi vzute ca o zon
de blocuri, n fiecare bloc fiind memorate instruciuni multiple (8 de
exemplu). Cnd o instruciune este adus, toate cele 8 instruciuni din
acelai bloc sunt aduse, n ipoteza localizrii spaiale: cu acces secvenial,
probabil c celelalte i celelate 7 instruciuni vor fi aduse, i este mai ieftin
de citit mai multe instruciuni din memorie n acelai timp.
Din pcate, o mare parte din codul de reea conine controlul la erori,
cum ar fi dac E eronat execut X, altfel execut Z. Z este rar executat,
dar deseori compilatorul plaseaz codul pentru Z imediat dup X. De
exemplu, (figura 5.13) ne imaginm c codul pentru Z urmeaz imediat
dup X. Dac X i Z cad n acelai bloc de 8 instruciuni, extragerea lui X,
frecvent utilizat, implic extragerea lui Y, rar utilizatul. Astfel ncrcarea
cache e mai puin eficient(multa munc inutil), i dup ncrcare cacheul e mai puin util (mai puin cod util n cache).

Codul
F1

Codul
F2

Dimensiunea
I-cache

Utilizarea frecventa a
codurilor F1 si F2

Utilizarea nefrecventa a
codurilor F1 si F2
Y

Re-localizare

Figura 5.13. n stnga este codul de reea dispus n memorie, cu intercalare arbitrar a codului
frecvent utilizat (alb) i rar utilizat (negru). Utilizarea unui cache direct mapat cu jumtate din
dimensiunea total a codului poate conduce la coliziunea a dou instruciuni frecvent utilizate,
cum ar fi X i Y. Aceast problem poate fi evitat reamplasnd tot codul utilizat frecvent,
astfel nct s fie continuu, (dreapta).

Ambele efecte sunt cauzate de reflectarea imperfect de ctre cache-uri a


localitaii temporale. Prima cauz este o funcie hash imperfect, ce poate
cauza coliziuni ntre dou adrese utilizate frecvent, iar a doua este
optimizarea localitaii spaiale. Ambele efecte pot fi diminuate prin
reorganizarea codului de reea astfel nct tot codul utilizat frecvent sa fie
continuu (dreapta figurii 5.13). De exemplu, n cazul dac E eronat
119

execut X, altfel execut Z, codul pentru Z poate fi mutat departe de X.


Aceasta necesit adugarea unei instruciune de salt la cod lui Z pentru ca
acesta s poat reveni la codul ce urma dup Z n versiunea neoptimizat.
Cum saltul se face doar n caz de eroare nu reprezint un cost mare.
Deci localizarea codului n memorie (P13) permite prima optimizare, a
doua optimizare fiind a cazului cel mai probabil(P11), prin lungirea
codului rar utilizat.
Procesarea pe nivele
Reorganizarea codului poate ajuta pn la un anumit punct, dar d gre
dac zona de lucru (setul de instruciuni accesat pentru aproape fiecare
pachet) depete dimensiunea I-cache. De exemplu, n figura 5.13. dac
dimensiunea albului, adic a instruciunilor frecvent utilizate este mai
mare dect I-cache, reorganizarea codului va fi nc de folos (sunt
necesare mai puine ncrcri din memorie, deoarece fiecare ncrcare
aduce instruciuni utile). Totui, fiecare instruciune va mai trebui adus
din memorie.

Timp

P1
sosire P2

Procesare
convenional

P1
P1
P1
P2
Legtura Reea Transport Legtura
de date
de date

P1
Legtura
de date

P2

P1

Legtura Reea
de date

P2

P2
Reea

P1

Reea Transport

P2
Transport

P2
Transport

Procesare
localizata
pe
niveluri.

Figura 5.14 Reprezentnd n timp procesareaconvenional, toate nivelurile de reea


ale pachetului P1 sunt procesate naintea celor pentru pachetul P2. ntr-o procesare
localizat pe niveluri a receptorului, codul fiecarui nivel este executat de mai multe ori,
pentru pachetele multiple recepionate, nainte de a trece la nivelul urmtor.

Dac zona de lucru al stivei reelei poate ncpea ntr-un I-cache modern
(care este din ce n ce mai mare) e posibil ca protocoalele mai complicate
(ce ruleaz TCP/IP ) s nu ncap. Ideea procesrii pe nivele este utilizarea
efectiv a I-cache ct timp codul fiecrui nivel al stivei reelei ncape n
I-cache. Procesnd repetat codul aceluiai nivel pntru mai multe pachete,
costul ncrcrii I-cache-ului este mprit pe mai multe pachete(P2c). n
figura 5.14, la reprezentarea n timp a procesrii convenionale, toate
nivelurile reea ale pachetului P1 sunt procesate nainte celor ale
pachetului P2. Dac dou pachete P1 i P2 sosesc la un server, ntr-o
implementare convenional, se termin toat procesarea lui P1 ncepnd
cu nivelul legtur de date i terminnd cu nivelul transport, i doar apoi
se ncepe procesarea pachetului P2.
Ideea principal n procesarea localizat pe niveluri este de a exploata un
alt grad de libertate (P13) i de a procesa toate codurile unui nivel, pentru
ct mai multe pachete posibil, nainte de a trece la nivelul urmtor. Astfel,
120

dup ce codul de nivel legtur de date pentru P1 este terminat, CPU trece
la executarea codului de nivel legatur de date pentru P2 i nu la codul de
nivel reea pentru P1. Corectitudinea ar trebui s nu fie afectat, deoarece
codul unui nivel n-ar trebui s depind de starea nivelurilor
inferioare.Totui, procesarea integrat pe niveluri are cteva dependene
subtile i deci cazuri de eec.
Astfel, dac codul pentru fiecare nivel ncape n I-cache (de exemplu
codul nivelului legatura de date) dar nu ncape codul pentru toate
nivelurile, atunci aceast optimizare amortizeaz costul ncrcrii I-cache
pentru mai multe pachete. Se utilizeaz procesarea pe loturi (P2c): cu ct
lotul este mai mare, cu att I-cache este utilizat mai eficient.
Implementarea poate adapta dinamic dimensiunea lotului. Codul poate
procesa o serie de pn la k pachete, din coada de pachete sosite( k este un
parametru care limiteaz latena). Dac sistemul este slab ncrcat, atunci
un singur mesaj va fi procesat la un moment dat. Dac sistemul este
puternic ncrcat, se crete dimensiunea lotului, crescnd astfel cnd e
nevoie, eficiena utilizrii lrgimii de band a memoriei.
Consideraii de inginerie software
Optimizrile de gen restructurarea codului (figura 5.13.) i procesarea
localizat pe niveluri(figura 5.14.) trebuie evaluate i innd cont de
efectele lor asupra modularitii codului i mentenanei. S-ar putea rescrie
kernel-ul i toate aplicaiile, utiliznd un limbaj de asamblare pentru o
optimizare perfect a utilizrii lrgimii benzii memoriei. Dar ar fi greu de
a face codul s ruleze corect sau s fie uor de ntreinut.
Restructurarea de cod este cel mai bine realizat de un compilator. De
exemplu, codul ce manevreaz erorile, poate fi adnotat cu indicii care s
sugereze ramificaiile cele mai frecvente (evidente, n general, pentru un
programator) i cu un compilator completat special, care poate restructura
codul pentru localizarea I-cache.
Pe de alt parte, procesarea localizat pe nivele pstreaz modularitatea
n interiorul nivelurilor. Comunicarea ntre niveluri trebuie modificat
dup cum urmeaz. Dac fiecare cod de nivel paseaz un pachet ctre
codul unui nivel superior cu o procedur de apel, acest cod trebuie
modificat s adauge pachetele pentru nivelul superior ntr-o coad.
Similar, cnd un nivel este apelat, el scoate pachete din coada sa de citire
pn cnd aceasta este terminat; dup procesarea fiecrui pachet, l
plaseaz n coada pentru urmtorul nivel superior. Aceast strategie
funcioneaz corect cnd fiecare nivel poate reutiliza buffer-ele de la alte
niveluri, aa cum este cazul mbuf-urilor UNIX. n ansamblu, modificrile
codului ar putea s nu fie majore.
5.6.2. Accesul direct la memorie DMA versus I/O programate
Seciunile anterioare au afirmat c schema Witless utilizeaz I/O
programate, sau PIO (procesorul este implicat n transferul fiecrui cuvnt
ntre memorie i adaptor), n timp ce alte scheme, cum ar fi VAX Clusters
utilizeaz DMA (unde adaptorul copiaz datele direct n memorie). Poate
prea c DMA este ntotdeauna mai bun dect PIO. Totui, comparaiile

121

ntre DMA i PIO sunt complicate deoarece fiecare metod are implicaii
subtile pentru utilizarea per total a lrgimii de band de memorie.
De exemplu, PIO are avantajul c datele circul prin procesor i astfel
ajung n cache-ul procesorului, prevenind pierderile de lime de band a
memoriei la accesul secvenial. Deasemenea, cu PIO e mai uoar
integrarea altor funcii, cum ar fi verificarea sumei de control, fr s fie
necesar un adaptor hardware care s fac aceeai funcie.
Totui, unele studii au artat c dac datele sosite sunt utilizate mult mai
trziu de ctre aplicaie, atunci plasarea datelor n d-cache prea devreme
este o risip a d-cache i mai degrab scade dect crete rata de succes a
cache. Pe de alt parte DMA poate fura cicluri de la CPU i necesit
deasemenea o atent invalidare a cache-ului cnd datele sunt scrise ntr-o
locaie de memorie(care poate fi tot n cache). Alegerea se face de la caz la
caz, din considerente arhitecturale i de aplicaie
.
5.7. CONCLUZII
Pe msur ce reelele devin mai rapide legturile, cum ar fi Gigabit
Ethernet, sunt deseori mai rapide dect magistralele interne i memoriile
din calculatoare sau
servere. Astfel, lrgimile de band de
memorie/magistrale sunt resurse cruciale. Au fost descrise tehnici de
optimizare a utilizrii lrgimii de band de memorie/magistral pentru
procesare de pachete IP i Web, care reprezint traficul Internet dominant.
S-a artat cum s nlturm copiile redundante implicate n
procesarea unui pachet IP utiliznd memoria adaptorului sau remaparea
memorie virtuale. Apoi s-a artat cum s ndeprtm copiile redundante
implicate n procesarea cererilor Web la un server, prin generalizarea
remaprii memoriei virtuale, pentru a include sistemul de fiiere sau prin
combinarea sistemului de fiiere i reelei I/O ntr-un singur apel de
sistem. Apoi s-a artat cum s combinm diferite manipulri de date
simultan. Toate aceste tehnici necesit schimbri n aplicaie i kernel dar
schimbrile sunt destul de localizate i majoritatea pstreaz
modularitatea.
n final s-a artat c, dac nu se are grij, procesarea protocolului poate
face nesemnificativ suprasarcina datorat copierii i au fost descrise
tehnici de optimizare a cache-ului de instruciuni. Serverele Web moderne
pot fi deja optimizate pentru implementri zero-copii utiliznd apeluri de
sistem de tipul sendfile (). Totui, astfel de servere nc consum cicluri de
processor ateptnd memorie. Astfel, tehnici de mbuntire a eficienei Icache pot oferi urmtoarea etap de optimizri pentru serverele Web.
Figura 5.1. prezint un sumar al tehnicilor utilizate n acest capitol,
mpreun cu principiile majore implicate.
Dar nu au fost eliminate toate problemele de performan implicate n
construirea unui server Web modern. Site-uri Web complexe, cum ar fi
amazon.com utilizeaz adesea mai multe niveluri de procesare pentru a
rspunde cerinelor Web (un server aplicaie, un server Web i un server
baz de date). Serverele Web baz de date introduc noi constrngeri care
pot necesita noi tehnici n afar de cele descrise aici. Totui, principiile de
baz ar trebui s rmn aceleai.
Referitor la principii, capitolul se ocup cu utilizarea repetat a P1, de
evitare a pierderilor evidente, ca citiri i scrieri inutile consumatoare de
122

lime preioas de band de memorie/magistral. La prima privire,


principiul P1 pare stupid . Ceea ce face acest principiu mai profund este c
pierderea devine vizibil doar dac analiza este extins la ntregul sistem,
sau la cea mai mare parte din el.n interiorul fiecrui subsistem local (de
exemplu aplicaie-kernel, kernel-retea, disc-sistem de fiiere) nu exist
risip de lime de band de memorie. Doar atunci cnd se urmrete
traseul unui pachet recepionat se descoper redundana dintre copiile
aplicaie-kernel i kernel-reea. Doar atunci cnd se extinde vederea i mai
departe pentru a observa distorsiunile implicate n rspunsul la o cerere
Web se observ redundanele care implic sistemul de fiiere. Doar atunci
cnd se extinde i mai mult vederea se vd toate manipulrile implicate n
procesarea unui pachet i citirile inutile din memorie. n sfrit, doar
atunci cnd se examineaz ncrcarea instruciunilor se vede posibilitatea
alarmant ca codul protocolului s fie de cteva ori mai mare dect
dimensiunea pachetului.
Astfel, utilizarea primului principiu al algoritmilor de reea necesit o
vedre sinoptic a ntregului sistem, de la http i anteteele sale la sistemul
de fiiere i la cache-urile de instruciuni. Dei complexitatea pare
descurajant, s-a argumentat deja c modelele simple de hardware,
arhitectur, sisteme de operare i protocoale pot face posibil o astfel de
vedere global. De exemplu, I-cache-urile au cteva variante complexe,
dar un model simplu, de mapare direct I-cache cu multiple instruciuni
per bloc, e uor de inut minte de proiectantul unui sistem de operare.
Comparate cu elegana i complexitatea tehnicilor teoretice, cum ar fi
algoritmul elipsoid pentru programarea linear i teoria lanurilor Markov
cu mixaj rapid, tehnicile de sistem, cum ar fi evitarea copierii, par lipsite
de strlucire i superficiale. Totui, se poate argumenta c complexitatea
sistemului nu se refer la profunzime(complexitatea fiecrei componente
n parte) ci la ansamblu(relaiile complexe dintre componente). Poate c
gradul de nelegere (HTTP, sistemul de fiiere, codul de reea,
implementarea cache-ului de instruciuni) necesar pentru a optimiza
limea de band de memorie ntr-un server Web pledeaz pentru aceast
lucrare.
5.8. EXERCIII
1. Memorii cache de date i copii: o memorie cache de date normal
mapeaz de la o adres de locaie de memorie la o pies de coninut. Cand
coninutul e accesat frecvent, atunci poate fi accesat direct din cache, n
loc sa se faca un acces la memorie. Presupunnd c memoria cache este de
tip write-back, chiar i scrierile pot fi facute n cache n loc de memorie i
sunt scrise n memorie doar cnd cache-ul e supra-ncrcat. Un bloc cache
modern e destul de mare (128 bii), cu mapari de la adrese de 32 de bii la
128 de bii, de date ncepnd cu acea adres.
Abordm problema copierii, unde diferite module(inclusiv reeaua i
sistemul de fiiere) copiaz date prin intermediul buffer-elor care devin
curnd supra-ncrcate (de exemplu, buffer-ul socket, buffer-ul aplicaie).
lucru fcut pana acum cu modificri software. Analizam acum dac
schimbarea arhitecturii hardware poate ajuta, fr modificri software ca
IO-Lite, fbufs i mmap.

123

Chiar i un cache de date obinuit poate ajuta la ndeprtarea unor


supraincarcari cnd copiem date de la locaia L la locaia M. Explicai de
ce. (Presupunem c locaia M este un buffer temporar care este n curnd
supranscris, ca si un buffer socket. Presupunem c dac un singur cuvnt
este scris ntr-un bloc cache mare, cuvintele rmase pot fi marcate ca
invalide.) Intuitiv, problema e dac exist un echivalent al copierii-lascriere (utilizat pentru a reduce copierea ntre spaiile adreselor virtuale)
folosind cache-uri de date.
Acum presupunem o proiectare diferita a cache-ului de date, unde un
cache este o mapare de la una sau mai multe adrese la acelai coninut.
Astfel, un cache s-a modificat de la o mapare unu-la-unu la o mapare mai
multe-la-unu. Presupunem un cache unde dou locaii pot pointa ctre
acelai coninut. O intrare cache poate fi (L,M,C), unde L i M sunt adrese
i C este coninutul comun al lui L i M. Un acces la memorie la oricare L
sau M va returna C. Care este avantajul fa de schema precedent ?
Totul e foarte ipotetic si ciudat. Comentai dezavantajele ideii din
cazul precedent. Multe cache-uri utilizeaz tehnica numit asociativitatea
multimilor/set associativity, unde o simpl funcie hash (de exemplu biii
de ordin inferior) este utilizat pentru a selecta un set mic de intrri cache,
pe care hardware-ul le parcurge n paralel. De ce ar putea adresarea
multipl per intrare cache s interacioneze slab cu cutarea prin
asociativitatea multimilor ?
2. Optimizri de nivel aplicaie pentru servere Web: sisteme de
operare ca Exokernel permit aplicaiei s particularizeze kernelul in
beneficiul su, fr a compromite securitatea altor aplicaii. O optimizare
interesant este combinarea TCP final FIN cu citirea ultimului segment de
date (optimizare permis de TCP).
De ce aceast optimizare ajut transferurile Web mici, obinuite?
De ce este aceast optimizare greu de realizat ntr-un server Web
obinuit i mai uor de realizat dac aplicaia este integrat n kernel, ca n
Exokernel?
Cum poate fi deplasat aceast optimizare ntr-un server Web obinuit
pasnd informaie prin interfa (P9) fr a compromite sigurana?
3. Copiere invers: emularea copierii-la-scriere are un grad de libertate
interesant (P13) pentru copiere paginilor-aliniate de date ntre dou
module (s zicem, sistem i aplicaie). Imaginai-v c dorii s copiai o
pagin parial dintr-o pagin de aplicaie, X, ntr-o pagin de sistem,Y.
Dac pagina este plin presupunei c putei schimba cele dou pagini
eficient. Presupunei c pagina parial are date utile D i o rmi R.
Dac volumul de date D este mic comparativ cu R e mai simplu s
copiem D n pagina destinaie Y. Dar dac D e mare (aproape toat
pagina) comparativ cu R, imaginai o strategie simpl pentru a minimiza
copierea. De reinut c dac pagina destinaie Y are alte date n restul de
pagin aceste date trebuie s rmn i dup copiere.
Care e criteriul de alegere ntre aceste dou strategii?

124

CAPITOLUL 6
CONTROLUL TRANSFERULUI

ntr-o companie plata unei facturi dureaz 6 luni. Factura ajunge prima
dat n pot, petrece ceva timp pe biroul secretarei, ajunge pe biroul celui
care ia principalele decizii i ajunge n sfrit la contabil. La procesarea
facturii, fluxul de control i urmeaz calea prin diferite straturi de
comand, fiecare adugnd un antet semnificativ. Un consultant de
management sugereaza scurtarea procesarii facturii elimininand straturile
intermediare cnd e posibil, i facand fiecare nivel ct se poate de selectiv.
Totui, fiecare nivel are cteva motive de a exista. Camera de pot mbin
serviciul de livrare a potei pentru toate departamentele companiei.
Secretara protejeaz eful de ntreruperi i elimin cererile nepotrivite.
eful trebuie eventual s decid dac factura merit pltit. Detaliile de
alocare a banilor sunt decise de contabil.
Un CPU modern, care proceseaz un mesaj de reea, trece prin nivele
similare de mediere. Dispozitivul (un adaptor Ethernet) ntrerupe CPU,
solicitand atenie. Controlul este pasat la kernel, care comaseaz
ntreruperile cand e posibil, face procesarea pachetului la nivelul reea i
planific s ruleze procesul aplicaie (un server Web). Recepia unui
singur pachet ofer o vedere limitat a contextului global de procesare. De
exemplu, un server Web va analiza cererea din pachetul de reea, va cuta
fiierul i va iniializa extragerea fiierului de pe disc. Cnd fiierul este
citit n memorie, este trimis napoi un rspuns coninnd fiierul cerut,
adugnd un antet HTTP.
A fost analizata reducerea supraincarcarii creata de operaiile cu date
(copiere, verificarea sumei de control). Va fi analizata reducerea
supraincarcarii creata de controlul implicat n procesarea unui pachet
(trimiterea/recepia unui pachet) si apoi la aplicatia de reea, serverul Web.
Numr
P8

Principiu
Utilizare
Trecerea dincolo de apelurile de sosire
Apel de plecare
utilizate n specificaii
Procesare pe mesaj, nu pe nivel
x-Kernel
P8
Protocol de legtur implementat cu cod
Potrivirea variantelor
P13
utilizator
Proces per acces la disc
Flash
P13
Modularizare pe sarcini, nu pe clieni
Server Web Haboob
P13
Mapri VM pentru evitarea copiilor
Flash
P4
n cache i aplicaie
Arbore bitmap
ufalloc() rapid
P15
Calculul incremental al vectorului de interes
select() rapid
P12a
Pasarea indiciilor de la protocol la select()
P9
Reinerea intereselor de-a lungul apelurilor
P12
Mutarea proteciei din kernel n adaptor
ADC-uri
P3c
Autorizarea adaptorului de ctre Kernel la
P2
iniializare
Intreruperi comasate de procese
Majoritatea OS
P13
Executarea protocolului n contextul
LRP
P2b
procesului de recepie
Figura 6.1. Tehnici de reducere a antetelor de control si principiile corespondente

125

6.1 Suprasarcina generata de control


Capitolul precedent a analizat suprasarcina cauzata de copiere ntr-un
server web (artnd potenialele copii implicate n rspunsul unui server la
o cerere get, fig.5.2). Figura 6.2 arat potenialele suprasarcini generate de
controlul dintr-un server Web mare care deservete mai muli clieni (sunt
ignorate aspectele transferului de date). E prezentata o vedere arhitectural
simplificat, axat pe interaciunea controlulului dintre adaptorul de reea
i CPU (prin intreruperi), ntre aplicaie i kernel (prin apelul de sistem) i
ntre diferite procese de nivel aplicaie sau thread-uri (prin apeluri la
planificator). Pentru simplitate e dat doar un CPU n server (multe servere
sunt multiprocesor) i un singur disc (unele servere utilizeaz discuri
multiple i discuri cu capete multiple). Serverul poate servi un numr mare
/mii de clieni concureni.
Pentru a nelege posibilele suprasarcini generate de control, implicate in
deservirea unei cereri GET, presupunem c clientul a trimis o cerere TCP
SYN, care sosete la adaptor, de la care este plasat n memorie. Kernelul
este apoi informat de aceast sosire prin intermediul unei ntreruperi.
Kernelul anun serverul Web prin deblocarea unui apel de sistem
anterior; aplicaia serverului Web va accepta conexiunea dac are resurse
sufiente.
Proces per grup; grupuri definite de structura aplicatiei

Client 1...Client 50

write()

read()

TCP/IP

Sistem fisiere

Bus

Pachet
receptionat

Client 51...Client 74

Client 75

Aplicatia
serverului
Web

FindActive()
Kernel
CPU

Memorie

Disc

Adaptor de retea
Retea
Figura 6.2. Antetul de control implicat in manipularea unei cereri GET la un server

n pasul 2 al procesrii, unele procese ale serverului parcurg cererile


Web. Presupunem c cererea este GET fisier1. n pasul 3, serverul trebuie
s localizeze fiierul pe disc, navigand prin structurile de directoare, care
pot fi deasemenea stocate pe disc. Odat fiierul localizat, n al 4-lea pas,
procesele server iniiaz un Read spre sistemul de fiiere (alt apel de
sistem). Dac fiierul este n cacahe-ul de fiiere, cererea Read poate fi
satisfcut repede; altfel, subsistemul de fiiere iniiaz o cutare pe disc
pentru a citi datele de pe disc. Dup ce fiierul este n buffer-ul aplicaiei,
126

serverul trimite rspunsul HTTP, prin scrierea conexiunii corespunztoare


(alt apel de sistem).
Pn acum, singurele suprasarcini generate de control par s fie apelurile
de sistem i ntreruperile, dar asta deoarece nu au fost examinate
ndeaproape structura reelei i codul aplicaiei.
n primul rand, pentru un cod structurat naiv, cu un singur process per
nivel n stiv, atunci suprasarcina generata de planificarea proceselor (de
ordinul sutelor de microsecunde) pentru procesarea unui pachet, poate fi
cu uurinta mult mai mare dect timpul de sosire al unui singur pachet.
Aceast potenial suprasarcina generata de planificare este artat n
figura 6.2 cu linie punctat spre codul TCP/IP din kernel. Din fericire, cele
mai multe coduri de reea sunt structurate mai mult monolitic, cu un antet
de control minim, dei unele tehnici mai inteligente pot face si mai bine.
n al doilea rnd, descrierea procesrii web s-a axat pe un singur client.
Deoarece presupunem un server Web mare ce lucreaz concurent pentru
mii de clieni, nu e clar cum ar trebui structurat acesta. La o extrema,
fiecare client este un process separat (sau thread) rulnd codul serverului
Web si concurena este maximizat (pentru c atunci cnd clientul 1
ateapt pentru o citire de pe disc, clientul 2 ar putea trimite pachete de
reea) cu costul mare al suprasarcinii generata de planificarea procesului.
Pe de alt parte, dac toi clienii sunt servii de un singur proces lansat
de evenimente, pierderea datorat schimbrii contextului este minimizat,
dar procesul unic trebuie s-i planifice intern clienii, pentru a maximiza
concurena si trebuie s stie cnd sunt gata citirile fiierului i cnd au
sosit datele de reea.
Multe sisteme de operare ofer un apel de sistem in acest scop, numit
generic FindActive () n figura 6.2. In Unix, numele sau este select (). Dar
daca un apel de sistem gol e costisitor din cauza depirii limitei kernelaplicaie, o implementare select() ineficient poate fi si mai costisitoare.
Dar raman intrebri provocatoare ca structurarea reelei i a codului
serverului n ideea minimizarii suprasarcinii generata de planificare i
maximizarii concurenei. Din acest considerent, figura 6.2 arat clienii
partiionai n grupuri, fiecare din acestea fiind implementat ntr-un singur
proces sau thread. De remarcat ca suprasarcina generata de planificare
tuturor clienilor ntr-un singur grup determina abordarea lansata-deevenimente, iar plasarea fiecarui client ntr-un grup separat determina
abordarea proces/thread -per-client.
Astfel, o implementare neoptimizat poate implica suprasarcini
considerabile datorate comutrii proceselor (sute de s ) dac aplicaia i
codul de reea sunt prost structurate. Chiar dac este eliminata
suprasarcina structurrii-proceselor, apelurile-sistem pot costa zeci de s ,
iar ntreruperile s (la o legtur Ethernet de 100 Gbps un pachet de 40
bytes poate sosi la PC la fiecare 3,2 s ).
Dat fiind faptul c legturile de 10 Gbps se raspandesc, trebuie acordat
mai mult atenie suprasarcinii generata de control. Dar, desi procesoarele
au devenit mai rapide, suprasarcina generata de control asociata cu
comutarea contextului, apelurile-sistem i ntreruperile nu s-au imbunatatit
in acelasi ritm. Unele progrese au fost fcute cu sisteme de operare mai
eficiente, ca Linux, dar progresul nu este suficient pentru a ine pasul cu
vitezele pe legtur crescnde.
127

6.2. Evitarea suprasarcinii generata de planificare n codul de reea.


Una din marile dificulti n implementarea unui protocol este de a
echilibra modularitatea (s implementezi un sistem mare pe pri i s faci
fiecare parte bine, independent de celelalte) i performana (s faci s
funcioneze bine intreg sistemul). S considerm exemplul simplu de
implementare a unei stive de reea. Modularitatea evident ar fi
implementarea ca procese separate a protocolului de transport (TCP), a
protocolului de rutare (IP), i a aplicaiei. In acest caz, fiecare pachet
recepionat ar trece prin cel puin dou comutari de context a procesului,
care sunt costisitoare.
Exist totui alternative care permit si modularitate i eficien. Fie o
aplicaie simpl (fig.6.3) care citete date de la tastatur i le trimite n
reea, utiliznd un protocol de transport. Cnd acestea sunt recepionate de
un receptor din reea sunt afiate pe ecran. Pe verticala sunt artate diferite
nivele de protocol, sus fiind protocolul aplicaie, apoi protocolul transport
i jos protocolul de reea. O implementare naiva a acestui protocol ar fi s
avem un protocol per seciune, adica trei procese i dou schimbri
complete de context per pachet primit/trimis.
Pot fi utilizate doar dou procese la transmitor i dou la receptor (pe
verticala) pentru a implementa stiva protocoalelor de reea. Procesele
receptorului sunt in stnga, iar procesele transmitorului in dreapta.
Astfel, transmitorul are un proces de manevrare a tastaturii/Keyboard
Handler care capteaza datele in/din tastatura, si cand are ceva date,
apeleaza transport-arm-to-send, care este o functie de nivel transport,
exportata spre procesul de manevrare a tastaturii si executata de acesta. In
acest moment, procesul de manevrare a tastaturii se poate autosuspenda
(comutarea contextului). Transport-arm-to-send spune protocolului de
transport ca acea conexiune doreste sa transmita date, dar el nu transfera
date.
Procesul transmisie-transport poate s nu transmit datele imediat, din
cauza limitrilor impuse de controlul fluxului. Dac dispar condiiile
impuse de controlul fluxului (datorit sosirii unor confirmri/ack),
procesul de transmisie, SendProcess va executa rutina transport-send
pentru aceast conexiune. Apelul send va chema mai inti protocolul
aplicaie care va exporta rutina display-get-data care furnizeaz de fapt,
aplicaiei datele. Acest lucru este avantajos, deoarece e posibil ca aplicaia
s fi recepionat mai multe date de la tastatur n timp ce protocolul de
transport este pregtit pentu a trimite, i se pot trimite deodat mai multe
date, cte incap ntr-un pachet. In final, n contextul aceluiai proces,
protocolul transport adaug un antet de nivel de transport i apeleaz
protocolul de nivel reea pentru a transmite efectiv pachetul.
La partea de receptor, pachetul este primit de ctre handlerul
ntreruperilor de recepie care, folosind o rutin de reea numit netdispatch, trebuie s gseasc crui proces s-i expedieze pachetul. Pentru a
afla procesul, net-dispatch apeleaz portul-primire-transport, care de fapt
este o rutin exportat de ctre nivelul transport, care citete numerele
portului din antet pentru a-i da seama care aplicaie (de ex. FTP) trebuie
s manevreze pachetul. Apoi se comut contextul i handlerul de recepie

128

rectig controlul i atenioneaz procesul de recepie, care execut


funciile de reea-transport, i n final codul aplicaiei pentru afiarea
datelor. De menionat c un singur proces execut toate nivele
protocolului.
Proces de
receptie

Manipulator
de receptie
intreruperi

afisare-date
primite

transport-date
primite

reteareceptie

Proces
transmitator
afisare-date

transportalocare port

reteaexpediere

transporttransmisie

Manipulator
tastatura
manipulator
tastatura

transportpregatit de
transmisie

reteatransmisie

Intrerupere
Figura 6.3. Implementarea unui protocol utilizand apeluri de transmisie

Ideea a fost neobinuit la acel timp din cauza prejudecii c nivelurile


ar trebui s foloseasc doar serviciile oferite de nivelurile inferioare;
apelurile ntre niveluri se numeau downcalls (cerute de specificaiile
protocolului). Dar nu sunt singurele alternative pentru implementrile
protocolului. In exemplul prezentat, pentru obinerea datelor sunt folosite
apelurile de tip upcalls (apeluri pentru afiarea datelor, display-get-data),
respectiv upcalls-uri pentru avizarea nivelurilor superioare (upcalls-uri
spre transport-get-port).
Dei upcalls-urile sunt de obicei folosite n implementri reale, probabil
nu este nici o diferen ntre upcalls-uri i procedura standard de apel, cu
excepia noutii n contextul implementrii reelei pe niveluri. Ideea mai
important, este a folosirii doar a unul/dou procese pentru procesarea
unui mesaj, fiecare proces constnd din rutine a dou sau mai multe
niveluri de protocol. Ideea a fost folosit n sisteme ca x-Kernel i n
folosirea reelor la nivelul utilizatorului, descris n seciunea urmtoare.
Ideea folosirii structurilor alternative de implementare, care conserv
modularitatea fr s sacrifice performana, este un exemplu al
principiului P8. Fiecare nivel din protocol poate fi implementat modular,
dar rutinele de tip upcall pot fi nregistrate de nivelele superioare cnd
sistemul pornete.
6.2.1. Aplicarea implementrii protocolului la nivel de utilizator.
Majoritatea mainilor moderne nu implementeaz fiecare nivel de
protocol n procese separate. In UNIX, toate codurile de protocol
(transport, reea, legtur de date) sunt manevrate ca parte a unui singur

129

proces nucleu/kernel-ul. Cnd un pachet sosete prin intermediul unei


ntreruperi, handlerul de ntreruperi noteaz sosirea pachetului, posibil l
memoreaz ntr-o coad i apoi planific un proces nucleu (printr-o
ntrerupere software) pentru procesarea propriu-zis a pachetului.
Procesul nucleu execut codurile de nivel legatur de date-reeatransport (folosind upcalls-uri); citind numerele porturilor de transport,
procesul nucleu afl aplicaia i o lanseaz. Astfel, fiecare pachet este
procesat, prin cel puin dou comutri; una de la contextul ntreruperii la
procesul nucleu manevrnd protocolul, i una de la procesul nucleu la
procesul care ruleaz codul aplicaiei (ex. Web, FTP).

Figura 6.4 Demultiplexarea unui pachet spre procesul destinaie final,


folosind un proces intermediar de demultiplexare, este costisitoare

Implementarea protocoalelor la nivel-utilizatorul e artat n procesul de


primire (fig.6.3) unde handlerul de protocol ruleaz n acelai process ca
aplicaia i poate comunica folosind upcalls-uri. Implementrile la nivelutilizator pot avea dou avantaje. Putem s nu folosim nucleul i s trecem
de la handlerul de ntreruperi direct ctre aplicaie, economisind o
comutare de context. Codul protocolului poate fi scris i depanat
(debugged) n spaiul-utilizatorul (programele de depanare functioneaz
bine n spaiul utilizatorului i nu prea bine n nucleu).
Solutia extrem aparine lui Mach, care a implementat toate protocoalele
n spaiul utilizatorului, iar protocoalelor au fost create mai generale dect
n fig 6.3. Astfel, cnd un handler de ntreruperi de recepie primete un
pachet, nu poate spune cu uurin care este procesul spre care s fie trimis
pachetul (deoarece implementarile la nivel-reea din procesul final conin
codul de demultiplexare). In particular, nu se poate face doar un apeltransport pentru a examina numerele portului (ca n exemplul din fig 6.3)
deoarece putem avea o mulime de protocoale de transport/reea posibile.
Initial, metoda naiv (fig 6.4) implica un proces de demultiplexare
separat, care s primeasca toate pachetele i s le examinaze determinnd
procesul destinaie final, spre care s expedieze apoi pachetul. Dar noul
proces de demultiplexare adaug de fapt comutatorul de context lips.
Ideea simpl de remediere a acestei situaii, este de a transmite o
informaie suplimentar (P9) prin interfaa aplicaie-nucleu, ca fiecare
aplicaie s poat informa ce fel de pachete dorete s proceseze (fig. 6.5).
De exemplu, o aplicaie de e-mail dorete toate pachetele cu cmpul
Ethernet-IP, al cror numr de protocol IP specific TCP, i avnd
numrul portului TCP destinaie 25 (aplicaie de mail implementeaz IP,
TCP i mail). Pentru a face aceasta, nucleul definete o interfa, care de
obicei este o form de limbaj de programare. De exemplu, primul a fost
CSPF (CMU Stanford Packet Filter), care specific cmpurile pachetelor
130

folosind un limbaj de programare bazat pe stive. Mai raspandit este BPF


(Berkeley Packet Filter) care folosete un limbaj de programare bazat pe
stive; un limbaj mai eficient este Path Finder.

Trebuie s fim ateni la transmiterea informaiei de la o aplicaie la


nucleu, ca aplicaiile greite sau maliioase s nu poat distruge nucleul.
Trebuie evitate acele aplicaii care genereaz coduri arbitrare nucleului, ce
duc la dezastre. Din fericire, exist tehnologii software care pot ncapsula
codurile strine, n sandbox, astfel nct s poat face ru doar n spaiul
de memorie alocat lor (sandbox-ul propriu). De exemplu, un limbaj bazat
pe stive poate fi pus s lucreze pe o stiv cu mrime specificat cu granie
controlate n fiecare punct. Aceast form de tehnologie a culminat recent
n executarea applet-urilor Java arbitrare primite din reea (applet-ul este
un program scris n Java, ce poate fi integrat n alt program, fiind
independent de limbajul de programare n care se integreaz appletul)
Dac pachetele sunt expediate de la handlerul de ntreruperi al nucleului
(folosind o serie de filtre de pachete) ctre procesul de recepie, acesta ar
trebui s implementeze stiva protocolului. Repetarea codului TCP/IP n
fiecare aplicaie ar genera foarte mult cod redundant. Astfel, n asemenea
sisteme, TCP este implementat ca o bibliotec partajat cu legturi (este
folosit o singur copie, spre care aplicaia are pointer, dar codul este
scris n modul reentrant, pentru a permite reutilizarea).
Aceasta nu e att de uor cum pare deoarece exist unele stri TCP
comune tuturor conexiunilor, chiar dac majoritatea sunt stri TCP
specifice unor conexiuni. Exist i alte probleme, deoarece ultima scriere
fcut de o aplicaie ar trebui s fie retransmis aplicaiei de ctre TCP,
dar aplicaia ar putea sa-i termine procesul dup ultima scriere. Oricum,
aceste probleme pot fi rezolvate. Au fost scrise implementri la nivel
utilizator cu performane excelente, care exploateaz gradul de libertate
(P13) adic protocoalele nu trebuie implementate n nucleu.
6.3. Evitarea n aplicaii, a suprasarcinii comutarii contextului
A fost tratata evitarea suprasarcinii dat de planificarea proceselor, la
procesarea unui singur pachet primit din reea, prin limitarea procesrii la
domeniul ntreruperilor (care poate de asemenea fi eliminat/diminuat
cnd se prelucreaz mai multe pachete) i expedierea pachetului ctre
procesul final aplicaie (care proceseaz pachetul). Daca procesul
destinaie ruleaz n acel moment, nu va exista o suprancrcare cauzat de

131

planificarea proceselor. Astfel, dup toate optimizrile, nu va aprea o


suprasarcin dat de controlul procesrii pachetului, asemanator cu
procesarea unui pachet primit, cu zero copii. Dupa analiza procesrii
complete a aplicaiei, vom vedea c apar alte copii redundante, cauzate de
interaciuni cu sistemul de fiiere.
Acum extindem analiza dincolo de procesarea unui singur pachet, pentru
a vedea cum proceseaz pachetele o aplicaie. Considerm din nou un
server Web tipic, important n practic (fig 6.2), care trebuie fcut mai
eficient. El manipuleaza un numr mare de conexiuni: un server proxy
TCP UDP de telefonie poate manevra 100 000 de conexiuni concurente.
Cum ar trebui structurat un server Web? Inainte, trebuie s nelegem
concurena posibil dintr-un singur server Web. Chiar cu un singur CPU i
un singur disc e posibil concurena. Presupunem c ntr-o procesare apare
o citire a fiierului 1, care nu se afl n memoria cache. Astfel CPU
initiaz o citire a discului, care necesit cteva milisecunde. Dar pentru
CPU, care poate rezolva o instruciune aproape la fiecare nanosecund,
timpul ar fi irosit dac ar atepta terminarea citirii. O posibilitate este
comutarea procesrii spre un alt client, n timp ce are loc citirea discului
pentru clientul 1. Aceasta permite ca procesarea discului pentru clientul 1,
s fie suprapus cu procesarea CPU pentru clientul 2.
Un al doilea exemplu de concuren CPU/dispozitiv (tipic pentru un
server Web) este suprapunerea dintre operaiile I/O ale reelei (realizat de
adaptor) i CPU. De exemplu, dup ce serverul accept o conexiune, poate
face pentru clientul 1 o citire a conexiunii acceptate. Citirea conexiunii
poate dura cteva milisecunde, deoarece clientul distant trebuie s trimita
pachetul, care trece prin reea, i n final e scris de adaptor pe socket-ul din
server corespunztor clientului 1.Comutarea la un alt client, face ca
procesarea reelei pentru clientul 1, s se suprapun cu procesarea CPU
pentru alt client. La fel, cnd se face o scriere ctre reea, scrierea poate fi
blocat din cauza lipsei de buffer-e la socket. Buffer-ul poate fi eliberat
mult mai trziu, cand sosesc confirmari ACK de la destinaie.
Pentru creterea eficienei unui server Web, trebuie exploatat orice
posibilitate de concuren. CPUul serverului Web trebuie s comute ntre
clieni, cnd un client este blocat n ateptarea unei I/O.
6.3.1. Procese per client
Pentru un programator, cea mai simpl cale de implementare a unui
server Web este s structureze procesarea fiecrui client ca un proces
separat, adic fiecare client se afl singur ntr-un grup separat (fig 6.2).
Planificatorul sistemului de operare comut ntre procese, repartiznd un
proces nou CPU-ului, cnd procesul curent este blocat. Majoritatea
sistemelor de operare moderne pot lucra cu mai multe CPU-uri, i s le
planifice astfel nct toate CPU-urile s aib o activitate util de cte ori
este posibil. Astfel, sistemul de operare jongleaza ntre clienti, n contul
aplicaiei, i nu aplicaia serverului Web. Dac de exemplu, clientul 1 este
blocat n ateptarea controlerului de disc, OS poate salva n memorie tot
contextul procesului-client 1, i s permit procesului-client 2 s ruleze
prin restaurarea contextului su din memorie.
Aceast simplitate cost. Comutarea ntre contextul i restaurarea
procesului este dificil, deoarece necesit citiri/scrieri din memorie n

132

registre pentru salvarea/restaurarea contextului. Contextul include


schimbarea tabelelor de pagini care sunt folosite (deoarece tabelele de
pagini sunt per proces); astfel, fiecare translatare a memoriei virtuale,
(memorat n memoria cache TLB), trebuie incarcat n cache. Si
coninutul memoriei cache de-date/de-instruciuni era cel util procesului
rezident anterior, astfel c aproape tot coninutul acestora e inutil noului
proces. Cnd toate apelurile la cache eueaz, performana iniial a
comutrii ntre procese poate fi slab.
Dar este dificil i naterea unui nou proces la sosirea unui nou client,
aa cum s-a fcut iniial n serverele Web. Din fericire, suprancrcarea
dat de distrugerea/crearea unui proces cnd un client vine/pleac poate fi
evitat prin precalcul i/sau tergerea relaxat a proceselor (P2
deplasarea n timp a calcului). Cnd un client termin sarcina de procesare
i conexiunea este terminat, n loc s distrugem procesul, el e returnat
stocului de procese n ateptare. Apoi procesul poate fi alocat urmtorului
client nou, ca s supravegheze cererea acestuia ctre server.
A doua problem este asocierea clienilor nou sosii cu procesele n
ateptare din stoc. Calea naiv trimite fiecare client nou la un proces de
asociere cunoscut, care-l asociaza cu un proces liber oarecare din stoc.
Proiectanii sistemelor de operare au realizat importana asocierii si au
inventat apelurile de sistem (apelul Accept din UNIX) pentru a face
asocierea cu alt cost decat cel al comutrii contextului proceselor.
Cnd se desfasoara un proces din stoc, el face un apel Accept i ateapt
la rnd ntr-o structur de date a kernel-ului. Cnd apare un nou client,
socket-ul su este trimis primului proces inactiv din rand. Astfel, kernel-ul
furnizeaz direct serviciile de asociere.
6.3.2. Fire de proces per client
Procesele sunt o solutie scump, chiar i dup eliminarea suprancrcrii
produs de crearea la cerere a unui proces i de asociere a proceselor.
Conexiunile lente pe arii extinse ctre servere sunt obinuite i sosirile la
un server Web cunoscut depaeste uor 2.000/sec, e obinuit ca un server
Web s aib 6000 de clieni concureni servii simultan.
Chiar dac procesele sunt deja create, comutarea ntre procese include
TLB-uri i pierderi n cache i necesit efort pentru salvarea i restaurarea
contextului. In plus, fiecare proces necesit memorie pentru stocarea
contextului, care poate lua din cea necesar cache-ului de fiiere.
O solutie intermediar este folosirea firelor de proces/thread sau procese
uoare. Ele au ncredere unele n altele, cum i trebuie n cazul n care ele
proceseaz clieni diferii n serverele Web. Putem nlocui procesarea
fiecrui client cu un fir de proces separat per client, toate protejate de un
singur proces (fig 6.6). Firele de proces folosesc aceeai memorie virtual,
deci intrrile TLB nu trebuie terse ntre firele de proces.
In plus, partajarea memoriei intre firele de proces implic faptul c toate
pot folosi un cache comun pentru a partaja i translatarile numelor
fiierelor i chiar fiierele. Pe de alt parte, cu un proces per client, adesea
cache-urile de fiiere nu pot fi partajate eficient de procese, deoarece
fiecare proces folosete un spaiu separat al memoriei virtuale. Astfel,
cache-urile de aplicaii pentru serverele Web vor suferi la capitolul

133

performan, deoarece fiierele comune multor clieni sunt replicate.


Serverul Web Apache e implementat n Windows cu cate un fir per client.
Suprasarcin generata de comutarea ntre firele de proces e mai mic
dect comutarea intre procese, dar este totui considerabil. In esen,
sistemul de operare trebuie nc s salveze/repun contextul per fir de
proces, ca stivele/registrele. De asemenea, memoria necesar pentru
stocarea strii per fir de proces sau per proces ia din cache-ul pentru
fiiere, care duce probabil la o rat de erori mai mare.

Fig 6.6 Dou alternative simple pentru structurarea unui server Web:(1) folosirea unui
singur proces (sau fir) per client; (2) implementarea unui proces unic care folosete un
manager de evenimente pentru a raporta procesului starea I/O a fiecrui client.

6.3.3. Planificatorul lansat de evenimente


Daca facilitile unui sistem de operare cu scop general sunt prea
scumpe, trebuie evitate. Daca planificarea firelor de procese, care permite
jonglarea ntre clieni fr o programare ulterioar, este prea scump,
aplicaia poate jongla ea nsi.
Aplicaia trebuie s implementeze propriul su planificator intern care s
jongleze cu strile fiecrui client. De exemplu, s-ar putea ca aplicaia s
trebuiasc s implementeze o main care s in minte c, clientul 1 este
n stadiul 2 (procesare HTTP) n timp ce clientul 2 este n stadiul 3
(ateptnd o I/O la disc), i clientul 3 este n stadiul 4 (ateptnd un buffer
de socket liber pentru a trimite urmtoarea parte a rspunsului).
Kernel-ul are un avantaj fa de un program aplicaie, deoarece vede
toate evenimentele I/O care se ncheie. Dac ntr-o implementare per fire
de proces, clientul 1 este blocat ateptnd o I/O, cnd controlerul de disc
ntrerupe CPU ca s-i spun c datele sunt acum n memorie, kernel-ul
poate s planifice firul de proces al clientului 1.
Astfel, dac aplicaia serverului Web i planifica singur clienii,
kernel-ul trebuie s paseze informaie (P9) ctre API, pentru a permite
aplicaiei per un singur fir de proces s vad ncheierea tuturor operaiilor
de I/O pe care le-a iniiat. Multe sisteme de operare ofer aceast facilitate,
134

FindActive() (fig. 6.2). De exemplu, Windows NT 3.5 are un mecanism


IOCP (I/O completion port), de verificare a terminrii I/O i UNIX
furnizeaz funcia select() de apel la sistem. Aplicaia st ntr-o bucl care
apeleaz funcia FindActive(). Presupunnd c tot timpul este ceva de
fcut la partea clientului, apelul va returna o list de descriptori I/O a
activitii respective (n exemplu datele fiierului 1 sunt acum n memorie,
conexiunea 5 a primit date). Cnd serverul Web proceseaz aceti
descriptori activi, revine cu un alt apel FindActive().
Dac exist mereu cate un client care necesit atenie (tipic pentru un
server aglomerat), nu trebuie s abandonam invocand costurile comutrii
contextului cnd se jongleaz ntre clieni. Asemenea jonglri necesit ca
aplicaia s aib o main de stri care s-i permit s comute singur
contextul ntre numeroasele cereri concurente. O astfel de planificare
intern specific aplicaiei e mai eficient dect apelarea planificatorului
extern de uz general, deoarece aplicaia tie setul minim de contexte care
trebuie salvat cand se mut de la client la client.
Serverul Zeus i serverul original Harvest/Squid proxy cache folosesc
modelul lansat de evenimentele unui singur proces. Fig. 6.6 arat
arhitectura serverelor multiproces (i fire de proces multiple) comparativ
cu arhitectura lansat de evenimente.
6.3.4. Serverele lansate de evenimente, cu procese ajuttoare
In principiu, un server lansat de evenimente poate s extrag tot atta
concuren din fluxul de operaii a clientilor ca i un server multiproces
sau multifir. Dar multe sisteme de operare, ca UNIX, nu au suportul
adecvat pentru operaii de disc care nu se blocheaz.
De exemplu, dac un server lansat de evenimente vrea s fie eficient,
cnd d o comand read() pentru un fiier care nu este n cache, ar vrea ca
funcia read() s rspunda imediat c nu este disponibil, astfel ca funcia
read() s fie fr blocare, ceea ce ar permite serverului s se mute ctre
ali clieni. Mai trziu, cnd se termin operaia de I/O a discului, aplicaia
poate fi regsit folosind urmtorul apel FindActive(). Dar dac apelul
read() se blocheaz, bucla principal a serverului va atepta milisecundele
necesare incheierii operaiei de I/O a discului.
Dificultatea este c multe sisteme de operare ca Solaris i UNIX permit
operaii de read(), write() nonblocante pentru conexiunile reelei, dar care
se pot bloca cnd sunt folosite pentru fiierele de pe disc. Aceste sisteme
de operare permit alte apeluri sistem asincrone pentru I/O cu discul, dar
care nu sunt integrate n apelul select() (echivalentul n UNIX a
FindActive() ). In asemenea sisteme de operare trebuie s se aleag ntre
pierderea concurenei, prin blocarea operatiei de I/O a discului, i trecerea
dincolo de modelul cu un singur proces.
Serverul de Web Flash merge dincolo de modelul cu un singur proces
pentru maximizarea concurenei. Cnd trebuie citit un fiier, procesul
principal de pe server nti testeaz dac fiierul este n memorie, folosind
fie un apel standard de sistem, fie blocand paginile fiierelor cache, pentru
ca procesele serverului s tie ntotdeauna care fiiere sunt n cache. Daca
fiierul nu este n memorie procesul principal din server instruiete un
proces ajuttor/helper pentru a face citirea de disc, posibil blocant. Cnd

135

procesul ajuttor a terminat, comunic cu procesul principal de pe server,


printr-o form de comunicare interprocese, precum pipe.
Spre deosebire de modelul mutiproces, procesele ajuttoare sunt
necesare doar pentru fiecare operaie concurent pe disc, i nu pentru
fiecare cerere client concurent. Modelul exploateaz un grad de libertate
(P13), observnd c mai sunt i alte alternative interesante ntre un singur
proces i un proces per client.
In afara de citirea fiierelor, procesele helper mai pot fi folosite la cutri
n directoare pentru localizarea fiierelor pe disc. In timp ce Flash menine
un cache, care face legtura ntre numele cilor directoarelor i fiierele de
pe disc, dac exist cumva o greeal a cache-ului, atunci trebuie cutat
prin structurile directoarelor de pe disc. Deoarece asemenea cutari de
directoare se pot bloca, sunt de asemenea necesare proceselor helper.
Crescnd cache-ul pentru numele de ci, crete de asemenea consumul de
memorie, dar reducerea ratei de erori a cache-ului poate reduce numrul
de procese ajuttoare necesare i s scad necesarul global de memorie.
Procesele helper ar trebui s evite ntrzierea crerii unui proces, de
fiecare dat cnd un process helper este invocat. Cte procese helper
trebuie s fie? Prea puine cauzeaz pierderi de concuren i prea multe
cauzeaz pierderi de memorie. Solutia n Flash este crearea dinamic i
distrugerea proceselor helper n funcie de ncarcare.
6.3.5 Structurarea bazat pe sarcini/task-uri
In figura 6.7 sus, e descrisa abordarea lansata-de-evenimente mbogit
cu procese helper. E similara cu manevrarea simpl lansata de evenimente,
figura 6.6 jos, cu exceptia proceselor helper. Exist cteva probleme la
arhitectura lansat de evenimente cu procese helper.
Complexitatea: proiectantul aplicaiei trebuie s tie s foloseasc
maina de stri pentru manevrarea cererilor clientului fr ajutor.
Modularitate: codul pentru server e scris ca un singur modul.
Serverele Web sunt foarte rspndite, dar sunt i multe servicii Web care
pot utiliza prile de cod similare (ca de exemplu cele pentru acceptarea
conexiunilor). Abordarea i mai modularizat permite reutilizarea codului.
Suprancrcarea cauzata de control: productorii serverelor Web
trebuie sa fac fa variaiilor considerabile a sarcinilor provenite de la
numrul imens de clieni, fiind esential ca serverul s-i continue
activitatea n suprasarcina (fr s piarda date), tratnd corect toi clienii.
Ideea principal n arhitectura multinivel a proceselor acionate de
evenimente este exploatarea gradului de libertate (P13) n descompunerea
codului. n locul descompunerii orizontale de ctre client n fire de
execuie, ca la arhitectura cu fire multiple, sistemul serverului este
descompus vertical de ctre sarcini, la fiecare ciclu de cerere a clientului
(fig. 6.6, jos). Fiecare nivel poate fi controlat de unul sau mai multe fire.
Astfel, modelul pe niveluri poate fi considerat o rafinare a modelului
simplu a proceselor lansate de evenimente, deoarece el atribuie un fir
principal i un fir posibil fiecrui nivel de procesare a serverului. Apoi,
nivelurile comunic prin cozi de ateptare i, la fiecare etaj, poate fi fcut
un control mai rafinat al suprancrcrii.

136

Fig. 6.7 Dou propuneri de arhitecturi Web ( diferite de cele din fig. 6.6) : (3) procese
lansate de evenimene (event-driven) si procese ajutatoare; (4) arhitectura pe niveluri a
proceselor lansate de evenimente

6.4 Selecia rapid


Pentru a justifica problema seleciei rapide, se prezint o problem de
performan din literatur, apoi e descrisa utilizarea i implementarea in
UNIX a apelului select(), se face o analiz a suprancrcrii, i se aplic
principiile de implementare sugernd diverse imbuntiri. E descris o
mbuntire, n ideea c API nu poate fi schimbat si se propune o soluie
mai bun care implic ns multe schimbri ale API.
6.4.1 Probleme ale serverului
Evitarea suprancrcrii generat de planificarea proceselor este o
problem important ntr-un server Web. De exemplu, un server eventdriven reduce complet suprancarcarea dat de planificarea proceselor prin
utilizarea unui singur fir pentru toi clienii, dup care se utilizeaz un apel
FindActive() la fel cu select(). Acum, proxy-ul Web CERN utilizeaz un
proces per client, iar serverul Web Squid utilizeaz o implementare eventdriven. Msurtorile fcute ntr-un mediu LAN au artat c proxy-ul Web
Squid e mai performant dect serverul CERN. Testele ntr-un mediu WAN
au artat c aici nu exist nici o diferen ntre performana serverelor
CERN i Squid. De ce ?
Problema a fost elucidat dupa ce s-a remarcat c la acelai trafic(ca
numr de conexiuni pe secund) cu ct ntrzierea tur-retur dintr-un mediu
WAN e mai mare, cu att e mai mare numrul de conexiuni concurente din
WAN. Fie un mediu WAN cu un timp mediu de 2 secunde per conexiune i
un server Web cu traficul de 3000 conexiuni pe secund. Legea lui Little
(teoria cozilor de ateptare) spune c numrul mediu de conexiuni simultane
este dat de produsul acestora, adic 6000.

137

Dar ntr-un mediu LAN, cu ciclul de ntrziere de 2 msec, numrul mediu


de conexiuni simultane scade la 6. Dac numrul de conexiuni pe secund
rmne la fel, n WAN o mare parte din conexiuni trebuie s fie n starea
idle(ateptnd rspunsuri) n orice moment.
Dou cauze principale de suprancrcare au fost apelurile de sistem
folosite de ctre serverul event-driven:
select(): serverele event-driven rulnd pe UNIX utilizeaz apelul de
select() pentru apelul FindActive(). Experimentele fcute arat c mai mult
de jumtate din CPU este utilizat pentru kernel i funcii nivel-utilizator
select() cu 500 conexiuni;
ufalloc(): de asemenea, serverul are nevoie s repartizeze cel mai mic
descriptor nealocat pentru socket-uri sau fiiere noi. Acest apel simplu
consum a treia parte din timpul CPU.
Performanele ufalloc() pot fi uor explicate. In mod normal, gsind un
descriptor liber, acesta poate fi uor implementat utiliznd o lista liber de
descriptori. Din pcate, UNIX cere alegerea celui mai mic descriptor
neutilizat. De exemplu, daca lista curent de descriptori nealocai are
elementele (nesortate) 9, 1, 5, 4, 2, atunci nu poate fi gsit 3, ca fiind cel mai
mic numr nealocat, fr parcurgerea ntregii liste nesortate. Din fericire, o
simpl schimbare n implementarea kernel (P15 utilizarea unor structuri de
date eficiente) poate reduce aproape la zero suprasarcina.
6.4.2 Utilizarea select() i implementarea existent
Presupunnd ca suprancarcarea generat de ufalloc() poate fi
minimizat uor prin schimbarea implementrii kernel-ului, este important
s ameliorm strangulrile rmase, cauzate de implementarea select() ntrun server event-driven. Deoarece cauzele problemei sunt mai complexe,
sunt revzute utilizarea si implementarea select() pentru a nelege
diferitele surse de suprancarcare.
Parametri
Select() este numit:
-Input (de intrare): o aplicaie cheam select() cu trei bitmap-uri de
descriptori (unul din care se citeste, unul n care se scrie i unul din care se
extrag excepiile) i o valoare de timeout.
-Interim (provizorie): aplicaia e blocat dac nu e nici un descriptor
pregtit.
-Output (de iesire): cnd apare ceva de interes, apelul returneaz
numrul descriptorilor pregtii (transmis ca valoare de ntreg) i lista
specific a descriptorilor fiecrei categorii (transmis ca referin, prin
supranscrierea bitmap-urilor de intrare).
Utilizarea ntr-un Server Web
Dup parametrii apelului select(), este important s nelegem cum poate
fi acesta utilizat de ctre un server Web lansat de evenimente. Un exemplu
de utilizare este prezentat n cele ce urmeaz. Firele aplicaiei serverului
stau ntr-o bucl cu trei componente majore:
Iniializare: primele zero-uri ale aplicaiei sunt scoase n afara
bitmap-urilor i se seteaz bitii pentru descriptorii de interes n vederea
scrierii/citirii. Aplicaia serverului ar putea dori s citeasc din descriptorii
fiierului i s scrie/citeasc socket-urile reelei deschise clienilor.

138

Apel:

apoi aplicaia apeleaz select() cu bitmap-urile construite la


pasul anterior, i se blocheaz dac nici un descriptor nu e pregtit n
momentul apelului; dac expir timpul (timeout), aplicaia face o
procesare de excepie.
Rspuns: dup ce apelul revine, aplicaia trece liniar prin bitmapurile returnate i invoc antetele de citire i scriere adecvate, pentru
descriptorii corespunztori poziiilor cu bii setai.
Costurile construirii bitmap-urilor, din pasul 1 i scanrii lor din pasul 3,
sunt suportate de ctre utilizator, dei ele sunt atribuibile direct costurilor
de pregtire a rspunsului la apelul select().
Implementare
Este important s nelegem implementarea select() n kernel-ul unei
variante tipice de UNIX. Kernel-ul face urmtoarele (adnotat cu surse de
suprancrcare):
Curare: kernel-ul ncepe cu folosirea bitmap-urilor, transmise ca
parametri, pentru a construi un sumar cu descriptorii marcai n cel puin
unul din bitmap-uri (numit setul selectat).
Acest lucru necesit o cutare liniar printre bitmap-urile de dimensiune N, indiferent
de numrul de descriptori de care aplicaia este interesat.

Verificare: apoi, pentru fiecare descriptor din setul selectat, kernel-ul

verific dac descriptorul este pregtit; dac nu, ncarc ID-ul firului
aplicaiei n coada de ateptare selectat a descriptorului. Kernel-ul pune
n adormire firul aplicaiei apelante, dac nu exist descriptori pregtii.
Acest lucru necesit investigarea tuturor descriptorilor selectai, indiferent de ci sunt
pregtii de fapt. Acest pas este mai costisitor dect simpla scanare a bitmap-ului.

Reluare: cnd descriptorul devine pregtit din cauza unei operaii de


I/O (de exemplu, un pachet sosete la un socket, de la care serverul
ateapt date), modulul de I/O al kernel-ului i verific coada de ateptare
selectat i trezete toate firele care ateapt un descriptor.
Acest lucru implic o suprancrcare cauzat de planificare, care pare inevitabil fr
un apel selectiv sau ateptare de ocupat.

Redescoperire:

in final, select() redescoper lista descriptorilor


pregtii fcnd o scanare a tuturor descriptorilor selectai pentru a vedea
care a devenit pregtit n timpul n care select() fusese pus n adormire i
trezit apoi. Aceasta necesit repetarea acelorai verificri costisitoare de
la pasul 2.
Verificrile se repet dei modulul de I/O tie care descriptori devenisera pregtii, dar
nu informeaz implementarea select().

6.4.3 Analiza operaiei select()


Se descriu posibilitile de optimizare a implementrii operaiei select()
existente, i apoi se sugereaza strategii de mbuntire a performanei
folosind principiile.
Risipa evidenta n implementarea select()
Principiul P1 urmrete nlturarea risipei evidente, dar pentru aplicarea
lui trebuie gsite sursele risipei evidente n implementarea select(). Pentru
fiecare surs de risip, cutm o cauza.
1.Recreerea interesului pentru fiecare apel: acelai bitmap este folosit
pentru intrare i ieire. Aceasta suprancrcare determin aplicaia s
reconstruiasc bitmap-urile din zona de lucru (scratch), dei poate o
intereseaz n majoritate aceiai descriptori la apelurile consecutive spre

139

select().De exemplu, dac doar 10 bii se schimb la fiecare apel ntr-un


bitmap de dimensiune 6000, aplicaia tot trebuie s treac prin cei 6000
bii pentru a seta fiecare bit dac e nevoie.
Trebuie nvinuit fie interfaa API, fie lipsa calculului incremental in aplicaie.
2.Reverificarea strii dup fiecare reluare: nici o informaie nu trece, de
la modulul protocolului (care trezete un fir adormit de pe socket) spre
apelul select() invocat cnd firul i reia activitatea. De exemplu, dac
modulul TCP primete date pe socket-ul 9, pe care doarme firul 1,
modulul TCP se va asigura mai nti ca firul 1 s-a trezit; dar nici o
informaie nu-i e dat firului 1 la trezire. Astfel firul 1 trebuie s reverifice
toate socket-urile selectate pentru a stabili dac socket-ul 9 are ntr-adevar
date, dei modulul TCP tia sigur acest lucru cnd l-a trezit.
Trebuie nvinuit implementarea kernel-ului.

3.Kernel-ul reverific disponibilitatea descriptorilor anterior


nepregtii: aplicaia server-ului Web e interesat de un socket pn la
eecul/sfritul conexiunii. Atunci de ce se repet testele pentru
disponibilitate dac nu s-a observat nici o schimbare a strii? Presupunem
de exemplu, c socket-ul 9 este o conexiune spre un client distant, cu o
ntrziere de 1 sec pentru trimiterea/ recepia pachetelor. Presupunem c la
timpul t este trimis o cerere la un client prin socket-ul 9 i serverul
ateapt rspuns, care sosete la t+1 secunde. Presupunem c n intervalul
dintre t i t+1, firul serverului apeleaz select() de 15000 ori. De fiecare
dat cnd e apelat select(), kernel-ul face o verificare laborioas a socketului 9 pentru a determina dac au sosit date sau nu. In schimb, kernel-ul
poate deduce aceasta, din simplul fapt ca socket-ul era verificat la timpul t
i nici un pachet din reea nu a fost recepionat de la acest socket de la
momentul t. Astfel 15000 de verificri nefolositoare i costisitoare pot fi
evitate; cnd pachetul sosete n sfarsit, la timpul t+1, modulul TCP poate
transmite informaia pentru a reporni verificarea acestui socket.
Trebuie nvinuit implementarea kernel-ului

4.Bitmap-uri liniari n raport cu dimensiunea descriptorului: Att


kernel-ul ct i utilizatorul trebuie s scaneze bitmap-urile, proporional cu
dimensiunea descriptorilor posibili, i nu cu volumul de munc util. De
exemplu, dac sunt 6000 de descriptori posibili, un server Web ar trebui s
trateze un vrf de sarcin, bitmap-uri cu lungimea 6000. Presupunem c n
timpul unei perioade oarecare sunt 100 de clieni concureni, din care doar
10 sunt pregtii n timpul fiecrui apel select(). Att kernel-ul ct i
aplicaia scaneaz i copiaz bitmap-uri de dimensiune 6000, dei
aplicaia este interesat doar de 200 de bii si doar 10 bii sunt setai la
revenirea fiecrui select().
Trebuie nvinuit API.

Strategii i principii pentru a repara select()


Odat stabilite cauzele risipei, pot fi aplicate strategii simple, utiliznd
principiile algoritmice:
Recrearea interesului pentru fiecare apel: Consider schimbarea APIului (P9) pentru a utiliza bitmap-uri separate pentru intrare i ieire. Sau
menine API-ul i folosete calculul incremental (P12a).
Reverificarea strii dup fiecare reluare: Paseaz informaia ntre
modulele protocolului care tiu cnd un descriptor este pregtit i modulul
selectat (P9).

140

ai reverificri kernel a disponibilitii descriptorilor tiui a fi


nepregtii. Kernel i menine starea n timpul apelurilor, asfel nct nu
trebuie s reverifice descriptorii tiui a fi nepregtii (P12a, utilizeaz
calculul incremental)
S foloseti bitmap-uri liniari n raport cu mrimea posibil i nu cu
mrimea descriptorului: Schimb fundamental API-ul pentru a evita
necesitatea interogrii asupra strii tuturor descriptorilor reprezentai de
bitmap-uri (P9).
6.4.4 Accelerarea select() fr schimbarea API
Vom vedea cum s eliminam primele trei, din patru, cauze de risip,
prezentate anterior.
1.Evitarea reconstruirii bitmap-urilor din scratch-uri: Codul aplicaiei
este schimbat pentru a folosi doua bitmap-uri de descriptori, de care este el
interesat. Bitmap-ul A este folosit pentru memorarea pe termen lung, i
bitmap-ul B este folosit ca parametru curent transmis ca referin la
select(). Astfel n bitmap-ul A, dintre apelurile spre select(), doar civa
descriptori care s-au schimbat trebuie s fie actualizai. Inainte de a apela
select(), bitmap-ul A este copiat n bitmap-ul B. Deoarece copierea se face
per cuvnt este mai eficient dect inspecia laborioas bit cu bit a bitmapului. In esen, noul bitmap este calculat incremental (P12a).
2. Evitarea reverificrilor tuturor descriptorilor cnd select() se
activeaza: Pentru a evita aceasta suprancrcare, implementarea kernelului este modificat astfel nct fiecare fir pstreaz un set de indicaii H,
care nregistreaz socket-urile care au devenit pregtite de la ultima dat
cnd firul a apelat select(). Protocolul sau modulele de I/O sunt
modificate astfel nct atunci cnd sosesc date noi (pachete din reea,
terminarea unor operaii de I/O cu discul), indexul descriptorului
corespunztor este scris n setul de indicaii al tuturor firelor, aflate n
coada de ateptare selectat pentru acel descriptor. In sfrit, dup ce un fir
se trezete n select(), doar descriptorii din H sunt verificai. Esena acestei
optimizri este pasarea de indicaii interfeelor dintre niveluri (P9).
3. Evitarea reverificrii descriptorilor tiui a fi nepregtii: Observaia
fundamental este aceea c un descriptor care ateapt date nu trebuie s
fie verificat pn nu apare o notificare asincron (de exemplu, descriptorul
este plasat n setul de indicaii H descris anterior). Este clar c, orice
descriptori proaspt sosii (de exemplu, socket-uri nou deschise) trebuie
verificai. A treia idee mai subtil este ca aplicaia poate citi doar 200
bytes, chiar i dup ce datele din reea au sosit la un socket (de exemplu,
1500 bytes). Astfel, un descriptor trebuie verificat pentru disponibilitate,
chiar dup sosirea primei date, pn cnd nu mai rmn date (de exemplu,
aplicaia citete toate datele) pentru a declara disponibilitatea.
Pentru a implementa aceste idei, pe lng setul de indicaii H,
implementarea kernel-ului mai pstreaz nc dou seturi. Primul este
setul de interes I, cu toi descriptorii de care firul este interesat. Al doilea
este un set de descriptori R cunoscui a fi pregtii. Setul de interes I
reflect interesul pe termen lung; de exemplu, un socket este plasat n I
cnd este menionat prima dat ntr-un apel select() i este nlturat doar
cnd socket-ul este deconectat sau refolosit. S notm cu S setul transmis

141

la select(). Atunci I este actualizat la Inou=Ivechi S. Acesta incorporeaz


descriptorii proaspt selectai fr a pierde descriptorii anterior selectai.
Apoi, kernel-ul verific doar descriptorii care sunt n Inou , dar sunt fie:
(i) n setul de indicaii H fie (ii) nu sunt n Ivechi sau (iii) n setul vechi de
descriptori pregtii Rvechi. Aceste trei afirmaii reflect cele trei categorii
discutate n urm cu dou paragrafe. Ele reprezint fie activitatea recent a
fiecruia, interesul proaspt declarat sau datele neconsumate rezultate
dintr-o activitate prioritar. Descriptorii gsii a fi pregtii n urma
verificrii sunt nregistrai n Rnou. La sfrit, apelul select() returneaz
utilizatorului elementele din Rnou S. Acest lucru se ntmpl deoarece pe
utilizator l intereseaz doar disponibilitatea descriptorilor specificai n
setul selectat S.
Ca exemplu, socket-ul 15 poate fi verificat cnd e menionat pentru
prima dat n apelul select() i deci intr n I; socket-ul 15 poate fi verificat
apoi, cnd un pachet de 500 bytes sosete din reea, ceea ce face ca socketul 15 s intre n H; n final, socket-ul 15 poate fi verificat repetat ca parte a
lui R pn cnd aplicaia consum toi cei 500 bytes, punct n care socketul 15 prsete R (P12,suplimentarea strilor pentru a crete viteza) st la
baza acestei optimizri. Optimizarea menine starea peste apeluri (P12)
pentru a reduce verificrile redundante.
6.4.5. Accelerarea procedurii select( ) schimbnd API
Tehnica descris mbuntete considerabil performana prin eliminarea
din select() a primelor trei surse (principale) de suprancrcare. Oricum,
funcioneaz asa, prin pstrarea unei stri suplimentare (P12) sub forma a
nc trei seturi de descriptori (H, I si R) care sunt meninui, de asemenea
ca i bitmap-uri. Aceasta, mpreun cu setul selectat S transmis la fiecare
apel, necesit scanarea i actualizarea celor patru bitmap-uri, separat.
Situaia n care sunt prezente un numr mare de conexiuni, dar doar
cteva sunt active la un moment dat, implic o mic suprancrcare,
proporional cu numrul total de conexiuni i nu cu numrul de
conexiuni active. Aceasta este a patra surs de risip enumerat anterior
i pare inevitabil cu API-ul existent.
Mai mult, precum am vzut anterior, chiar i procedura select() rapid
modificat verific un descriptor de mai multe ori pentru fiecare
eveniment, ca sosirea unui pachet (dac aplicaia nu consum toate datele
odat). Asemenea controale adiionale sunt inevitabile deoarece select()
furnizeaz starea fiecrui descriptor.
Dac ne uitm mai ndeaproape la interfa, ceea ce aplicaia cere n
esen, este s fie informat de fluxul evenimentelor (terminarea unei I/O,
sosirea unui pachet de reea) care-i schimb starea. Notificrile lansate de
evenimente apar pentru a putea nltura neajunsuri evidente ce rezult din
utilizarea anterioar.
Notificare asincron: dac aplicaia este anunat imediat ce un
eveniment apare, ar aprea ncrcri suplimentare, i ar fi dificil de
programat. De exemplu, atunci cnd o aplicaie servete socket-ul 5, un
pachet ar putea sosi la socket-ul 12. Intreruperea aplicaiei, pentru a o
informa de noul pachet, poate fi o idee proast.

142

Rata excesiv a evenimentelor: aplicaia e interesat de evenimentele


care cauzeaz schimbarea strii, nu de fluxul lor neprelucrat. Pentru un
transfer Web mare, mai multe pachete pot ajunge la un socket i aplicaia
ar dori s obin o notificare pentru ntregul lot, nu cte una pentru fiecare
pachet. Suprasarcina generat de fiecare notificare este echivalent cu
memorarea fiecrei notificri, n termeni de costuri de comunicaie(CPU).
Principiul P6 sugereaz proiectarea rutinelor specializate eficiente
pentru a evita strangulrile.
Interogarea sincron: ca i n cazul apelului select() original,
aplicaia poate interoga evenimentele n curs. Spre exemplu, n exemplul
anterior, aplicaia continu s serveasc socket-ul 5 i toate celelalte
socket-uri active nainte s ntrebe (i s i se spun despre) evenimente ca
de pild sosirea pachetului la socket-ul 5.
Comasarea evenimentelor: dac, n timp ce un prim eveniment a
fost introdus ntr-un ir pentru notificare, apare un al doilea eveniment
pentru descriptor, cea de-a doua notificare este omis. Astfel per
descriptor, acolo poate fi cel mult o notificare de eveniment important.
Utilizarea noului API este direct dar nu prea conform cu stilul
aplicaiilor ce foloseau vechiul select() API. Aplicaia st ntr-o bucl, n
care are nevoie de sincronizare pentru setul urmtor de evenimente, i
intr n repaus n caz contrar. Cnd apelul revine, aplicaia trece prin
fiecare notificare de eveniment i invoc antetele potrivite de scriere sau
citire. Implicit, setarea registrelor unei conexiuni intereseaz descriptorul
corespunztor, n timp ce deconectarea conexiunii nltur descriptorul din
lista de interes.
Implementarea: fiecrui fir i este asociat un set de descriptori de care
este interesat. Fiecare descriptor (socket de exemplu) pstreaz o lista de
mapare inversa a tuturor firelor interesate de descriptor. In activitatea de
I/O (de exemplu, sosirea datelor la un socket), modulul I/O utilizeaz
propria sa lista de mapare invers, pentru a identifica toate firele posibil
interesate. Daca descriptorul este n setul de fire interesat, un eveniment de
notificare este adugat irului evenimentelor n curs al acelui fir.
Un bitmap per fir simplu, un bit per descriptor, este utilizat sa
nregistreze faptul c un eveniment este n ateptare n ir i s evite
multiplele notificri de evenimente per descriptor. In final, cnd aplicaia
cere urmtorul set de evenimente, acestea sunt returnate din irul de
ateptare.
6.5 Evitarea apelurilor de sistem
Omitem discuia referitoare la select(), i relum discuia despre lucrul
cu reeaua la nivelul utilizatorului. Se pare c am eliminat kernel-ul din
tablou prin recepia i trimiterea unui pachet, dar din pcate nu e aa. Cnd
o aplicaie vrea s trimit date, trebuie cumva sa anune adaptorul unde se
afl acele date.
Cnd o aplicaie vrea s primeasc date, ea trebuie sa specifice bufferele unde se vor scrie pachetele de date primite. In Unix acest lucru se face
utiliznd apelurile de sistem, n care aplicaia comunica kernel-ului despre
datele pe care ar vrea s le trimit i buffer-ele pe care ar vrea s le
primeasc. Chiar dac implementm protocolul n spaiul utilizatorului,

143

kernel-ul trebuie s serveasc aceste apeluri de sistem (care pot fi


costisitoare) pentru fiecare pachet trimis sau primit.
Acest lucru pare a fi necesar deoarece pot fi cteva aplicaii care primesc
i trimit date de la un adaptor comun; din moment ce adaptorul este o
resurs partajat, este de neconceput pentru o aplicaie s scrie direct n
registrele dispozitivului unui adaptor al reelei fr ca kernel-ul s verifice
utilizarea eronat sau ruvoitoare.

Sunt posibile i alte soluii. In figura 6.8 vedem c dac o aplicaie


vrea s seteze valoarea unei variabile X la 10, nu face de fapt o chemare a
kernel-ului. Dac ar trebui s fac asta, atunci fiecare citire si scriere s-ar
face foarte lent. In loc de asta, hardware-ul gsete pagina virtual a lui X,
o translateaz ntr-o pagin fizic (sa zicem 10) prin intermediul TLB, i
apoi permite accesul direct la ea atta timp ct aplicaia are pagina 10
mapat n memoria sa virtual.
Dac pagina 10 nu este mapat n memoria virtual a aplicaiei,
hardware-ul genereaz o excepie, care determin kernel-ul s intervin,
stabilind de ce este un viol al accessului la pagina acolo. Kernel-ul a fost
implicat n setarea memoriei virtuale pentru aplicaie (doar lui i se permite
sa fac asta, din motive de securitate) i poate fi implicat dac aplicaia
violeaz accesul la paginile sale setate de kernel. De altfel, kernel-ul nu
este implicat n orice acces. Putem spera la o abordare similar n cazul
accesului aplicaiei la memoria adaptorului, pentru a evita apeluri inutile la
sistem (P1) ?
Pentru a vedea dac acest lucru este posibil trebuie s examinm mai
atent ce informaie trimite i receptioneaz o aplicaie, de la un adaptor.
Sigur c trebuie s prevenim ca aplicaii incorecte sau ru intenionate s
defecteze alte aplicaii sau chiar kernel-ul nsui. Figura 6.9 arat o
aplicaie care dorete s primeasc date direct de la adaptor. Tipic, o
aplicaie care face asta trebuie s puna n coada de ateptare un descriptor.
Un descriptor este o bucat mic de informaie care descrie buffer-ul din
memoria principal, unde ar trebui nscrise datele din pachetul urmtor
144

(pentru aceast aplicaie). In consecin ar trebui s considerm cu atenie


i separat memoria descriptorului i memoria actual a buffer-ului.
Putem lucra uor cu memoria descriptorului, tiind c memoria
adaptorului este o memorie mapat. Presupunem c adaptorul are 10.000
bytes de memorie, considerat memorie pe magistral, si c pagina fizic a
sistemului este de 1000 bytes. Rezult faptul c adaptorul are 10 pagini
fizice. Presupunem c alocm cte 2 pagini fizice fiecrei aplicaii dintr-un
set de 5 aplicaii de mare performan (ex.Web, FTP), aplicaii care vor s
foloseasc adaptorul pentru a transfera date. Presupunem c aplicaia Web
primete 2 pagini fizice, de exemplu nr.9 si 10. Kernel-ul mapeaz
paginile fizice 9 i 10 la tabela de pagini a aplicaiei Web, iar paginile
fizice 3 i 4 le mapeaz la tabela de pagini a aplicaiei FTP.
Acum, aplicaia Web poate scrie direct n paginile fizice 9 i 10, fr nici
un pericol; dac va ncerca s scrie n paginile 3 i 4, hardware-ul
memoriei virtuale va genera o excepie. Astfel (P4c) exploatm hardwareul existent sub forma TLB, pentru a proteja accesul la pagini. Presupunem
acum c pagina 10 este o secven de descriptori de buffer-e libere, scrise
de aplicaia Web; fiecare descriptor de buffer descrie o pagin din
memoria principal (presupunem c avem la dispoziie doar 32 bii), care
va fi folosit pentru a recepiona urmtorul pachet descris pentru aplicaia
Web.Spre exemplu, pagina 10 poate conine secvena 18, 12 (fig.6.9).
Aceasta nseamn c aplicaia Web are n coada curent paginile fizice cu
numrul 18 i 12 pentru recepionarea urmtoarelor pachete. Presupunem
c paginile 18 i 12 se afl n memoria principal i sunt pagini fizice
blocate, atribuite aplicaiei Web de ctre kernel, la pornirea aplicaiei
Web.
In momentul n care sosete un nou pachet pentru aplicaia Web,
adaptorul va demultiplexa pachetul ctre pagina 10, folosind un filtru de
pachete, iar apoi va scrie datele din pachet (folosind DMA) n pagina 18.
Dup ce a realizat aceasta, adaptorul va scrie descriptorul 18 ntr-o pagin
dedicat descriptorilor de pagini scrise (exact ca la fbufs), spre exemplu
pagina nr.9, pagina pe care aplicaia Web este autorizat s o citeasc.
Este apoi sarcina aplicaiei Web s termine procesarea paginilor scrise, i
s pun periodic n coada adaptorului noi descriptori de buffer-e libere.
Totul pare frumos, dar exist o problem de securitate. Presupunem c
printr-o eroare/rea intenie, aplicaia Web scrie n pagina descriptorilor
secvena 155, 120 (lucru pe care-l poate face). Presupunem n continuare
ca pagina 155 este n memoria principal, i c n aceast pagin kernel-ul
ii stocheaz structurile de date. Cand adaptorul primete un nou pachet
pentru aplicaia Web, va scrie datele pachetului n pagina 155,
suprascriind structurile de date ale kernel-ului. Aceasta va cauza probleme
serioase, cel putin euarea sistemului.
Dar de ce nu poate detecta hardware-ul memoriei virtuale acest tip de
problem? Motivul este ca hardware-ul memoriei virtuale (observai
pozitia TLB n fig.6.8) ofer protecie doar mpotriva accesului neautorizat
a proceselor care ruleaz pe CPU. TLB intercepteaz fiecare acces de tip
READ (sau WRITE) fcut de ctre procesor i poate face verificari; ns
adaptoarele care fac acces de tip DMA, ocolesc sistemul memoriei virtuale
i acceseaz memoria direct.
145

In practic, acest lucru nu reprezint o problem deoarece aplicaiile nu


pot programa dispozitivele (precum discuri, adaptoare) s citeasc sau s
scrie la o anumit locaie, la comanda aplicaiei. Ins, accesul este mediat
mereu de ctre kernel. Dac nu implicm i kernel-ul, trebuie s ne
asigurm c instruciile pe care aplicaia le-ar putea da adaptorului au fost
atent verificate.
Soluia folosit la canalul dispozitivului aplicaie ADC (application
device channel), este ca (P9, paseaz indicaii la interfa) kernel-ul s
trimit adaptorului o list de pagini fizice valide, pe care fiecare aplicaie
care folosete adaptorul, s le poat accesa direct. Acest lucru poate fi
fcut doar dup ce aplicaia a pornit i nainte de a ncepe transferul de
date. Cu alte cuvinte, calculul implicat n autorizarea paginilor este decalat
n timp (P2), de la faza transferului de date la faza de iniializare a
aplicaiei. Spre exemplu, n momentul n care ncepe aplicaia Web,
aplicaia va cere kernel-ului 2 pagini, de exemplu 18 i 12 iar apoi va cere
kernel-ului s autorizeze utilizarea acestor pagini de ctre adaptor.
Kernel-ul este apoi transpus n regim normal de operare de date. Daca n
acest moment aplicaia Web pune n coad descriptorul 155 i apare un
nou pachet, adaptorul va verifica mai nti dac numarul 155 este n lista
autorizat a aplicaiei (care conine 18 i 15). Deoarece 155 nu este n
list, adaptorul nu va suprascrie structurile de date ale kernel-ului.
In concluzie, ADC-urile deplaseaz n spaiu funciile de protecie (P3c)
de la kernel la adaptor, folosind informaii prelucrate anterior (lista
paginilor fizice autorizate, P2a) trimise de la kernel ctre adaptor (P9) i
la care s-a adugat hardware-ul memoriei virtuale (P4c).
In ultimii ani a fost promovat utilizarea mesajelor active pentru scopuri
similare. Mesajul activ conine adresa procesului de nivel utilizator care va
manevra pachetul.Un mesaj activ evita intervenia kernel-ului i stocarea
temporar n tampoane, prin folosirea tampoanelor prealocate sau a
mesajelor de dimensiune mic, rspunsuri directe ale aplicaiei,
ajungndu-se astfel la o laten mic. Latena mic permite o suprapunere
a calculului i comunicaiei n mainile paralele. Implementarea cu mesaje
active permite doar transferul mesajelor scurte sau a blocurilor mari.
Implemetarea mesajelor rapide merge mai departe i combin interfeele
de dispersie-regrupare la nivel-utilizator cu controlul fluxului, pentru a
permite o performan ridicat uniform, att pentru mesajele scurte ct i
pentru cele lungi.
La ce folosesc kernelurile?
Problema este important deoarece ADC-urile i mesajele active ocolesc
kernel-ul. Nucleele sunt bune pentru asigurarea proteciei (protecia
sistemului i a utilizatorilor bine intenionai, de programe ru intenionate
i erori) i pentru planificarea resurselor ntre diferitele aplicaii. Dac
scoatem nucleul din funcie, aceste servicii vor trebui ndeplinite de
altcineva. Spre exemplu, ADC-urile ofer protecie folosind hardware-ul
memoriei virtuale (pentru a proteja descriptorii) i constrngerea
adaptoarelor (pentru a proteja memoria tampon).
Trebuie de asemenea s multiplexeze legtura fizic de comunicare (n
special n partea de emisie) ntre diversele canale ale dispozitivelor
aplicaiei i s asigure un oarecare grad de corectitudine. Pentru aceasta

146

codul kernel-ului ar trebui replicat n fiecare dispozitiv; unele dispozitive


ns, precum discul sau adaptorul de reea sunt mai speciale, n sensul c
necesit performan mai ridicat, i trebuie tratate special. Exist o
iniiativ prin care se dorete ca toate aceste idei s aib i o form
comercial, bazat pe ideea ADC i pe soluia UUNet de la Cornell
(asemntoare cu ADC i propus n paralel cu aceasta). Aceast
propunere, cunoscut sub numele de arhitectura interfeei virtuale VIA
(Virtual Interface Architecture)este descris n cele ce urmeaz.
6.5.1. Propunerea de arhitectur a interfeei virtuale (VIA)
Arhitectura interfeei virtuale este un standard comercial, care
nglobeaz ideile legate de ADC. Termenul de interfa virtual are sens,
dac considerm c un canal al unui dispozitiv al aplicaiei poate oferi
fiecrei aplicaii cte o interfa virtual proprie, pe care o poate manevra
fr intervenia nucleului. Interfeele virtuale sunt desigur multiplexate
ctre o singur interfaa fizic. VIA a fost propus de un consoriu
industrial care include Microsoft, Compaq i Intel.
VIA foloseste urmtoarea terminologie:
Memoria nregistrat: Acestea sunt regiuni de memorie folosite de
aplicaie pentru a trimite/recepiona date. Aplicaia e autorizat s citeasc/
/scrie din/n aceste regiuni; regiunile sunt mbinate pentru a evita
paginarea.
Descriptorii: Pentru a trimite/recepiona un pachet, aplicaia folosete
o bibliotec la nivel-utilizator (libvia), pentru a construi un descriptor care
este o structur de date ce conine informaii despre tampon (de exemplu
un pointer). VIA permite unui descriptor s se refere la mai multe
tampoane din memoria nregistrat (pentru dispersie/regrupare) i permite
folosirea de diferite etichete de protecie a memoriei. Descriptorii pot fi
adugai unei cozi de descriptori.
Soneriile (doorbells): Reprezint o metod nespecificat prin care
interfeei de reea i se comunic descriptorii. Se poate face fie prin partea
de scriere a interfeei cardului de memorie, fie prin declanarea unei
ntreruperi pe card; variaz de la implementare la implementare. Sunt de
fapt pointeri ctre descriptori, conducnd la nivelul doi de indirectare.
Standardul VIA are cteva probleme :
Performana mesajelor mici: trimiterea datelor necesit urmrirea unei
sonerii care este pus n legtur cu un descriptor (destul de mare, n jur de
45 bytes), care indic spre date. In cazul unor mesaje mici, aceasta
reprezint un cost suplimentar mare (un mod de a elimina aceast
problem este de a combina descriptorul i datele pentru mesajele mici).
Memoria soneriei: La fel ca la memoriile nregistrate, i soneriile
trebuiesc protejate. Specificaia VIA cere ca fiecare sonerie s fie mapat
la o pagina de utilizator separat, ceea ce reprezint o risip a spaiului
adreselor virtuale pentru mesaje de dimensiune mic (un mod de a elimina
aceast problem este de a combina mai muli descriptori cu o singur
pagin, nsa aceasta presupune mecanisme suplimentare)
Specificaiile VIA sunt destul de vagi.

147

6.6. Reducerea intreruperilor


Dei suprancrcarea datorat ntreruperilor este mai mic dect cea
aprut la planificarea proceselor sau apelurile sistem, ea poate fi totui
destul de substanial. De fiecare dat cnd sosete un pachet, apare o
ntrerupere care are ca efect nteruperea procesorului i o comutare de
context. Nu pot fi evitate de tot ntreruperile, dar se poate reduce
suprancrcarea datorat ntreruperilor prin urmtoarele artificii.
Intrerupere doar pentru evenimente importante: de exemplu, n
soluia ADC, adaptorul nu trebuie s ntrerup procesorul la fiecare
recepie a unui nou pachet, ci doar la recepionarea primului pachet din
fluxul de pachete (presupunem c aplicaia va verifica pachetele
recepionate) i cnd coada descriptorilor de tampoane libere este goal.
Aceasta poate reduce suprancrcarea datorat ntreruperilor, la un singur
pachet din N pachete recepionate, presupunnd c cele N pachete se
recepioneaz ntr-o rafal.
Polling/anchetarea: Procesorul (CPU) verific dac au aprut noi
pachete iar adaptorul nu ntrerupe niciodat. Acest lucru poate duce la o
suprancrcare mai mare dect n cazul procesrii acionate de ntreruperi,
dac numrul de pachete recepionate este sczut, dar metoda poate fi
eficient pentru volume de trafic mari. O alt variant a acestui concept ar
fi ntreruperile de ceas: CPU verific periodic, la expirarea unui timer.
Controlul prin aplicaie: Transmitorul poate determina momentul
cnd se ntrerupe receptorul, setnd un anumit bit din antetul pachetului.
De exemplu un transmitor FTP poate seta bitul de ntrerupere, doar n
ultimul pachet de date din cadrul unui transfer de fiiere (P10, paseaz
indicaii n antetele protocolului). Ideea este probabil prea radical pentru
a putea fi folosit, ns a fost propus o implementare care are la baz o
rafinare a acestei idei, ntr-un chip ATM, fabricat deja.
In general, folosirea simultana a mai multor metode funcioneaz destul
de bine n practic. In unele implementri cum cum este first bridge,
utilizarea polling-ului este foarte eficace. De aceea, ideile mai radicale
precum ntreruperile de ceas sau cele controlate de aplicaie au devenit
mai puin folositoare. Trebuie menionat faptul c ideile RDMA au marele
avantaj de a nltura, pentru transferurile de date de mari dimensiuni,
necesitatea apelurilor de sistem per pachet i a ntreruperilor per pachet.
6.6.1. Evitarea blocrii Livelock la nivelul recepiei
Pe lng ineficienele datorate costurilor de tratare a ntreruperilor,
ntreruperile pot interaciona cu planificarea sistemului de operare,
reducnd la zero debitul nodurilor terminale, fenomen cunoscut sub
numele de receiver livelock. In BSD UNIX, recepionarea unui pachet
genereaz o ntrerupere. Procesorul face un salt la rutina de tratare a
ntreruperii, trecnd peste planificator, pentru a ctiga vitez. Rutina de
tratare a ntreruperii face o copie a pachetului, pe care o pune ntr-o coad
a nucleului, care conine toate pachetele IP ce ateapt s fie consumate,
face o cerere de atribuire a unui fir de execuie ctre sistemul de operare
(ntrerupere software) i i termin activitatea.
Daca reeaua este foarte ncrcat, calculatorul poate intr n starea de
receiver livelock, stadiu n care calculatorul proceseaz toate pachetele
care ajung la el, doar pentru a le distruge ulterior, deoarece aplicaiile nu

148

ruleaz niciodat. Dac se receptioneaz un tren de pachete, doar rutina de


tratare a ntreruperilor de prioritate maxim va rula, i probabil nu va mai
fi timp pentru ntreruperile software i nici att pentru procesul browser.
Astfel, se ajunge la momentul n care cozile IP sau cozile socket-urilor vor
fi pline, i la pierderea pachetelor n a crei procesare s-au investit resurse.
O tehnic, care pare necesar n astfel de situaii este dezactivarea
ntreruperilor, cnd procesarea la nivelul aplicaiilor este foarte redus.
Acest lucru se poate face urmrind timpul de rulare a rutinelor de
ntrerupere aferente unui dispozitiv, iar dac timpul respectiv depete un
anumit procentaj din timpul total, atunci dispozitivul respectiv va fi
mascat. Aceasta va duce ns la pierderea pachetelor care ajung n
momentele de suprancrcare ale calculatorului, printre care vor fi i
pachete importante sau care nu ar genera ntreruperi.
Se apeleaza la dou mecanisme. In primul rnd ar trebui folosite cozi
separate pentru fiecare socket destinaie i nu o singur coad utilizat n
comun. La recepionarea pachetului, prin demultiplexare timpurie se va
plasa fiecare pachet n coada asociat socket-ului. In acest fel, dac se
ntampl ca o coad a unui socket s se umple, pentru c aplicaia
respectiv nu citete pachetele, celelate socket-uri vor putea progresa,
neinfluenate de aceast problem.
Al doilea mecanism este implementarea procesarii protocolului la
nivelul de prioritate a procesului receptor i ca parte a contextului
proceselor recepionate (i nu ca o ntrerupere software separat). In
primul rnd se nltura practica neechitabila, n care se transfer
procesarea de la aplicaia X la aplicaia Y, ce rula n momentul
recepionrii pachetului pentru aplicaia X. In al doilea rnd, dac o
aplicaie ruleaz ncet, coada soclului respectiv se va umple iar pachetele
recepionate pe acest socket vor fi pierdute, permind ns procesarea
celorlalte pachete. In al treilea rand, i cel mai important este faptul c
deoarece protocolul de procesare este fcut la un nivel mai sczut
(procesarea aplicaiei), se nltur problema livelock cauzat de procesarea
parial (de exemplu, procesarea de protocol) a multor pachete, fr ca
procesrile aplicaie aferente s fie obligate s scoat pachetele din coada
de socket.
Acest mecanism, denumit lazy receiver processing (LRP), folosete n
principiu procesarea nceat, nu att de mult pentru eficien, ct pentru
echitate i pentru a evita apariia livelock.
6.7. Concluzii
Pe lng restructurarea principal referitoare la evitarea copierii,
controlul suprancrcrii este o problem foarte important, care trebuie
tratat cnd e vorba de aplicaii de reea. Serverele rapide trebuie s reduc
suprancrcarea cauzat de planificarea proceselor, de apelurile la sistem,
i de ntreruperi. Sistemele de operare mai noi, precum Linux se strduiesc
enorm s reduc costul inerent pe care l implic controlul suprancrcrii.
Arhitecturile moderne devin tot mai rapide n procesarea instruciunilor,
folosind date din memoria cache, fr o accelerare sensibil a comutrii
contextului sau a procesrii ntreruperilor.
Au fost trecute n revist, pentru aplicaiile de reea, tehnicile de baz
pentru reducerea suprancrcrii cauzat de planificarea proceselor. Cu

149

greu se poate face ceva ieit din comun, ca structurarea fiecrui nivel ca un
proces separat, fr apeluri la nivelurile superioare. Din fig.6.3 trebuie
desprins ideea profund a procesarii la nivelul utilizatorului. Proiectarea
de reele la nivel de utilizator, mpreun cu canalele dispozitivelor de
aplicaie fac posibil existena unor tehnologii precum VIA, care vor face
parte n curnd din sisteme reale, pentru a evita apeluri de sistem la
trimiterea/recepionarea pachetelor.
Pe de alt parte, arta procesrii structurate n contextul aplicaiei, de
exemplu un server Web, s-a bucurat de tot mai mult atenie n ultimul
timp. In timp ce serverele conduse de evenimente (mpreun cu processele
ajuttoare) echilibreaz maximizarea concurenei i minimizarea ncrcrii
datorat comutrii de context, aspectele legate de ingineria software las
nc multe ntrebri fr rspuns. Va fi suficient abordarea lansat-de evenimente n mediul de producie, cu modificri i depanri frecvente?
Un pas inainte l reprezint abordarea condus de evenimente, pe nivele,
ns ingineria serverelor Web mari va necesita cu siguran mai mult efort.
Abordarea condus de evenimente se bazeaz pe implementarea rapid a
apelului select() sau a funciilor echivalente cu acesta. Abordrile Unix au
probleme fundamentale de scalabilitate ; sistemele de operare mai
populare, precum Windows, au API-uri mult mai eficiente
Ideea foarte important privind standardul VIA o reprezint faptul c se
permite aplicaiilor s comunice direct cu dispozitivele de reea, folosind o
interfa virtual protejat. Ideal, adaptorii sunt astfel proiectai nct s
permit funcionarea mecanismelor de tip VIA sau similare. Intreruperile
sunt evident de neevitat, aceast problem poate fi ns ameliorat
folosind amestecul i polling-ul n medii potrivite.Figura 6.1 listeaz
tehnicile discutate n acest capitol i principiile corespunztoare.
6.8. Exercitii
1. Filtre de pachete i apeluri : La descrierea apelurilor (fig.6.3)
sistemul i-a dat seama pentru care aplicatie era destinat un anumit
pachet, prin faptul c apela o rutin de transport. De ce mai e necesar
filtrarea pachetelor? Ce presupuneri implicite au fost fcute aici?
2. Compararea modelelor de structurare a serverelor Web : au
fost comparate diferite mecanisme de structurare a serverelor prin
intermediul unor metrici simple ca eficiena planificrii i concurena
CPU. Considerati i celelalte dou metrici n procesul de comparare.
Concurena la disc : Unele sisteme au discuri multiple i exist o
planificare a discurilor. Intr-un asemenea mediu se pune ntrebarea dac
la o abordare condus de evenimente ar putea apare probleme, n
comparaie cu abordarea multiproces. Vor apare probleme i la
abordarea condus de evenimente care dispune i de procese helper?
Acumularea statisticilor: Serverele Web trebuie s dein informaii
statistice referitoare la structurile de utilizare pentru a ine evidena. Vor
fi aceste statistici mai complexe la arhitecturile proces-per-client i fir de
execuie-per-client? De ce este mai simplu ntr-o arhitectur condus de
evenimente?
3. Algoritmi versus algoritmic n reimplementarea ufalloc():
Se determina modul cel mai eficient de reimplementare a funciei
ufalloc(), pentru a gsi cel mai mic descriptor nealocat.

150

Se folosesete o stiv/heap binar. Pentru N identificatori, cte accese


la memorie sunt necesare? Ct spaiu este necesar, n bii?
Presupunem c maina este pe W bii (la Alpha W=64) i c exist o
instruciune (sau un set de instruciuni) pentru a gsi cel mai din dreapta
zero ntr-un cuvnt de W bii. Presupunem c descriptorii alocai sunt
reprezentai ca un set de bii de dimensiune N. Cum poate fi completat
setul de bii cu o stare suplimentar (P12), pentru a calcula eficient cel mai
mic descriptor nealocat ?
Care sunt costurile de spaiu i timp ale acestei scheme, n comparaie
cu o stiv simpl? Se poate face stiva simpl mai rapid folosind un
artificiu prin care se mrete baza stivei, astfel nct s avem K>1
elemente n fiecare nod al stivei?
4. Implementarea modificat a unui fast select(): Textul explic
modul n care elementele sunt adugate setului I, H i R, dar nu specific
n totalitate modul n care ele sunt scoase din set. Explicai modul n care
elemetele sunt scoase din set, n special la setul de indicaii H.
5 Implementarea modificat a unui fast select(): Se consider
urmtoarele modificri ale implementrii fast select:
(a) Inew este egal cu S (i nu cu Iold S).
(b) Rnew este calculat ca i nainte.
(c) Utilizatorului i se returneaz Rnew (i nu Rnew S).

151

CAPITOLUL 11
CAUTAREA PENTRU ASOCIEREA PREFIXELOR
Considerm o baz de date cu avioanele ce vin/pleac dinspre/spre
Londra ctre sute de orae americane. O soluie ar fi precizarea cilor ctre
fiecare destinaie. Dac majoritatea zborurilor ctre America trec prin
Boston, exceptnd zborurile spre California, care trec prin Los Angeles,
putem reduce baza de date de la sute de locaii, la dou locaii tip prefix:
(USA* Boston; USA.CA.* LA). Problema ce apare folosind aceast
reducere este: oraul destinaie USA.CA.Fresno se va potrivi cu ambele
prefixe: USA* i USA.CA.*; baza de date trebuie s returneze cea mai lung
potrivire (USA.CA.*)/the longest-prefix-match. Astfel, prefixele se folosesc
pentru comprimarea bazelor mari de date, cu costul unei cutri mai
complexe pentru cea mai lung potrivire .
Internet-ul utilizeaz acelai principiu. n anul 2004 ruterele de tip core
memorau 150.000 prefixe, n loc de un miliard de intrri pentru fiecare
adres de internet posibil. Pentru un ruter de tip core, toate calculatoarele
din cadrul unei universiti (ca UCSD) vor fi probabil gsite cu aceeai
adres salt/hop (adresa ruterului de intrare/ieire n/din subreteaua de
comunicaii). Dac tuturor calculatoarele din cadrul UCDS le vor fi date
aceleai seturi iniiale de bii (numrul reelei sau prefixul), atunci ruterul va
putea memora o intrare n loc de sute de intrri pentru fiecare calculator din
UCDS. Tehnicile i principiile corespunztoare sunt prezentate n fig.11.1.
Numr
P2a, P10
P2a, P10,
P4a
P11

Principiul
Precalculul indicilor
Indicii calculai se transmit la momentul
rulrii.
Exploatarea hardware-ului comutatorului
ATM
Memorarea ntregii adrese IP n cache

Cutare n cache-uri

P5

Cutare paralel hardware

CAM-uri

P4b

Expandarea prefixelor pentru creterea


vitezei

Expansiune controlat

P13

Folosirea unor pai variabili,


ca grad de libertate
Comprimare pentru creterea vitezei
Contorizare precalculat a setului de bii

Arbori ordonai, cu pas


variabil
Arbori ordonai de tip
Lulea

Cutare eficient
Adaug stri marker
Precalcularea evoluiei
marker-ilor
Precalculeaz domeniul pentru potrivirea
prefixelor

Cutare binar a lungimii


prefixelor

P4b, P12, P2a


P15
P12
P2a
P2a

Tehnica de c utare
Comutare de etichet
Comutare IP.

Cutare
prefixelor

binar

Figura 11.1 Principiile utilizate n schemele de mascare a prefixului.

152

11.1 Cautarea prefixelor


Aceast seciune introduce notaia prefix, explic de ce e folosit cutarea
prefixelor i descrie principalele metrici pentru evaluarea schemelor de
cutare a prefixelor.
11.1.1 Notarea prefixelor.
Prefixele utilizate pe internet sunt definite prin bii i nu prin caractere
alfanumerice, avnd o lungime de pn la 32 de bii. Confuzia e creat de
faptul ca c prefixele IP sunt scrise deseori cu notaii cu punct zecimal.
Astfel, prefixul de 16 bii pentru UCDS, se scrie 132.239. Fiecare din cifrele
zecimale dintre puncte reprezint un octet. Deoarece n binar 132 este
10000100 i 239 este 11101111, prefixul UCDS n binar poate fi scris i ca
1000010011101111*, unde caracterul * arat c biii rmai nu conteaz.
Toate adresele IP de 32 bii ale staiilor UCSD ncep cu aceti 16 bii.
Deoarece prefixele pot avea lungime variabil, alt mod de notare a
prefixelor este de forma A/L, unde A e o adres IP de 32 bii n virgul
zecimal i L lungimea prefixului. Astfel, prefixul UCDS poate fi scris i ca
132.239.0.0/16, unde lungimea 16 indic faptul c doar primii 16 bii
(132.239) sunt relevani. Al treilea mod de a scrie prefixele este utilizarea
unei mti n loc de o lungime explicit de prefix. Astfel prefixele pot fi
scrise n urmtorul mod: 128.239.0.0 cu masca 255.255.0.0. Deoarece masca
255.255.0.0 are 1 pe primii 16 bii, se indic o lungime implicit de 16 bii. 1
Din aceste trei modaliti prin care se poate nota un prefix (binar cu asterix
la sfrit, cu notaie / slash, i prin intermediul mtii), ultimele dou sunt
mai compacte i deci mai potrivite pentru scrierea prefixelor mari. Din
motive pedagogice este mai simplu s se utilizeze prefixe mici pentru
exemple i scrierea n binar. n acest capitol se va utiliza 01110* pentru a
indica un prefix ce se potrivete cu toate adresele IP de 32 de bii care ncep
cu 01110. Este uor de convertit aceast notaie spre notaiile slash sau
masc. Majoritatea prefixelor au lungimea minim de 8 bii.
11.1.2 De ce prefixe cu lungime variabil?
nainte de a considera abordarea temei complexe de potrivire a prefixelor
cu lungime variabil, s vedem de ce prefixele Internet-ului au lungime
variabil. De exemplu pentru un numr de telefon 858-549-3816, e uor de
extras codul zonei, adic primele trei cifre zecimale (858). Dar dac prefixele
cu lungime fix sunt uor de implementat, care este avantajul celor cu
lungime variabil?
Rspunsul general e c prefixele cu lungime variabil sunt mai eficiente ca
spaiu utilizat pentru adresare. Zonelor cu multe terminale li se asociaz
prefixe scurte, iar celor cu puine terminale prefixe lungi.
Rspunsul specific vine din istoria adresrii pe Internet. Internetul a nceput
printr-o simpl ierarhie n care adresele de 32 de bii erau divizate n adres
de reea i numr de staie gazd; ruterele doar memorau intrrile n reele.
Pentru alocarea flexibil de adrese, adresele de reea vin cu dimensiuni
variabile: Clasa A (8 bii), Clasa B (16 bii), Clasa C (24 bii). Pentru a face
fa epuizrii adreselor de clas B, schema CIDR (Classless Internet Domain
1

Notaia cu masc este de fapt mai general din cauz c se pot folosi mti nenvecinate,
la care 1-urile nu sunt neaprat consecutive pornind de la srtnga. Astfel de definiii ale
reelelor sunt din ce n ce mai puin folosite i nu exist n tabelele de prefixe ale ruterelor
core.

153

Routing) asigneaz noilor organizaii adrese multiple continue din Clasa C


ce pot fi agregate cu un prefix comun. Se reduce dimensiunea tabelului
ruterului core.
Lipsa spaiului de adresare, a determinat ca nregistrrile Intrenet s fie
foarte conservative n asignarea de adrese IP. Unei organizaii mici i se poate
aloca doar o mic parte a adreselor Clas C, poate a 30-a parte, care permite
folosirea a doar patru adrese IP n cadrul organizaiei respective.Multe
organizaii rezolv problema prin mprirea adreselor IP ntre mai multe
calculatoare, utiliznd scheme ca translatarea adreselor reea, NAT(Network
Address Translation).
Astfel, CIDR i NAT au ajutat la manevrarea creterii exponeniale a
Internet-ului cu un spaiu finit de adrese de 32 de bii. Eficiena NAT pe
termen scurt i complexitatea lansrii unui nou protocol au determinat o
dezvoltare lent a IPv6 care are adrese de 128 bii. Dar, ntr-o lume nou cu
miliarde de senzori fr fir, interesul pentru IPv6 va reveni.
Decizia de dezvoltare a CIDR a salvat Internetul, dar a introdus
complexitatea metodelor de verificare a potrivirii celui mai lung prefix.
11.1.3 Modelul de cutare/lookup
Un pachet care sosete pe o legtur de intrare poart o adres 2 de Internet
de 32 bii. Procesorul consult un tabel de expediere/forwarding care conine
un set de prefixe cu legtura de ieire corespunztoare. Pachetul se asociaz
cu prefixul cel mai lung, care se potrivete cu adresa destinaie a pachetului,
i este retransmis ctre legtura corespunztoare de ieire. Sarcina gsirii
legturii de ieire numit i cutarea adresei /address lookup, este subiectul
acestui capitol, care expune algoritmii de cutare i arat c aceste cutri
pot fi implementate la viteze de gibabit i terabit.
nainte de a cuta soluii pentru cutarea IP, trebuie s ne familiarizm cu
cteva probleme legate de distribuia traficului, tendinele memoriilor, i
dimensiunile bazelor de date (fig.11.2), care justifica schemele de cutare.
Studii asupra traficului n reelele de tranzit/backbone (1997), arat
250.000 de fluxuri concurente de scurt durat, cu o msurare destul de
conservativ a fluxurilor. Numrul fluxurilor este n cretere, deci
memoriile cache nu funcioneaz bine.
Aproximativ jumtate din pachetele recepionate de ctre ruter sunt
pachete TCP de confirmare de lungime minim. E posibil ca un ruter s
primeasc un ir de pachete de lungime minim. Ca s putem cuta
prefixul n timpul retransmiterii unui pachet de lungime minim, trebuie
evitat necesitatea unei cozi pe legtura de intrare, ceea ce ar simplifica
proiectarea sistemului.
Al doilea motiv este comercial: muli vnztori pretind transmisii la
viteza /firului: transmisia unui pachet de 40 byte la viteza liniei nu ar
trebui s dureze mai mult de 320ns la o vitez de 1Gbps, 32nsec la
30Gbps (vitezele OC 192), i 8nsec la 40Gbps (OC - 768).
Cea mai important metric a schemelor de cutare/lookup este viteza
cutrii. A treia observaie arat c, deoarece costul computaional e dominat
2

Dei majoritatea utilizatorilor lucreaz cu nume de domenii, trebuie menionat c acestea


sunt translatate n adrese IP de ctre serviciul DNS, nainte de transmiterea pachetelor

154

de accesrile memoriilor, cea mai simpl msur a vitezei cutrii este


numrul de accesri ale memoriei n cazul cel mai defavorabil. A patra
observaie arat c deoarece bazele de date ale reelelor backbone au prefixe
cu lungimea ntre 8 i 32, schemele naive vor avea nevoie de 24 de accesri
ale memoriei n cel defavorabil caz, pentru a testa toate lungimile posibile
de prefix.
A cincea observaie susine c n timp ce bazele de date au n jur de
150.000 prefixe, posibila utilizare a rutelor pentru calculatoarele gazd (cu
adrese de 32 bii) i a rutelor multicast, nseamn c ruterele backbone
viitoare vor avea baze de date de prefixe cu 500.000 -1.000.000 de prefixe.
A asea observaie se refer la viteza de actualizare a structurilor de date
pentru cutri, pentru adugarea/tergerea unui prefix de exemplu.
Implementrile instabile ale protocoalelor de rutare pot duce la actualizri de
ordinul milisecundelor. De observat c, indiferent dac sunt de ordinul
secundelor sau a milisecundelor, sunt cu cteva ordine de mrime sub
necesarul cutrii/lookup, permind astfel luxul precalculrii informaiilor
(P2a), sub form de structuri de date, pentru accelerarea cutrii, cu costul
creterii timpilor de actualizare.
A aptea observaie se refer la memoriile standard ieftine, DRAM cu
timpi de acces de 60 nsec, i memoriile de vitez mare (off/on-chip
SRAM, 110nsec) ce trebuie folosite la viteze mari. DRAM sunt teoretic
nelimitate, dar SRAM i cele on-chip sunt limitate de costul mare i
nondisponibilitate. Astfel a treia metric este utilizarea memoriei; aceasta
poate fi scump i rapid (cache la software, SRAM la hardware), sau ieftin
i lent (DRAM, SDRAM).
O schem de cutare care nu face o reactualizare incremental, va avea
nevoie de dou copii ale bazei de date de cutare/lookup, astfel nct n
prima s poat face cutarea, i n cealalt asocierea. Astfel actualizarea
incremental reduce la jumtate necesarul de memorii de mare vitez..
A opta observaie se refer la lungimea prefixelor. IPv6 folosete prefixe
de 128 bii, iar lookup-urile multicast necesit asocieri pe 64 bii (adresa de
grup i adresa surs pot fi concatenate n 64 de bii). Este discutabila
generalizarea Ipv6 i a multicast-ului, asa c lookup-urile IP pe 32 bii
rmn actuale. Schemele descrise se scaleaz bine i la prefixe lungi.
Pe scurt, metricile importante n ordinea importantei sunt: viteza lookupului, memoriile i timpul de actualizare. Ca exemplu, o proiectare buna onchip, folosind o memorie on-chip de 16 Mbii, poate suporta orice set din
500.000 prefixe, face un lookup n 8 nsec pentru a permite o expediere la
viteza firului la ratele OC-192, i permite actualizarea prefixului n 1msec.
Datele sunt conform cu baza de date disponibil pentru proiectul IPMA,
folosit pentru a compara experimental schemele de mascare. Cea mai mare
dintre acestea Mae East, e un model rezonabil pentru un suport larg de ruter.
Urmtoarea notaie este utilizat n mod repetat pentru raportarea
performanelor teoretice ale algoritmilor de mascare IP. N reprezint numrul
de prefixe (150.000 pentru baze de date mari, n prezent ), iar W reprezint
lungimea adresei (32 pentru IPv4) .

155

Observaii
1)250000 de fluxuri concurente n backbone
2)50% sunt confirmri TCP
3)Cutare dominat de accesrile memoriei
4)Lungimea prefixelor 8 - 32
5)150.000 prefixe actuale i rute multicast i
gazd
6)BGP instabil, multicast
7)Vitezele mari necesit SRAM
8)Ipv6, ntrzieri multicast

Inferente
Memorarea cache lucreaz slab n ruterele
backbone
Pentru pachetele de 40 bii e necesar
cutarea cu viteza liniei
Viteza cutrii msurat de numrul de
accesri ale memoriei
Schemele naive cer 24 de accesri ale
memoriei
n urma creterii
500.000 -1.000.000 prefixe
Actualizare n timp de
milisecunde-secunde
Duce la minimizarea memoriei
Decisiv e lookup pe 32bii

FIGURA11.2 Date curente despre problemele de lookup i implicaiile asupra soluiilor

n final dou observaii pot fi exploatate pentru optimizarea cazului utilizat.


O1: Aproape toate prefixele au 24 bii sau mai puin, n timp ce majoritatea
au prefixe de 24 bii i urmtorul vrf e la 16bii. Uneori vanztorii utilizeaz
aceasta pentru a prezenta cel mai slab caz pentru metodele de cutare cu 24
bii. Viitorul poate s aduc baze de date cu un numr mare de rutere gazd
(32 adrese de bit) i integrarea memoriilor ARP.
O2: Sunt rare prefixele ce sunt prefixele altor prefixe (ca 00* i 0001*).
Numrul maxim de prefixe ale unui prefix, coninute ntr-o baz de date, e 7.
Ideal ar fi s facem fa i celui mai defavorabil caz de cutare din punct de
vedere a timpului, dar este de dorit s gsim scheme ce utilizeaz
observaiile precedente pentru creterea performanei medii de stocare.
11.2 Evitarea cutrii
Pornirea instinctiv a proiectantului de sistem este nu s rezolve
problemele complexe (ca potrivirea cea mai lung a prefixelor), ci s le
elimine. In reelele cu circuit virtual, ca reelele ATM, cnd o surs dorete
s transmit date ctre o destinaie, stabilete un apel, asemntor cu
stabilirea unui apel telefonic. Numrul de apel (VCI) este pentru fiecare ruter
un ntreg cu lungime moderat, uor de cutat. Stabilirea apelului duce la
creterea ntrzierii tur-retur, suplimentar fa de timpul necesar transmisiei
datelor. In reelele ATM comutatorul precedent trimite un index (P10,
trimite informaii n antetele de protocol), ctre urmtorul comutator. Indexul
este calculat (P2a) chiar nainte ca datele s fie trimise, de ctre comutatorul
precedent (P3c, realizeaz deplasarea calculului n spaiu). Aceeai idee
poate fi utilizat n reelele de tip datagrame, ca Internetul, pentru a evita
cutarea prefixului. Vor fi descrise dou metode ce au la baz aceast idee:
comutare cu etichet i comutarea circuit.

156

11.2.1 iruri de indici i comutarea etichetelor


La folosirea irurilor de indici, fiecare ruter paseaz un indice tabelului de
retransmisie a urmtorul ruter; se evit astfel folosirea cutrii prefixelor.
Indecii sunt precalculai de ctre protocolul de rutare/dirijare de cate ori se
schimba topologia retelei. n figura 11.3, sursa S trimite un pachet ctre
destinaia D prin primul ruter A; antetul pachetului conine un index i spre
tabelul de retransmisie al lui A. Astfel, ruterul A precizeaz calea spre D prin
ruterul B, care la rndul lui conine indicele j ctre destinaia D. Astfel A
trimite pachetul spre B i precizeaz indicele j al acestuia. Procesul se repet
n fiecare ruter din reea prin utilizarea indexului din pachet pentru cutarea
in tabelele de transmisie spre destinaie.
Diferenele majore ntre irurile de indici, i indicii circuitelor virtuale sunt
urmtoarele: irurile de indici sunt per destinaie, nu per perechea activa
surs-destinaie ca indicii circitelor virtuale tip ATM. Cea mai important
diferen este aceea c irurile de indecsi cu sunt precalculate de ctre
protocolul de rutare de fiecare dat cnd se schimb topologia. In figura
11.4 se prezint topologia unui ruter ce utilizeaz protocolul Bellman Ford
pentru gsirea distantelor spre destinaie.
Cu protocolul BellmanFord (folosit de protocolul intradomeniu RIP,
Routing Information Protocol), un ruter R calculeaz calea cea mai scurt
spre D, prin retinerea celui mai mic dintre costurile spre D, prin fiecare
vecin. Costul spre D printr-un vecin ca A, este costul lui A spre D (5 in cazul
nostru) la care se adun costul de la R la A (3, in exemplul nostru). n figura
11.4, costul cel mai scurt de la R spre D este prin ruterul B, cu costul 7. R
poate calcula aceste costuri deoarece fiecare vecin al lui R, (A si B aici)
paseaza costul propriu de la D spre R, cum se arat n figur. Pentru
calcularea si a indicilor, se modific protocolul de baza astfel nct fiecare
vecin isi reporteaz indicii spre destinaie in plus cu costul propriu spre
destinatie. n figura 11.4, A trimite pe i i B pe j; astfel, cand R alege pe B, ii
foloseste si indexul j a lui B in intrarile tabelului de dirijare pentru D. Deci,
fiecare ruter utilizeaz indexul vecinului de cost minim pentru fiecare
destinatie, ca sir de indecsi pentru acea destinatie.
Cisco a introdus mai trziu comutarea etichetelor, a crei concept se
aseamn cu conceptul niruirii indecsilor, dar comutarea etichetelor
permite unui ruter utilizarea unei stive de etichete (indici) pentru ruterele
multiple care urmeaza. Cu toate acestea, ambele scheme nu lucreaz bine cu
structurile ierarhice. Se consider un pachet ce ajunge de la backbone la
primul ruter al domeniului de ieire. Domeniul de iesire este ultima retea
condusa autonom traversata de pachet, sa zicem o retea de intreprindere
careia ii apartine destinatia pachetului.
Singura cale de evitare a cutrii/lookup in primul ruter R, din domeniul de
ieire, este sa avem un ruter inafara domeniului de ieire care sa trimita
(pentru subreteaua destinatie) mai devreme un index ctre R. Acest lucru este
imposibil, deoarece ruterele backbone anterioare ar trebui s aibe doar o
intrare agregata de rutare ctre intreg domeniul destinaie i, astfel, poate
trimite doar un indice spre toate subretelele din acel domeniu. Soluia este fie
adugarea unor intrri suplimentare ruterelor din afara domenuilui (ceea ce e
nefezabil), sau sa se pretinda o cautare IP banala la punctele de intrare in
domeniu(soluia folosit). Comutarea etichetelor s-a dezvoltat azi sub o

157

form mai generala numit comutare de etichete multiprotocol (MPLS


MultiProtocol Label Switching). Totusi, nici comutarea de etichete nici
MPLS nu evita complet cautarea IP ordinara.

D i

D j

D -

B,j

B, -

A, i

Nod A
Tabel rutare
S

Tabel rutare

Fig. 11.3 Cutarea destinaiei prin utilizarea de ctre fiecare ruter a unui index de trecere
n tabelul de transmisie a urmtorului ruter

Cost 5

Cost 6

Nod D

D, 5

D, 6
Cost 3

Cost 1

Nod A

Nod B

D, 5, i

D, 5, j

Tabel
trimis de A

D, 5, j
Tabel
trimis de B

Nod R
Fig 11.4 Setarea indicelor niruirii, sau modificarea niruirii prin
rutarea Bellman Ford

11.2.2 Comutarea fluxurilor


O alt metod de evitare a cutrii este comutarea fluxurilor. Se utilizeaza
un ruter de salt precedent care trimite un indice urmtorului ruter de salt, dar
spre deosebire de comutarea etichet, acest index este calculat la cerere,
atunci cnd ajung datele la ruter, si apoi e memorat in cache.
Comutarea fuxului ncepe cu ruterele care conin un comutator ATM
intern(posibil lent), i un procesor capabil sa realizeze retransmisia IP i
rutarea. n figura 11,5 sunt prezentate dou astfel de rutere R1 i R2. Cand
ruterul R2 trimite prima data un pachet IP spre destinaia D, care ajunge la

158

intrarea din stnga a ruterului R2, portul de intrare trimite pachetul


procesorului sau central. Aceasta este o cale lenta. Procesorul face o cutare
IP i comuta intern pachetul spre legatura de iesire L. Mai departe nimic nu e
iesit din comun.
R2

R1

I,L

L
M

D
Procesor

Slow path
Fast path

Fig. 11.5 Comutarea IP

La comutarea IP, daca R1 doreste sa comute pachetele transmise spre D


destinate legaturii de iesire L, R1 alege un circuit virtual liber I, plaseaza
asocierea I,L in portul sau de intrare, si apoi trimite pe I inapoi la R2. Daca
acum R2 trimite lui D pachete cu eticheta VCI I, pachetul va fi comutat
direct spre legatura de iesire, fara sa mai treaca prin procesor.
Daca insa, daca momentan e un volum mare de trafic spre D, nodului R1
ii vine idea sa comute pachetele ce merg spre D, situatia devine
ciudata.In acest caz, R1 alege mai intai un circuit virtual liber I, plaseaza
asocierea I L in portul sau hardware, si apoi trimite I inapoi la R2. Daca
acum R2 trimite spre D pachete cu eticheta VCI I , spre portul de intrare a lui
R1, portul verifica asocierea lui I cu L si comuta pachetul direct spre
legatura de iesire L fara sa mai treaca prin procesor. Desigur, R2 poate repeta
acest proces de comutare cu ruterul precedent de pe cale, s.a.m.d. Eventual,
inaintarea IP poate lipsi complet in portiunea comutata a secventei de rutere
cu comutarea fluxurilor.
Comutarea fluxurilor, desi eleganta, probabil ca nu functioneaza prea bine
in retelele de tranzit/backbone, deoarece fluxurile backbone au o viata scurta
si o localizare slaba. Unii autori, Molinero-Fernandez si McKeown au o
parere contrara, si argumenteaza in favoarea unei reveniri a comutarii
fluxurilor bazata pe conexiunile TCP. Ei considera ca actuala folosire a
comutatoarelor optice cu comutarea circuitelor in ruterele de tranzit/core,
subutilizarea legaturilor de tranzit/backbone care lucreaza la 10% din
capacitate, si cresterea latimii de banda optce vor favoriza simplitatea
comutarii de circuit la viteze mari.
Ambele metode de comutare (IP i etichet), sunt folosite pentru evitare a
cautarilor IP prin pasarea de informatii in antetele protocoalelor. Ca i la
ATM, ambele trimit indici (P10); dar comutarea etichet precalculeaz
indicii in avans(P2a) (topologia se modifica in timp), spre deosebire de ATM
(chiar inainte de transferul datelor). Pe de alta parte, la comutarea IP indicii
sunt calculai la cerere (P2c, evaluare relaxata) dup ce datele ncep s fie
trimise. Cu toate acestea nici comutarea etichtelor nici comutarea IP nu evit
159

complet cutarea cu prefix i fiecare adauga un protocol complex. Sa vedem


acum cum e cu presupusa complexitate a cautarii IP.
11.2.3 Situatia comutrii etichetelor, comutarii IP i comutrii
multiprotocol a etichetelor
Desi comutarea etichetelor i cea IP au fost initial introduse pentru
creterea vitezei cutrii, la comutarea IP s-a renuntat. Dar comutarea
etichetelor s-a reinventat sub forma mai general a comutarii multiprotocol a
etichetelor (MPLS), pentru a diferentia fluxurile in scopul asigurarii calitii
serviciilor. Asa cum un VCI indic o etichet simpla pentru distingerea
rapid a fluxului, eticheta permite ruterului s izoleze rapid un flux pentru
servicii speciale. De fapt, MPLS utilizeaz etichetele pentru a evita
clasificarea pachetelor, ceea ce este o problema mult mai dificila dect
cutarea prefixelor. Asa ca, desi asocierea prefixelor este necesara inca,
metoda MPLS este utilizat actualmente in ruterele de tranzit/core.
Pe scurt, inaintarea/expedierea rapida MPLS a pachetelor se desfasoara
astfel. Dac este identificat un pachet cu un antet MPLS, este extras din
acesta o etichet de 20 bii si eticheta este cautata intr-o tabela care asociaza
eticheta cu regula de inaintare/retransmisie. Regula specific urmtorul
nod/hop i operaiunile ce vor fi efectuate asupra setului curent de etichete
din pachetul MPLS. Aceste operaiuni pot include renunarea la etichete
(extragere din stiva etichetelor)sau adugarea de etichete (introducere in
stiva etichetelor).
Implementarea ruterelor MPLS trebuie realizat impunand anumite limitri
procesului general, pentru a garanta retransmisia la viteza liniei. O limitare
posibila se refera la impunerea unui unui spatiu dens pentru etichete , care
suporta un numar de etichete sub 220 (ceea ce permite un volum mai mic de
memorie pentru lookup, si evitarea tabelului hash), si limitarea numarului de
operatii cu stiva de etichete care pot fi efectuate asupra unui singur pachet.
11.3 Tehnici nonalgoritmice de asociere a prefixelor
Se prezint aici alte dou tehnici de cutare a prefixelor, nelegate de
metodele algoritmice: memorarea in cache-uri i CAM ternar. Memorarea in
cache-uri se bazeaz pe localizarea referinelor adreselor, iar CAM ternar pe
paralelismul hardware.
11.3.1 Memorarea in cache-uri
Cutarea/lookup poate fi mai rapid prin utilizarea memoriilor cache,
(P11a) care mapeaz adresele de 32 bii spre urmtorul salt/hop. Cu toate
acestea rata de utilizare a acestor memorii in backbone-uri este destul de
mic din cauza lipsei localizrii prezentata de fluxurile din backbone.
Utilizarea unei memorii cache mari necesit folosirea unui algoritm de
asociere precis pentru cautare. Au aparut propuneri inteligente de modificare
a algoritmului de lookup pentru cahe-ul CPU, in acest scop. n esenta,
memorarea in cache-uri poate fi de folos dar nu elimin necesitatea unei
cutri rapide a prefixului.
11.3.2 Memorii ternare adresate prin coninut.
Memoriile ternare adresate prin coninut (TCAM) care permit biti care nu
conteaza ofera o cutare paralel printr-un singur acces la memorie. CAM-

160

urile actuale pot face cutarea si actualizarea/update intr-un singur ciclu de


memorie (10 nsec de exemplu) si manevreaza orice combinatie a 100.000 de
prefixe. Dar CAM-urile au urmtoarele probleme:
Scalarea densitatii: un bit n TCAM-uri are nevoie de 10, 20 tranzistoare,
pe cnd un SRAM necesita doar 4, 6 tranzistoare. Astfel TCAM-urile vor fi
mai puin dense dect SRAM-urile, adica vor avea o suprafa mai mare, iar
suprafaa plcilor este o problem critica pentru rutere.
Scalarea puterii: TCAM-urile consum o putere mai mare din cauza
comparrii paralele. Dar furnizorii de CAM-uri evita problema, gasind cai
de eliminare a unor parti ale CAM-ului, pentru a reduce puterea. Puterea
este o problema cheie in ruterele mari de tranzit/core.
Scalarea timpului: logica de asociere intr-un CAM cere ca toate regulile
de asociere/matching sa lucreze astfel incat sa castige cea mai lunga
potrivire.Vechile generatii de CAM-uri aveau nevoie in jur de 10nsec pentru
o operatie, dar produsele anuntate actualmente se pare ca vor necesita doar 5
nsec, probabil prin pipelining-ul din partea de intirziere a asocierii.
Chip-uri suplimentare: avand in vedere faptul ca multe rutere, ca CISCO
GSR si Juniper M160, au circuite integrate dedicate ASIC (Application
Specific Integrated Circuit) expedierii pachetelor, e tentanta integrarea
algoritmilor de clasificare cu cautare, fr adugarea interfeei CAM si chipurilor CAM. Tipic, CAM-urile necesita o punte ASIC in plus pe langa chipul CAM de baza, iar uneori neceista chip-uri CAM multiple.
n concluzie, tehnologia CAM se mbuntete rapid i pot inlocui
metodele algoritmice n ruterele mai mici. Dar, pentru ruterele de tranzit mai
mari ce vor avea in viitor baze de date cu milioane de rute, ar fi mai bune
soluiile care se scaleaza la tehnologiile memoriilor standard ca i SRAM.
Probabil ca tehnologia SRAM va fi mereu mai ieftin, mai rapid i mai
dens ca i CAM-urile. Desi e prea devreme sa prezicem rezultatul acestei
competitii dintre metodele algoritmice si cele TCAM, chiar si producatorii
de semiconductoare furnizeaza ambele solutii: algoritmice si cu CAM-uri.
P1=101*
P2=111*
P3=11001*
P4=1*
P5=0*
P6=1000*
P7=100000*
P8=100*
P9=110

Fig. 11.6 Baza de date cu prefixe.

11.4 Arbori ordonati unibit


Trie sau prefix tree este o structura de date ordonata de tip arbore pentru
memorarea tabelelor asociative la care cheile sunt siruri. Spre deosebire de
binary search tree, nici un nod din arbore nu memoreaza cheia asociata
nodului, dar in schimb, pozitia sa in arbore arata care este cheia asociata.Toti
descendentii oricarui nod au un prefix comun al sirului asociat acelui nod, iar
radacinii ii este asociat un sir vid. In mod normal, nu se asociaza valori
fiecarui nod, doar frunzelor (leaves) si anumitor noduri interne (inner
nodes) care corespund cheilor de interes.

161

Termenul trie deriva din retrieval. Din cauza etimologiei sale unii sustin ca ar trebui
pronuntat ca si tree, dar altii sustin varianta try, pentru a face distinctia fata de
termenul mai general tree.

Este utila trecerea in revista a tehnicilor algoritmice (P15) pentru cutarea


prefixelor printr-o tehnic simpl: arborii ordonati unibit / unibit tries. Se va
considera o baz de date (fig 11.6), pentru ilustrarea soluiile algoritmice din
acest capitol, cu 9 prefixe, P1-P9, cu sirurile de bii ca in figur.
n practic, exista un hop/salt urmator asociat fiecrui prefix (omis in
figura). Pentru evitarea confuziei, numele prefixelor sunt folosite pentru
precizarea urmtorului hop. Astfel o adres D ce ncepe cu 1 i continua cu
31 de zerouri se va potrivi cu P6, P7, P8. Cea mai lung potrivire este P7.
In fig.11.7 este prezentat un arbore ordonat unibit pentru exemplul de baza
de date din fig.11.6. Arborele ordonat unibit e un arbore la care fiecare nod e
un tabel/array care contine pointer-0 si pointer-1. La radacina toate prefixele
care incep cu 0 sunt memorate intr-un subarbore ordonat indicat de
pointerul-0 si toate prefixele care incep cu un 1 sunt memorate intr-un
subarbore ordonat indicat de pointerul-1.
Fiecare arbore ordonat este apoi construit recursiv, intr-un modul
asemanator, folosind restul de biti ai prefixului alocati subarborelui
ordonat.De exemplu, in fig.11.7, P1=101 e memorat intr-o cale parcursa
urmarind pointerul 1 ca radacina, pointerul 0 ca si copilul din dreapta al
radacinii, si pointerul-1 la urmatorul nod al caii.
Mai trebuie remarcate doua probleme. In unele cazuri, un prefix poate fi un
subsir al altui prefix. De exemplu, P4=1 este un subsir al lui P2=111 . In
acest caz, cel mai mic sir, P4, e memorat in interiorul nodului ordonat, pe
calea spre sirul mai lung.De exemplu P4 e memorat la copilul din dreapta a
radacinii; calea acestui copil din dreapta este sirul 1, care e acelasi cu P4.
La sfarsit, in cazul unui prefix ca P3=11001, dupa ce urmam primii trei
biti, naiv ne-am putea astepta sa gasim un sir de noduri corespunzand
ultimilor doi biti.Dar deoarece nici un alt prefix nu partajeaza cu P3 mai
mult decat primii trei biti, aceste noduri ar contine doar un pointer de
fiecare.Un astfel de sir de noduri ale arborelui ordonat cu cate doar un
pointer e numit ramura cu cale unica. In mod clar, ramurile uni-cale pot
creste spatiul pierdut de memorare, folosind intregul nod (ce contine minim
doi pointeri) cand de fapt ar fi suficient doar un bit. O tehnica simpla de a
elimina aceasta risipa evidenta (P1) este sa comprimam ramurile uni-cale.
Figura 11.7 Arbore ordonat unibit pentru baza de date din fig.11.6

In fig.11.7 acest lucru e facut folosind un sir text (de ex.01) pentru a
reprezenta pointerii care ar urma in ramura unicale. Astfel, in fig.11.7, doua
noduri ale arborelui ordonat (continand fiecare doi pointeri) din calea spre
P3, au fost inlocuiti de un singur sir text, de 2 biti. Dar nu s-a pierdut
informatie prin aceasta transformare (ca exercitiu, determinati daca mai e
vreo cale prin arbore care poate fi comprimata asemanator).
Pentru cautarea celei mai lungi potriviri a prefixului addresei destinatie D,
se folosesc bitii lui D pentru a trasa calea prin arbore. Calea incepe cu
radacina si continua pina ce cautarea esueaza prin terminare la un pointer vid
ori la un sir text care nu se potriveste complet.In timp ce urmareste calea,
algoritmul tine evidenta ultimului prefix numarat la un nod de pe cale. Cand
cautarea esueaza, acesta este cea mai lunga potrivire a prefixului si e
162

returnata.De exemplu, daca D incepe cu 1110, algoritmul porneste urmarind


pointerul-1 la radacina ca sa ajunga la nodul ce-l contine pe P4.Algoritmul
isi aminteste pe P4 si foloseste urmatorul bit al lui D ( un 1) pentru a urmari
pointerul -1 la urmatorul nod. La acest nod, algoritmul urmareste valoarea
(P4) prin prefixul (P2) gasit mai nou.In acest punct se termina cautarea,
deoarece P2 nu are pointeri de iesire.
Pe de alta parte, consideram ca facem o cautare pentru destinatia D ai
carui primii 5 biti sunt 11000. Inca odata, primul bit de 1, e folosit pentru a
ajunge la nodul ce-l contine pe P4. P4 este tinut minte ca ultimul prefix
contorizat, si pointerul 1 e urmarit pentru a ajunge la nodul cel mai din
dreapta de adincime 2.
Algoritmul urmareste acum al treilea bit din D (un 0) spre nodul sirului
text care contine 01. Astfel ne amintim ca P9 a fost ultimul prefix
contorizat. Al patrulea bit a lui D este 0, care se potriveste cu primul bit din
01. Dar, al cincilea bit a lui D este 0 (si nu 1 cum e al doilea bit din 01 ).
Astfel cautarea se termina cu P9 ca cea mai lunga potrivire.
Literatura despre arborii ordonati nu foloseste sirurile text pentru a
comprima ramurile cu cale unica (fig.11.7).In schimb schema clasica
Patricia trie / testul Patricia, foloseste un contor de omisiuni / skip count.
Acest contor memoreaza numarul de biti din sirul text corespunzator, si nu
bitii in sine.De exmplu, 01 din exemplul nostru va fi inlocuit cu contorul
de omisiuni 2 in testul Patricia.
Algoritmul lucreaza bine atata timp cat testul Patricia e folosit pentru
pentru potriviri exacte, pentru care a si fost initial creat.Cand ajunge cautarea
la la un nod cu contor de omisiuni, omite numarul de biti potriviti si
urmareste pointerul nodului contorului de omisiuni pentru a continua
cautarea. Deoarece bitii omisi nu sunt comparati pentru potrivire, Patricia
pretinde ca la sfarsitul cautarii sa se faca o comparare completa dintre cheile
cautate si intrarile gasite de Patricia.
Din pacate, algoritmul lucreaza foarte prost pentru potrivirea prefixului/
prefix matching, pentru care Patricia nu a fost proiectat la inceput. De
exemplu, la cautarea lui D, ai carui primii 5 biti sunt 11000 in echivalentul
lui Patricia a figurii 11.7, cautarea ar trebui sa omita ultimii doi biti si sa o ia
spre P3. In acest punct compararea va gasi ca P3 nu se potriveste cu D .
Cand se intampla acest lucru o cautare in arborele Patricia trebuie sa
revina inapoi si sa retesteze arborele pentru o posibila potrivire mai scurta. Sar parea ca in acest exemplu, cautarea ar trebui sa-si aminteasca P4. Dar
daca P4 a fost de asemenea contorizat pe calea care contine nodurile
contoarelor de omisiuni, algoritmul nu poate fi chiar sigur de P4. Astfel el
trebuie sa revina ca sa verifice daca P4 este corect.
Din pacate, implementarea BSD a inaintarii IP a decis sa foloseasca arborii
Patricia, ca baza pentru cea mai buna potrivire de prefix. Astfel,
implementarea BSD a folosit contoarele de omisiuni; de asemenea
implementarea memoreaza prefixele umplandu-le cu zerouri. Prefixele au
fost depozitate in frunzele arborelui, in loc sa fie in interiorul nodurilor, cum
e aratat in fig.11.7. Rezultatul e ca potrivirea prefixului poate, in cel mai rau
caz, sa duca la o reluare/ backtracking a arborelui pentru cazul cel mai
defavorabil de 64 de accesari ale memoriei (32 in josul arborelui si 32 in
susul arborelui).
163

Avand alternativa simpla a folosirii sirurilor text pentru evitarea


backtracking-ului, contoarelor de omisiuni sunt o idee proasta; in esenta,
deoarece transformarea contoarelor de omisiuni nu conserva informatia, in
timp ce transformarea sirurilor text o conserva. Totusi, din cauza influentei
enorme a BSD-ului, unii producatori si chiar algoritmi au aplicat contoarele
de omisiuni in implementarile lor.
11.5 Arbori ordonai multibit
Majoritatea memoriilor mari folosesc DRAM-uri; acestea au latenta
mare( 60 nsec), comparativ cu timpul de acces la registre (2-5 nsec).
Deoarece la arborii ordonati unibit testarea poate necesita 32 de accesari ale
memoriei pentru un prefix de 32 de biti, timpul de cautare in cazul cel mai
defavorabil la arborii unibit e de minim 32 60 = 1,92 sec , ceea ce
motiveaza cautarea in arborii ordonati multibit.
Pentru a face cautarea cu pasi/strides de 4 biti, principala problema este de
a lucra cu prefixe ca 10101 (cu lungimea 5 ), a caror lungime nu e multiplu
de 4 lungimea aleasa a pasilor. Cum putem fi siguri ca nu omitem prefixe ca
10101 , atunci cand la un moment dat cautam 4 biti ? Problema se rezolva
cu expansiunea controlata a prefixului, prin transformarea bazei de date de
prefixe existenta intr-o baza de date noua, cu mai putine prefixe dar posibil
cu mai multe prefixe. Eliminarea tuturor lungimilor care nu sunt multipli de
lungimea pasului ales, expansiunea permite o cautare multibit mai rapida, cu
pretul cresterii dimensiunii bazei de date.
Figura 11.8 Expansiunea controlata a bazei de date de prefixe originala (stanga, cu cinci
lungimi de prefixe 1,3,4,5,6) la o baza de date expandata (dreapta, cu doar doua lungimi de
prefixe 3 si 6).

De exemplu, extragand prefixele impare vechi se reduce numarul de


prefixe, de la 32 la 16, ceea ce ar permite cautarea in arbore a cate doi biti la
un moment dat. Pentru a extrage un prefix ca 101 de lungime 3, se observa
ca 101 reprezinta adresele care incep cu 1010 sau cu 1011 . Astfel 101
(de lungime 3) poate fi inlocuit de doua prefixe de lungime 4 ( 1010 si
1011 ), ambele mostenind intrarile de inaintare spre nodul/hop urmator
101 .
Dar prefixele extinse pot intra in coliziune cu un prefix existent care are
noua lungime.In acest caz se renunta la noul prefix expandat, si se da
prioritate vechiului prefix deoarece el a avut de la inceput lungimea mai
mare.
In esenta, expansiunea face un compromis memorie/timp in favoarea
timpului (P4b). Aceeasi idee poate fi folosita pentru a indeparta orice set ales
de lungimi, cu exceptia lungimii 32. Deoarece cautarea in arbore depinde
liniar de numarul de lungimi, expandarea reduce timpul de cautare.
Consideram mostra de baza de date din fig.11.6, cu noua prefixe, P1-P9.
Aceasta e trecuta si in stanga figurii 11.8. Baza de date din dreapta figurii
11.8 este o baza de date echivalenta, construita prin expandarea bazei de
date originale, pentru a contine doar prefixe de lungimea 3 si 6. De
164

mentionat este faptul ca prin expandarea lui P6= 1000 de la patru biti la
sase biti, se intra in coliziune cu P7= 100000 si astfel se renunta la P6.
11.5.1 Arbori ordonati cu pas fix
In fig.11.9 e prezentat un arbore ordonat pentru aceeasi baza de date ca cea
din fig.11.8, folosind un arbore expandat cu pas fix, de lungime 3. Astfel
fiecare nod al arborelui foloseste 3 biti. Intrarile replicate in nodurile
arborelui din fig.11.9 corespund exact prefixelor expandate din dreapta
figurii 11.8. De exemplu, P6 din fig.11.8 are trei expandari
(100001,100010,100011) .

Aceste trei prefixe expandate indica spre pointerul 100 a nodului radacina
din fig.11.9 (deoarece toate cele trei prefixe expandate incep cu 100 ) si sunt
memorate in intrarile 001, 010, 011 ale copilului din dreapta nodului
radacina. De mentionat este ca intrarea 100 in nodul radacina are prefixul
memorat P8 (pe langa faptul ca pointerul indica spre expansiunea lui P6),
deoarece P8= 100 este el insusi un prefix expandat.
Figura 11.9 Arbore ordonat expandat (care are doi pasi de cate 3 biti) corespunzator bazei
de date de prefixe din fig.11.8.

Astfel, fiecare element al nodului arborelui e o inregistrare continand doua


intrari: prefixul memorat si un pointer. Cautarea in arbore proceseaza 3 biti
la un moment dat de timp.De fiecare data cand e urmat un pointer, algoritmul
isi reaminteste prefixul memorat (daca are). Cand se termina cautarea la un
pointer vid, este returnat ultimul prefix memorat din cale.
De exemplu, daca adresa D incepe cu 1110 , cautarea pentru D incepe la
intrarea 111 a nodului radacina, care nu are un pointer de iesire ci doar un
prefix memorat (P2). Astfel, cautarea pentru D se termina cu P2. O cautare
pentru o adresa care incepe cu 100000 urmareste pointerul 100 in radacina
(si-si reaminteste P8). Acesta indica spre nodul de mai jos din dreapta, unde
intrarea 000 nu are pointer de iesire ci doar prefix memorat(P7).Astfel
cautarea se termina cu rezultatul P7. Atat pointerul cat si prefixul memorat
pot fi regasite printr-un singur acces la memorie folosind memorii mari (
P5b).
Un caz special a arborilor ordonati cu pas fix,foloseste pasi ficsi de 24,4 si
4.Autorii, Guptas.a., observa ca DRAM-urile cu mai mult de 224 de locatii
devin accesibile, astfel ca devine fezabila si cautarea cu pas de 24 de biti.
11.5.2 Arbori ordonati cu pas variabil
In figura 11.9, nodul frunza cel mai din stanga trebuie sa memoreze
expandarile lui P3= 11001 , iar nodul frunza cel mai din dreapta trebuie sa
memoreze P6 ( 1000 ) si P7 ( 100000 ). Astfel, dincauza lui P7, nodul
frunza cel mai din dreapta trebuie sa examineze mai mult de 2 biti, deoarece
P3 contine doar 5 biti, si oasul radacinii eate de 3 biti. Exista un grad de
libertate suplimentar care poate fi optimizat (P13).
In arborii ordonati cu pas variabil, numarul de biti examinati de fiecare nod
al arborelui poate varia, chiar si pentru noduri de acelasi nivel. Pentru a face
acset lucru, pasul nodului arborelui e codat cu un pointer spre nod. Figura
11.9 poate fi transformata inlocuind nodul cel mai din stanga cu un tabel cu

165

patru elemente si codand lungimea 2 cu pointerul spre nodul cel mai din
stanga. Codarea pasului necesita 5 biti. Dar, arborele ordonat cu pas variabil
din fig.11.10 are cu patru intrari in tabela mai putine decat arborele din
fig.11.9.
Exemplul motiveaza alegerea pasilor pentru minimizarea volumul de
memorie al arborelui. Deoarece expandarea face un compromis memorietimp, de ce sa nu minimizamnecesarul de memorie prin optimizarea gradului
de libertate (P13), pasii folositi in fiecare nod ? Pentru alegerea pasilor
variabili, proiectantul trebuie sa specifice mai intai numarul de accesari ale
memoriei in cazul cel mai defavorabil.De exemplu, cu un pachet de 40 de
octeti la 1 Gbps si un DRAM de 80 nsec, avand bugetul de timp de 320
nsec, sunt permise doar patru accesari ale memoriei. Acest lucru
conditioneaza numarul maxim de noduri in orice cale de cautare (patru
pentru exemplul considerat).
Daca inaltimea arborelui este data, pasul poate fi ales pentru a minimiza
memoria. Acest lucru poate fi facut in cateva secunde folosind programarea
dinamica, chiar si pentru baze mari de date de 150.000 de prefixe. Un grad
de libertate(pasii), e optimizat pentru minimizarea memoriei folosita pentru o
inaltime data cea mai defavorabila.
Un arbore ordonat se spune ca e optimal pentru o inaltime h si o baza de
date D, daca arborele are cel mai mic spatiu de memorare dintre toti arborii
ordonati cu pas variabil pentru baza de date D, si inaltimea nu mai mare
decat h. Se arata usor ca arborele din fig.11.10 e optimal pentru baza de date
din stanga figurii 11.8 si inaltimea 2.
Problema generala a alegerii pasul optim poate fi rezolvata recursiv (fig
11.11). presupunem ca inaltimea arborelui trebuie sa fie 3. Algoritmul alege
mai intai o radacina cu pasul s. Cei y = 2s pointeri posibili din radacina pot
conduce spre y subarbori nevizi T1 ,..., Ty . Daca multimea de s pointeri indica
spre subarborele Ti , atunci toate prefixele din baza de date originala D care
incep cu pi trebuie memorate in Ti . Numim setul de prefixe Di .
Presupunem ca putem gasi recursiv Ti optimal pentru inaltimea h 1 si
baza de date Di . Avand un acces la memorie folosit la nodul radacina, au
ramas doar h 1 accese la memorie pentru a parcurge fiecare subarbore Ti .
Notam cu Ci necesarul de spatiu de memorare, numarat in locatii de tabele,
pentru Ti optimal. Atunci, pentru un pas s al radacinii fixat, costul arborelui
optimal rezultat C ( s ) este 2 s (costul nodului radacina in locatii de tabel)plus
y

C . Astfel, valoarea optimala a pasului initial este valoarea lui s , unde


i =1

1 s 32 , care minimizeaza s.
O folosire naiva a recursivitatii duce la subprobleme repetate. Pentru a
evita subproblemele repetate. Algoritmul construieste mai intai un arbore
ordonat 1-bit.De mentionat este ca oricare subarbore ordonat Ti (fig.11.11)
trebuie sa fie un subarbore N al arborelui 1-bit. Apoi, algoritmul foloseste
programarea dinamica pentru construirea costului optim si pasii arborelui
pentru fiecare subarbore N din arborele original 1-bit, pentru toate valorile
1-h ale inaltimii, construind de jos in sus, de la subarborele de cea mai mica

166

inaltime spre subarborele de cea mai mare inaltime. Rezultatul final sunt
pasii optimi pentru radacina (subarborelui 1-bit) cu inaltimea h.
Complexitatea finala a algoritmului este O N W 2 h , unde N este

numarul prefixelor originale din baza de date originala, W este latimea


adresei destinatie, iar h este ponderea dorita pentru cazul cel mai defavorabil.
Aceasta este deoarece exista N W subarbori in arborele 1-bit, fiecare din ei
trebuie rezolvat pentru inaltimi in gama 1-h, si fiecare solutie implica o
minimizare fata de cel mult W alegeri posibile, pentru pasul initial s.
Complexitatea este liniara fata de N (numarul cel mai mare cunoscut actual
fiind de 150.000)si h, (care ar trebui sa fie mic, maxim 8), dar patratica ca
functie de latimea adresei (32, in mod curent). In practica, dependenta
patratica de latimea adresei nu e un factor major.
De exemplu, pentru o inaltime de 4, baza de date optimizata Mae-East
necesita 432 KB, fata de 2003 KB a variantei neoptimizate. Varianta
neoptimizata foloseste pasii naturalide 8,8,8,8 . Programul dinamic ia 1,6
sec timp de rulare pe un Pentium Pro de 300 MHz. Programul dinamic poate
fi chiar mai simplu pentru arborii cu pas fix, rularea durand doar 1msec, dar
necesita 737KB in loc de 423 KB.
Dar 1,6 msec este mult prea mult ca programul dinamic sa ruleze la fiecare
actualizare si mai permite actualizari de ordinul milisecundelor. Cu toate
acestea, instabilitatile backbone sunt cauzate de patologii de genul in care
acelasi set de prefixe S sunt inserate repetat si sterse de ruterul care e
temporar suntat. Deoarece a trebuit sa se aloce memorie pentru intregul set,
inclusiv S, oricum, faptul ca arborele este suboptimal la folosirea sa a
memoriei cand S este sters, este irelevant. Pe de alta parte, rata la care noile
prefixe sunt sterse sau adaugate de manager, pare ca e mai probabil ca acest
lucru sa fie facut in ordinea zilelor. Astfel, un program dinamic care ia
cateva secunde timp de rulare, e rezonabil sa fie rulat zilnic, si nu va afecta
timpul pentru cazul cel mai defavorabil de inserare/stergere, permitand arbori
optimali rezonabili.
11.5.3 Actualizarea incrementala
Pentru arborii ordonati multibit exista algoritmi simpli de inserare/stergere.
Consideram adaugarea unui prefix P. Algoritmul simuleaza mai intai
cautarea unui sir/string de biti in noul prefix P, pina la si inclusiv ultimul pas
complet din perfixul P. Cautarea se termina fie prin terminarea cu ultimul
pas (posibil incomplet) sau prin ajungerea la un pointer vid/nil.Astfel, pentru
adaugarea lui P10= 1100 bazei de date din fig.11.9, cautarea urmeaza
poiterul 110 si termina la frunza cea mai din stanga a arborelui ordonat a
nodului X.
Pentru scopul inserarii/stergerii, pentru fiecare nod X a arborelui ordonat
multibit, algoritmul mentine un arbore 1-bit corespondent, cu prefixele
memorate in X. Aceasta structura auxiliara trebuie sa nu fie in memoria
rapida. Astfel, pentru fuecare element al tabelului de noduri, algoritmul
memoreaza lungimea celei mai bune potriviri ale sale prezenta.Dupa ce se
determina ca P10 trebuie adaugat nodului X, algoritmul expandeaza P10
spre pasul lui X. Orice element al tabelului spre care P10 este expandat (care
este etichetat curent cu un prefix avand o lungime mai mica decat P10)
trebuie suprascris cu P10.

167

Asfel, la adaugarea lui P10= 1100 , algoritmul trebuie sa adauge


expansiunea lui 0 inspre nodul X. In particular, intrarile 000 si 001 in
nodul X trebuie actualizate sa fie P10.
Daca se termina cautarea inainte de a atinge ultimul pas in prefix,
algoritmul creaza un nou nod al arborelui ordonat. De exemplu, daca prefixul
P11= 1100111 e adaugat, cautarea esueaza la nodul X, cand se gaseste un
pointer vid/nil la intrarea 011. Algoritul creaza atunci un nou pointer la
aceasta locatie, care e facut sa indice spre un nou nod al arborelui care
contine P11. Apoi P11 este expandat in acest nod nou.
Stergerea este similara adaugarii. Complexitatea inserarii si a stergerii este
data de timpul de realizare a unei cautari ( O (W ) ) plus timpul de reconstruire
completa a nodului (O ( S ) , unde S este dimensiunea maxima a nodului
arborelui). De exemplu, folosind noduri ale arborelui de 8-biti, acest al
doliea cost va necesita scanarea a aproximativ 28 = 256 intrari de nod ale
arborelui. Astfel, pentru a permite actualizari rapide, e crucial sa limitam de
asemenea dimensiunea oricarui nod din programul dinamic descris anterior.
11.6 Arbori ordonati comprimati pe nivel, LC(Level-Compressed
Tries)
Un arbore ordonat LC este un arbore comprimat cu pas variabil in care
fiecare nod al arborelui contine intrari nevide. Un arbore ordonat LC e
construit gasind mai intai pasul celei mai mari radacini care permite intrari
non-vide si apoi se repeta recursiv procedura in subarborii copii. Un exemplu
al acestei proceduri e dat in figura 11.12, pornind cu un arbore 1-bit in stanga
si rezultand intr-un arbore LC in stanga. P4 si P5 formeaza cel mai mare
subarbore cu radacini complete posibil daca pasul radacinii este 2, atunci
primele doua intrari de tabele vor fi goale. Motivul este evitarea elementelor
goale de tabel, pentru a minimiza spatiul de memorare.
Arborii cu pas variabil pot fi perfectionati in continuare, permitand ca
memoria sa fie tratata pentru viteza. De exemplu, reprezentarea arborelui
ordonat LC folosind baza Mae-East (1997) are o inaltime de arbore de 7 si
un necesar de 700 KB de memorie. Prin comparatie, un arbore ordonat cu
pas variabil are o inaltime a arborelui de 4 si necesita 400 KB de memorie.
Reamintim deasemenea ca pasul variabil optim calculeaza cel mai bun
arbore pentru o inaltime tinta, si astfel ar putea intr-adevar produce un arbore
ordonat LC daca arborele LC ar fi optimal pentru inaltimea sa.
Figura 11.12 Schema arborelui ordonat LC descompune recursiv arborele 1-bit in
subarbori completi/full de cea mai mare dimensiune posibila. (stanga). Copiii din fiecare
subarbore complet (cu linie punctata) sunt apoi plasati in nodul arborelui pentru a forma un
arbore cu pas variabil specific bazei de date alese.
Figura 11.13 Reprezentarea tabelului arborelui ordonat LC

In forma sa finala, nodurile arborelui ordonat LC cu pas variabil in ordinea


de pe prima latime (prima data radacina, apoi toate nodurile arborelui si
nivelul secund de la stanga la dreapta, apoi nodurile din al treilea nivel, etc.),
ca in fig.11.13. Asezarea tabelei si conditiile impuse pentru subarborii
completi fac ca actualizarea sa fie lenta in cazul cel mai defavorabil. De
exemplu, stergerea lui
P5 din fig. 11.13
cauzeaza schimbari in
168

descompunerea in subarbori. Si mai rau este ca face ca aproape fiecare


element din reprezentarea tabelului din fig.11.13 sa migreze in sus.
11.7 Arbori ordonati comprimati de tip Lulea
Desi arborii ordonati LC si arborii ordonati cu pas variabil incearca sa
comprime arborii ordonati multibit variind pasul la fiecare nod, ambele
scheme au probleme. Desi folosirea tabelelor complete permit arborii
ordonati LC sa nu iroseasca de loc memoria cu locatii vide, ele cresc
inaltimea arborelui ordonat, care nu poate fi potrivita. Pe de alta parte,
arborii ordonati cu pas variabil pot fi potriviti sa aiba o inaltime scurta, cu
costul irosirii memoriei datorata locatiilor goale din tabel in nodurile
arborelui ordonat. Abordarea Lulea, descrisa acum, este o schema de arbore
ordonat multibit care foloseste noduri de arbore cu pas ficsi mari, dar si o
compresie bitmap pentru a reduce considerabil necesarul de memorie.
Sirurile cu repetitie (e.g. AAAABBAAACCCCC) pot fi comprimate
folosind un bitmap care denota punctele de repetitie (i.e.10001010010000)
impreuna cu o secventa comprimata(i.e.ABAC). Similar, nodul radacina din
fig.11.9 contine o secventa repetata (P5,P5,P5,P5) cauzata de expandare.
Schema Lulea evita aceasta irosire evidenta comprimand informatia
repetata folosind un bitmap si o secventa comprimata, fara o penalizare mare
la timpul de cautare. De exemplu, aceasta schema foloseste doar 160 KB de
memorie pentru a memora baza de date Mae-East, ceea ce permite ca sa fie
memorata intreaga baza de date intr-o SRAM on-chip scumpa. Costul platit
este timpul mare de inserare.
Unele intrari de arbore expandate (e.g. 110 intrari la radacina din fig. 11.9)
au doua valori, un pointer si un prefix. Pentru a face compresia mai usoara,
algoritmul porneste facand ca fiecare intrare sa aiba exact o valoare, prin
impingerea informatiei de prefix jos in frunzele arborelui. Deoarece frunzele
nu au pointer, avem doar informatia despre urmatorul hop la frunza si doar
pointerii la nodurile non-frunza. Acest procedeu se numeste leaf-pushing.
De exemplu, pentru a evita prefixe memorate in intrarea 110 a nodului
radacina din fig.119, prefixul memorat P9 este impins spre toate intrarile
nodului arborelui, cu exceptia intrarilor 010 si 011(ambele continua sa
contina pe P3). Similar, prefixul memorat P8 in intrarea 100 a nodului
radacina, este impins in jos spre intrarile 100,101,110 si 111 ale nodului cel
mai din dreapta a arborelui. Odata realizata aceasta etapa, fiecare intrare de
nod contine fie un prefix memorat, fie un pointer.
11.10
Cutarea binar a lungimii prefixului
Aici se adapteaz o alt schem clasic de potrivire perfect,
dispersarea/hashing-ul, la potrivirea celui mai lung prefix. Cutarea
binar asupra lungimii prefixului duce la gsirea celei mai lungi potriviri
utiliznd log 2 W dispersri, unde W reprezint lungimea maxim a
prefixului. Aceasta poate asigura o soluie scalabil pentru adresarea pe
128 bii de tip IPv6. Pentru prefixele de 128 de bii, acest algoritm
utilizeaz 7 accese la memorie spre deosebire de 16 accese la memorie
dac se utilizeaz un arbore multibit ordonat cu pasul de 8 bii. In acest
scop, n prima faz, algoritmul sorteaz prefixele dup lungime, n tabele
separate de dispersare. Mai precis, utilizeaz o zon L de tabele de

169

dispersare, astfel nct L [i ] e un pointer spre tabela de dispersare care


conine toate prefixele de lungime i.
Considerm acelai tabel mic de rutare din figura 11.17, cu doar dou
prefixe, P4 = 1* i P1 = 101*, de lungime 1 i respectiv 3. Acesta este un
subset al figurii 11.18. Zona tabelelor de dispersare este orizontal, n
partea de sus (A) a figurii 11.18. Tabela de dispersare de lungime 1,
coninnd prefixul P4, este vertical, n partea stng i indic spre
poziia 1 din tabel; tabela de dispersare de lungime 3, coninnd prefixul
P1, este n partea dreapta i indic spre poziia 3 din tabel; tabela de
dispersare de lungime 2 este vid, deoarece nu exist nici un prefix de
lungime 2.
O cutare naiv a adresei D ncepe cu tabelul de lungimea cea mai
mare (3 n exemplu), extrage primii l biti din D n Dl i apoi caut Dl
in tabelul de dispersie de lungime l. Dac cautarea are succes, a fost
gsit cea mai bun potrivire; dac nu, algoritmul ia n considerare
lungimea imediat mai mic (de ex. 2). Algoritmul caut, decrementnd
lungimea posibil a prefixului, pn cnd gsete o potrivire n mulimea
prefixelor posibile, sau pn cnd epuizeaz lungimile.
Schema naiv realizeaz o cutare liniar a lungimilor de prefixe
distincte. Analogia sugereaz un algoritm mai eficient: cutarea binar
(P15). Spre deosebire de cutarea binar a domeniului/gamei de prefixe,
aceasta este o cutare binar asupra lungimii prefixelor. Diferena este
major. Cu 32 de lungimi, cutarea binar asupra lungimii dureaz 5
accesri n cel mai ru caz ; cu 32000 de prefixe cutarea binar asupra
gamei de prefixe dureaz 16 accesri. Cutarea binar trebuie s inceapa
de la lungimea mediana a prefixelor si fiecare dispersare trebuie sa
mpart n dou lungimile posibile ale prefixelor. O cutare poate da
doar dou rezultate: gsit sau negsit. Daca s-a gsit o potrivire la
lungimea m, atunci lungimile strict mai mari dect m trebuie cutate
pentru o potrivire mai lung. In mod corespunztor, dac nu s-a gasit
nici o potrivire, cutarea trebuie sa continue printe prefixele de lungimi
strict mai mici dect m.
De exemplu, n figura 11.18.A, presupunem c ncepe cutarea la
lungimea medie-2 a tabelei hash, pentru o adres care ncepe cu 101.
Evident c aceast cutare nu duce la gsirea unei potriviri. Dar exist o
potrivire mai lung n tabelul de lungime 3. Din moment ce doar gsirea
unei potriviri duce la translatarea cutrii la jumtatea din dreapta,
trebuie introdus o potrivire artificialsau marker/indicator care s
foreze cutarea n jumtatea din dreapta n cazul n care exist
posibilitatea unei potriviri mai lungi.
De aceea n partea B se introduce o intrare de marcare 10 reprezentat
ngroat, care corespunde primilor doi bii ai prefixului P1= 101 din
tabelul de lungime 2. In esen, starea a fost adaugat pentru creterea
vitezei (P12).Markerul permite eecuri de testare n zona median
pentru a exclude toate lungimile mai mari dect cea median.

170

Cutarea unei adrese D care ncepe cu 101 se face corect. Cutarea


pentru 10 n tabelul de lungime 2 (fig.11.18.B) duce la gsirea unei
potriviri ; cutarea continu mai departe n tabelul de lungime 3, se
gsete o potrivire cu P1 i se ncheie cutarea. In general, trebuie plasat
un marker pentru un prefix P, la toate lungimile prin care va trece
cutarea binar pentru gsirea lui P. Se adaug doar un numr
logaritmic de marcatori. Pentru un prefix de lungime 32, markerii
necesari sunt doar la lungimile 16, 24, 28 i 30.
Din pcate, algoritmul este nc incorect. In timp ce markerii duc la
prefixe posibil mai lungi, pot de asemenea s duc la o cutare pe piste
greite.Se consider cutarea unei adrese D (fig.11.18.B) ai crei primi
trei bii sunt 100. Deoarece mijlocul tabelului conine 10, cutarea n
tabela hash mijlocie conduce la gsirea unei potriviri. Acest lucru
foreaz algoritmul s caute 100 n continuare n al treilea tabel ceea ce
va duce la euarea cutrii. Cea mai bun potrivire corect a prefixului
se afl n primul tabel (P4 = 1*). Markerii pot cauza deraierea cutarii.
Dar, o revenire a cutrii n jumtatea stng duce la un consum liniar
de timp.
Pentru a asigura un timp de cutare logaritmic, fiecare nod marker
M va conine o variabil M.bmp, unde M.bmp reprezint cel mai lung
prefix care se potrivete cu irul M. Aceast variabil este precalculat
cnd M este introdus n tabela hash. Cnd algoritmul urmarete markerul
M i caut prefixele de lungime mai mare dect M, dac eueaz n
gsirea unui asemenea prefix mai lung, atunci rspunsul este M.bmp. In
esen, cel mai potrivit prefix asociat fiecrui marker este precalculat
(P2a). Acest lucru evit cutarea tuturor lungimilor mai mici dect
lungimea medie dac potrivirea se face cu ajutorul markerului.
171

Versiunea final a bazei de date ce conine prefixele P4 i P1 este


prezentat n fig.11.18.C. A fost adugat un cmp bmp markerului 10
care indic spre cea mai bun potrivire de prefix a irului 10 (ex. P4 =
1*). De aceea, cnd algoritmul caut 100 i gsete o potrivire n tabelul
median de lungime 2, i aduce aminte valoarea bmp corespunztoare
intrrii P4, nainte de a cuta n tabelul de lungime 3. Cnd cutarea
eueaz (n tabelul de lungime 3), algoritmul returneaz cmpul bmp al
ultimului marcator ntlnit (ex. P4).
Un algoritm banal pentru construirea unei cutri binare a structurii
de date din memoria de lucru/scratch este urmtorul. Prima dat se
determin lungimile de prefix distincte; se determin astfel secvena de
lungimi de cutat. Apoi se adaug fiecare prefix P tabelei hash
corespunztor lungimii P, length(P). Pentru fiecare prefix, se adaug de
asemenea un marker fiecrui tabel corespunztor lungimilor L <
lungimea (P) pe care cutarea binar le va parcurge (dac nu exist una
deja). Pentru fiecare astfel de marker M se utilizeaz o testare
suplimentar 1-bit pentru determinarea prefixului cu cea mai bun
potrivire a lui M.
In timp ce acest algoritm de cutare utilizeaz cinci cutri n tabelele
hash, n cel mai defavorabil caz pentru IPv4, n cele mai probabile cazuri
majoritatea cutrilor ar trebui s aib dou accesri ale memoriei.
Aceasta se datoreaz observrii cazului ateptat O1 care arat c
majoritatea prefixelor sunt de lungine 16 sau 24 de bii. De aceea cutarea
binar la 16 iar apoi la 24 de bii va fi suficient pentru majoritatea
prefixelor.
Utilizarea hashing-ului face cutarea binar asupra lungimii prefixelor s
fie ntr-o oarecare msur dificil de implementat hardware. Oricum,
scalabilitatea tehnicii la lungimi mari de prefixe, cum sunt adresele IPv6,
a fcut-o suficient de atractiv pentru anumii productori.

11.11 Alocarea memoriei n scheme comprimate


Cu excepia cutrii binare i a arborilor cu prefix/ordonati multibit cu
pas fix, multe din schemele descrise necesit alocri de memorie de
diferite dimensiuni. De aceea, dac un nod al arborilor cu prefix
comprimat crete de la dou la trei cuvinte de memorie, algoritmul de
inserare trebuie s dezaloce vechiul nod de dimensiune 2 i s realoce
noul nod de dimensiune 3. Alocarea memoriei n sistemele de operare
este oarecum euristic, utiliznd algoritmi cum sunt best-fit si worst-fit
(cea mai bun/proast potrivire) care nu garanteaz propietaile cazului
cel mai defavorabil.
De fapt toate metodele standard de alocare a memoriei pot avea un caz
cel mai defavorabil, n care raportul de fragmentare a memoriei este
foarte ru. Este posibil ca locatorii i delocatorii de memorie s
conlucreze pentru a fragmenta memoria n petice de zone goale i
blocuri de memorie alocate de dimensiuni reduse. Dac Max este
dimensiunea maxim de memorie a unei cereri de alocare, cazul cel mai
defavorabil apare cnd toate spaiile libere de memorie au dimensiunea
Max 1 i toate blocurile alocate au dimensiunea 1. Aceast situaie
poate s apar prin alocarea ntregii memorii utiliznd cereri de alocare
de dimensiune 1, urmate de dealocrile corespunzatoare. Rezultatul
172

final este c doar 1/Max din memorie este utilizat sigur, deoarece toate
cererile de alocare viitoare pot fi de dimensiune Max.
Utilizarea locatorului de memorie o translateaz direct n numrul
maxim de prefixe pe care un chip de cutare o poate suporta.
Presupunem c, ignornd locatorii, 20MB de memorie on-chip poate
suporta 640.000 de prefixe n cel mai defavorabil caz. Dac inem
seama de locator, i Max = 32, chip-ul poate garanta suportarea a doar
20.000 de prefixe.
Nu ajut la nimic c vnztorii avertizau asupra celui mai defavorabil
caz de 100.000 de prefixe cu un timp de cutare de 10 nsec i un timp
de actualizare de o microsecund. Aadar, avnd n vedere c algoritmii
de cutare a prefixelor comprim frecvent structurile de date pentru a
ncpea ntr-o memorie SRAM, aceti algoritmi trebuie i s proiecteze
o alocare rapid a memoriei i cu o fragmentarea minim.
Exista o limit care spune c: locatorii care nu compacteaz memoria
1
nu pot avea un raport al utilizrii mai bun dect
. De exemplu,
log 2 Max
acesta este 20 % pentru Max = 32. Deoarece aceast valoare este
inadmisibil, souliile algoritmice ce implic structuri comprimate de
date trebuie s utilizeze compactarea memoriei. Compactarea memoriei
const n mutarea blocurilor de memorie alocate, astfel nct s se
mreasc dimensiunea spaiilor libere din memorie.
Compactarea este puin folosit n sistemele de operare din motivul
urmtor. Dac o poriune de memorie M este mutat, atunci trebuie
corectai toi indicatorii care indic spre M. Din fericire, majoritatea
structurilor de cutare sunt structuri de tip arbore, n care oricare nod
este indicat ca vecin a cel mult unui nod. Meninnd un nod printe
pentru fiecare nod al arborelui, nodurile care indic spre un nod M al
arborelui pot fi modificate corespunztor cnd M este realocat. Din
fericire, indicatorul printe este necesar doar pentru actualizare si nu
pentru cutare. Deci, indicatorul printe poate fi memorat ntr-o copie
externa chip-lui, a bazei de date utilizat pentru actualizri n procesorul
de dirijare, fr a ocupa memoria SRAM intern chip-lui.
Chiar dup rezolvarea aceastei probleme, este necesar existena unui
algoritm simplu, care s decid cnd s se compacteze o anumit
poriune a memoriei. In literatura de specialitate exist tendina de a
utiliza compactori globali, care pot scana toat memoria ntr-un singur
ciclu de compactare. Pentru a limita timpii de intercalare trebuie s
existe o form de compactare local, care compacteaz doar o mic
poriune de memorie, din jurul regiunii afectate de actualizare.
11.11.1 Compactarea pe cadre
Pentru a arta ct de simple pot fi schemele de compactare locale, e
descris mai nti o schem foarte simpl care, dei face o compactare
minim, acoper totui 50% din cele mai defavorabile cazuri de utilizare
a memoriei. Apoi se va urmri mbuntirea utilizrii memoriei pn la
o valoare ct mai apropiat de 100%.

173

In fuzionare cadrelor se presupune c toate cele M cuvinte de


M
cadre de dimensiunea Max. Fuzionarea
memorie sunt divizate n
Max
cadrelor caut s pstreze utilizarea memoriei la cel puin 50%. In acest
scop toate cadrele nevide ar trebui s fie cel putin 50% pline.
Fuzionarea cadrelor pstreaz urmatoarea invarian : toate cadrele
neumplute cu excepia unuia singur sunt cel putin 50% pline. Dac
M
este mult mai mare dect 1, atunci
lucrurile stau n felul acesta i
Max
utilizarea garantat va fi de aproape 50%.
Cererile de alocare i dealocare sunt realizate cu ajutorul etichetelor
ataate fiecrui cuvnt, care ajut la identificarea blocurilor de memorie
libere i ocupate. Singura restricie suplimentar este c toate spaiile
libere s fie continute n interiorul cadrelor; spaiilor libere nu li se
permite s se extind nafara cadrelor.
Un cadru este imperfect/defect dac nu este gol i are utilizarea mai
mic de 50 %. Pentru a se menine invariana, fuzionarea cadrelor
conine un indicator suplimentar care s urmareasca cadrele curente
imperfecte, daca exist. Acum, o alocare poate face ca un cadru anterior
gol s devin un cadru imperfect dac alocarea este mai mic dect
Max
.
2
Similar, o dealocare poate face ca un cadru plin mai mult de 50% sa
devin plin mai puin de 50%. Se consider un cadru care conine dou
blocuri alocate de dimensiune 1 i respectiv Max 1 i deci are o
1
utilizare de 100%. Utilizarea s-ar putea reduce la
dac blocul de
Max
dimensiune Max 1 este dealocat. Acest lucru ar putea face ca cele
dou cadre s devin imperfecte, fapt ce ar nclca regula de invarian.
In continuare e dat un artificiu simplu pentru a pstra invariana. Se
presupune c exist deja un cadru imperfect F i c apare un nou cadru
imperfect F. Invariana este pstrat prin fuzionarea coninutului
cadrelor F i F ntr-un nou cadru F. Acest lucru este posibil deoarece
ambele cadre F i F au fost ocupate ntr-o proporie mai mic de 50%.
De reinut este faptul c singura compactare utilizat este cea la nivel
local i este limitat la dou cadre imperfecte F i F. Asemenea
compactare local duce la obinerea unor timpi mici de actualizare.
Gradul minim de utilizare n cazul fuzionrii cadrelor poate fi
mbuntit prin creterea dimensiunii cadrelor la kMax i prin
schimbarea definiiei cadrelor imperfecte, astfel nct utilizarea acestor
k
cadre s devin mai mic dect
. Schema descris anterior este un
k +1
caz special n care k=1. Crescnd valoarea lui k se imbuntete
utilizarea, cu costul creterii compactrii.

11.12 Modelul chip-lui de cutare


Avnd n vedere creterea vitezelor la cele din standardul OC-786,
schemele de cutare vor fi probabil implementate mai degrab on-chip
decat n procesoarele de reea, cel puin la viteze ridicate. Figura 11.19
174

descrie un model al chip-lui de cutare/lookup care realizeaz cutarea


i actualizarea. Chip-ul are un proces de Cutare i unul de Actualizare,
amndou accesnd o memorie comun de tipul SRAM care poate fi
ncorporat n chip sau poate fi plasat n exteriorul acestuia.
Procesul de Actualizare permite actualizri incrementale i posibil,
realizarea alocrii/dealocrii memoriei, i o compactare local redus
pentru fiecare actualizare. El poate fi implementat fie complet on-chip,
fie parial /complet prin soft. Dac o companie productoare de
semiconductori dorete s vnd un chip de cutare care utilizeaz un
algoritm complex de actualizare (de ex. pentru schemele comprimate),
ar fi de recomandat s furnizeze i un algoritm de actualizare
implementat hardware. Daca chip-ul de cutare face parte dintr-un
motor de expediere/forwarding, ar fi mai simplu s se retrogradeze
complet procesul de actualizare pe un CPU separat.

Fiecare acces la memoria SRAM poate fi destul de mare dac e


nevoie, chiar pn la 1000 de bii. Acest lucru este posibil de
implementat n zilele noastre utilizndu-se o magistral extins. Logica
de cutare i actualizare poate procesa cu uurinta 1000 de bii n paralel
ntr-un singur ciclu de memorie. Accesul la cuvinte de dimensiuni mari
poate fi de folos, de exemplu, n cutarea binar, pentru a reduce timpii
de cutare.
Timpii de Cutare i Actualizare sunt multiplexai pentru a se
mpri accesul la memoria comun SRAM care conine baza de date de
cutare. Aadar procesului de Cutare i se permit S accese consecutive
la memorie, iar apoi procesului de Actualizare i se permit K accese la
memorie. Dac S este 20 iar K este 2, se permite ca Actualizarea s
fure cteva cicluri de acces de la procesul Cutare prin scderea
vitezei de cutare pentru o fraciune din timp. De notat o cretere a
latenei n cazul cutrii de k ori n cel mai defavorabil caz. Deoarece
procesul Cutare este proiectat n tehnica pipeline, aceast ntrziere
poate fi considerat o mic ntrziere pipeline suplimentar.
Chip-ul are pini pentru semnalele de Cutare i Actualizare i poate
furniza rezultatele cutrii la ieiri. Modelul poate fi proiectat pentru
diferite tipuri de cutri, inclusiv cutarea IP, cutarea adreselor fizice
(adresele MAC pe 48 bii ca i chei i porturile de ieire ca rezultate) i
175

clasificare (de ex. antetele pachetelor ca i chei i regulile de potrivire ca


rezultate).
Oricare adugare sau tergere a unei chei poate duce la cererea unei
dealocri a unui bloc i de alocare a unui bloc de dimensiune diferit.
Fiecare cerere de alocare poate fi n domeniul 1 la Max cuvinte de
memorie. Sunt n total M cuvinte de memorie care pot fi
alocate.Memoria actual poate fi incorporat n chip, n exteriorul chiplui sau ambele cazuri.Chiar dac se utilizeaz opiunea de memorare
off-chip, primele niveluri ale oricrui arbore de cutare vor fi memorate
n interiorul chip-lui. Memoria on-chip este mai atractiv din punct de
vedere al costului i al vitezei. Din pcate, memoria on-chip este
limitat de procesele concurente la aproximativ 32 Mbii. Acest lucru
face dificil suportarea unei baze de date de 1 milion de prefixe.
Intern, chip-ul va utiliza din plin tehnica pipeline. Structura de date
de cutare este partiionat n cteva buci, fiecare din aceste buci
fiind prelucrat concurent de ctre niveluri diferite ale logicii. Deci
memoria SRAM va fi probabilimprit n cteva memorii SRAM mai
mici care pot fi accesate independent de ctre fiecare etap a pipeline.
Exista o problem referitoare la partiionarea static a memoriei
SRAM ntre nivelurile pipeline, datorit faptului c necesarul de
memorie pentru fiecare nivel poate varia pe msur ce prefixele sunt
inserate i terse. O soluie posibil este aceea de a mpri memoria
SRAM ntr-un numr mare de buci care pot fi alocate dinamic
nivelurilor, prin intermediul unui switch crossbar de partiionare.
Proiectarea unui asemenea switch crossbar care s lucreze la viteze mari
este dificil.
Toate schemele descrise pot utiliza metoda pipeline, deoarece toate
se bazeaz pe structuri de date de tip arbore. Toate nodurile de la acelai
nivel a arborelui pot fi alocate aceluiai nivel pipeline.
11.13 Concluzii
Situaia actual din domeniul cutarii/lookup i principiile de baz utilizate:
Starea actual a lookups. Schemele de cutare au aprut din cauza
ruterelor de tranzit (core) la care cresc rapid att dimensiunile tabelei
(pn la 1 milion de prefixe) ct i viteza (pn la 40Gbps). MPLS
(Multi Protocol Label Switching) s-a considerat ca fiind o modalitate de
finisare a tehnicilor de cutare, iar n momentul de fa este utilizat
pentru evitarea clasificrii pachetelor din ingineria traficului. CMS-le
sunt nlturate chiar i din nucleele ruterelor, dar costurile ridicate,
puterea consumat a CAM-lor de dimensiuni mari rmne o problem.
Asa ca muli productori de rutere nc utilizeaz i proiecteaz
algoritmi de cutare.
Desi e ciudat, dup ce o bogie de algoritmi au fost explorai n acest
capitol, arborii simpli cu prefix unibit mpreun cu memoria SRAM i
tehnica pipeline lucreaz bine chiar i la viteze de 40 Mbps. Lucrul se
datoreaz faptului c arborii simpli cu prefix unibit cu comprimarea cii
sunt relativ compacti; timpii mari de cutare pot fi deplasai prin
pipeline mpreun cu o zon de cutare iniial. Folosirea pipeline este
dificil deoarece necesit partiionarea memoriei ntre niveluri.

176

La viteze de pn la 10 Gbps, arborii simpli simpli cu prefix multibit


ce utilizeaz extinderea controlat a prefixelor, lucreaz bine cu
memoriile de tip DRAM. Memoriile DRAM sunt mai ncete, dar sunt
ieftine i uor de gsit. Tehnicile RAMBUS pot permite utilizarea
pipeline n cutri/lookup chiar i cu procesoare de reea. Simplitatea
acestor scheme s-a dovedit atractiv pentru muli productori.
Unii productori utilizeaz cutarea binar a crei viteze i utilizare a
memoriei sunt rezonabile, n mod special n cazul arborilor-B cu
memorie extins pentru a se reduce nlimea arborilor. Schemele de
cutare binar a gamelor nu sunt patentate.
La viteze mai mari, numrul de niveluri pipeline poate fi redus de la 20
la 5 utiliznd arborii simpli cu prefix multibit. Arborii simpli cu prefix
multibit trebuie comprimate pentru a putea fi memorate ntr-o memorie
SRAM on-chip sau off-chip. Compresia la Lulea este remarcabil, dar
se pare c algoritmul poate fi utilizat astzi numai n soluiile
personalizate per client oferite de o companie numit Effnet. Schema
Lulea are de asemenea o actualizare nceat. Schemele bitmap de tip
arbore au actualizri rapide i pot fi tolerate de o gam larg de setri
hardware.De asemenea pot exista patente ce pot restriciona folosirea
lor. E utilizat n prezent n ruterul Cisco CRS-1.
In concluzie, cutarea binar asupra lungimii prefixelor este atractiv
datorita proprietilor de scalabilitate la lungimi mari ale adreselor. Din
pcate, utilizarea tehnicii de hashing face dificil obinerea unor timpi
buni de cutare. In mod similar, introducerea adresrii IPv6 i multicast
ce cresc importana cutrii adreselor lungi, au fcut ca aceast schem
s fie puin atractiv. Schema este utilizat de anumiti productori in
implementri software.
Soluiile algoritmice mpreun cu pipeline pot ine pasul cu vitezele
legturilor att timp ct memoriile SRAM pot respecta timpii de sosire a
pachetelor. Toate schemele studiate pot fi pipeline pentru a asigura o
cutare/lookup per timp de acces la memorie. Alegerea ntre CAM i
schemele algoritmice va fi greu de cuantificat i probabil alegerea se va
face ad hoc n funcie de fiecare produs.
Dac schemele cu arborii cu prefix comprimate pot utiliza mai puin
de 32 de bii per prefix atunci arborii cu prefix comprimai par a utiliza
mai puine tranzistoare i o putere mai mic dect CAM. Acestea se
datoreaz faptului c n CAM, logica de cutare/lookup este distribuit
n fiecare celul N de memorie, n timp ce ntr-o solutie algoritmica
logica de cutare, dei mai complicat, este distribuit de-a lungul unui
numr mai mic i constant de niveluri. O analiz VLSI atent a celor
dou implementri ar fi foarte util.
Dei capitolul e dedicat tehnicilor de cutare, in concordanta cu
tendinele curente ale pieei, s nu se uite c la baza acestora stau
anumite principii. Este plauzibil ca toate ruterele din viitor s utilizeze
comutarea i procesarea optic chiar i n cazul cutarii. In acest caz,
algoritmii specifici descrii ar putea fi depaii, dar principiile de
proiectare vor rmne valabile.
Schemele descrise n acest capitol necesit ntr-o anumit msur
gndirea algoritmic precum i alte principii ce au fost prezentate.
Schemele utilizeaz precalcularea, care scurteaza timpii de
177

inserare/tergere. Schemele se folosesc de asemenea de anumite


caracteristici hardware cum ar fi memoria extins, utilizarea dupa caz a
memoriilor rapide sau lente i optimizarea gradului de libertate ntr-o
proiectare data (vezi fig. 11.1).

178

COMUTAIA

n primii ani ai telefoniei, operatorul de telefonie a ajutat la realizarea


structurii sociale ntr-o comunitate. Dac X a dorit s vorbeasc cu Y, a
apelat operatorul i a ntrebat de Y; operatorul a trebuit s introduc
manual un fir ntr-un tablou de comutaie care conecteaz telefonul lui X
cu al lui Y. Tabloul de comutaie permite desigur i conexiuni paralele
ntre perechi disjuncte, iar X ' a putut vorbi cu Y ' n acelai timp. S-a putut
ntmpla ca fiecare apel nou s fie ntrziat pentru un interval de timp
scurt, timp n care operatorul finalizeaz tratarea apelului anterior.
Cnd a fost descoperit tranzistorul n laboratoarele Bell, faptul c fiecare
tranzistor era de fapt un comutator controlat n tensiune a fost imediat
exploatat n realizarea comutatoarelor electronice utiliznd o matrice cu
tranzistori. Operatorul de telefonie a fost folosit pentru funcii care
necesit intervenia omului, ca de exemplu colectarea apelurilor. Utilizarea
electronicii a crescut cu mult viteza i fiabilitatea comutaiei telefonice.
Un ruter este de fapt un oficiu potal automat pentru pachete. Ruter are
sensul generic de component general de interconectare, ca de exemplu
gateway sau comutator SAN. In esen ruterul este o cutie care comut
pachete ntre legturile de intrare i de ieire (figura 13.1). Procesul de
cutare (B1) determin linia de ieire la care un pachet va fi comutat.
Trebuie facuta planificarea pachetelor la linia de iesire (B3). Esenta
ruterului este sistemul intern de comutaie (B2), descris n acest capitol.
RUTER
B2
Comutaie
Linie intrare i

B3

Linie ieire
Planificare

B1
Cutare adrese
FIGURA 13.1. Modelul ruterului

Literatura n domeniul comutaiei este vast, i acest capitol s-a axat pe


comutatoarele analizate n literatur, utilizate n prezent n industria
reelelor. Comutatoarele descrise, Gigacomutatorul DEC, GSR-ul lui
Cisco, seriile T ale lui Juniper, TSR-ul lui Avici, reprezint o introducere
n problemele teoretice i practice implicate n structurile de comutatoare
pentru ruterele de vitez. Tehnicile de comutaie i principiile
corespunztoare invocate sunt rezumate n figura 13.2.
Numr
P5b

Principiu
Acces extins la memorii
pentru vitez de lucru

179

Comutator
Datapath

P13
P5a
P11
P15
P3

P13
P14
P15

P14
P3

P15
P3b

P15
P3a
P15

P13

Control distribuit al cozilor


prin bilete
Planific n paralel ieiri i
grupuri de vntoare
Optimizat pentru o
concuren de maxim k<N
la ieiri
Utilizarea unui arbore de
concentratoare aleatorizat
pentru corectitudine
Relaxeaz specificatiile
bufferului de ieire
Utilizeaza cozi de intrare
per-ieire
Comunicaie N2 , fezabil
pentru N mic
Utilizeaza asociere iterativ
aleatorizata
PPE-uri pentru corectitudine
round-robin,
fezabil pentru N mic
Relaxeaz specificatiile
dependenei
de acceptare-alocare
Utilizeaz o reea Clos cu
trei nivele
pentru reducerea costurilor
Aleatorizeaz distributia
sarcinii
pentru a reduce k de la 2n
la n
Utilizeaz o reea Benes cu
log N -nivele
pentru reducerea costurilor
Utilizeaz o schem de
rutare aleatoare rapid
Utilizeaz multicast cu
copiere dubl i arbore binar
Realizeaz grila utiliznd
fire scurte

Gigaswitch

Knockout

AN-2

iSLIP

Juniper
T 640

Structura
Growth

Avici TSR

FIGURA 13.2. Principii utilizate pentru comutatoare

13.1 COMPARAIE RUTERE -COMUTATOARE TELEFONICE


Avand analogia ntre rutere i comutatoarele telefonice, subliniem
asemnrile i diferenele majore ntre comutatoarele ruterelor i ale
telefoanelor. Primele rutere au utilizat o magistral simpl pentru
conectarea intrrilor i a ieirilor, care permite unei singure intrri s
transmit spre o ieire la un moment dat. Astazi, aproape orice ruter core
utilizeaz o matrice crossbar intern, care permite perechilor distincte s
comunice n paralel, crescand astfel traficul. Electronica are rolul
operatorului, activnd comutatoare cu tranzistoare care interconecteaz
intrrile i ieirile.
n telefonie o conexiune telefonic tipic dureaz secunde, sau chiar
minute. Dar n comutatoarele Internet, fiecare conexiune este mentinut pe
durata pachetului. Aceasta nseamn 8 nsec pentru un pachet de 40 bytes

180

la 40 Gbps. Memoriile cache nu reduc cutrile, datorit raritii


secventelor de pachete de mari dimensiune in aceeai direcie. De
asemenea, este improbabil ca dou pachete consecutive la un port de
intrare al comutatorului s fie destinate aceluiai port de ieire. Aceasta
ngreuneaz echilibrarea sarcinii de comutaie pentru pachetele multiple.
Deci, pentru a opera la viteza liniei, sistemul de comutaie trebuie s
decid intrrile i ieirile ce trebuie asociate, n timpul minim de sosire al
unui pachet. Astfel, partea de control a unui comutator de Internet (care
stabilete conexiunile), e mult mai greu de realizat dect n cazul unui
comutator telefonic. O alt diferen important ntre comutatoarele
telefonice i cele de pachete este necesitatea conexiunilor multicast pentru
comutatoarele de pachete. Multicastul complic suplimentar problema
planificrii, deoarece unele intrri vor s transmit spre ieiri multiple.
Pentru a simplifica problema, majoritatea ruterelor segmenteaz intern,
pachetele de dimensiune variabil n celule de dimensiune fix, nainte de
a fi transmise spre structura de comutaie. Matematic, comutaia ruterului
este redus la rezolvarea unei probleme de asociere bipartita: ruterul
trebuie s asocieze ct mai multe linii de intrare (la ct mai multe linii de
ieire), n limita posibilitilor, ntr-un timp fix de sosire a celulelor.
Deoarece algoritmii optimali pentru asociere bipartit ruleaz ntr-un timp
de ordinul milisecundelor, rezolvarea acestei probleme la fiecare 8 nsec
necesit gndirea unor sisteme. Soluiile descrise n acest capitol
realizeaza un compromis precizie/timp (P3b), utilizeaza paralelismul
hardware (P5) i aleatorizarea (P3a), i exploateaza faptul c
comutatoarele tipice au 32-64 porturi, pentru a face operaii rapide cu cozi
prioritare utiliznd bitmap-uri(P14).
13.2. COMUTATOARE CU MEMORIE COMUN
nainte de-a descrie comutatoarele cu magistrale, respectiv crossbar,
analizam una dintre cele mai simple implementri de comutator, cea cu
memorie partajat. Pachetele sunt scrise in memorie de pe linia de intrare
si citite spre linia de iesire. Acest tip de proiectare a fost utilizat in
comutatoarele cu interschimbarea diviziunilor de timp din telefonie.
Funcioneaz bine i pentru reele de date n cazul comutatoarelor de
dimensiuni mici.
Principala problem este latimea de banda a memoriei (viteza de lucru).
Dac chip-ul are 8 linii de intrare i 8 linii de ieire, va trebui sa citeasca/
scrie fiecare pachet/celul. Deci memoria trebuie s ruleze la o viteza de
16 ori mai mare decat viteza fiecrei linii. Pn la un punct, problema se
poate rezolva cu o memorie cu viteza mare de acces. Biii sosesc serial la
o linie de intrare i sunt memorai ntru-un registru de intrare cu deplasare.
Cand toat celula a fost memorat, ea poate fi ncrcat ntr-o memorie cu
dimensiunea unei celule. Apoi aceasta poate fi citit n registrul de
deplasare de ieire al liniei corespunztoare i transmis pe linia de ieire.
Comutatorul Datapath utilizeaz o memorie central de 4 Kcelule, care
evident nu asigur memoria tampon adecvat. Totusi, aceast memorie
poate fi implementat uor ntr-un singur chip si mrit, utiliznd controlul
fluxului i memorii tampon de pachete externe chipului. Dar proiectarea
acestor memorii partajate, ca aceasta, nu se scaleaza peste memoriile de
dimensiunea unei celule, deoarece pachetele de dimensiune minim pot

181

avea cel mult dimensiunea unei celule. Un comutator care trimite mai
multe pachete de dimensiune minim nspre diferite destinaii poate
mpacheta mai multe asemenea pachete ntr-un singur cuvnt, dar nu e
sigur c le poate extrage n acelai timp.
In ciuda acestui fapt, comutatoarele cu memorie partajat pot fi relativ
simple pentru un numr mic de porturi. Marele lor avantaj este c pot fi
optimale ca memorie i putere, deoarece datele sunt stocate/extrase in/din
memorie o singur dat. Comutatoarele hard sau crossbar, aproape
ntotdeauna necesit memorarea pachetelor de dou ori dublnd potenial
costurile de memorie i de putere. Este posibil extinderea ideii de
memorie partajat la comutatoarele de dimensiuni mai mari, folosind
ntreeserea aleatoare DRAM.
13.3 RUTERELE: DE LA MAGISTRALE LA CROSSBAR
Comutatoarele pentru rutere au evoluat de la cele mai simple
comutatoare cu mediu partajat (magistrale sau memorii), (fig.13.3a) la
comutatoarele crossbar mai moderne (fig.13.3 d). Un card de linie ntr-un
ruter sau comutator conine logica interfeei pentru o legtur de date
(linie pe fibr optic sau un Ethernet). Primele comutatoare au conectat
intern toate cardurile de linie, printr-o magistral de vitez mare
(asemanator cu o reeea locala LAN interna) pe care numai o pereche de
carduri de linie pot comunica simultan. Astfel dac cardul de linie 1 a
transmis un pachet nspre cardul de linie 2, nici o alt pereche de carduri
de linie nu mai poate comunica.
Pachet
MAGISTRAL

Card de linie 1

Card de linie 2

CPU

Card de linie 1
Card de linie 2

a) Magistral, CPU comun

CPU M

b) Magistral, CPU-uri comune

MAGISTRAL

CPU (uri)
de rutare

CPU N
Card de linie 2

CPU 1

Card de linie N

Card de linie N

Pachet
CPU 1
Card de linie 1
CPU 2
Card de linie 2

MAGISTRAL

Pachet

c) Magistral, CPU-uri pe fiecare


card de linie

CPU (uri)
de rutare
Pachet
FE 1
Card de linie 1
FE 2
Card de linie 2

FE N
Card de linie 2

d) Crossbar, motoare de naintare pe fiecare


card de linie

FIGURA 13.3. Evoluia comutatoarelor pentru reele, de la comutatoarele cu magistral


comun cu un CPU comun, la comutatoarele crossbar cu un motor de naintare pe fiecare
card de linie

182

Mai ru, n ruterele i comutatoarele mai vechi, decizia de naintare a


pachetelor a fost dat unui CPU cu scop general, partajat. CPU-urile cu
scop general au un software de naintare mai simplu i uor de modificat.
Dar ele erau lente, datorit nivelurilor suplimentare de interpretare a
instruciunilor cu scop general. Le lipsea capacitatea de lucru/control in
conditii de timp real la procesarea pachetelor, din cauza
nedeterminismului cauzat de mecanisme ca memoriile cache. Fiecare
pachet traverseaz magistrala de dou ori, o dat pentru a ajunge la CPU i
o dat pentru a ajunge de la CPU la destinaie, deoarece CPU se afl pe un
card separat, accesibil numai prin intermediul magistralei.
Deoarece CPU a fost o strangulare, pasul urmator a fost adugarea unui
grup de CPU-uri comune pentru naintare, dintre care fiecare poate
expedia un pachet. De exemplu un CPU poate nainta pachetele de pe
cardurile de linie 1 pn la 3, cel de-al doilea de pe cardurile de linie 4
pn la 6 i aa mai departe. Aceasta crete eficienta total, sau reduce
cerinele pentru fiecare CPU individual, conducnd potenial spre o
variant cu un cost mai sczut. In orice caz, fr o atenie corespunztoare
se poate ajunge la o ordonare greit a pachetelor, ceea ce nu este de dorit.
Cu toate acestea, magistrala rmne o strangulare. O singur magistral
partajat are limitri de vitez, datorit numrului de surse i destinaii
distincte care trebuie tratate de o singur magistral comun. Aceste surse
i destinaii adaug sarcin electric suplimentar, nrutind timpii de
crestere ai semnalelor, i n final viteza de transmitere a biilor pe
magistral. Alte efecte electrice includ conectorii multipli (de la fiecare
card de linie) i reflexiile pe linie.
Metoda clasic de-a evita aceast strangulare este comutatorul crossbar
(fig. 13.3.d) care conine n esen 2N magistrale paralele, o magistral
pentru fiecare card de linie surs, i o magistral pentru fiecare card de
linie destinaie. Matricea de magistrale surs (orizontale) i destinaie
(verticale) formeaz crossbar-ul.
Teoretic viteza pe o magistral crete de N ori, deoarece n cel mai bun
caz toate cele N magistrale vor fi utilizate n paralel, simultan pentru a
transfera date, n locul unei singure magistrale. Bineneles pentru a obine
aceast cretere de vitez este necesar gsirea a N perechi distincte sursdestinaie in fiecare diviziune de timp. Apropierea de aceast margine
reprezint probema major de planificare studiat acum.
O alt modificare a comutatoarelor crossbar, produse in perioada 19952002, este utilizarea de circuite integrate speciale dedicate (ASIC) i a
motoarelor de naintare, n locul CPU-urilor cu scop general, dei
asocierea nu e obligatorie. Dezavantajele acestor motoare de naintare ar fi
costurile de proiectare ale ASIC-urilor, i lacunele de programabilitate
(ceea ce face ca eventuale modificri s fie dificile sau chiar imposibile).
Aceste probleme au condus din nou la procesoare de reea rapide, dar
programabile .
13.4. PLANIFICATORUL CROSSBAR IA-I UN BILET
Cel mai simplu crossbar este o matrice cu N magistrale de intrare i N
magistrale de ieire (fig.13.4). Atunci cand cardul de linie R dorete s
transmit date cardului de linie S, magistrala de intrare R trebuie s fie
conectat la magistrala de ieire S. Cea mai simpl cale de-a face aceast

183

conexiune este aducerea unui tranzistor n stare de conducie (fig.13.5).


Pentru fiecare pereche de magistrale de intrare i de ieire, la fel ca la R i
S, exist un tranzistor care, n conducie, conecteaz cele dou magistrale.
O astfel de conexiune este cunoscut sub denumirea de punct de
conexiune/crosspoint. Un crossbar cu N intrri i N ieiri are N2 puncte de
conexiune, iar fiecare dintre acestea necesit o linie de control de la
planificator, pentru a-l aduce n stare de conducie i pentru a-l bloca.

Intrare 1
Intrare 2
Intrare 3

Ieire 1 Ieire 2

Ieire 3

FIGURA 13.4. Comutatorul crossbar fundamental


Intrare R
Se seteaz la adevrat pentru a
conecta intrarea R la ieirea S
Ieire S

FIGURA 13.5. Conecteaz intrarea de pe cardul de linie R la cardul de linie S, prin aducerea
tranzistorului n stare de conducie. La modelele moderne de crossbar aceast variant simpl
este nlocuit cu arbori de multiplexoare pentru a reduce capacitatea.

Desi N2 pare mult, implementrile VLSI simple cu tranzistoare fac ca


limitarile n realizarea comutatoarelor de dimensiune mare sa fie impuse
mai ales de numrul de pini, tehnologiile de conectare a cardurilor, etc.
Majoritatea ruterelor i comutatoarelor dinainte de 2002 utilizeaz
comutatoarele crossbar simple ca suport pentru 16-32 porturi. Multicastul
se face prin conectarea magistralei de intrare R la toate magistralele de
ieire care doresc s recepioneze de la R. Dar planificarea multicast e
complicat.
In practic numai variantele mai vechi de crossbar utilizeaz tranzistoare
pentru conexiuni (capacitatea totala crete cu numrul de porturi). Aceasta
duce la creterea ntrzierii la transmisia unui semnal, ceea ce devine o
problem la viteze mai mari. Implementrile moderne utilizeaz pe ieiri
arbori mari de multiplexoare, sau buffere cu 3 stri. Sistemele performante
utilizeaz, pentru trecerea fluxului de date prin crossbar, nite memorii
(de ex. o poart) la punctele de conexiune.Astfel considerentele de nivel
fizic fac proiectarea comutatoarelor crossbar moderne complicat.
Va fi tratata doar partea de planificare a comutatoarelor. Pentru
corectitudine controlul logic trebuie s asigure conectarea fiecrei
magistrale de ieire la cel mult o magistral de intrare (pentru a preveni
mixarea intrrilor). Pentru performan, partea logic trebuie s
184

maximizeze numrul de perechi de carduri de linie care comunic n


paralel. Dei paralelismul ideal asigura c toate cele N magistrale de ieire
sunt ocupate n acelai timp, n practic paralelismul este limitat de doi
factori. In primul rnd s-ar putea s nu existe date pentru unele carduri de
linii de ieire. Apoi e posibil ca dou sau mai multe caduri de linii de
intrare s doreasc s transmit date aceluiai card de linie de ieire. Dar o
singur intrare poate ctiga la un anumit moment dat, si astfel se
limiteaz traficul pentru intrrile care au pierdut si nu pot transmite date.
Astfel, n ciuda paralelismului extins, concurena major are loc la portul
de ieire. Cum poate fi soluionat concurena pentru porturile de ieire n
acelai timp cu maximizarea paralelismului? O variant simpl i elegant
de planificare a fost pentru prima dat inventat i utilizat n
Gigacomutatorul DEC. Un exemplu al aa numitului algoritm ia-i un
bilet utilizat de DEC este dat n figura 13.6.
Ideea este ca fiecare card de linie de ieire S s menin o coad
distribuit pentru toate cardurile de linie de intrare R care ateapt s
transmit nspre S. Coada pentru S este memorat in cardul liniei de intrare
(n loc de S) utiliznd un mecanism simplu cu numere de bilet. Dac
cardul de linie R dorete s transmit un pachet spre cardul de linie S, mai
nti trimite o cerere printr-o magistral de control separat nspre S; S
trimite apoi un numr de coad nspre R pe magistrala de control. Numrul
de coad este numrul poziiei lui R n coada de ieire pentru S.
Apoi R monitorizeaz magistrala de control; cnd S termin acceptarea
unui nou pachet, S trimite pe magistrala de control numrul de coad
curent pe care o servete. Dac R observ c numrul su este servit, R
i plaseaz pachetul pe magistrala datelor de intrare pentru R. In acelai
timp S se asigur c punctul de conexiune ntre R i S a fost activat.
In fig. 13.6 se vede algoritmul n aciune ; cadrul de la cardul de linie A
conine trei pachete destinate ieirilor 1, 2 i 3, B are 3 pachete destinate
acelorai ieiri, iar C are pachete destinate ieirilor 1, 3 i 4. In acest
exemplu pachetele au aceeai dimensiune (acest lucru ns nu este necesar
pentru ca algoritmul ia-i un bilet s funcioneze).
Fiecare port lucreaz numai pentru pachetul din fruntea cozii sale. Deci
algoritmul ncepe cu fiecare intrare transmind o cerere, printr-o
magistral de control nspre portul de ieire cruia i este destinat pachetul
din fruntea cozii de intrare. Astfel, n exemplu, fiecare intrare trimite o
cerere nspre portul 1 pentru permisiunea de-a transmite un pachet.
Numrul de bilet este un ntreg mic care depinde de, i este eliberat n
ordinea sosirii. Presupunem c cererea lui A ajunge prima pe magistrala de
control serial urmat de B, iar apoi de C. In figura din stnga sus aparent
cererile sunt transmise n mod concurenial, nu secvential. Deoarece portul
de ieire 1 poate servi un singur pachet la un moment dat, el pune cererile
n ordine serial i returneaz T1 lui A, T2 lui B, i T3 lui C.
Astfel, n figura din mijloc n rndul de sus, portul de ieire 1 difuzeaz
numrul de bilet curent care este deservit (T1) pe o alt magistral de
control. Cnd A observ c are un numr corespunztor pentru intrarea 1,
n figura din partea dreapt sus, A conecteaz magistrala sa de intrare la
magistrala de ieire a lui 1 i i trimite pachetele pe magistrala sa de
intrare. Deci la sfritul primului rnd de imagini, A a trimis pachetul din
fruntea cozii sale de intrare la portul de ieire 1.
185

Al doilea rnd din figura 13.6 ncepe cu transmisia unei cereri de ctre
A pentru pachetul care este acum n fruntea cozii sale nspre portul de
ieire 2. Lui A i se returneaz un numr de bilet, T1, pentru portul 2. n
imaginea din mijlocul rndului 2, portul 1 anun c este pregtit pentru
T2, i portul 2 anun c este pregtit pentru biletul T1. Aceasta rezult din
figura din partea dreapt a celui de-al doilea rnd, unde A este conectat la
portul 2 i B este conectat la portul 1 i pachetele corespunztoare sunt
transferate.
Etapa 1
3 2 1 A
B
3 2 1
4 3 1 C

1
2
3
4

3 2 1 A
3 2 1 B
4 3 1 C

Cerere

1
2
3
4
Acordare bilet

3 2 1 A
3 2 1 B
4 3 1 C

T2 1
2
T1 3

A
3 2
3 2 1 B
4 3 1 C

T1
T2
T3

Etapa 2
A
3 2
3 2 1 B
4 3 1 C

1
2
3
4

A
3 2
3 2 1 B
4 3 1 C

Cerere

T1

4
Acordare bilet

1
2
3
4
Conectare
1
2
3
4
Conectare

Etapa 3
A
3
B
3 2
4 3 1 C

1
2
3
4
Cerere

A
3
B
3 2
C
4 3 1

1
2
3
T2
4
Acordare bilet
T1

T3
T2
T1

A
3
B
3 2
4 3 1 C

1
2
3
4
Conectare

FIGURA 13.6. n mecanismul de planificare ia-i un bilet, toate porturile de intrare au o singur
coad de intrare care este etichetat cu numrul portului de ieire cruia fiecare pachet i este destinat.
Astfel n primul cadru, intrrile A, B i C trimit cereri nspre portul de ieire 1. Portul de ieire 1 (sus,
mijloc) i acord primul numr lui A, cel de-al doilea lui B, etc., i aceste numere sunt utilizate pentru
a stabili o ordine serial pentru accesul la porturile de ieire.

Al treilea rnd de imagini din figura 13.6 ncepe similar cu transmisia de


ctre A i B a unei cereri pentru porturile 3 i 2, respectiv. Numai C mai
este nc blocat n ateptarea pentru numrul su de bilet T3, care este
obinut cu dou iteraii nainte pentru a fi anunat la portul de ieire 1.
Astfel C nu mai trimite alte cereri pn ce pachetul din fruntea cozii sale
de ateptare este deservit. Lui A i se returneaz T1 pentru portul 3 i lui B i
se returneaz T2 pentru portul 2. Apoi portul 1 difuzeaz T3, portul 2
difuzeaz T2, i portul 3 difuzeaz T1. Aceasta duce la ultima imagine din
partea stng a rndului 3, unde comutatorul crossbar conecteaz A cu 3,
D cu 2 i C cu 1.
Varianta ia-i un bilet este avantajoas n starea de control necesitnd
doar dou numrtoare de log 2 N bii la fiecare port de ieire pentru a
reine numrul de bilet curent care este deservit i cel mai mare numr de
bilet dispensat. Aceasta a permis s se ajung la o dimensiune de 36 pori
la Gigacomutatorul DEC chiar i n anii 90 cnd dimensiunea memoriei
pe chip a fost limitat. Varianta a utilizat un planificator distribuit, iar
arbitrarea fiecrui port de ieire a fost realizat de un aa numit chip GPI
pe fiecare card de linie; chip-urile GPI comunic printr-o magistral de
control.
Chip-urile GPI trebuie s arbitreze magistrala de control (serial) cu
scopul de-a prezenta o cerere la un card de linie de ieire i de-a obine un
numr de ordine n coad. Deoarece magistrala de control este o magistral
186

de difuziune, un port de intrare i d seama cnd i vine rndul observnd


activitatea acelora care au fost naintea lui, i apoi poate instrui
comutatorul s realizeze o conexiune.
Pe lng simplitatea de realizare a controlului, varianta ia-i un bilet
are avantajul de-a fi capabil s opereze direct cu pachete de dimensiune
variabil. Porturile de ieire pot difuza asincron numrul urmtor de bilet
n momentul n care acestea finalizeaz recepionarea pachetului curent;
porturi distincte de ieire pot difuza numrul lor de bilet curent la
momente de timp arbitrare. Astfel spre deosebire de toate variantele care
vor fi descrise mai trziu nu exist antet i trafic de control pentru
mprirea pachetelor n celule i reasamblarea lor ulterioar. Pe de alt
parte n cazul ia-i un bilet paralelismul este limitat de blocarea n
fruntea liniei, fenomen analizat n urmtoarea seciune.
Un alt avantaj al variantei ia-i un bilet se numete grupuri de
vntoare. Orice set de carduri de linie (nu numai cardurile de linie
nvecinate fizic) pot fi agregate pentru a forma o legtur cu banda mai
mare, numit grup de vntoare. Astfel 3 legturi de 100 Mbps pot fi
grupate ntr-o singur legtur de 300 Mbps.
Implementarea ideii necesit doar mici modificri ale algoritmului de
planificare original, deoarece fiecare dintre chip-urile GPI din grup poate
observa mesajele trimise unul altuia pe magistrala de control i astfel s
pstreze copii locale ale numrului de bilet (comun). Urmtorul pachet
destinat grupului este servit de primul port de ieire liber din grupul de
vntoare. In timp ce grupurile de vntoare de baz pot reordona
pachetele transmise spre legturi diferite, o mic modificare permite ca
pachetele de la o intrare s fie transmise spre un singur port de ieire ntrun grup de vntoare, printr-o dispersare determinist simpl. Modificarea
evit reordonarea cu preul reducerii paralelismului.

3 2 1
3 2 1
4 3 1

Timp (conform cu
durata pachetelor)
A
B
C

A B C

A B

3
4

A B C
C

FIGURA 13.7 Blocare n fruntea liniei cauzat de variante de algoritmi ia-i un bilet.
Pentru fiecare port de ieire, o scar de timp orizontal este etichetat cu portul de intrare
care trimite un pachet ctre acel port de ieire n perioda de timp corespunztoare sau cu un
ptrat gol dac nu se transmit pachete. Se observ numrul mare de ptrate goale, ceea ce
denot o risip de oportuniti, ceea ce limiteaza paralelismul .

Gigacomutatorul fiind o punte, a trebuit s trateze LAN-ul multicast.


Deoarece mecanismul de planificare ia-i un bilet utilizeaz planificarea
distribuit, prin chip-uri GPI separate pe ieire, este dificil s se
coordoneze toate planificatoarele pentru a asigura ca fiecare port de ieire
s fie liber.In plus ateptarea ca fiecare port de ieire s aib un bilet liber
pentru un pachet de multicast ar duce la blocarea unor porturi care au fost
gata de-a servi pachetul mai nainte, pierzndu-se debit util. Aadar
multicastul a fost tratat de ctre un procesor central prin software, i n
consecin a fost asociat strii de clasa a doua.
187

13.5 BLOCAREA N FRUNTEA LINIEI (HOL)

Facand abstractie de mecanismul intern din figura 13.6, se observ c n


3 iteraii au fost 9 posibiliti de transmisie (3 porturi de intrare i 3
iteraii), dar dup ultima imagine, cea din dreapta jos, rmne un pachet n
coada lui B i dou pachete n coada lui C. Deci au fost transmise numai 6
din 9 pachete posibile ; rezult c paralelismul este limitat.
Aceast concentrare doar pe comportamentul de intrare-ieire este
ilustrat n figura 13.7, care arat pachetele transmise n fiecare durat de
pachet la fiecare port de ieire. Fiecare port de ieire are o linie de timp
asociat, etichetat cu portul de intrare care transmite un pachet n durata
corespunztoare de timp ; ptratele albe au semnificaia c nici un port de
intrare nu transmite pachete n acel interval de timp. Este continuat
exemplul din figura 13.6 pentru nc trei iteraii, pn ce toate cozile de
intrare sunt goale.
In dreapta figurii se observ c doar aproximativ jumtate din
posibilitile de transmisie sunt utilizate (9 din 24). Bineneles nici un
algoritm nu o poate face mai bine pentru anumite scenarii. Totui, ali
algoritmi ca de exemplu iSLIP (figura 13.11) poate duce la un paralelism
mai bun, finaliznd aceleai nou pachete n patru iteraii n loc de ase.
In prima iteraie, (fig.13.7), toate intrrile au pachete n ateptare pentru
ieirea 1. Deoarece numai una singur (de exemplu A) poate s transmit
un pachet ctre ieirea 1 la un anumit moment de timp, ntreaga coad la B
(i C) este blocat ateptnd finalizarea transmisiei lui A. Deoarece
ntreaga coad este blocat de progresul pachetului din fruntea cozii,
aceasta se numete blocare n fruntea liniei HOL (head of line). ISLIP i
PIM ocolesc aceast limitare permind pachetelor din spatele pachetului
blocat s progreseze (de exemplu pachetul destinat portului de ieire 2 n
coada de intrare a lui B poate fi transmis nspre portul 2 n prima iteraie a
figurii 13.7) cu preul unui algoritm de planificare mai complicat.
Pierderea de debit util prin blocarea HOL poate fi descris analitic cu un
model simplu, uniform de trafic. Presupunem c n fruntea fiecrei cozi de
intrare este un pachet destinat unei ieiri din N cu probabilitatea 1/N.
Astfel, dac dou sau mai multe porturi de intrare transmit ctre acelai
port de ieire, toate cu excepia unei intrri sunt blocate. Intregul trafic al
celorlalte intrri este pierdut datorit blocrii n fruntea liniei.
Considerm pachetele de dimensiune egal i o ncercare iniial unde
un proces aleator asociaz un port destinaie fiecrui port de intrare,
uniform de la 1 la N. In loc sa ne concentrm atenia asupra porturilor de
intrare, ne concentrm asupra probabilitii c un port de ieire O este
nefolosit, care e de fapt probabilitatea ca nici unul dintre cele N porturi de
intrare s aleag portul de ieire O. Deoarece fiecare port de intrare nu
alege O cu probabilitatea 1 1/ N , probabilitatea ca toate cele N porturi de
N
intrare nu vor alege O este (1 1/ N ) . Aceast expresie converge rapid

nspre 1/ e . Deci probabilitatea ca O s fie ocupat este 1 1/ e , adic 0,63.


Deci debitul util al comutatorului nu este N B (ideal atins doar dac
toate cele N intrri ar fi ocupate, opernd la B bps). El este 63 % din
aceast valoare maxim, deoarece 37 % din legturi sunt nefolosite.
Analiza este simplist i presupune (incorect) c fiecare iteraie este
independent. In realitate, pachetele selectate s nu fie transmise ntr-o
188

iteraie, trebuie luate n consideraie n iteraia urmtoare (fr o alt


selecie aleatoare a destinaiei). O analiz clasic, care elimin prezumia
de independen, arat c debitul util se apropie de 58 % .
Dar sunt realiste distribuiile uniforme de trafic? Analiza depinde de
distribuia traficului, deoarece nici un comutator nu poate funciona bine
dac tot traficul e destinat unui singur port. Analiza arat c efectul HOL
poate fi redus utiliznd grupuri de vntoare, mrind viteza comutatorului
crossbar comparativ cu a legturilor, i lucrnd cu distribuii mai realiste,
la care un numr de clieni transmit trafic ctre cteva servere.
Exist insa distribuii pentru care blocarea n fruntea liniei poate afecta
grav traficul. S ne imaginm c fiecare linie de intrare are B pachete spre
portul 1 urmate de B pachete spre portul 2 i aa mai departe, i n final B
pachete spre portul N. Aceeai distribuie de pachete este prezent la toate
porturile de intrare. Dac planificm pachetele destinate portului 1 n
grupul iniial, blocarea n fruntea liniei va limita comutatorul, fiind
posibil transmisia unui singur pachet pe intrare n fiecare interval de
timp. Astfel, comutatorul reduce traficul la 1/ N din traficul total posibil,
dac B este destul de mare. Pe de alt parte vom vedea c variantele de
comutatoare care utilizeaz cozi de ieire virtuale (VOQ) pot atinge n
situaii similare aproape 100 % din debitul util, deoarece fiecare bloc de B
pachete se distribuie n cozi separate la fiecare intrare.
13.6 EVITAREA HOL PRIN COZI LA IEIRE
Pentru evitarea blocrii HOL s-au propus cozi de ateptare la ieire n
locul cozilor la intrare. Presupunem c pachetele pot fi trimise oricum
ctre un port de ieire fr coad de ateptare la intrare. Un pachet P
destinat unui port de ieire ocupat, nu poate bloca un alt pachet care-i
urmeaz, deoarece pachetul P, trimis n coada de ateptare a portului de
ieire, poate bloca doar pachetele destinate aceluiai port de ieire.
Cea mai simpl cale de-a realiza acest lucru ar fi de-a face comutaia de
N ori mai rapid comparativ cu viteza liniilor de intrare. Atunci chiar dac
toate cele N intrri transmit ctre aceeai ieire, ntr-un anumit timp de
celul, toate cele N celule pot fi trecute prin comutator spre a fi introduse
n coada de ateptare la ieire. Deci, pentru a realiza cozi de ateptare la
ieiri e nevoie de comutatoare cu viteze de N ori mai mari. Soluia e
scump sau irealizabil.
O implementare practic a cozilor de ateptare la ieire este comutatorul
knockout. Presupunem c recepia a N celule pentru aceeai destinaie,
n orice interval de timp de celul, este rar i c numrul ateptat este k,
iar k << N . In acest caz (P11) este necesar s se proiecteze un comutator
doar de k ori mai rapid dect viteza liniei de intrare, nu de N ori. Aceasta
duce la economii substaniale pentru comutator, i se poate realiza prin
paralelism hardware (P5), folosind k magistrale paralele.
In afara de varianta ia-i un bilet toate celelalte variante, inclusiv
varianta knockout, se bazeaz pe divizarea pachetelor n celule de
dimensiune fix. Se va folosi noiunea de celul nu de pachet, dar se
subnelege faptul c exista o etap iniial de segmentare a pachetelor n
celule, i apoi de reasamblare la portul de ieire.
Pe langa un comutator mai rapid, varianta knockout necesit o coad de
ateptare la ieire capabil s accepte celule cu o vitez de k ori mai mare

189

decat viteza liniei de ieire. O implementare naiv ar fi cu un FIFO rapid,


dar costul e ridicat. De altfel ideea unui FIFO rapid este exclus, deoarece
bufferul nu rezist la un dezechilibru pe termen lung, ntre viteza de
intrare i cea de ieire. Astfel specificarea bufferului poate fi relaxat (P3)
permindu-i-se s opereze astfel doar pe perioade scurte, n care celulele
sosesc de k ori mai rapid dect sunt transmise mai departe. Aceasta se
poate rezolva prin intreeserea memoriei i folosirea a k memorii paralele.
Un distribuitor (care ruleaz de k ori mai repede) mparte celulele ce
sosesc la k memorii, n ordine round-robin, iar la ieire celulele sunt
extrase n aceeai ordine.
In final trebuie tratat corect i cazul n care nu este respectat condiia
impus, i N > k celule sunt transmise la aceeai ieire, n acelai timp.
Pentru a nelege soluia general expunem trei cazuri mai simple.
Doi concureni, un ctigator: In cel mai simplu caz dac k=1 i N=2,
arbitrul trebuie s aleag echitabil o singur celul din dou variante
posibile. Aceasta se poate face prin realizarea unui echipament elementar
de comutaie 2x2, numit concentrator care selecteaz aleatoriu un
ctigtor si un nectigtor. Ieirea ctigtoare este celula selectat.
Ieirea nectigtoare este folositoare n cazul general n care sunt
combinate mai multe concentratoare elementare 2 x 2.
Multi concureni, un singur ctigtor: Acum considerm k=1 (numai o
singura celul poate fi acceptat) i N>2 (sunt mai mult de dou celule
ntre care arbitrul trebuie sa fac o selecie echitabil). O strategie simpl
se bazeaz pe varianta dezbin i cucerete (P15 structuri de date
eficiente) pentru a crea un arbore knockout de concentratoare 2x2.
Celulele sunt grupate dou cte dou utiliznd N / 2 copii ale
concentratorului elementar 2x2. Acestea formeaz primul nivel al
arborelui. Ctigtorii primei runde trec la runda a doua unde sunt N/4
concentratoare i aa mai departe, pn se ajunge la un singur concentrator
(root) care stabilete ctigtorul. Se observ c ieirile nectigtoare au
fost ignorate pan acum.
Mai muli concureni, mai mult de un castigator: In final, consideram
cazul general in care k celule trebuie selectate din N celule posibile, pentru
valori arbitrare ale lui k si N. O idee simpla este de-a crea k arbori
knockout separati pentru a calcula primii k castigatori. Pentru
corectitudine, celulele nectigtoare la arborii knockout de nivel inferior
trebuie trimise la urmatorul nivel pentru locurile urmatoare. Aceasta este
posibil deoarece concentratorul knockout 2x2 are doua iesiri, una pentru
castigator si una pentru nectigtor, nu doar una pentru castigator. Iesirile
nectigtoare sunt direcionate nspre arborii pentru poziiile urmtoare.
Dac trebuie selectate 4 celule din 8 candidai, cea mai simpl variant
va atribui cei 8 candidai (n perechi) la 4 concentratori knockout 2x2.
Acestea logic vor selecta patru ctigtori, cantitatea dorit. Aceasta
variant este mult mai simpl fa de utilizarea a patru arbori separai, dar
poate deveni inechitabil. De exemplu presupunem dou surse care
transmit continuu informaie, S1 si S2 i ntmplarea face ca aceste dou
surse s formeze o pereche, n timp ce o alt surs cu debit mare S3
formeaz o pereche cu o surs cu debit mic. In acest caz sursele S1 si S2
vor obine aproximativ jumtate din traficul pe care l obine S3. Trebuie
evitate aceste situaii inechitabile prin utilizarea a k arbori separai, unul
190

pentru fiecare poziie.Implementarea naiv a arborilor este: se ncepe


rularea logicii pentru arborele din poziia j, strict dup ce s-a terminat
rularea logicii pentru arborele din poziia j-1. Aceasta asigur c toti
nectigtorii eligibili au fost colectai. Echitatea este dificil de
implementat.
Inelegerea comutatorului knockout e important datorit tehnicilor pe
care le introduce, dar implementarea lui este complex i face presupuneri
asupra distribuiei de trafic. Presupunerile nu sunt valabile pentru topologii
reale, unde mai mult de k clieni concureaz frecvent n cazul transmisiilor
ctre un server foarte mult accesat. Dar cercettorii au gsit ci simple de a
evita blocarea HOL fr utilizarea cozilor la ieire.
13.7.EVITAREA HOL CU ASOCIERE PARALEL ITERATIV
Ideea principal la PIM, asocierea paralel iterativ, este de-a
reconsidera cozile de ateptare la intrare, adaptndu-le s evite blocarea n
fruntea liniei. Unui port de intrare i se planifica nu doar celula din fruntea
cozii sale de intrare, ci i toate celelalte celule ce pot progresa cnd prima
celula este blocat. Pare foarte dificil: pot fi o sut de mii de celule n
fiecare coad si chiar cu un singur bit de planificare a strii fiecrei celule
rezulta prea multa memorie pentru stocare i procesare.
Prima observaie e c celulele din coada fiecrui port de intrare pot fi
destinate numai pentru N porturi de ieire posibile. Presupunem c celula
P1 este situat naintea celulei P2 n coada de intrare X, i ambele P1 si P2
sunt destinate aceleiai cozi de ieire Y. Cu FIFO, P1 trebuie planificat
nainte de P2. Deci, nu se obine nici un ctig din ncercarea de-a
planifica P2 nainte de P1. Risipa evident poate fi evitat (P1) prin
planificarea doar a primei celule destinate fiecrui port de ieire distinct,
iar restul celulelor raman neplanificate.
Primul pas la fiecare port de intrare, este descompunerea cozii unice de
intrare din fig.13.6 n cozi de intrare separate pentru fiecare ieire numite
cozi virtuale la ieire (VOQ) (fig.13.8) ; in stnga sus sunt aceleai celule
de intrare ca i n fig.13.7, dar plasate n cozi separate.
Pentru comunicarea planificrii porturilor de intrare e nevoie de un
bitmap de doar N bii (N este dimensiunea comutatorului). Un 1 in poziia
i a bitmap-ului arat c exist cel puin o celul destinat portului de ieire
i. Astfel dac fiecare port de intrare, din N, comunic folosind un vector de
N bii pentru descrierea planificrii necesare, planificatorul trebuie s
proceseze numai N2 bii. Pentru N<32, nu sunt prea muli bii de transmis
pe magistralele de control sau de depus n memoriile de control.
Comunicarea cererilor e n stnga sus in figura 13.8. Se observ c A nu
transmite o cerere portului 4 deoarece nu are celule destinate portului 4.
De asemenea portul de intrare C transmite o cerere pentru celula destinat
portului de ieire 4, dei aceeai celul este ultima n coada de intrare C, n
cazul scenariului cu o singura coad de intrare din figura 13.6.
E necesar acum un algoritm de planificare ce asociaz resurse nevoilor.
Dei inteligent, adevratul progres l constituie evitarea blocrii HOL
utiliznd VOQ la intrare. Pentru a menine analogia ntre exemplul din
fig.13.8 i fig.13.6, presupunem c fiecare pachet din fig.13.6 e convertit
ntr-o singura celul n fig.13.8.

191

Pentru a motiva algoritmul de planificare utilizat in PIM, se observ n


fig.13.8 stnga sus, c portul 1 de ieire primete 3 cereri, de la A, B i C,
dar poate servi numai una singur n urmtorul slot. O soluie simpl este
selecia aleatoare (P3a). Astfel n faza de alocare (imaginea din mijlocul
primului rnd din fig. 13.8), portul de ieire 1 l selecteaz aleatoriu pe B.
Similar presupunem c portul 2 l selecteaz pe A aleatoriu (dintre A i B),
i portul 3 l selecteaz pe A aleatoriu (dintre A, B i C). In final, portul 4 l
selecteaz pe singurul su solicitant C.
Etapa 1
1
2
3
1
2
3
1
3
4

3
4

C
Cerere

1
2
3
1
2
3
1
3
4

1
3
2
3
1
3
-

1
3
3
-

1
2

3
4

C
Acord

1
2
3
1
2
3
1
3
4

B
C
a=1

3
4
Acceptare

Etapa 2
1
3
2
3
1
3
-

3
4

C
a=1

Cerere

1
2

3
4

C
Acord

1
3
2
3
1
3
-

1
3
3
-

1
2

3
4

C
Acceptare

Etapa 3
1
3
3
4

C
a=1

Cerere

1
2

3
4

C
Acord

1
2

3
4

C
Acceptare

FIGURA 13.8 Varianta iterativ paralel de asociere (PIM ), presupune ca toate intrrile s trimit n
paralel cereri ctre toate ieirile la care doresc s se conecteze. PIM utilizeaz aleatorizarea pentru a
face asocierea, astfel c ieirile care primesc cereri multiple aleg aleatoriu o anumit intrare, iar
intrrile care obin acorduri multiple aleg aleatoriu ieirea nspre care s transmit. Acest proces n trei
etape poate fi repetat pentru a mbunti dimensiunea asocierii.

Nu e suficient rezolvarea competiiei de la porturile de ieire, deoarece


are loc o competiie i la porturile de intrare. Dou porturi de ieire pot
aloca aleatoriu resurse aceluiai port de intrare, care trebuie s selecteze un
port nspre care s transmit o celul. De exemplu n imaginea din
mijlocul primului rnd din fig. 13.8, A primete alocri din partea ieirilor
2 i 3. Astfel este necesar o a treia faz Acceptare, n care fiecare port de
intrare selecteaz aleatoriu un port de ieire (dac aleatorizarea a fost
utilizat n faza de alocare, de ce s o nu utilizm din nou?).
Astfel, n imaginea din dreapta sus a figurii 13.8, A selecteaz n mod
aleatoriu portul 2, B i C nu au de ales i selecteaz porturile 1 i respectiv
4. S-a realizat conexiunea crossbar, i pachetele de la A la portul 2, B la
portul 1 i C la portul 4 sunt transferate. Dei n acest caz asocierea a fost
maximal (adic nu mai poate fi mbuntit), n unele cazuri seleciile
192

aleatoare pot da o asociere ce mai poate fi mbuntit ulterior. De


exemplu n cazul improbabil ca porturile 1, 2 i 3 s selecteze toate A, vor
fi asociate doar dou.
In aceste cazuri, neprezentate n figur, algoritmul poate fi
mbuntit prin mascarea tuturor intrrilor i ieirilor asociate, dup care
se fac mai multe iteraii (pentru acelai interval de timp care urmeaz).
Dac asocierea n cazul iteraiei curente nu este maximal, o iteraie
urmtoare va mbunti asocierea cu cel puin 1. Iteraiile urmtoare nu
pot nruti asocierea, deoarece asocierile existente se pstreaz de la o
iteraie la alta. Dei cel mai defavorabil caz pentru a atinge o asociere
maximal pentru N intrri este de N iteraii, se arat c numrul cel mai
probabil de asocieri este mai apropiat de logN. Implementarea DECAN 2 a
utilizat 3 iteraii pentru un comutator cu 30 de porturi.
Exemplul din fig.13.8 utilizeaz o singur iteraie pentru fiecare
asociere. Rndul din mijloc arat a doua asociere pentru al doilea timp de
celul, n care, de exemplu A i C ambele transmit o cerere pentru portul 1
(dar nu i B deoarece celula dinspre B nspre 1 a fost transmis n ultimul
timp de celul). Portul 1 l selecteaz aleatoriu pe C i asocierea final este
A-3, B-2 i C-1. Al treilea rnd arat a treia asociere, de data aceasta de
dimensiune 2. Dupa a treia asociere numai celula destinat portului 3 n
coada de intrare B nu este transmis. Astfel n patru timpi de celul (din
care al patrulea nu e utilizat optimal i nu poate fi utilizat pentru a se
transmite mai mult trafic) s-a transmis ntreg traficul. Varianta aceasta e
mai eficient dect cea cu bilete din figura 13.6.
13.8 EVITAREA ALEATORIZRII CU iSLIP
Asocierea paralel iterativ, PIM este extrem de important, deoarece
introduce ideea c blocarea HOL poate fi evitat, cu un cost hardware
rezonabil. Dar PIM are doua probleme. Utilizeaz aleatorizarea, i e greu
de creat o surs acceptabil de numere aleatoare la viteze foarte mari.
Apoi, e necesar un numr logaritmic de iteraii pentru a obine rezultate
maxime. Dar fiecare iteraie necesit trei faze, iar decizia de asociere
trebuie luat n timpul minim de sosire al pachetelor, aa c ar fi mai
eficient o variant care se apropie de asocierea maxim ntr-una sau dou
iteraii.
ISLIP este o variant foarte rspndit, care dezaleatorizeaz PIM,
astfel ca se obine un rezultat foarte apropiat de asocierile maxime ntruna sau dou iteraii. Ideea este extrem de simpl. Cnd un port de intrare
sau de ieire recepioneaz cereri multiple, el va selecta cererea
catigtoare n mod uniform pn la aleatoriu pentru echitate. Ethernet
asigura echitatea folosind aleatorizarea, iar token-ring prin utilizarea unui
pointer round-robin, implementat prin tocken.
ISLIP asigura echitatea, alegnd urmtorul ctigtor dintre multiplii
competitori, n maniera round-robin, utiliznd un pointer circular. Dei
pointerii round robin pot fi iniial sincronizai i dau ceva asemntor cu
HOL, acetia tind s devin liberi i, pe termen lung, dau asocieri
maximale. Deci, subtilitatea n iSLIP nu este utilizarea pointerilor roundrobin, ci aparenta lacun de sincronizare pe termen lung ntre N pointeri ce
ruleaz n mod concurent.

193

Mai precis fiecare port de ieire/intrare menine un pointer g, setat iniial


spre primul port de intrare/ieire. Daca un port de ieire trebuie s
selecteze multiplele cereri de intrare, el va selecta cel mai mic numr de
intrare egal sau mai mare ca g. Similar dac un port de intrare are de ales
ntre multiple cereri provenite de la porturile de ieire, el alege cel mai mic
numr de port de ieire mai mare sau egal cu a, unde a este pointerul
portului de intrare. Cand un port de ieire este asociat unui port de intrare
X, atunci pointerul portului de ieire este incrementat la primul numr de
port mai mare dect X, n ordine circular (de ex. g devine X+1 n afar de
cazul n care X a fost ultimul port, caz n care g se va afla n jurul primului
numr de port).
Prioritatea rotitoare permite fiecrei resurse (port de ieire, port de
intrare) s partajeze destul de echitabil toi competitorii, cu preul a 2N
pointeri, de dimensiune log2N, suplimentari fata de N2 stri de planificare
necesare fiecrei iteraii.
In figurile 13.9 si 13.10 se prezint acelai scenariu ca n figura 13.8 (i
figura 13.6), dar cu doua iteraii iSLIP. Dac fiecare rnd este o iteraie a
unei asocieri, fiecare asociere este prezentat utiliznd dou rnduri. Deci,
cele trei rnduri ale figurii 13.9 prezint primele 1,5 asocieri ale
scenariului. Figura 13.10 prezint celelalte 1,5 asocieri rmase.
Etapa 1, iteratia 1
1
2
3
1
2
3
1
3
4

1 g=A

A
a=1

2 g=A

B
a=1
C
a=1

3 g=A
4 g=A
Cerere

1
2
3
1
2
3
1
3
4

1
2
3
1
2
3
1
3
4

2
3
1
3
1

1
2

3
4

C
Alocare

1
2
3
1
2
3
1
3
4

A
a=2

1
2
3
1
2
3
1
3
4

1 g=B
2 g=A

B
a=1
C
a=1

3 g=A
4 g=A
Acceptare

Etapa 1, iteratia 2
1
2
3
1
2
3
1
3
4

1 g=B

A
a=2

2 g=A

B
a=1
C
a=1

3 g=A
4 g=A
Cerere

1
2

3
4

C
Alocare

1
2

3
4

C
a=1

Acceptare

Etapa 2, iteratia 1
2
3
1
3
1
-

A
a=2
B
a=1

1 g=B

C
a=1

4 g=A

2 g=A
3 g=A

Cerere

1
2

3
4

C
Alocare

2
3
1
3
1
-

2 g=B

B
a=2
C
a=1

FIGURA 13.9 O etap i jumtate a unui exemplu de scenariu iSLIP

194

1 g=C

A
a=3

3 g=A
4 g=A
Acceptare

Imaginea din stnga-sus a figurii 13.9 este identic cu figura 13.8,


fiecare port de intrare transmind cereri spre fiecare port de ieire pentru
care are celule destinate. O diferen este c fiecrui port de ieire i se
asociaz un pointer de alocare g, iniializat pentru toate ieirile la valoarea
A. Similar, fiecrui port de intrare i se asociaza un asa-numit pointer de
acceptare a, iniializat la valoarea 1 pentru toate intrrile.
Determinismul n iSLIP cauzeaz o divergen, imediat n faza de
Alocare. Compar imaginea din mijloc sus a figurii 13.9 cu imaginea din
mijloc sus a figurii 13.8. De exemplu dac ieirea 1 recepioneaz cereri
de la toate cele trei porturi de intrare, portul selectat va fi A, deoarece A
este cel mai mic numr de intrare mai mare sau egal cu g1 = A. In figura
13.8, portul 1 selecteaz aleatoriu portul de intrare B. In aceast etap
determinismul la iSLIP se dovedete a fi un dezavantaj real deoarece A a
trimis cereri i nspre porturile 3 i 4. Deoarece 3 i 4 au de asemenea
pointerii de alocare g3 = g4 = A porturile 3 i 4 l vor selecta deasemnea
pe A ignornd preteniile lui B i C. C fiind singurul care trimite o cerere
nspre portul 4 va primi alocarea din partea portului 4.
Daca A a primit trei alocri din partea porturilor 1, 2 i 3, A l accept pe
1, deoarece 1 este prima ieire egal sau mai mare ca pointerul de
acceptare a lui A, aA, care a fost egal cu 1. Similar C l alege pe 4. Acestea
fiind fcute A l incrementeaz pe aA la 2 si C incrementeaza aC la 1
(incrementarea circular a lui 4 este 1). Numai la aceasta etap ieirea1
incrementeaz pointerul su de alocare, g1, la B (cu 1 mai mare dect
ultima alocare ce a avut loc cu succes) iar portul 4 n mod similar face
incrementarea la A (cu 1 mai mare decat C n ordine circular). Se observ
c celelalte porturi care au dat alocri portului A, adic 2 i 3 nu i
incrementeaz pointerii de alocare deoarece A a refuzat alocrile lor. Dac
acetia ar fi fcut incrementarea, ar fi fost posibil construirea unui
scenariu n care porturile de ieire menin incrementarea pointerului lor de
alocare, dincolo de un anumit port de intrare I dupa alocri fr succes,
astfel nfometnd continuu portul de intrare I. Asocierea are doar
dimensiunea 2; dar spre deosebire de figura 13.8 acest scenariu poate fi
mbuntit printr-o a doua iteraie prezentat n figura 13.9. La sfaritul
primei iteraii intrrile i ieirile asociate nu sunt conectate prin linii
ngroate (nsemnnd transfer de date), ca n dreapta sus la figura 13.8.
Acest transfer de date va atepta sfrsitul ultimei iteraii (iteraia a doua).
A doua iteraie (rndul din mijoc al figurii 13.9) ncepe cu intrrile care
nu au fost asociate ntr-o iteraie precedent (aceasta nseamn B) adresnd
cereri numai porturilor de ieire neasociate pn acum. Astfel B trimite
cereri lui 2 i 3 (i nu lui 1 dei B are de asemenea o celul destinat lui 1).
Ambele porturi de ieire 2 i 3 trimit alocri portului B, iar B l selecteaz
pe 2 (cel mai mic numr de port care este mai mare sau egal cu pointerul
su de acceptare). Pentru evitarea nfometrii, iSLIP nu-i incrementeaz
195

pointerii n celelalte iteraii n afar de prima. Deci B nu-i va incrementa


pointerul de acceptare la 3 (1 plus 2-ultimul acceptat).
Dup conectarea lui B la 2, pointerul de alocare a lui 2 rmne A i
pointerul de acceptare al lui B rmne 1. Aceasta fiind iteraia final, toate
perechile asociate incluznd perechi cum ar fi A,1 asociate n iteraii
anterioare, sunt conectate i are loc transferul de date (liniile ngroate).
Etapa 2, iteratia 2
2
3
1
3
1
3
-

1 g=C

A
a=3

2 g=B

B
a=2
C
a=1

3 g=A
4 g=A
Cerere

2
3
1
3
1
3
-

3
3
1
-

3
3
1
-

1
2

3
4

C
Alocare

2
3
1
3
1
3
-

A
a=3

3
3
1
-

A
a=4

3
3
1
-

A
a=4

1 g=C
2 g=B

B
a=2
C
a=1

3 g=A
4 g=A
Acceptare

Etapa 3, iteratia 1
3
3
1
-

1 g=C

A
a=3

2 g=B

B
a=2
C
a=1

3 g=A
4 g=A
Cerere

1
2

3
4

C
Alocare

1 g=A
2 g=B

B
a=2
C
a=2

3 g=B
4 g=A
Acceptare

Etapa 3, iteratia 2
3
3
1
-

1 g=A

A
a=4

2 g=B

B
a=2
C
a=2

3 g=B
4 g=A
Cerere

1
2

3
4

C
Alocare

1 g=A
2 g=B

B
a=2
C
a=2

3 g=B
4 g=A
Acceptare

FIGURA 13.10 Cealalta etapa si jumatate din exemplul de scenariu iSLIP

In al treilea rnd se observ cum sincronizarea iniial a pointerilor de


alocare i acceptare e ntrerupt. Deoarece un singur port de ieire a trimis
un mesaj de alocare nspre A, acest port 1 trebuie s acorde prioritate
celorlalte porturi de intrare. Dac A are al doilea pachet destinat lui 1 (nu
se prezint n exemplu), 1 i va trimite mesaj de alocare lui B.
Rndurile rmase din figura 13.9 i figura 13.10 trebuie examinate cu
atenie pentru a intelege regulile de mprosptare a pointerilor de alocare i
acceptare i care pachete vor fi comutate la fiecare etap. In ultima
imagine din figura 13.10 se observ ca singura celul care a rmas de
comutat este celula dinspre B nspre 3. Acest lucru poate fi realizat ntr-un
al patrulea timp de celul.
In figura 13.11 se prezint un sumar al planificrii finale (fcndu-se
abstracie de mecanismele interne) a scenariului iSLIP pentru comparaie
cu figura 13.7. Deoarece acestea sunt doar nite exemple particulare, ele
nu sugereaz c iSLIP (la fel ca i PIM) ar reduce risipa de diviziuni de
196

timp prin evitarea blocrii n fruntea liniei. Se observ c iSLIP la fel ca i


PIM comut acelai trafic de intrare n 4 timpi de celul, si nu 6.
Comparand figurile 13.9 i 13.8, iSLIP pare s fie inferior lui PIM,
deoarece sunt necesare dou iteraii pe asociere la iSLIP pentru a obine
acelai numr de perechi asociate pentru care la PIM este nevoie de-o
singur iteraie pe asociere. Aceasta ilustreaz mai degrab penalizarea pe
care iSLIP trebuie s-o plteasc la pornire i nu o penalizare pe termen
lung. In practic, pe moment ce pointerii iSLIP se desincronizeaz, iSLIP
functioneaza foarte bine cu o singur iteraie i unele implementri
comerciale utilizeaz doar o singur iteraie: iSLIP este extrem de popular.
Timp (in sloturi de celula)
3 2 1
3 2 1
4 3 1

A
B
C

1
2

A B C
B A
C A B

3
4

FIGURA 13.11 Evitarea blocrii HOL de ctre iSLIP crete debitul util din scenariul din figura 13.7

Foarte sumar, iSLIP se deosebete de PIM prin nlocuirea aleatorizrii


cu o planificare folosind o planificare circular (round robin) folosind
pointeri de intrare i de ieire. Acestei caracterizri i lipsesc dou aspecte
subtile ale iSLIP.
Pointerii de alocare sunt incrementai numai n faza a treia,

dup acceptarea alocrii Intuitiv, daca O acord o alocare portului de


intrare I, nu exist nici o garanie c I o va accepta. Dac O i-ar
incrementa pointerul de alocare se poate ajunge la o nfometare
permanent a traficului ntre I i O. i mai grav, Mc Keown a artat c
aceast variant round-robin reduce debitul util la numai 63 % (pentru
sosiri Bernoulli) deoarece pointerii tind s se sincronizeze i s se ajung
la blocaj.
Toi pointerii sunt incrementai numai dup recunoaterea

acceptrii primei iteraii: regula previne nfometarea, dar scenariul este


mult mai subtil dect exerciiul prezentat.
Asocierile realizate n iteraii, altele dect prima din iSLIP, sunt
considerate un bonus crescnd debitul util fr a fi contorizate n
dezavantajul cotei unui port.
13.8.1 Extinderea iSLIP la multicast si prioriti
LIP poate fi extins pentru a trata trafic multicast i pe baz de prioriti.
PRIORITI
Prioritile sunt utile pentru a transmite traficul critic sau de timp real
mai rapid prin comutator. Cisco GSR permite traficului voice over IP, s
fie planificat cu o prioritate mai mare decat restul traficului, deoarece are o
rat limitat i deci nu poate nfometa alte categorii de trafic.

197

Implementarea Tiny Tera manevreaz patru niveluri de prioritate.


Fiecare port de intrare are 128 de cozi virtuale (una pentru fiecare
combinaie de 32 de ieiri i 4 niveluri de prioritate). Deci, la planificator,
fiecare intrare are 128 de bii pentru controlul intrrilor.
Algoritmul iSLIP este modificat foarte simplu pentru a trata prioriti.
Pentru nceput fiecare port de ieire pstreaz un pointer de alocare separat
gk pentru nivelul de prioritate k, i fiecare port de intrare pstreaz un
pointer separat de acceptare ak pentru fiecare nivel de prioritate k. In
esen se aplic algoritmul iSLIP, astfel nct fiecare entitate (port de
intrare, port de ieire) s aplice algoritmul iSLIP la cel mai mare nivel de
prioritate existent la intrri.
Fiecare port de ieire face alocarea doar pentru cererea cea mai prioritar
recepionata. Un port de intrare I poate face o cerere la nivelul de prioritate
1 pentru ieirea 5, i o cerere la nivelul de prioritate 2 pentru ieirea 6,
deoarece acestea sunt cererile de cea mai nalta prioritate pe care le-a avut
portul pentru ieirile 5 i 6. Daca ambele ieiri 5 i 6 fac alocri pentru I, I
nu va face selecia bazndu-se pe pointerii de acceptare deoarece cele
dou celule au prioriti diferite, ci o va selecta pe cea de prioritate mai
mare. La o acceptare, n prima iteraie, pentru prioritatea k, ntre intrarea I
i portul de ieire O, pointerul de acceptare a prioritii k la I i pointerul
de alocare corespunztor prioritii k la O, sunt incrementai.
MULTICAST
Datorita aplicaiilor (videoconferinta) i protocoalelor (IP multicast) in
care ruterele transmit pachetele nspre un numr de porturi de iesire mai
mare ca unu, multicast n comutatoare, ca entitate de prima clas, a
devenit important. Algoritmul ia-i un bilet a tratat multicastul ca o
entitate de clasa a doua, prin transmiterea ntregului trafic de multicast la o
entitate/entiti central, care apoi va transmite traficul de multicast
pachet-cu-pachet ieirilor corespunztoare. Mecanismul ia-i un bilet
irosete resurse de comutatie (lime de band de control, porturi) i
asigur performane mai sczute (latena mai mare, trafic mai sczut)
pentru multicast.
Pe de alta parte, figura 13.4 arat c multicastul este suportat cu uurin
pe calea de date a unui comutator crossbar. De exemplu dac intrarea 1
(fig.13.4) transmite un mesaj pe magistrala sa de intrare i punctele de
conexiune sunt conectate astfel nct magistrala de intrare a lui 1 este
conectat la magistralele de ieire verticale ale ieirilor 2 si 3, atunci
ieirile 2 i 3 recepioneaz o copie a pachetului /celulei la acelai moment
de timp. Dac pachetele au lungimea variabil, mecanismul distribuit de
control al variantei ia-i un bilet, trebuie s aleag ntre a atepta eliberarea
simultan a tuturor porturilor, i transmiterea pachetelor unul dup altul.
Extensia iSLIP pentru multicast, numit ESLIP, acorda multicastului
aproape acelai statut ca i unicastului. Ignornd prioritile pentru
moment, exist o coad suplimentar pentru multicast pentru fiecare
intrare. Pentru evitarea blocarii HOL, ar fi ideal s existe o coad separat
pentru fiecare subset posibil de porturi de ieire, ceeace ar duce la un
numr impracticabil de cozi (216 pentru 16 porturi). Astfel se utilizeaz o
singur coad pentru multicast i poate aprea blocarea HOL, deoarece nu

198

se poate ncepe procesarea unui pachet pan ce pachetele de multicast


anterioare lui nu sunt transmise.
Presupunem c intrarea I are pachete destinate ieirilor O1, O2 si O3 n
fruntea cozii de multicast a lui I. Se spune c I are un fan-out de 3. Spre
deosebire de cazul unicastului, ESLIP pstreaz un singur pointer de
alocare comun pentru multicast si nici un pointer de acceptare pentru
multicast. Utilizarea pointerilor comuni implic o implementare
centralizat, diferit de planificatorul ia-i un bilet. Pointerul comun
permite ntregului comutator s favorizeze o intrare particular, nct s-i
poat completa ntregul fan-out mai repede dect daca ar fi mai multe
porturi de intrare, care transmit poriuni mici din fanout-ul lor de multicast
n aceleai momente de timp.
In exemplu, I va transmite o cerere de multicast nspre O1, O2 si O3.
Dar porturi de ieire cum este O2 pot recepiona cereri de unicast de la alte
porturi de intrare, de exemplu J. Cum va decide un port de ieire ntre
pachete de unicast i de multicast? ESLIP acorda traficului de multicast i
de unicast prioritate mai mare n sloi alternani de celul. De exemplu n
sloii impari O2 va selecta unicastul iar in sloii pari multicastul.
Pentru a continua exemplul presupunem un slot impar i presupunem c
O2 are cereri de unicast n timp ce O1 i O3 nu au cereri de unicast.
Atunci O2 va transmite un mesaj de alocare de unicast n timp ce O1 i O3
vor transmite alocri de multicast. O1 i O3 aleg pentru alocare intrarea
corespunztoare primului numr de port mai mare sau egal fa de
pointerul comun de alocare G. Presupunem c s-a selectat I i astfel O2 i
O3 vor trimite alocri de multicast nspre I. Spre deosebire de unicast, I
poate accepta toate alocrile de multicast.
Spre deosebire de planificarea unicast, pointerul de alocare la multicast e
incrementat doar dup ce I i-a completat fanoutul. Astfel n urmtorul slot
de celul, cnd multicastul are prioritate, I va putea transmite la O2. Acum
fanout-ul e completat, pointerul de alocari multicast se incrementeaza la
I+1, si planificatorul transmite inapoi lui I un bit prin care-i spune ca s-a
terminat transmisia din capul cozii sale multicast, deci poate fi luat in
lucru urmatorul pachet multicast.Un multicast nu trebuie terminat intr-o
singura diviziune de celula(ceea ce ar presupune ca toate iesirile implicate
sa fie libere), dar prin folosirea fanout splitting pe mai multe diviziuni.
Desigur ca iSLIP poate induce blocarea HOLpentru multicast. Daca
pachetul P1din capul cozii multicast este destinat iesirilor O1si O2 si
ambele sunt ocupate, atunci urmatorul pachet P2, destinat lui O3 si O4
libere amandoua, trebuie sa astepte dupa P1. Ar fi mult prea dificila
implementarea fanout splitting-ului pemtru alte pechete decat cele din
capul cozii si asta deoarece nu ne putem permite cate un VOQ separat
pentru fiecare combinatie posibila de porturi destinatie.
Algoritmul final ESLIP care combina patru niveluri de prioritate si
multicastingul este implementat in ruterul CISCO GSR.
13.8.2 Implementarea iSLIP
Inima hardware-ului ce implementeaza iSLIP este arbitrul care alege
intre cele N cereri (codate ca bitmap), cautandu-l pe primul mai mare sau
egal cu un pointer fix ; acesta este codorul programabil de prioritati.
Planificarea comutatorului poate fi facuta cu un arbitru de alocari similar,

199

pentru fiecare port de iesire (pentru arbitrarea cererilor) si un arbitru de


acceptari pentru fiecare port de intrare (pentru a arbitra intre alocari).
Prioritatile si multicastul sunt reintroduse intr-o structura de baza prin
adaugarea unui filtru la intrari, inainte de arbitru ; de exemplu, filtrul de
prioritati va anula toate cererile cu exceptia celor de prioritate maxima.
Desi, in principiu, planificatoarele unicast pot fi proiectate folosind
cate un chip separat per port, starea este suficient de redusa ca sa fie
manevrata de un singur chip planificator cu fire cablate de control
spre/dinspre fiecare port. Algoritmul multicast necesita un pointer
multicast partajat per nivel de prioritate, care implica si el un planificator
centralizat. Centralizarea implica insa intarzieri sau latenta, pentru a
trimite cererile si deciziile de la cardurile liniilor de port spre/dinspre
planificatorul centralizat.
Pentru a tolera aceasta latenta, planificatorul lucreaza cu un pipeline de m
celule (8 in Tiny Tera), de la fiecare VOQ si n celule (5 in Tiny Tera) de la
fiecare coada multicast.Acest lucru presupune ca fiecare card de linie in Tiny
Tera trebuie sa comunice 3 biti per unicast VOQ, care inseamna dimensiunea
VOQ , maxim pina la 8. Cu 32 de iesiri si patru nivele de prioritate, fiecare port
de intrare are de trimis 384 de biti de informatie unicast. Fiecare card de linie isi
comunica si fanout-ul (32 de biti per fanout), pentru fiecaredin cele cinci pachete
multicastdin fiecare cele patru nivele de prioritate, ajungandu-se la 640 biti. Cei
32 1024 biti ai informatiei de intrare sunt memorati intr-un SRAM pe chip.
Dar pentru accelerare, informatia despre capul fiecarei cozi (stari mai mici, de
exemplu, doar 1 bit per VOQ unicast) e memorata in bistabile, mai rapide dar
mai putin dense.
Consideram acum manevrarea ieratiilor multiple. Faza de cerere apare doar in
prima iteratie si trebuie modificata in celelalte iteratii prin mascare a intrarilor
associate.Astfel, K iteratii apar ca au nevoie de 2K pasi de timp, din cauza ca
pasii de alocare si acceptare necesita fiecare cate un pas de timp. La prima
vedere pare ca faza de grant a iteratie k+1 incepe dupa faza de acceptare a
iteratiei k ; si acest lucru, deoarece e nevoie sa stim daca un port de intrare I
afost acceptat in faza k, astfel incat e permisa o alocare pentru acea intrare in
iteratia k+1.
Urmatoarea observatie face partial posibil pipelining-ul: daca I intrari
receptioneaza orice grant in iteratia k, atunci I trebuie sa accepte exact una, si
deci este nedisponibila in iteratia k+1. Astfel pot fi relaxate specificatiile
implementarii (P3) pentru a permite fazei de grant din iteratia k+1 sa inceapa
imediat dupa faza de grant din iteratia k, si deci sa se suprapuna cu faza de
acceptare din iteratia k. pentru a face acest lucru, folosim un Sau intre toate
granturile intrarii I (la sfarsitul iteratiei k) pentru a masca toate cererile la I (in
iteratia k+1). Se reduce astfel timpul total cu un factor apropiat de 2 pasi de timp
pentru k iteratii, de la 2k la k+1. De exemplu, la implementarea iSLIP Tiny Tera
sunt trei iteratii in 51nsec ( viteza OC-192) cu un ceas de 175 Mhz ; fiecare
ciclu de ceas fiind de 5,7 nsec, iSLIP are 9 cicluri de ceas pentru a termina.
Deoarece fiecare pas de grant si acceptare necesita doua cicluri de ceas,
pipelining-ul e crucial pentru manevrarea a trei iteratii in 9 cicluri ;
implementarea naiva ar avea nevoie de minim 12 cicluri de ceas.

13.9.2 Scalarea la switch-uri mai mari


Pana acum au fost tratate switch-urile mici care necesitau rutere cu pana
la 32 de porturi, categorie in care intrau si actualele rutere Internet.
Deocamdata construirea codurilor cablate tinde sa limiteze numarul de
oficii care pot fi servite de un dulap cablat. Astfel, switch-urile pentru

200

LAN-uri plasate in dulapuri cablate sunt bine deservite de porturi de


dimensiuni reduse.
Dar in general, retelele telefonice foloseau cateva switch-uri foarte mari
care pot comuta 1.000-10.000 legaturi. Folosirea switch-urilor mari tinde
sa elimine legaturile switch-la-switch, reducand astfel latenta si crescand
numarul de porturi diponibile utilizatorilor. Astfel unii cercetatori pledeaza
pentru switch-uri mari, dar pana recent nu a existat suportul industrial
pentru ele.
Exista trei tendinte recente in favoarea proiectarii switch-uri mari:
1. DWDM: folosirea multiplexarii cu diviziune prin lungimea de
unda, pentru a asocia multiple lungimi de unda in legaturi optice
intre ruterele core, care va creste numarul de legaturi logice
comutate de ruterele core.
2. Fibra la domicilii: e o sansa reala ca in viitorul apropiat
conexiunile intre switch-uri si case/oficii sa fie cu fibre optice .
3. Rutere modulare multisasiu: exista un interes crescut in
dezvoltarea clusterelor de rutere, formate din rutere interconectate
prin retele de mare viteza. De exemplu, multe puncte de acces in
retele conecteaza ruterele prin legaturi FDDI sau Gigaswitch-uri.
Clusterele de rutere sau ruterele multisasiu cum mai sunt numite,
sunt de interes deoarece permit dezvoltarea incrementala.
Tipic, timpul de viata al unui ruter core e estimat la 18-24 de luni, dupa
care traficul creste, determinand ISP-urile sa renunte la vechile rutere si sa
se orienteze spre unele noi. Ruterele multisasiu pot prelungi timpul de
viata al unui ruter core la 5 ani sau mai mult, permitand ISP-urilor sa
inceapa cu rutere mici si apoi sa adauge altele clusterelor, conform cu
necesarul de trafic. Retelele Juniper au creat seria T de rutere, care permit
asamblarea a pana la 16 rutere unisasiu (fiecare cu pana la 16 porturi),
formand astfel un ruter cu 256 de porturi. In inima unui ruter multisasiu
se afla un sistem de comutare scalabil 256x256. CRS-1 este versiunea
Cisco a unui astfel de ruter.
13.9.1 Masurarea costului switch-ului
Inainte de problema scalarii, este importanta intelegerea principalelor
metrici de cost ale switch-ului. La inceputul telefoniei, punctele de
interconectare erau realizate cu switch-uri electromagnetice, si astfel cele
N 2 puncte de interconectare ale comutatorului crossbar reprezentau un
cost major. Chiar si astazi acesta este principalul cost pentru ruterele foarte
mari, de dimensiune 1000. Dar fiind vorba de interconectari cu
tranzistoare, dimensiunea lor e redusa.
Limitarea reala a switch-urilor electronice este data de numarul de pini
al circuitului integrat. Limita curenta este de 1000 de pini, dintre care o
mare parte sunt alocati altor functii, alimentare/pamintare, si e imposibil
de pus pe un singur chip chiar si un switch de 500x500. Desigur ca s-ar
putea multiplexa cateva intraride crossbar pe un singur pin, dar asta ar
incetini viteza fiecarei intrari la jumatate din viteza posbila de I/O a
fiecarui pin.
Cele N 2 puncte de interconectare ale comutatorului crossbar, constituie
o problema pentru N suficient de mare, dar pentru N<200, majoritatea
complexitatii interconectarii e continuta de chip. Astfel ca implementarea

201

numarul mari se fac fac prin interconectarea chip-urilor care contin


comutatoare crossbar mici. Costul dominant ramine numarul pinilor si
numarul de legaturi intre chip-uri. O masura mai rafinata a costului tine
cont si de tipul de pini, fiecare avand un cost diferit.
Alti factori care limiteaza constructia switch-urilor monolitice mari este
incarcarea capacitiva a magistralelor, complexitatea planificarii, spatiul in
dulapuri si puterea. Daca se construieste un switch 256x256 de tip
crossbar cu 256 magistrale de intrare si iesire, incarcarea acestora va duce
la scaderea vitezei. Apoi, un algoritm de planificare centralizat ca iSLIP,
care are nevoie de N 2 biti de planificare a starii, nu se adapteaza prea bine
la valori mari ale lui N.
O alta limitare este conditia, in multe rutere, de a avea putine (de
preferinta unul singur) porturi pe un card de linie. Situatia e la fel, din
condsiderente de putere disipata, si pentru numarul de carduri de linie ce
pot fi plasate intr-un dulap. Solutiile multirack si multisasiu sunt logice.

13.9.2 Reele CLOS i rutere multiasiu


Pentru switch-urile VLSI e important numrul total de comutatoare i de
legturi care le interconecteaz. Costul comutatoarelor realizate in tehnica
VLSI e constant indiferent de numrul punctelor de intersecii. Firma
Juniper folosete o reea Clos pentru a realiza un ruter multiasiu 256x256
interconectnd 16x16 rutere T n primul etaj. O reea Clos standard ar avea
nevoie de 16 rutere n primul etaj, 16 n etajul al treilea i k=2*16-1=31
comutatoare n etajul mijlociu. Costul acestei configuraii s-ar putea
reduce dac s-ar impune k=n, dar atunci reea Clos se va putea bloca.
Reeaua Clos poate deveni neblocabil prin rearanjare dac oricare
intrare i poate fi conectat cu oricare ieire o atta timp ct exist
posibilitatea rearanjrii unor conexiuni din etajul mijlociu.Folosind k=n n
loc de k=2n-1 se reduce aproape de dou ori numrul total de comutatoare
de pe etajul mijlociu, dar crete complexitatea alogoritmului de rearanjare.
n cazul apelurilor telefonice se presupune c toate apelurile sosesc la
intrare n acelai timp. Cnd sosete un nou apel, convorbirile existente
trebuie rearanjate.
Pentru a profita de complexitatea redus si pentru a permite tratarea
apelurilor telefonice problema se poate rezolva elegant dac mai nti se
nlocuiete fiecare apel cu pachete i fiecare pachet cu celule de
dimensiune fix. In fiecare interval de celul, apar celule la fiecare intrare
destinate fiecrei ieiri: fiecare celul nou are nevoie de o aplicare nou a
algoritmului de potrivire, care s nu fie restricionat de celulele
precedente. In loc rularii unui proces lent, ce folosete tehnica edge
coloring, se redistribuie traficul fiecarei intrari pe comutatoarele de pe
nivelul mijlociu (echilibrarea ncarcarii, determinist sau aleatoare).
Diviznd pachetele n celule i apoi distribuindu-le peste ntreaga
structur Clos se obine acelai efect ca prin manevrarea conexiunilor n
reeaua cu comutare de circuit, deoarece toate cile sunt folosite simultan.
Afirmaia este parial adevrat deoarece pot aprea comutatoare
congestionate pe nivelul mijlociu.

202

Mai exist posibilitatea de folosire a unui algoritm aleator, prin care


fiecare comutator de pe nivelul de intrare alege aleator un comutator de pe
nivelul mijlociu, pentru fiecare celul care trebuie transmis. n acest caz,
d.p.d.v. probabilistic fiecare comutator de pe nivelul mijlociu va
recepiona N/n celule, numrul de ieiri ale comutatorului de pe nivelul
mijlociu. Astfel, dac avem un flux de celule care merg spre ieiri diferite
vom avea un debit de 100% pentru algoritmul aleator.
Dar algoritmul de aleatorizare e greu de realizat, existnd i
probabilitatea de coliziune, cnd mai multe comutatoare de intrare doresc
s foloseasc acelai comutator de ieire. Acest fenomen va reduce debitul
i va impune folosirea bufferelor.Scderea debitului poate fi compensat
prin cresterea vitezei de operare intern a comutatoarelor.
Un algoritm de aleatorizare relativ uor de implementat i cu eficien
crescut este generatorul de numere aleatoare Tausworth compus din trei
registre de deplasare cu reacie care apoi sunt insumate SAU-EXCLUSIV.
Algoritmul de reasamblare a celulelor n pachete este mai complex dac
se folosete echilibrarea aleatoare a ncrcrii, dect dac se folosete
metoda determinist de echilibrare a ncrcrii. n ultimul caz, logica de
reasamblare tie de unde tebuie s soseasc urmtoarea celul.
13.9.3 Reele Benes pentru rutere mari
Avnd n vedere faptul c switch-ul No.1.ESS pentru telefoane comut
65.000 de legturi de intrare, Turner susine faptul c Internet-ul ar trebui
s fie construit cu ajutorul a ctorva rutere mari n locul de mai multe
rutere mici. Aceste topologii pot duce la reducerea legturilor risipite
pentru realizarea conexiunilor ruter-la-ruter ntre ruterele mici, reducnduse costul; aceste topologii pot deasemenea reduce lungimea terminal-cale
cele mai defavorabile, reducnd latena i mbuntind timpul de rspuns
al utilizatorului.
n esen, o reea Clos are o dimensiune de aproximativ N N , din
punctul de vedere al complexitii punctelor de intersecii, folosind doar 3
nivele. Experiena algoritmicii generale sugereaz faptul c o reea ar
trebui s aib o complexitate a puctelor de intersecii de N log N , n
acelai timp mrind adncimea de comutare la logN. Astfel de reele de
comutare pot exista i au fost cunoscute ani de-a rndul n telefonie i n
industria de operare paralel. Alternative precum reelele Butterfly, Delta,
Banyan i Hypercube reprezint o concuren bine cunoscut.
Acest subiect este foarte vast, astfel ca acest capitol se va concentra doar
asupra reelelor Delta i Benes. Asemenea reele sunt folosite n multe
implementri. Spre exemplu switch-ul Gigabit de la Universitatea din
Washington folosete o reea Benes, care poate fi considerat ca 2 copii a
unei reele Delta. Cea mai simpl modalitate de a nelege o reea Delta
este prin recursivitate. S presupunem c avem N intrri n stnga, iar
aceast problem trebuie redus la problema construirii a dou reele Delta
mai mici, de dimensiune N/2. Presupunem c exist un prim nivel de 2 x 2
comutatoare.

203

Figura 13.14: Construirea recursiv a unei reele Delta

Dac ieirea este n jumtatea superioar (MSB al ieirii este 0), atunci
intrarea este direcionat ctre reeaua Delta N/2 superioar, dac ns
ieirea este n jumtatea inferioar (MSB=1) atunci intrarea este
direcionat ctre reeaua Delta N/2 inferioar.
Pentru a economisi la primul nivel 2 comutatoare de intrare, trebuie
grupate intrrile n perechi consecutive, fiecare pereche fcnd uz de
acelai comutator cu 2 intrri, cum se vede n fig.13.14. n acest fel, dac
cele 2 celule de intrare dintr-o pereche merg ctre 2 jumti de ieire
diferite, atunci ele pot fi comutate n paralel, altfel una va fi comutat iar
cealalt va fi abandonat sau stocat ntr-un buffer. Bineneles, acelai
proces poate fi repetat n mod recursiv pentru fiecare dintre reelele Delta
de dimensiune N/2, unde din nou exist un nivel de 2 x 2 comutatoare,
apoi 4 N/4 comutatoare e.t.c. Extinderea complet a unei reele Delta este
vizibil n prima jumtate a figurii 13.15. Se poate observa cum
construcia recursiv din fig.13.14 se regsete n conexiunea dintre
primul nivel i cel de-al doilea nivel din fig.13.15.

204

Figura 13.15: Efectuarea rutrii multicast copiaz de dou ori folosind o reea Benes.
Prima jumtate este o reea Delta i a doua jumtate este o reea Delta oglindit.

Astfel, reducerea problemei la 2x2 comutatoare necesit logN nivele;


deoarece fiecare nivel are N/2 intersecii, reeaua Delta binar are o
complexitate a interseciilor i legturilor de N log N . Evident putem
construi o reea Delta i folosind d x d comutatoare n primul nivel i
mprind apoi reeaua iniial n d reele Delta, fiecare de dimensiune N/d.
Se reduce numrul de nivele la logdN iar complexitatea legturilor la
n*logdN. Avnd n vedere costurile VLSI, e mai ieftin de construit un chip
comutator cu o valoare d ct mai mare, pentru a reduce costul legturilor.
Reeaua Delta, ca i reeaua Banyan i Butterfly, dispune de o
proprietate numit auto-rutare (self-routing). n cazul reelei Delta binare,
se poate gsi calea unic de la o intrare dat la o ieire dat o = o1,o2,...,os ,
exprimat n binar, urmrind legtura corespunztoare valorii oi din
nivelul/stadiul i. Acest lucru reiese clar din fig.13.14, unde folosim MSB
la primul nivel, cel de-al doilea bit la cel de-al doilea nivel, etc. Pentru
d 2, se scrie adresa de ieire ca un numr n baza d i se urmresc digiii
succesivi n aceai manier.
O proprietate interesant a reelei Delta este faptul c este reversibil. Se
poate urmri a cale de la o ieire ctre o intrare, urmrind biii de la intrare
n acelai fel. n fig. 13.14 se poate observa c, mergnd de la ieire spre
intrre, penultimul bit al intrrii selecteaz unul dintre 2 comutatoare din
primul nivel, iar ultimul bit selecteaz intrarea. Proprietatea de
reversibilitate e important pentru c permite utilizarea unei versiuni
oglindite a reelei Delta, cu proprieti similare cu reeaua Delta original.
O problem a reelei Delta o reprezint congestia. Deoarece exist o cale
unic de la fiecare intrare ctre fiecare ieire, reeaua nu este o reea de
permutare. Spre exemplu, dac fiecare pereche succesiv de intrri dorete
s trimit o celul ctre aceai jumtate de ieire, doar jumtate din celule
vor ajunge la al doilea nivel. Dac se repet situaia, doar un sfert din
celule vor ajunge la al treilea nivel, etc. Deci exist combinaii de cereri de
205

ieire pentru care debitul reelei Delta se reduce la o legtur, spre


deosebire de N legturi.
O cale de a face reeaua Delta mai puin susceptibil la congestionare n
cazul permutrilor arbitrare a cererilor de intrare, este adugarea mai
multor ci ntre o intrare i o ieire. Generaliznd ideile discutate la reeua
Clos (fig.13.12), putem construi o reea Benes (fig,13.15), care const din
2 reele de adncime logN: jumtatea din stnga este o reea Delta standard
iar jumtatea din dreapta este o reea Delta inversat prin oglindire. Dac
privim invers la jumtatea din dreapta, mergnd de la ieiri spre stnga
putem observa c conexiunile dintre ultimul nivel i penultimul nivel sunt
identice cu conexiunile dintre primul i cel de-al doilea nivel.
Se poate privi reeaua Benes i recursiv, adugnd la fig.13.14 al treilea
nivel de comutatoare 2 x 2, conectnd acest nivel la cele 2 reele de
dimensiune N/2 din mijloc, n aceai manier n care comutatoarele din
primul nivel sunt conectate la cele 2 reele de dimensiune N/2 (fig.13.16).
Aceast procedur recursiv poate fi folosit pentru a creea direct schema
din fig.13.15, fr a crea 2 reele Delta separate.

Figura 13.16: Construirea recursiv a unei reele Benes

Exist asemnri ntre versiunea recursiv a reelei Benes din fig.13.16


i reeaua Clos din fig.13.12, care pot fi folosite pentru a demonstra faptul
c reeaua Benes poate ruta orice permutare de cereri de ieire, similar cu
proprietatea de rearanjare fr blocare a reelei Clos.
n fiecare din dou iteraii se caut o potrivire perfect a primului i
ultimului etaj din figura 13.16, ca mai nainte, i se alege una din cele
dou comutatoare de pe nivelul mijlociu. Dar algoritmul nu se oprete aici
ci urmrete recursiv acelai algoritm de rutare n reeaua Benes de
dimensiune N/2. Alternativ, ntreg procesul poate fi formulat folosind
metoda edge coloring. Mesajul final este c rutarea permutrilor arbitrare
ntr-o reea Benes este posibil; dar metoda e complex i greu de obinut
ieftin ntr-un interval minim de sosire a pachetului.
La reeaua Clos se putea alege aleator comutatorul din etajul mijlociu; se
poate alege i aici o destinaie aleatoare pentru fiecare celul n prima
jumtate. Apoi n a doua jumtate se poate folosi metoda de rutare Delta
inversat, pentru rutarea de la comutatorul intermediar aleator la
destinaie.
206

Ca i la reelele Clos, se poate arta c dac se folosete un algoritm


aleator, nici o legtur intern nu devine congestionat atta timp ct nici
o intrare sau ieire nu devine congestionat. Intuitiv: jumtatea
responsabil de mprirea ncrcrii preia traficul destinat oricrei ieiri
de la oricare intrare i l distribuie n mod egal spre toate cele N legturi de
ieire ale primei jumti. n a doua jumtate, datorit structurii simetrice,
tot traficul este dirijat spre legtura de ieire destinaie.
De exemplu, considerm c legtura de sus ajunge la primul comutator
de pe etajul final din figura 13.15. Aceast legtur de sus va purta
jumtate din traficul legturii de ieire 1 (deoarece legtura de sus
transport tot traficul destinat ieirii 1 din jumtatea de sus a nodurilor de
intrare i datorit proprietii de mprire a ncrcrii se obine jumtate
din traficul destinat ieirii 1). Tot aa se poate observa c legtura de sus
poart jumtate din traficul destinat ieirii 2, etc.
n timp ce unele dintre aceste proprieti erau cunoscute dinainte, Turner
a extins aceste idei pentru traficul multicast. Problema nu a fost tratat la
ruterele multiasiu bazate pe reeaua Clos. Tratarea multicast este bazat
pe modelul server ca n schema de acordare a unui bilet (take a ticket).
Pentru a extinde ideile de rutare Benes i pentru multicast, Turner a
elaborat o form mai simpl de multicast numit copiaz de dou ori. n
aceast form, fiecare intrare poate specifica dou ieiri. Mai departe este
treaba reelei s trimit dou copii ale celulei de la intrare spre porturile de
ieire specificate. Dac acest lucru este posibil i legturile de ieire pot fi
reciclate spre intrare, atunci cele dou copii create la prima parcurgere pot
fi extinse la 4 copii n parcurgerea a doua i la 2i copii la parcurgerea i prin
reeaua Benes.
Spre exemplu n figura 13.15 se observ faptul c cea de-a cincea intrare
are o celul care este pus n legtur att cu 1000 (adic ieirea 8) ct i
cu 1111 (adic ieirea 15). n prima jumtate, celula este rutat n mod
aleator ctre ieirea 7 a celei de-a doua jumti. n cea de-a doua
jumtate, se urmresc biii ieirii reale, nti MSB, pn se ajunge prima
dat ntr-un loc n care cele dou adrese de ieire difer. Deobicei, dac
bitul curent are valoarea 0 se comut n sus, iar dac are valoarea 1 se
comut n jos. De aceea, la primul nivel al reelei copiate, celula este rutat
spre legtura de jos, pentru c ambele adrese de ieire ncep cu un 1.
Lucrurile se complic la nivelul doi, deoarece la poziia a doua dinspre
dreapta adresele difer. Astfel, comutatorul din nivelul doi (adic
comutatorul al patrulea de la vrf) trimite celulele n dou direcii. Cele
dou ci de ieire s-au desprit la primul bit care difer. Din acest
moment, fiecare dintre cele dou celule urmrete adresa corespunztoare
ieirii sale. n figura 13.15, dac se iau n considerare ultimii 2 bii ai 1000
i 1111, se observ faptul c cele 2 celule ajung la ieirea 8 i 15.
Se poate demonstra c dac copierea se face la nivelul primului bit care
difer, aceasta nu duce la nici o suprancrcare a vreunei legturi interne,
dac legturile de intrare i ieire nu sunt suprancrcate. Rezultatul e
valabil i la reele copy-3 (reea capabil s produc 3 copii la o trecere).
n momentul n care o celul ajunge la un comutator, ea poart un
specificator multicast cu legtura de ieire, care trebuie transformat n 2
sau mai muli specificatori unicast pentru fiecare parcurgere. n mod
similar, fiecare celul trebuie s poarte cu ea 2 sau mai multe adrese pe
207

parcursul drumului. Utilizarea unui numr mic, precum 2 limiteaz


complexitatea operaiei de mapare a porturilor i dimensiunea antetului.
Utilizarea unor numere mai mari va duce la micorarea numrului de
parcurgeri necesare pentru a replica o celul muticast.
O proprietate mbucurtoare a proiectrii multicast a lui Turner este
faptul c fanout-uri cu valori mari, de tip multicast, pot fi prelucrate n mai
multe iteraii. Acest lucru poate fi vizualizat ca un arbore binar multicast,
din cadrul mai multor reele Benes conectate n serie. n realitate, este
refolosit aceai reea Benes, astfel reducnd costul. Imaginea
demonstreaz eficiena adugrii de noi conexiuni multicast. Aceasta
presupune de fapt adugarea unei frunze la arborele existent, cauznd o
perturbare minim la nivelul celorlalte noduri existente ale arborelui i
celorlalte conexiuni.
n consecin, comutatorul Turner tinde s foloseasc resursele n mod
optim datorit reciclrii. Proiectul permite o scalabilitate a resurselor de
N log N , poate trata orice configuraie de trafic unicast i multicast i
poate aduga sau terge un punct terminal dintr-un arbore multicast ntr-un
interval de timp constant. Alte arhitecturi de comutatoare nu ndeplinesc
aceste condiii, iar n practic pot face fa doar la un trafic multicast de
dimensiune limitat. n prezent importana traficului multicast este
limitat, ns avnd n vedere creterea importanei videoconferinelor prin
Internet se poate spune c va exista un viitor, n care comutatoare
multimedia de mari dimensiuni vor avea un rol cheie.
n concluzie trebuie menionat faptul c la fel ca la comutatorul Clos,
simplitatea conceptual a unei strategii de echilibrare aleatoare a
ncrcrii pentru o reea Benes aduce o complexitate de implementare. n
primul rnd, deoarece echilibrarea aleatoare a ncrcrii nu este perfect,
comutatorul Turner necesit buffere i controlul fluxului. n al doilea rnd,
aleatorizarea trebuie facut corect. Primul prototip al comutatorului de la
Universitatea Washington a folosit echilibrarea simpl a ncrcrii, bazat
pe un numrtor, ns atunci cnd a fost reproiectat la compania Growth
Networks, comutatorul a folosit un circuit de aleatorizare mult mai
sofisticat, care s poat rezolva chiar i cele mai patologice modele de
intrare. n final, o resecveniere eficient a celulelor a necesitat un doesebit
efort n aceast arhitectur.

208

S-ar putea să vă placă și