GNU/Linux >> Znalost Linux >  >> Linux

Je malloc/free syscall nebo knihovní rutina poskytovaná libc?

Velmi často malloc a free používají služby alokace virtuální paměti nižší úrovně a alokují několik stránek (nebo dokonce megabajtů) najednou pomocí systémových volání jako mmap a munmap (a možná sbrk). Často malloc preferuje opětovné použití dříve free d paměťový prostor, pokud je to relevantní. Nejvíce malloc implementace používají různé a různé strategie pro "velké" a "malé" alokace atd...

Všimněte si, že virtuální adresní prostor může být omezen, např. se setrlimit(2). Použijte v Linuxu pmap(1) a proc(5), abyste se dozvěděli více o virtuálním adresovém prostoru nějakého procesu (např. /proc/self/maps pro váš vlastní nebo /proc/1234/maps - také pmap 1234 příkaz - pro proces pid 1234).

Můžete se podívat na zdrojový kód GNU libc, podívat se na zdrojový kód jiných standardních knihoven C (jako je musl-libc), přečíst si o malloc implementace, vyberte nějaké jiné nebo implementujte své vlastní, nebo použijte strace k experimentálnímu zjištění.

Přečtěte si manuálovou stránku syscalls (tj. syscalls(2)) a soubor <asm/unistd.h> pro seznam systémových volání.

velmi rychlý malloc

Pevně ​​věřím, že standard C je velmi vágní ohledně malloc a free . Jsem si docela jistý, že následující funkce respektují literu (ale ne ducha) standardu:

 /* politically incorrect, but very probably standard conforming */
 void *malloc (size_t sz) { if (sz>0) errno = ENOMEM; return NULL; }
 void free(void*ptr) { }

Samozřejmě zadáte kód calloc a realloc podle toho.

GNU libc vám nabízí háčky pro vaše vlastní malloc funkcí (a dokonce byste pravděpodobně mohli transparentně používat Boehm's Garbage Collector). Tyto háčky mohou být zastaralé a jsou nestandardní.

Pokud používáte GNU libc, podívejte se také na mallinfo(3) a malloc_stat(3) a související funkce.


malloc a free jsou standardní funkce knihovny C, které mají být implementovány každou implementací C.

Standard C pouze definuje způsob, jakým se tyto funkce chovají, a chování, které se od nich očekává. Jak mají být implementovány, je ponecháno na každé implementaci.

Stručně řečeno, jsou to implementační detaily implementace, kterou používáte.

("Implementace" se skládá z kompilátoru, linkeru, runtime knihovny a pravděpodobně několika dalších věcí.)


Linux
  1. free:příkaz nenalezen

  2. Co vrátí malloc(0)?

  3. Kód pro malloc a zdarma

  1. Jak zkompilovat vlastní standardní knihovnu glibc C ze zdroje a použít ji?

  2. Kde jsou hlavičky standardní knihovny C++

  3. Vynutit free() pro návrat paměti malloc zpět do operačního systému

  1. Jak zkontrolovat verzi knihovny libc na Debian Linuxu

  2. Použijte knihovnu C ve Swift na Linuxu

  3. Jak nainstalovat manuálové stránky pro funkce standardní knihovny C v Ubuntu?