2013-03-30 17 views
8

Ho alcune domande su buffer e pool di memoria a cui vorrei avere risposta.Pool di memoria e buffer C++

Dire che ho un server, l'invio e la ricezione ~ 50-100 + msg/secondo. Tutti i messaggi sono disponibili in varie dimensioni. Come lo faresti per sfruttare al meglio la gestione della memoria qui? Il mio piano originale è stato fissato utilizzando nodi di buffer di dimensioni, e li piscina, qualcosa come:

struct buffer{ 
    uint8_t data[512]; 
    uint32_t end; 
    buffer* next; 
} 
buffer* b = pool_get_new_buffer(); 

Così, quando un msg viene inviato, creo uno o più buffer a seconda delle dimensioni e collegarli insieme. In questo modo non ho paura della frammentazione nel pool stesso. (o questo è ciò che penso). Ma su un piccolo msg, è uno spreco di spazio.

Ma leggendo sempre di più e verificando il codice su Internet, sembra che nessuno utilizzi affatto questo approccio. Quindi quale sarebbe un approccio migliore? Allocazione della memoria dal pool in base alla dimensione del messaggio?

MODIFICA: Quindi quello che ho dopo è forse un confronto più induttivo dei diversi approcci.

Se utilizzo l'approccio basato sul buffer concatenato, manterrò la frammentazione al minimo, ma d'altra parte suppongo che fare memoria per ogni buffer della catena abbia anche un costo. Ma poi di nuovo, allocare un buffer abbastanza grande e fare una sola memcpy deve avere i suoi lati negativi, anche se la maggior parte delle persone sceglie comunque questo approccio.

+0

La tua idea è buona. Devi solo [estenderlo] (http://en.wikipedia.org/wiki/Buddy_memory_allocation). Le tue esigenze sembrano un [allocatore generale] (http://g.oswego.edu/dl/html/malloc.html). O forse un allocatore [SLAB] (http://en.wikipedia.org/wiki/Slab_allocation) se hai bisogno di inizializzare la memoria? –

+0

Non è troppo popolare dato che Linux e BSD hanno già degli ottimi allocatori. L'allocatore predefinito di Windows è piuttosto terribile, ma poiché MSVC2010 ne spedisce uno piuttosto buono come parte del CRT della concorrenza. Nota che lo schema che hai menzionato è praticamente quello che Linux e BSD usano internamente per i socket. –

+0

Ma perché non è popolare? perché è più difficile da implementare? o perché non guadagni tanto nel farlo in questo modo? Sarebbe bello sapere più specificamente perché un metodo è preferito rispetto all'altro. – user2010820

risposta

1

Come avere un singolo buffer, ad esempio 0,5/1 MB di dimensioni. Ciò dipende ovviamente dal sistema operativo/dispositivo di destinazione e probabilmente dalla dimensione massima del messaggio. Inoltre, fare in modo che il server includa le dimensioni del pacchetto. Supponendo che il tuo pacchetto non superi la dimensione del buffer singolo, puoi scaricare i dati nel buffer, elaborarlo e quindi contrassegnare la memoria come disponibile. Ho usato questo approccio per singole applicazioni client-server.

Problemi correlati