L'appel fondamentalement demande à l'OS afin d'allouer plus de mémoire pour l'application par incrémentation de la précédente "pause " valeur" d'un certain montant. Ce montant (le premier paramètre) est la quantité de mémoire de votre application obtient alors une.
Plus rudimentaires malloc implémentations de construire sur les sbrk appel système pour obtenir des blocs de mémoire qu'ils se séparent et la piste. Le mmap fonction est généralement accepté comme un meilleur choix (c'est pourquoi mallocs comme dlmalloc soutenir à la fois avec un #ifdef).
Comme pour le "comment ça marche", un sbrk à sa plus niveau le plus simple, pourrait ressembler à quelque chose comme ceci:
uintptr_t current_break;//Some global variable for your application.//This would probably be properly tracked by the OS for the processvoid*sbrk(intptr_t incr){uintptr_t old_break = current_break;
current_break += incr;return(void*) old_break;}
Les systèmes d'exploitation modernes permettrait de faire beaucoup plus, comme la carte des pages dans l'espace d'adressage et d'ajouter des informations de suivi pour chaque bloc de mémoire alloué.
Notez que les fonctions sont marquées d '"HÉRITAGE" en référence; si vous allez au courant SUS spécification (opengroup.org/onlinepubs/9699919799/toc.htm), ils (brk, sbrk) ne sont pas présents. Bon point à l'aide de ces fonctions risquent de causer des problèmes de portabilité si une mise en œuvre décide de ne pas se soucier de la compatibilité ascendante.
sbrk est assez obsolète, ces jours que vous souhaitez utiliser mmap à la carte quelques pages à partir de /dev/zero. Il n'est certainement pas quelque chose que vous utilisez à la place de malloc et les amis, c'est plus une manière de mise en œuvre de ceux-ci. Aussi, bien sûr, il existe seulement sur posix systèmes d'exploitation qui se soucient de la compatibilité descendante de l'ancien code.
Si vous trouvez Malloc et les Nouvelles trop lourd, vous devriez regarder dans la collecte des ordures à la place... mais attention, il y a un potentiel de performance des coûts, de sorte que vous devez comprendre ce que vous faites.
Vous ne voulez pas utiliser sbrk au lieu de malloc ou free. Il est non portable et est généralement utilisé uniquement par les responsables de l'implémentation de la bibliothèque standard C ou dans les cas où il n'est pas disponible. Il est décrit très bien dans son page de man:
Description
brk() définit la fin de la
segment de données à la valeur spécifiée par
end_data_segment, lorsque cette valeur est
raisonnable, le système n'ont
assez de mémoire et le processus n'est pas
dépasser son maximum, la taille des données (voir
setrlimit(2)).
sbrk() incrémente le programme de données
de l'espace par incrément octets. sbrk() n'est pas
un appel système, c'est juste une bibliothèque C
wrapper. L'appel de sbrk() avec un
incrément de 0 peut être utilisée pour trouver le
emplacement actuel du programme de pause.
Valeur De Retour
En cas de succès, brk() renvoie
zéro, et sbrk() renvoie un pointeur sur
le début de la nouvelle zone. En cas d'erreur,
-1 est renvoyé, et errno ENOMEM.
Enfin,malloc et free ne sont pas lourdes, ils sont la norme d'allouer et de libérer de la mémoire en C. Même si vous voulez mettre en place votre propre allocateur de mémoire, il est donc préférable d'utiliser malloc et free comme la base d'une approche commune consiste à allouer un gros morceau à la fois avec malloc et de fournir de l'allocation de mémoire (c'est ce que suballocators, ou piscines, généralement de mettre en œuvre)
Re l'origine du nom sbrk (ou son cousin brk), il peut avoir quelque chose à voir avec le fait que l'extrémité du segment est marqué par un pointeur connu comme le "break". Le tas commence juste après la BSS segments et les pousse vers la pile.
Vous avez marqués ce C++ alors, pourquoi voudriez-vous utiliser 'lourdes' malloc() plutôt que de nouvelles? Je ne suis pas sûr de ce qui est lourd sur le malloc dans tous les cas; en interne, peut-être, mais pourquoi voudriez-vous? Et si vous avez des soins (pour des raisons de déterminisme par exemple), vous pouvez allouer une grande piscine et de mettre en œuvre votre propre allocateur pour que la piscine. En C++ bien sûr, vous pouvez la surcharge de l'opérateur new pour le faire.
sbrk est utilisé pour coller la bibliothèque C du système sous-jacent système d'exploitation, la gestion de la mémoire. Donc, assurez-OS appels plutôt que d'utiliser sbrk(). Comment il fonctionne, qui est dépendante du système. Si par exemple vous utilisez le Newlib de la bibliothèque C (couramment utilisé sur les "bare-metal" systèmes embarqués avec le compilateur GNU), vous devez mettre en œuvre sbrk vous-même, de sorte que la façon dont il fonctionne dans ces conditions est à vous, tant qu'il réalise son comportement d'étendre le tas ou de l'échec.
Comme vous pouvez le voir sur le lien, il ne fait pas beaucoup et serait extrêmement lourdes à utiliser directement - vous auriez probablement finir en l'enveloppant dans toutes les fonctionnalités que malloc et de nouveaux fournir dans tous les cas.
Cela dépend de ce que tu veux dire par malloc être "Lourd". sbrk est pas utilisé directement plus, à moins que vous êtes à la mise en œuvre de votre propre allocateur de mémoire: c'est à dire, l'opérateur primordial "nouveau". Même alors, je serais probablement utiliser malloc pour me donner mon premier mémoire.
Si vous souhaitez voir comment implémenter la fonction malloc() sur le dessus de sbrk(), découvrez http://web.ics.purdue.edu/~cs354/labs/lab6/ qui est un exercice traverse.
Sur un système moderne, vous ne devriez pas y toucher mais l'interface. Puisque vous êtes à l'appel de malloc et de nouveaux lourd, je soupçonne que vous n'avez pas toute l'expérience nécessaire pour correctement et en toute sécurité utilisation sbrk pour votre code.
Ont un coup d'oeil à le cahier des charges pour brk/sbrk.
L'appel fondamentalement demande à l'OS afin d'allouer plus de mémoire pour l'application par incrémentation de la précédente "pause " valeur" d'un certain montant. Ce montant (le premier paramètre) est la quantité de mémoire de votre application obtient alors une.
Plus rudimentaires malloc implémentations de construire sur les sbrk appel système pour obtenir des blocs de mémoire qu'ils se séparent et la piste. Le mmap fonction est généralement accepté comme un meilleur choix (c'est pourquoi mallocs comme dlmalloc soutenir à la fois avec un #ifdef).
Comme pour le "comment ça marche", un sbrk à sa plus niveau le plus simple, pourrait ressembler à quelque chose comme ceci:
Les systèmes d'exploitation modernes permettrait de faire beaucoup plus, comme la carte des pages dans l'espace d'adressage et d'ajouter des informations de suivi pour chaque bloc de mémoire alloué.
Bon point à l'aide de ces fonctions risquent de causer des problèmes de portabilité si une mise en œuvre décide de ne pas se soucier de la compatibilité ascendante.
OriginalL'auteur Matthew Iselin
sbrk est assez obsolète, ces jours que vous souhaitez utiliser mmap à la carte quelques pages à partir de /dev/zero. Il n'est certainement pas quelque chose que vous utilisez à la place de malloc et les amis, c'est plus une manière de mise en œuvre de ceux-ci. Aussi, bien sûr, il existe seulement sur posix systèmes d'exploitation qui se soucient de la compatibilité descendante de l'ancien code.
Si vous trouvez Malloc et les Nouvelles trop lourd, vous devriez regarder dans la collecte des ordures à la place... mais attention, il y a un potentiel de performance des coûts, de sorte que vous devez comprendre ce que vous faites.
OriginalL'auteur Andrew McGregor
Vous ne voulez pas utiliser
sbrk
au lieu demalloc
oufree
. Il est non portable et est généralement utilisé uniquement par les responsables de l'implémentation de la bibliothèque standard C ou dans les cas où il n'est pas disponible. Il est décrit très bien dans son page de man:Enfin,
malloc
etfree
ne sont pas lourdes, ils sont la norme d'allouer et de libérer de la mémoire en C. Même si vous voulez mettre en place votre propre allocateur de mémoire, il est donc préférable d'utilisermalloc
etfree
comme la base d'une approche commune consiste à allouer un gros morceau à la fois avecmalloc
et de fournir de l'allocation de mémoire (c'est ce que suballocators, ou piscines, généralement de mettre en œuvre)Re l'origine du nom
sbrk
(ou son cousinbrk
), il peut avoir quelque chose à voir avec le fait que l'extrémité du segment est marqué par un pointeur connu comme le "break". Le tas commence juste après la BSS segments et les pousse vers la pile.OriginalL'auteur Eli Bendersky
Vous avez marqués ce C++ alors, pourquoi voudriez-vous utiliser 'lourdes' malloc() plutôt que de nouvelles? Je ne suis pas sûr de ce qui est lourd sur le malloc dans tous les cas; en interne, peut-être, mais pourquoi voudriez-vous? Et si vous avez des soins (pour des raisons de déterminisme par exemple), vous pouvez allouer une grande piscine et de mettre en œuvre votre propre allocateur pour que la piscine. En C++ bien sûr, vous pouvez la surcharge de l'opérateur new pour le faire.
sbrk est utilisé pour coller la bibliothèque C du système sous-jacent système d'exploitation, la gestion de la mémoire. Donc, assurez-OS appels plutôt que d'utiliser sbrk(). Comment il fonctionne, qui est dépendante du système. Si par exemple vous utilisez le Newlib de la bibliothèque C (couramment utilisé sur les "bare-metal" systèmes embarqués avec le compilateur GNU), vous devez mettre en œuvre sbrk vous-même, de sorte que la façon dont il fonctionne dans ces conditions est à vous, tant qu'il réalise son comportement d'étendre le tas ou de l'échec.
Comme vous pouvez le voir sur le lien, il ne fait pas beaucoup et serait extrêmement lourdes à utiliser directement - vous auriez probablement finir en l'enveloppant dans toutes les fonctionnalités que malloc et de nouveaux fournir dans tous les cas.
OriginalL'auteur Clifford
Cela dépend de ce que tu veux dire par malloc être "Lourd". sbrk est pas utilisé directement plus, à moins que vous êtes à la mise en œuvre de votre propre allocateur de mémoire: c'est à dire, l'opérateur primordial "nouveau". Même alors, je serais probablement utiliser malloc pour me donner mon premier mémoire.
Si vous souhaitez voir comment implémenter la fonction malloc() sur le dessus de sbrk(), découvrez http://web.ics.purdue.edu/~cs354/labs/lab6/ qui est un exercice traverse.
Sur un système moderne, vous ne devriez pas y toucher mais l'interface. Puisque vous êtes à l'appel de malloc et de nouveaux lourd, je soupçonne que vous n'avez pas toute l'expérience nécessaire pour correctement et en toute sécurité utilisation sbrk pour votre code.
OriginalL'auteur McPherrinM