2013-08-03 16 views
7

Recentemente ho visto il seguente post:Quali sono le chiamate di sistema/sistema operativo nativo di Windows e Linux eseguite da malloc()?

un allocatore di memoria non è di livello inferiore a malloc. (L'allocatore predefinito chiama in genere malloc direttamente o indirettamente)

Un allocatore consente solo di specificare diverse strategie di allocazione . Ad esempio, è possibile utilizzare un allocatore che chiama malloc una volta per recuperare un ampio pool di memoria e quindi per le successive richieste di allocazione , restituisce solo una piccola porzione di questo pool.

Oppure è possibile utilizzarlo come un gancio per consentire di eseguire alcune attività aggiuntive ogni volta che la memoria viene allocata o liberata.

Per quanto riguarda la seconda domanda, malloc è il più basso possibile senza perdita di portabilità. malloc viene in genere implementato utilizzando alcune funzione di allocazione di memoria specifica del sistema operativo, in modo che il livello inferiore sia ancora . Ma questo non è correlato alla tua domanda principale, dal momento che gli allocatori C++ sono un'astrazione di livello superiore.

da: C++: Memory allocators

La mia domanda è-come è malloc implementato nei seguenti sistemi operativi?

  • per Windows
  • per Linux

quali sono le funzioni specifiche del sistema operativo che sono chiamati/implementazioni di malloc()?

+0

per Linux, è 'sbrk' –

+0

Per quale implementazione della libreria standard? 'new' /' malloc' non è necessariamente parte dell'OS API stessa, ad es. su Windows, che ha solo 'HeapAlloc',' VirtualAlloc' ecc. come parte della sua API. – dyp

+0

No, 'sbrk' è quasi obsoleto su Linux, sta usando' mmap' –

risposta

8

In Windows, nelle versioni recenti di MSVC, malloc (e C++ new, poiché viene implementato utilizzando gli stessi fondamentali per la parte di allocazione di memoria effettiva di new) chiama HeapAlloc(). In altre versioni, come g ++ mingw, il runtime C è una versione precedente, che non chiama abbastanza direttamente a HeapAlloc, ma alla base di esso, va comunque a HeapAlloc - per trovare qualcosa di diverso, dobbiamo andare Torna a Windows pre-95, che aveva un set di funzioni GlobalAlloc e LocalAlloc - ma non credo che la gente usi i compilatori a 16 bit al giorno d'oggi - almeno non per la programmazione Windows.

In Linux, se si sta utilizzando glibc, dipende dalle dimensioni della dotazione se si chiama sbrk o mmap - mmap (con MAP_ANONYMOUS nelle bandiere) viene utilizzato per le allocazioni più grandi (più di una soglia, che credo sia 2 MB nell'implementazione tipica)

+0

"In Windows, nelle versioni recenti" -> Tutte le implementazioni delle Librerie standard (di C e C++) per Windows lo usano? (So ​​che MSVC lo fa) – dyp

+0

Dal momento che G ++ (mingw - non so come funziona Cygwin) usa MSVC (anche se una versione precedente, che potrebbe non essere mappata direttamente con HeapAlloc), sì. Non sono a conoscenza di alcuna libreria C o C++ che usi qualcosa di diverso da HeapAlloc per ottenere effettivamente un pezzo di memoria da Windows - a meno che non torniamo così indietro da usare 'LocalAlloc' e' GlobalAlloc', ma poi stiamo parlando Finestre a 16 bit. –

+0

Il nostro progetto utilizza ptmalloc() e dlmalloc() con MSVC su Windows che emulano sbrk() usando VirtualAlloc(). –

4

La mia domanda è- come si implementa malloc nei seguenti sistemi operativi?

Su Linux ci sono due famosi malloc implementazioni:

dlmalloc (malloc di Doug Lea)

ptmalloc

Su libc Linux come glibc, EGLIBC o newlib implementare ptmalloc o una variante di ptmalloc .

quali sono le funzioni specifiche del sistema operativo chiamate/implementazioni di malloc()?

Su sistemi Unix e Linux sbrk e mmap vengono utilizzate le chiamate di sistema. Vedere man 2 sbrk e man 2 mmap per ulteriori informazioni.

+1

'mmap' è più usato che' sbrk' che è obsoleto (cioè non è multithread friendly). –

+0

@BasileStarynkevitch ha aggiunto il puntatore a 'mmap' – ouah

1

Va bene, io non sono sicuro di Linux, ma quando si tratta di finestre ...

memoria può essere allocata in due punti classificati.

1) Heaps (Process Heap, personalizzata creata Heaps) See ->http://msdn.microsoft.com/en-us/library/windows/desktop/aa366711(v=vs.85).aspx utilizzando funzioni come HeapAlloc & HeapFree. LocalAlloc e LocalFree possono essere utilizzati come "scorciatoie" per HeapAlloc quando si desidera allocare nell'heap del processo predefinito.

2) Memoria virtuale (di solito solo specifica del processo a causa delle restrizioni di accesso nella memoria virtuale globale per la sicurezza), utilizzando VirtualAlloc, VirtualFree. vedi ->http://msdn.microsoft.com/en-us/library/windows/desktop/aa366916(v=vs.85).aspx

A mia conoscenza, malloc utilizzerà le funzioni di allocazione dell'heap su Windows.

Spero che questo aiuti.

+0

" Le funzioni globali e locali sono supportate per il porting da codice a 16 bit "[da qui] (http://msdn.microsoft.com/en-us/library/aa366596%28v = vs.85% 29.aspx) -> non utilizzare 'LocalAlloc' – dyp

+0

La memoria allocata con le funzioni' Heap * 'è anche" locale "nel processo. IMO, la tua risposta suggerisce che un mucchio e una memoria virtuale sono due cose indipendenti, che non sono. Un heap utilizza la "memoria virtuale", cioè lo spazio degli indirizzi virtuali e la memoria fisica. Così fanno le funzioni 'Virtual *', non si occupano solo dello spazio degli indirizzi virtuali. – dyp

+0

@DyP Il primo commento è corretto: non usare più 'LocalAlloc', è una traccia di Windows a 16 bit. Usa sempre 'HeapAlloc'. Ma la seconda parte non è * esattamente * corretta. Confusamente, anche in Win32, l'heap locale e globale sono due cose leggermente diverse.La memoria allocata da una non può essere liberata dall'altra. Quindi, anche se hai ragione a dire che sono semanticamente simili e entrambi "locali" al processo, non sono identici. –

1

malloc() e gli amici sono considerati parte del sistema di runtime fornito con un compilatore. Quindi ogni compilatore può utilizzare e fa chiamate OS differenti per implementare malloc.

Come altri hanno già detto, su Linux le opzioni sono sbrk() e mmap().

Su Windows le opzioni sono HeapAlloc() e VirtualAlloc().

Problemi correlati