Komunikace mezi pthread vlakny

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Sobota Duben 5 14:07:03 CEST 2003


On Mon, 31 Mar 2003, Stanislav Meduna wrote:

> Pozor, pipe v Linuxe na madzithreadovu komunikaciu nie je
> bohvieco. Problem je v tom, ze neprazdna pipa nikdy nie je
> selektovatelna pre zapis.  Dovodom je, ze ma iba jednu stranku
> miesta a zapisovatelna pipa musi garantovat, ze sa aspon
> PIPE_BUF moze zapisat (a PIPE_BUF je jedna stranka).
> 
> Vysledkom je, ze ak si signalizujete medzi threadmi
> cez pipu, tak sa writer nepohne, kym reader vsetko
> neprecita - context switch thrashing ako vysity.

To leda pokud writer provadi aktivni cekani. Pokud visi v select(),
poll() (a ceka na zapisovatelnost), nebo primo ve write(), tak jaksi
schazi duvod provadet context switche.

Vypada, ze zde je (a nebo aspon nekdy v historii Linuxu byl) jisty problem
spis v implementaci select()/poll() (a vlastne i write() na rouru), ktera
vesele budila cekajici procesy, bez ohledu na to, na co cekaji (s tim, ze
ty, co cekaly na neco jineho, pak zase samy sebe jeste v kernelspacu
uspi). Cili pokud reader cetl vstup po malych kouscich, tak pro kazdy
precteny kousek vzbudil mimochodem writera. Takze to pak tak trochu
aktivni cekani je. (Na druhou stranu, program, ktery chce fungovat aspon
trochu efektivne, by se asi mel cteni a zapisu malych kousku vyhybat.)

Mala velikost rouroveho bufferu muze maximalne zvysit pravdepodobnost
vzniku takoveho scenare, pripadne to vylepsit o nejaky zajimavy deadlock,
pokud je ten program dostatecne blbe napsany.

> Pred vyse tromi rokmi som to hlasil na l-k aj s quick&dirty
> patchom (vtedy proti 2.3.33), ale bolo mi odpovedane, ze sa
> to mieni riesit inak (cielom bol zerocopy model). [...]

To by mne zajimalo, jak chteli udelat zero-copy, kdyz se to aspon musi
zkopirovat z adresoveho prostoru writera do adresoveho prostoru
readera. :)

--Pavel Kankovsky aka Peak  [ Boycott Microsoft--http://www.vcnet.com/bms ]
"Resistance is futile. Open your source code and prepare for assimilation."



Další informace o konferenci Linux