[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.



Hans-Christian Stadler wrote:

>> Även om det skall göras i c/c++ är det ett enkelt, säkert,och snabbt
>> förfarande
> Jeg kan huske, at vi havde en tråd, hvor jeg lavede et eksempel på brug af
> message queues i C/C++. Problemet med message queues er dog så vidt jeg
> har forstået det, at en message bliver fjernet fra køen ved læsning
> (Gælder vist både for SysV og POSIX realtidskøer). Dvs. vil man sende en
> message til N processer, så skal man sende selve beskeden N gange. Det er
> jo i orden, hvis
> 
> N * E(len(besked)) * E(antal beskeder/tidsenhed) = E(bandbredde)
> 

Hmm, vad står 'E' för?

> ikke er for stor. Til simpel signalering kan det godt bruges. Til
> udvæksling af datapakker - måske.
> 

Du skall skicka stora meddelande till många processer för att det skall 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å?

(Den ena processen låg och väntade på att ett meddelande skulle komma in,
fick medddelandet, packade upp det, ökade på en räknare och skickade
tillbaka det till avsändaren för att sedan vänta igen. Sändaren gjorde
samma sak, fast skickade givetvis det första meddelandet först.)

> Hans-Christian Stadler
> 
> PS: Ok, i formlen skal len(besked) vist være statistisk uafhængig af
> antal beskeder/tidsenhed for at man kan regne expected bandbredde ud
> på den måde.


Det fina med msg-queues är att du behöver inte ha en fix längd på dina
meddelande, är din struct 10 bytes, så skickar du bara 10 bytes + lite
overhead, som är fast (jag tror overhead ligger i storleksordningen 10
bytes (max).

Du kan också använda lite finesser med msg-queues, som att sätta prioritet
på meddelanden, eller om du bara har en kö, men många läsare, så kan 
en viss läsare tex bara läsa vissa meddelanden.

Shared memory är ungefär lika snabbt, men du får fixa synkronisering själv.
Tex 1 semaphor för att få tillgång till minnesarean, och en semaphor per
process. Varje läsare hänger på sin semaphor, och skrivaren tar den globala
semaphoren ,skriver i en läsares del av shared mem, väcker läsaren, som
försöker ta den globala semaphoren, och slutligen släpper den globala
semaphoren så att den nyväckta läsaren får tillgång till shared mem.

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.

Med msg queues slipper du allt besvär. Håll bara reda på vilken msgqueue som
är associerad med vilken process, tex med ftok och en given fil.


/Björn


 


 
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] *