In Windows, nelle versioni recenti di MSVC, malloc (e C++ new
, poiché è implementato utilizzando gli stessi fondamenti per l'effettiva parte di allocazione della memoria di new
) chiama HeapAlloc()
. In altre versioni, come g++ mingw, il runtime C è una versione precedente, che non chiama così direttamente HeapAlloc
, ma alla base va ancora a HeapAlloc
- per trovare qualcosa di diverso, dobbiamo tornare a Windows precedente al 95, che aveva un GlobalAlloc
e LocalAlloc
insieme di funzioni, ma non credo che le persone usino compilatori a 16 bit di questi tempi, almeno non per la programmazione Windows.
In Linux, se stai usando glibc
, dipende dalla dimensione dell'allocazione se chiama sbrk
o mmap
- mmap
(con MAP_ANONYMOUS
nei flag) viene utilizzato per allocazioni maggiori (oltre una soglia, che credo sia di 2 MB nell'implementazione tipica)
malloc() e gli amici sono considerati parte del sistema di runtime fornito con un compilatore. Quindi ogni compilatore può utilizzare e utilizza diverse chiamate del sistema operativo per implementare malloc.
Come altri hanno già detto, su Linux le opzioni sono sbrk() e mmap().
Su Windows le opzioni sono HeapAlloc() e VirtualAlloc().
La mia domanda è:come viene implementato malloc nei seguenti sistemi operativi?
Su Linux ci sono due famosi malloc
implementazioni:
dlmalloc (il malloc di Doug Lea)
ptmalloc
Su Linux libc come glibc, eglibc o newlib implementano ptmalloc o una variante di ptmalloc.
quali sono le funzioni specifiche del sistema operativo chiamate/implementazioni di malloc()?
Sui sistemi Unix e Linux sbrk
e mmap
vengono utilizzate le chiamate di sistema. Vedi man 2 sbrk
e man 2 mmap
per ulteriori informazioni.
Va bene, non sono sicuro di Linux, ma quando si tratta di Windows...
La memoria può essere allocata in due posizioni categorizzate.
1) Heap (heap di processo, heap creati su misura) vedi -> http://msdn.microsoft.com/en-us/library/windows/desktop/aa366711(v=vs.85).aspx utilizzando funzioni come HeapAlloc e HeapFree. LocalAlloc e LocalFree possono essere utilizzati come "scorciatoie" per HeapAlloc quando si desidera eseguire l'allocazione nell'heap del processo predefinito.
2) Memoria virtuale (di solito solo specifica del processo a causa delle restrizioni di accesso alla memoria virtuale globale per motivi di sicurezza), utilizzando VirtualAlloc, VirtualFree. vedi -> http://msdn.microsoft.com/en-us/library/windows/desktop/aa366916(v=vs.85).aspx
Per quanto ne so, malloc utilizzerà le funzioni di allocazione dell'heap su Windows.
Spero che questo aiuti.