dans un programme C, il y a [...]
- le segment stack
- le heap (malloc...)
Lorsque le programme est chargé en mémoire, comment windows fait-il pour
savoir quelle est la quantité de mémoire à réserver à la pile (stack) et
au heap ?
dans un programme C, il y a [...]
- le segment stack
- le heap (malloc...)
Lorsque le programme est chargé en mémoire, comment windows fait-il pour
savoir quelle est la quantité de mémoire à réserver à la pile (stack) et
au heap ?
dans un programme C, il y a [...]
- le segment stack
- le heap (malloc...)
Lorsque le programme est chargé en mémoire, comment windows fait-il pour
savoir quelle est la quantité de mémoire à réserver à la pile (stack) et
au heap ?
Papouille wrote on 06/02/2008 23:01:
dans un programme C, il y a [...]
- le segment stack
- le heap (malloc...)
Lorsque le programme est chargé en mémoire, comment windows fait-il
pour savoir quelle est la quantité de mémoire à réserver à la pile
(stack) et au heap ?
la question est propre au format PE des exec. microsoft pas au C.
l'OS le sait car ces infos sont des params transmis au linkeur et donc
présentes dans l'exec.
Sylvain.
Papouille wrote on 06/02/2008 23:01:
dans un programme C, il y a [...]
- le segment stack
- le heap (malloc...)
Lorsque le programme est chargé en mémoire, comment windows fait-il
pour savoir quelle est la quantité de mémoire à réserver à la pile
(stack) et au heap ?
la question est propre au format PE des exec. microsoft pas au C.
l'OS le sait car ces infos sont des params transmis au linkeur et donc
présentes dans l'exec.
Sylvain.
Papouille wrote on 06/02/2008 23:01:
dans un programme C, il y a [...]
- le segment stack
- le heap (malloc...)
Lorsque le programme est chargé en mémoire, comment windows fait-il
pour savoir quelle est la quantité de mémoire à réserver à la pile
(stack) et au heap ?
la question est propre au format PE des exec. microsoft pas au C.
l'OS le sait car ces infos sont des params transmis au linkeur et donc
présentes dans l'exec.
Sylvain.
Bonjour,
dans un programme C, il y a 4 zones d'espace mémoire :
- le segment de code
- le segment de données (variables extern et static)
- le segment stack
- le heap (malloc...)
Lorsque le programme est chargé en mémoire, comment windows fait-il
pour savoir quelle est la quantité de mémoire à réserver à la pile
(stack) et au heap ?
Bonjour,
dans un programme C, il y a 4 zones d'espace mémoire :
- le segment de code
- le segment de données (variables extern et static)
- le segment stack
- le heap (malloc...)
Lorsque le programme est chargé en mémoire, comment windows fait-il
pour savoir quelle est la quantité de mémoire à réserver à la pile
(stack) et au heap ?
Bonjour,
dans un programme C, il y a 4 zones d'espace mémoire :
- le segment de code
- le segment de données (variables extern et static)
- le segment stack
- le heap (malloc...)
Lorsque le programme est chargé en mémoire, comment windows fait-il
pour savoir quelle est la quantité de mémoire à réserver à la pile
(stack) et au heap ?
Sylvain wrote:Papouille wrote on 06/02/2008 23:01:
dans un programme C, il y a [...]
- le segment stack
- le heap (malloc...)
Lorsque le programme est chargé en mémoire, comment windows fait-il
pour savoir quelle est la quantité de mémoire à réserver à la pile
(stack) et au heap ?
la question est propre au format PE des exec. microsoft pas au C.
l'OS le sait car ces infos sont des params transmis au linkeur et donc
présentes dans l'exec.
Sylvain.
La reponse, c'est qu'il n'en sait rien. Et qu'il n'a de toute facon
aucun moyen de le savoir, a moins bien sur que le programmeur le
specifie quelque part ce qui a ma connaissance n'arrive pas.
Sauf erreur de ma part, le tas (heap) est alloue sur demande dans une
zone partage par tous les processes windows. Partant de la, l'OS croise
les doigts pour qu'il n'y ait pas de debordement.
absolument pas, c'était comme ça sous dos mais pas sous un systeme
Sylvain wrote:
Papouille wrote on 06/02/2008 23:01:
dans un programme C, il y a [...]
- le segment stack
- le heap (malloc...)
Lorsque le programme est chargé en mémoire, comment windows fait-il
pour savoir quelle est la quantité de mémoire à réserver à la pile
(stack) et au heap ?
la question est propre au format PE des exec. microsoft pas au C.
l'OS le sait car ces infos sont des params transmis au linkeur et donc
présentes dans l'exec.
Sylvain.
La reponse, c'est qu'il n'en sait rien. Et qu'il n'a de toute facon
aucun moyen de le savoir, a moins bien sur que le programmeur le
specifie quelque part ce qui a ma connaissance n'arrive pas.
Sauf erreur de ma part, le tas (heap) est alloue sur demande dans une
zone partage par tous les processes windows. Partant de la, l'OS croise
les doigts pour qu'il n'y ait pas de debordement.
absolument pas, c'était comme ça sous dos mais pas sous un systeme
Sylvain wrote:Papouille wrote on 06/02/2008 23:01:
dans un programme C, il y a [...]
- le segment stack
- le heap (malloc...)
Lorsque le programme est chargé en mémoire, comment windows fait-il
pour savoir quelle est la quantité de mémoire à réserver à la pile
(stack) et au heap ?
la question est propre au format PE des exec. microsoft pas au C.
l'OS le sait car ces infos sont des params transmis au linkeur et donc
présentes dans l'exec.
Sylvain.
La reponse, c'est qu'il n'en sait rien. Et qu'il n'a de toute facon
aucun moyen de le savoir, a moins bien sur que le programmeur le
specifie quelque part ce qui a ma connaissance n'arrive pas.
Sauf erreur de ma part, le tas (heap) est alloue sur demande dans une
zone partage par tous les processes windows. Partant de la, l'OS croise
les doigts pour qu'il n'y ait pas de debordement.
absolument pas, c'était comme ça sous dos mais pas sous un systeme
Papouille écrivait :dans un programme C, il y a 4 zones d'espace mémoire :
- le segment de code
- le segment de données (variables extern et static)
- le segment stack
- le heap (malloc...)
moi j'ai des programmes C avec nettement plus de sections que ça
Ça dépend de la plateforme, pas du langage.
Lorsque le programme est chargé en mémoire, comment windows fait-il
pour savoir quelle est la quantité de mémoire à réserver à la pile
(stack) et au heap ?
Ça c'est la tambouille de windows, du compilateur, du linker
(dynamique), etc.
Mais surtout pas du C qui ne fait que demander de la
mémoire au système.
Papouille <Papouille@papouille.net> écrivait :
dans un programme C, il y a 4 zones d'espace mémoire :
- le segment de code
- le segment de données (variables extern et static)
- le segment stack
- le heap (malloc...)
moi j'ai des programmes C avec nettement plus de sections que ça
Ça dépend de la plateforme, pas du langage.
Lorsque le programme est chargé en mémoire, comment windows fait-il
pour savoir quelle est la quantité de mémoire à réserver à la pile
(stack) et au heap ?
Ça c'est la tambouille de windows, du compilateur, du linker
(dynamique), etc.
Mais surtout pas du C qui ne fait que demander de la
mémoire au système.
Papouille écrivait :dans un programme C, il y a 4 zones d'espace mémoire :
- le segment de code
- le segment de données (variables extern et static)
- le segment stack
- le heap (malloc...)
moi j'ai des programmes C avec nettement plus de sections que ça
Ça dépend de la plateforme, pas du langage.
Lorsque le programme est chargé en mémoire, comment windows fait-il
pour savoir quelle est la quantité de mémoire à réserver à la pile
(stack) et au heap ?
Ça c'est la tambouille de windows, du compilateur, du linker
(dynamique), etc.
Mais surtout pas du C qui ne fait que demander de la
mémoire au système.
dans un programme C, il y a 4 zones d'espace mémoire :
- le segment de code
- le segment de données (variables extern et static)
- le segment stack
- le heap (malloc...)
Lorsque le programme est chargé en mémoire, comment windows fait-il
pour savoir quelle est la quantité de mémoire à réserver à la pile
(stack) et au heap ?
dans un programme C, il y a 4 zones d'espace mémoire :
- le segment de code
- le segment de données (variables extern et static)
- le segment stack
- le heap (malloc...)
Lorsque le programme est chargé en mémoire, comment windows fait-il
pour savoir quelle est la quantité de mémoire à réserver à la pile
(stack) et au heap ?
dans un programme C, il y a 4 zones d'espace mémoire :
- le segment de code
- le segment de données (variables extern et static)
- le segment stack
- le heap (malloc...)
Lorsque le programme est chargé en mémoire, comment windows fait-il
pour savoir quelle est la quantité de mémoire à réserver à la pile
(stack) et au heap ?
Sylvain wrote:Papouille wrote on 06/02/2008 23:01:
dans un programme C, il y a [...]
- le segment stack
- le heap (malloc...)
Lorsque le programme est chargé en mémoire, comment windows fait-il
pour savoir quelle est la quantité de mémoire à réserver à la pile
(stack) et au heap ?
la question est propre au format PE des exec. microsoft pas au C.
l'OS le sait car ces infos sont des params transmis au linkeur et
donc présentes dans l'exec.
Sylvain.
La reponse, c'est qu'il n'en sait rien. Et qu'il n'a de toute facon
aucun moyen de le savoir, a moins bien sur que le programmeur le
specifie quelque part ce qui a ma connaissance n'arrive pas.
Sauf erreur de ma part, le tas (heap) est alloue sur demande dans une
zone partage par tous les processes windows. Partant de la, l'OS
croise les doigts pour qu'il n'y ait pas de debordement.
absolument pas, c'était comme ça sous dos mais pas sous un systeme
évolué. Lorsqu'un programme fait un malloc(), le malloc regarde le heap
(mémoire allouée dynamiquement) pour voir si il sait caser le morceau
demandé. Autrement, il demande une ou plusieurs pages qui sont placées à
la fin du heap. La pagination permet d'empecher justement qu'un
programme déborde de la page et ecrive dans la memoire d'un autre
processus. Mais l'important est qu'on obtient un espace d'adressage
virtuel contigü.
Sylvain wrote:
Papouille wrote on 06/02/2008 23:01:
dans un programme C, il y a [...]
- le segment stack
- le heap (malloc...)
Lorsque le programme est chargé en mémoire, comment windows fait-il
pour savoir quelle est la quantité de mémoire à réserver à la pile
(stack) et au heap ?
la question est propre au format PE des exec. microsoft pas au C.
l'OS le sait car ces infos sont des params transmis au linkeur et
donc présentes dans l'exec.
Sylvain.
La reponse, c'est qu'il n'en sait rien. Et qu'il n'a de toute facon
aucun moyen de le savoir, a moins bien sur que le programmeur le
specifie quelque part ce qui a ma connaissance n'arrive pas.
Sauf erreur de ma part, le tas (heap) est alloue sur demande dans une
zone partage par tous les processes windows. Partant de la, l'OS
croise les doigts pour qu'il n'y ait pas de debordement.
absolument pas, c'était comme ça sous dos mais pas sous un systeme
évolué. Lorsqu'un programme fait un malloc(), le malloc regarde le heap
(mémoire allouée dynamiquement) pour voir si il sait caser le morceau
demandé. Autrement, il demande une ou plusieurs pages qui sont placées à
la fin du heap. La pagination permet d'empecher justement qu'un
programme déborde de la page et ecrive dans la memoire d'un autre
processus. Mais l'important est qu'on obtient un espace d'adressage
virtuel contigü.
Sylvain wrote:Papouille wrote on 06/02/2008 23:01:
dans un programme C, il y a [...]
- le segment stack
- le heap (malloc...)
Lorsque le programme est chargé en mémoire, comment windows fait-il
pour savoir quelle est la quantité de mémoire à réserver à la pile
(stack) et au heap ?
la question est propre au format PE des exec. microsoft pas au C.
l'OS le sait car ces infos sont des params transmis au linkeur et
donc présentes dans l'exec.
Sylvain.
La reponse, c'est qu'il n'en sait rien. Et qu'il n'a de toute facon
aucun moyen de le savoir, a moins bien sur que le programmeur le
specifie quelque part ce qui a ma connaissance n'arrive pas.
Sauf erreur de ma part, le tas (heap) est alloue sur demande dans une
zone partage par tous les processes windows. Partant de la, l'OS
croise les doigts pour qu'il n'y ait pas de debordement.
absolument pas, c'était comme ça sous dos mais pas sous un systeme
évolué. Lorsqu'un programme fait un malloc(), le malloc regarde le heap
(mémoire allouée dynamiquement) pour voir si il sait caser le morceau
demandé. Autrement, il demande une ou plusieurs pages qui sont placées à
la fin du heap. La pagination permet d'empecher justement qu'un
programme déborde de la page et ecrive dans la memoire d'un autre
processus. Mais l'important est qu'on obtient un espace d'adressage
virtuel contigü.
L'architecture Win32 dit (disait?) que pour la pile, par défaut c'est 1 Mo
(± 8 Ko, je ne sais plus les détails de tête). Si tu fais une allocation
brutale d'un objet automatique plus grand, cela coince.
Certains environnements C (dont celui de Microsoft, si je me souviens bien)
sont spécialement reprogrammés pour s'affranchir de cette limite (si tu
déclares un grand tableau auto, le compilo génère des appels en plus au
système pour éviter le problème). D'autres savent récupérer l'exception et
requalifier la mémoire en « utilisable ». Il y a aussi des options à
l'édition de liens (-stack) qui permette de changer la valeur par défaut.
Bref si tu as des problèmes pratiques, il y a des solutions ad hoc (qui te
seront détaillées le cas échéant sur le groupe adéquat, pas ici merci.)
Il n'y a pas de mémoire réservée pour le tas (j'ai du mal à comprendre la
question, en fait).
Tu as par ailleurs une limite à 2 Go, ampliable globalement à 3Go, pour
l'espace d'adressage, qui est partagé (adressage linéaire).
Et aussi éventuellement des quotas.
Tout ceci est de la mémoire virtuelle, pas grand chose à voir (du moins
directement) avec la mémoire physique (celle qui est écrite sur ton bon de
commande).
Pour Win64, je n'en sais rien (sauf qu'évidemment, il n'y a en pratique pas
de limite de l'espace d'adressage).
L'architecture Win32 dit (disait?) que pour la pile, par défaut c'est 1 Mo
(± 8 Ko, je ne sais plus les détails de tête). Si tu fais une allocation
brutale d'un objet automatique plus grand, cela coince.
Certains environnements C (dont celui de Microsoft, si je me souviens bien)
sont spécialement reprogrammés pour s'affranchir de cette limite (si tu
déclares un grand tableau auto, le compilo génère des appels en plus au
système pour éviter le problème). D'autres savent récupérer l'exception et
requalifier la mémoire en « utilisable ». Il y a aussi des options à
l'édition de liens (-stack) qui permette de changer la valeur par défaut.
Bref si tu as des problèmes pratiques, il y a des solutions ad hoc (qui te
seront détaillées le cas échéant sur le groupe adéquat, pas ici merci.)
Il n'y a pas de mémoire réservée pour le tas (j'ai du mal à comprendre la
question, en fait).
Tu as par ailleurs une limite à 2 Go, ampliable globalement à 3Go, pour
l'espace d'adressage, qui est partagé (adressage linéaire).
Et aussi éventuellement des quotas.
Tout ceci est de la mémoire virtuelle, pas grand chose à voir (du moins
directement) avec la mémoire physique (celle qui est écrite sur ton bon de
commande).
Pour Win64, je n'en sais rien (sauf qu'évidemment, il n'y a en pratique pas
de limite de l'espace d'adressage).
L'architecture Win32 dit (disait?) que pour la pile, par défaut c'est 1 Mo
(± 8 Ko, je ne sais plus les détails de tête). Si tu fais une allocation
brutale d'un objet automatique plus grand, cela coince.
Certains environnements C (dont celui de Microsoft, si je me souviens bien)
sont spécialement reprogrammés pour s'affranchir de cette limite (si tu
déclares un grand tableau auto, le compilo génère des appels en plus au
système pour éviter le problème). D'autres savent récupérer l'exception et
requalifier la mémoire en « utilisable ». Il y a aussi des options à
l'édition de liens (-stack) qui permette de changer la valeur par défaut.
Bref si tu as des problèmes pratiques, il y a des solutions ad hoc (qui te
seront détaillées le cas échéant sur le groupe adéquat, pas ici merci.)
Il n'y a pas de mémoire réservée pour le tas (j'ai du mal à comprendre la
question, en fait).
Tu as par ailleurs une limite à 2 Go, ampliable globalement à 3Go, pour
l'espace d'adressage, qui est partagé (adressage linéaire).
Et aussi éventuellement des quotas.
Tout ceci est de la mémoire virtuelle, pas grand chose à voir (du moins
directement) avec la mémoire physique (celle qui est écrite sur ton bon de
commande).
Pour Win64, je n'en sais rien (sauf qu'évidemment, il n'y a en pratique pas
de limite de l'espace d'adressage).
Il n'y a pas de mémoire réservée pour le tas (j'ai du mal à
comprendre la question, en fait).
Je pense à un process avec son segment de code, de données et sa pile,
avec de la place en plus allouée entre la pile et les données de telle
sorte que la pile peut augmenter ainsi que le nombre de données sans
pour autant forcer le process à se mettre en "attente", swapper sur le
disque dur en attendant que de la place se libère, ou soit tué.
A priori, cette réservation de place se fait en mémoire virtuelle.
Tu as par ailleurs une limite à 2 Go, ampliable globalement à 3Go,
pour l'espace d'adressage, qui est partagé (adressage linéaire).
Et aussi éventuellement des quotas.
L'espace d'adresses virtuelles est sur 32bits, ce qui fait 4Go, non ?
Et cet espace est propre à chaque process qui en dispose à volonté
Pour Win64, je n'en sais rien (sauf qu'évidemment, il n'y a en
pratique pas de limite de l'espace d'adressage).
64 bits d'espace d'adresse ou 64 bits sur le bus de données ?
Il n'y a pas de mémoire réservée pour le tas (j'ai du mal à
comprendre la question, en fait).
Je pense à un process avec son segment de code, de données et sa pile,
avec de la place en plus allouée entre la pile et les données de telle
sorte que la pile peut augmenter ainsi que le nombre de données sans
pour autant forcer le process à se mettre en "attente", swapper sur le
disque dur en attendant que de la place se libère, ou soit tué.
A priori, cette réservation de place se fait en mémoire virtuelle.
Tu as par ailleurs une limite à 2 Go, ampliable globalement à 3Go,
pour l'espace d'adressage, qui est partagé (adressage linéaire).
Et aussi éventuellement des quotas.
L'espace d'adresses virtuelles est sur 32bits, ce qui fait 4Go, non ?
Et cet espace est propre à chaque process qui en dispose à volonté
Pour Win64, je n'en sais rien (sauf qu'évidemment, il n'y a en
pratique pas de limite de l'espace d'adressage).
64 bits d'espace d'adresse ou 64 bits sur le bus de données ?
Il n'y a pas de mémoire réservée pour le tas (j'ai du mal à
comprendre la question, en fait).
Je pense à un process avec son segment de code, de données et sa pile,
avec de la place en plus allouée entre la pile et les données de telle
sorte que la pile peut augmenter ainsi que le nombre de données sans
pour autant forcer le process à se mettre en "attente", swapper sur le
disque dur en attendant que de la place se libère, ou soit tué.
A priori, cette réservation de place se fait en mémoire virtuelle.
Tu as par ailleurs une limite à 2 Go, ampliable globalement à 3Go,
pour l'espace d'adressage, qui est partagé (adressage linéaire).
Et aussi éventuellement des quotas.
L'espace d'adresses virtuelles est sur 32bits, ce qui fait 4Go, non ?
Et cet espace est propre à chaque process qui en dispose à volonté
Pour Win64, je n'en sais rien (sauf qu'évidemment, il n'y a en
pratique pas de limite de l'espace d'adressage).
64 bits d'espace d'adresse ou 64 bits sur le bus de données ?