[an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]
 
[an error occurred while processing this directive] [an error occurred while processing this directive]
Skåne Sjælland Linux User Group - http://www.sslug.dk Home   Subscribe   Mail Archive   Forum   Calendar   Search
MhonArc Date: [Date Prev] [Date Index] [Date Next]   Thread: [Date Prev] [Thread Index] [Date Next]   MhonArc
 

Re: [PROGRAMMERING] Hvordan ? Et program skal sende beskeder til N andre.



> Hmm, vad står 'E' för?
Expected value - statistisk set.

> bli märkbart. I exemplet på min webbsida skickar jag en 1024 byte stor
> record (struct) 100000 gånger mellan 2 processer, dvs varje process ser
> recorden 50000 gånger. Det tog 20 sekunder på en PII 350 MHz maskin vilket
> ger 100000 * 1024 / 20 = 5120000 bytes/sekund dvs cirka 5 Mb/s. Har du
> större behov än så?
Tak for oplysningerne. Det lyder hurtigt. Måske er det godt nok for
Henrik.

> Det fina med msg-queues är
> Du kan också använda lite finesser
Enig, det er nemt med message queues. Og de er lige akkurat bygget til
formålet - sende messages fra en process til EN anden.

> Shared memory är ungefär lika snabbt
Det forstod jeg så ikke. Jeg troede det burde være hurtigere, siden man kopierer
data 1 gang ind i shm, hvorpå N klienter læser data. Det burde gå
hurtigere end med msq, men efter følgende betragtninger er jeg kommet i tvivl:

shm: 1 kopi til shm + N kopier for modtagerne
msq: N kopier til kernel memory, N kopier for modtagerne

1 + N
-----   ~   1/2  for store N =>  shm burde være knap 2 gange hurtigere.
N + N

I dit eksempel er N=2 => shm kopieringsarbejdet er 3/4 af msq kopieringsarbejdet.
I realiteten skal man selfølgelig være forsigtig, da kopieringsarbejdet
måske udgøre en mindre del, og behandling af data (B) tager længere. I så fald

(Bsender + 1) + N * (1 + Breceiver)      1
----------------------------------- ~  ----------
(Bsender + N) + N * (1 + Breceiver)    1/Brcv + 1

(Hvor Bxx måles i multiplum af kopieringstid)

I theorien ser det altså ud til, at msq er næsten lige så hurtig som
shm, hvis Breceiver er stor og jeg må hermed trække mit argument fra min
forige posting delvist tilbage på grund af realitetsblindhed :-(.
Hvis jeg får tid, hvil jeg prøve begge varianter og måle tiden.
Det skal siges, at jeg går ud fra et system hvor der er mange (20?)
modtagerprocesser per kanal. Dit eksempel med 2 modtagerprocesser svarer
ikke helt til dette scenario.

> semaphor per process. Varje läsare hänger på sin semaphor, och skrivaren
Jeg tror det kan gøres med 2 semaphorer per processgruppe (=datakanal),
#children er antallet af child processer, der lytter på kanalen:

initial sem1 = 0, sem2 = #children;

loop: parent prepare data                      loop: children sem1 down by 1-->block
parent sem1 up by #children      -->           children read data
parent await sem2 = 0-->block
parent sem2 up by #children      <--           children sem2 down by 1, goto loop
parent goto loop

> Men det förutsätter att ingen annan kommer in, och struntar i den globala
> semaphoren, för då är datat i shared mem garanterat korrupt.
Klart - en fordel for msq, hvor dette ikke er et problem.

Summa summarum: Bjørn har fået mig til at tvivle på, at man som regel skal foretrække
shm fremfor msq af hensyn til performance.

Hans-Christian Stadler



 
Home   Subscribe   Mail Archive   Index   Calendar   Search

 
 
Questions about the web-pages to <www_admin>. Last modified 2005-08-10, 22:44 CEST [an error occurred while processing this directive]
This page is maintained by [an error occurred while processing this directive]MHonArc [an error occurred while processing this directive] # [an error occurred while processing this directive] *