Sprog :
SWEWE Medlem :Logon |Registrering
Søg
Encyclopedia samfund |Encyclopedia Svar |Indsend spørgsmål |Ordforråd Viden |Upload viden
Forrige 1 Næste Vælg sider

Hukommelse pool

Grundkoncept

Hukommelse pool (Memory Pool) er en allokering af hukommelse. Normalt vi bruges til direkte at bruge nye, malloc API applikationer såsom hukommelse tildeling, den ulempe, at dette er, at: Da størrelsen på den ønskede hukommelse blok variabel, når hyppig brug vil forårsage en masse hukommelse fragmenter og dermed reducere ydeevnen.

Hukommelse pool er i brug, før den virkelige hukommelse, først ansøge tildelt et bestemt antal af samme størrelse (under normale omstændigheder) hukommelse blok reserveret til fremtidig brug. Når en ny hukommelse krav, når det afgivne del af en blok af hukommelse fra hukommelsen puljen, hvis hukommelsen blok er ikke nok til at fortsætte med at anvende den nye hukommelse. Gør en væsentlig fordel er at undgå hukommelse fragmentering, hvilket gør hukommelse tildeling effektivitet er blevet forbedret.Der er mange steder i tildelingen kernehukommelse er ikke tilladt at fejle. Sikre fordelingen som en måde i disse tilfælde har kerne udviklerne skabt en pulje af hukommelse kaldet (eller "mempool") Abstrakt En rigtig hukommelse pulje at kun en klasse backup cache, der har forsøgt at holde en liste af fri hukommelse til brug i nødsituationer.

En hukommelse pool har en type mempool_t (defineret i <linux/mempool.h> i) Du kan bruge mempool_create oprette en:

mempool_t * mempool_create (int min_nr, mempool_alloc_t * alloc_fn, mempool_free_t * free_fn, void * pool_data). min_nr parameter er genstand for hukommelse pulje skal forblive tilknyttet til det mindste antal af faktiske tildeling og frigivelse objekter håndteres af alloc_fn og free_fn, har de Disse prototyper:

typedef void * (mempool_alloc_t) (int gfp_mask, void * pool_data), typedef void (mempool_free_t) (void * element, void * pool_data), giver mempool_create sidste parameter (pool_data) føres til alloc_fn og free_fn.

Hvis det er nødvendigt, kan du skrive en funktion til at håndtere tildeling mempool specielle formål hukommelse. Men ofte kun du nødt til at gøre kernen slab allokatoren for dig at håndtere denne opgave. Har to funktioner (mempool_alloc_slab og mempool_free_slab) til hukommelse pool allokering Prototype og induktion hærdning mellem kmem_cache_alloc og kmem_cache_free derfor indstille hukommelse pulje kode ofte ser sådan ud:

cache = kmem_cache_create (...) pool = mempool_create (MY_POOL_MINIMUM, mempool_alloc_slab, mempool_free_slab, cache) Når du har oprettet en pulje af hukommelse, der kan tildeles, og frigive objekter, brug:

void * mempool_alloc (mempool_t * pool, int gfp_mask), void mempool_free (void * element mempool_t * pool) Når hukommelsen puljen er oprettet, vil funktionen fordeling kaldes nok gange til at oprette en pulje af forudallokerede objekt, og derfor, ja. mempool_alloc opkaldsforsøg fra anmodningen objekt yderligere tildeling funktion hvis tildelingen mislykkes, objektet en pre-tildelt (hvis nogen resterende) returneres, når et objekt er udgivet af mempool_free, som forbliver i puljen, hvis justeringen forhånd afsat. Antallet af objekter mindre end det minimumsbeløb, ellers er det tilbage til systemet.

En mempool kan re-størrelse, skal du bruge:

int mempool_resize (mempool_t * pool, int new_min_nr, int gfp_mask) Denne indkaldelse, hvis det lykkes, at justere størrelsen af ​​hukommelsen pool har new_min_nr objekter i hvert fald hvis du ikke behøver en hukommelse pulje, vendte tilbage til systemet:

void mempool_destroy (mempool_t * pulje), din skriftligt opgave at returnere alle objekter, før ødelægge mempool, eller vil forårsage en kerne oops.

Hvis du overvejer at bruge din driver en mempool, skal du huske én ting:. Mempools afsætte en blok af hukommelse i en sammenkædet liste over nogen reel brug er nem at bruge tomgang og ubrugelige mempools forbruge en masse hukommelse i næsten alle. Dernæst foretrukne løsning er ikke at bruge mempool og enkel behandling fordelingen i stedet for muligheden for fiasko, og hvis du kører der nogen måde at skade integriteten af ​​systemet er ikke den måde at reagere på en tildeling undlader at gøre det. kørsel kode skal bruge mempools mindre.

Hukommelse pool gennemførelse eksempler

Der er mange hukommelse pulje for at opnå den ydeevne og anvendelighed er ikke det samme, følgende er en forholdsvis simpel C implementering - GenericMP skabelon klasse. (I dette tilfælde baseret på "Online spil server programmering" en bog)

I dette eksempel anvendelse af en skabelon til at imødekomme behovene hos forskellige målgrupper hukommelse, den hukommelse blok af hukommelse pulje listen organiseret baseret på strukturen.

GenericMP skabelon klasse definition

skabelon <class T, int BLOCK_NUM= 50>

klasse GenericMP

{

public:

static void * operatør ny (size_t allocLen)

{

hævde (sizeof (T) == allocLen);

if (! m_NewPointer)

MyAlloc ();

Uchar * rp = m_NewPointer;

m_NewPointer = * reinterpret_cast <UCHAR**> (rp) / / Siden de første fire bytes "tvinges" fortolket som en pointer til den næste hukommelse blok, hvor m_NewPointer ville pege på den næste hukommelse blok, bruge til at forberede sig til næste opgave.

returnere rp;


Forrige 1 Næste Vælg sider
Bruger Anmeldelse
Ingen kommentarer endnu
Jeg ønsker at kommentere [Besøgende (18.209.*.*) | Logon ]

Sprog :
| Tjek kode :


Søg

版权申明 | 隐私权政策 | Copyright @2018 Verden encyklopædiske viden