Visszavonul az M:N threading

Címkék

Győzött az egyszerűbb, a FreeBSD fejleszői ágából Jeff Roberson ma eltávolította az M:N threadkezelési megoldás kernel oldali részét.

A FreeBSD-ben az első pthreads implementáció 12 éve jelent meg a libc_r formájában. A megvalósítás ún. 1:N típusú volt, azaz tisztán a userspace-ben futott. Ez a megoldás egészen a 4-es szériáig tartotta magát (amelyben a kernel még teljesen a Big Giant Lock (BGL) alatt futott, azaz a kernelben magában egyetlen szál működhetett csak, így többprocesszoros környezetben a kernel szűk keresztmetszetté válhatott).
A libc_r mellett rendelkezésre állt a linuxthreads is, külön telepíthető port formájában. Ez utóbbi sokaknak segített a kezdeti, jellemzően futtatni kívánt threades alkalmazások (pld. MySQL) gyorsításában, azonban egyértelmű volt, hogy nem ez az út a követendő (a Linuxban ezt a megoldást az NPTL (1:1) váltotta, ill. emellett a 2.4-es szériához az IBM által fejlesztett NGPT (M:N) is elérhető volt).

Az 5-ös verzióban a finomabb szabályozást lehetővé tévő alacsonyabb szintű lockolás megjelenésével a kernel egyes részei kikerültek a BGL alól, illetve elkezdett testet ölteni a Kernel Scheduled Entities (KSE), amely a Scheduler Activations elképzelés mintájára készült.
A KSE projekt nagyban hozzájárult ahhoz, hogy a FreeBSD-ben használható és modern threadkezelés legyen, mert bár sokan szidták a viszonylagos bonyolultsága miatt, mégiscsak ez segített valamelyest visszaszerezni a FreeBSD elvesztett teljesítményét a versenytársakkal szemben.
A KSE az 5.3-as verziótól fogva alapértelmezett threading libraryje az OS-nek, az NGPT-hez hasonlóan ez is M:N rendszerű.

A KSE sajnos sosem tudott igazán kifejlődni, így mellette 2003-ban megjelent az 1:1-es megoldást alkalmazó libthr is, amely idővel gyorsabbnak és könnyebben karbantarthatónak bizonyult. Ennek köszönhetően a 7-es verzió már ezt tartalmazza alapból, a 8-as pedig a fentiek tanúbizonysága szerint már csak a libthr-rel kerül kiadásra.

A KSE kapcsán anno sokat kritizálták a FreeBSD-t, hiszen a Sun abban az időben váltott a Solarisban az M:N megközelítésről az 1:1-re, illetve a KSE-vel kapcsolatos munkák sok más feladatot késleltettek, maga a projekt pedig isten igazából sosem fejeződött be.
Részben ennek a projektnek köszönhető a perforce repository is, amelyben a CVS helyett mostanában tartják a kísérleti kódot és ahonnan csak már megfelelő érettségi szint elérése után kerülhet át az elsődleges kódbázisba az újdonság.

Akárhogy is, érdekes kísérlet volt, amely bár elbukott, végső soron csak jobbá lett általa a rendszer...

A háromfajta megközelítésről (1:N, 1:1, M:N) itt és itt olvasható pár gondolat.

Hozzászólások

Szép cikk, bra. Ilyenkor irigyellek, mármint, ami az informatikai tudásod/látásmódod illeti. Egyszer szívesen söröznék veled. (Kár, hogy van egy rezignált oldalad is. No, majd, ha egyszer sörözünk valaha, akkor elbeszélgetünk róla.)

Suspend/Resume
– POSIX: Take effect on the all threads in a process.
– Linux: Only take effect on the task the signal was delivered to.

Hátőő, nem éppen:

http://pastebin.ca/940754

clone(child_stack=0x41001250, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x410019e0, tls=0x41001950, child_tidptr=0x410019e0)

Linux kernelbe sok minden ugy van osszerakva, hogy viselkedesre POSIX-nak tunjon, megha belul maskep is mukodik. pl. getpid sem a pid -et adja vissza hanem group leader pid -jet, igy ugy tunik mintha ugyan ahhoz proceszhez tartozna minden szal. (tid a pid valojaban :))
(a teljes) POSIX viselkedes egy a lehetseges viselkedesek kozzul.

A szoveg kornyezet nem a library -re hanem magara a kernelre vonatkozott.

Ez az erdekes a kiserleti kodokban (meg ugy altalaban), nagy reszeben kiderul rola, h nem jo, de megis rengeteget tanul belole az ember.

---
pontscho / fresh!mindworkz