DEV: Jak na zamek na databazi?

Karel Zak zakkr na zf.jcu.cz
Čtvrtek Březen 27 10:19:56 CET 2003


On Wed, Mar 26, 2003 at 03:42:30PM +0000, Miroslav Prymek wrote:
> Dobry den,
> jeste jeden dotaz ohledne programovani serveru.
> V serveru jede pro kazdeho pripojeneho klienta jeden thread (a BLOKUJICI 
> socket), pricemz klienti posilaji pozadavky na zapis/cteni databaze, 
> kterou spravuje server. (Databaze je trosku silne slovo, jde o klasicky 
> obousmerne zretezeny seznam objektu. Nepouzivam zadnou knihovnu - 
> objekty a vsechno,
> co s nimi souvisi jsem implementoval sam).
> 
> PROBLEM: Chtel bych, aby zaroven mohlo libovolne mnozstvi threadu cist
> z databaze. Jestlize chce nektery thread zapisovat, zakaze dalsi cteni,
> pocka az soucasne cteni dobehne a potom zacne psat.
> TEDY CELKEM KLASICKA SITUACE.

 Urcite najdete radu implementaci R/W zamku pro pthreads. Napriklad
 aplikacni server Mape (mape.jcu.cz:-) presne to co potrebujete
 pouziva. Pracuje to naprosto spolehlive. Pokud o to mate zajem tak
 jsem to dal na FTP:
 ftp://ftp2.zf.jcu.cz/users/zakkr/th/thrwlock.tar.gz

 Je to pomerne jednoduche, jsou tam dve urovne. Ta vyssi predpoklada
 pole zamku a na zamky se odvolavate najakym ID ta nizsi pak pracuje
 primo se strukturou zamku. Je to vzdy jeden mutex lock pouzivany na
 strukturu co popisuje pocet threadu ktere ctou nebo cekaji.
 Pochopitelne ty cekajici to pokud jiz mohou zacit cist/zapisovat
 probouzi.

 Pokud chcete co nejvetsi propustnost tak bych pouzival zamky na
 urovni objektu a jeden globalni zamek pro modifikaci toho seznamu. 
 Jeste vetsi propustnosti pak dosahnete pokud nebudete pouzivat
 jednoduchy seznam, ale vetvici se strom kde kazdy uzel ma zamek na
 sva data (objekt) a dalsi zamek na pripadne potomky. Takto je delana
 napriklad cache Mape.

> Myslite, ze by bylo lepsi pouzit server s jednim threadem a
> neblokujicimi sockety (odpoada potreba blokovani databaze)?
> (vykonnost na viceprocesorovem stroji

 Je jeste treti varianta kde pocet thredu <= poctu klientu. To 
 znamena jeden thread muze obsluhovat vice klientu a to tak ze
 existuje nejaky seznam pozadavku plneny podle toho so prichazi 
 po siti -- tento seznam je obsluhovan threadem ktery nic jineho
 nedela. Ostatni thready si z tohoto seznamu "berou praci" vzdy 
 kdyz nemaji co delat nebo pokud spi tak je hlavni thread co obsluhuje
 seznam po pridani pozadavku probouzi. Tato implementace umoznuje i
 plynule prechazet na model, ze thread se venuje jen a pouze jednomu
 klientu - proste klient posle threadu informaci "ted se jiz nekoukej
 do zadneho seznamu pozadavku a jen cti muj socket". Muzete tak vyresit
 potrebu chvilkove narocnosti klienta na odezvu serveru.
 
 To "pocet thredu <= poctu klientu" je velmi efektivni tam kde klient
 ma vetsi prodlevu mezi pozadavky na server -- typicky kdy klienta
 obsluhuje klikajici clovek. Pochopitelne je to trosku vice narocne na
 implementaci ale jde to.

> nehraje roli - takovy stroj nemam a asi nikdy mit nebudu:)
> Spis se me to zda neelegantni z toho duvodu, ze pozadavky,
> posilane serveru maji ruznou, ale PEVNE DANOU delku, takze by
> bylo vhodne je PRECIST JAKO JEDEN BLOK. Jestlize by tedy
> klient z nejakeho duvodu pozdrzel psani uprostred bloku,
> server by zustal stat, coz je nepripustne.

 Pokud mate v serveru uzke hrdlo ktere slehuje pozadavky klientu tak by 
 melo pouze a jen sledovat -- napriklad pomoci select(). Cist data by melo 
 neco co neblokuje ostatni casti serveru, tedy thread.

> P.S. Je tahle konference vubec urcena i pro temata ohledne programovani?
> Nerad bych nejak obtezoval :)

 Jasne, pojdme se radeji bavit o tom jaka distribuce je nejlepsi... jsem
 pro debian :-)
 
    Karel

-- 
 Karel Zak  <zakkr na zf.jcu.cz>
 http://home.zf.jcu.cz/~zakkr/


Další informace o konferenci Linux