2013-03-30 16 views
8

Mam kilka pytań dotyczących buforów i pul pamięci, na które chciałbym odpowiedzieć.Pule pamięci i bufory C++

Powiedz, że mam serwer, wysyłając i otrzymując ~ 50-100 + msg/sekundę. Wszystkie wiadomości mają różne rozmiary. Jak byś postąpił, aby jak najlepiej wykorzystać zarządzanie pamięcią? Mój pierwotny plan był przy stałej wielkości węzłów buforowe i połączyć je, coś takiego:

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

Więc kiedy msg zostanie wysłana, i utworzyć jeden lub więcej buforów w zależności od wielkości i połączyć je ze sobą. W ten sposób nie bałem się fragmentacji w puli to ja. (lub co najmniej co myślę). Ale na małym msg to marnowanie przestrzeni.

Ale czytanie coraz więcej i sprawdzanie kodu w Internecie, wygląda na to, że nikt w ogóle nie stosuje tego podejścia. Jakie byłoby lepsze podejście? Przydzielanie pamięci z puli w zależności od rozmiaru msg?

EDYTOWANIE: Więc po co tu jest może bardziej indept porównanie różnych podejść.

Jeśli użyję podejścia z łańcuchem buforowym, zgaduję, że zachowam fragmentację na najniższym poziomie, ale z drugiej strony przypuszczam, że robienie memcpy dla każdego bufora w łańcuchu również wiąże się z kosztem. Ale znowu przydzielanie wystarczająco dużego bufora i robienie pojedynczego memcpy również musi mieć swoje wady, mimo że większość ludzi wybiera to podejście.

+0

Twój pomysł jest dobry. Trzeba tylko [rozszerzyć] (http://en.wikipedia.org/wiki/Buddy_memory_allocation). Twoje wymagania wydają się być [ogólną alokacją] (http://g.oswego.edu/dl/html/malloc.html). A może przydzielić alokatora [SLAB] (http://en.wikipedia.org/wiki/Slab_allocation), jeśli potrzebujesz pamięci do zainicjowania? –

+0

To nie jest zbyt popularne, ponieważ Linux i BSD mają już całkiem dobre alokatory. Windows domyślny alokator jest dość straszny, ale od MSVC2010 wysyła całkiem niezły jako część CRT współbieżności. Zauważ, że wspomniany schemat jest raczej tym, którego Linux i BSD używają wewnętrznie dla gniazd. –

+0

Ale dlaczego nie jest popularny? bo trudniej to wdrożyć? czy dlatego, że nie robisz tego tak często? Byłoby miło dowiedzieć się dokładniej, dlaczego jedna metoda jest preferowana od drugiej. – user2010820

Odpowiedz

1

Co powiecie na posiadanie pojedynczego bufora, np. 0,5/1MB. To oczywiście zależy od docelowego systemu operacyjnego/urządzenia i ewentualnie maksymalnego rozmiaru wiadomości. Również twój serwer powinien uwzględniać rozmiar pakietu. Zakładając, że Twój pakiet nie przekracza rozmiaru pojedynczego bufora, możesz pobrać dane do bufora, przetworzyć je, a następnie oznaczyć pamięć jako dostępną. Używałem tego podejścia do pojedynczych aplikacji klient-serwer.