Je voudrais comprendre pourquoi une allocation d'un tableau (su'il soit
a une dimension ou deux) provoque une faute de segmentation dès que je
dépasse une certaine taille (pas réellement astronomique a vrai dire)...
Voici le code qui bugge :
// sur machine1 : 1400 ok, 1500 erreur segmentation
// si on commente la ligne gris[5]=6;, OK tout le temps...
// sur machine2 : 1600 ok, 1700 erreur segmentation
// si on commente la ligne gris[5]=6;, OK tout le temps...
const int MAXI = 1600;
int main()
{
int gris[MAXI*MAXI]; // c'est pareil avec [MAXI][MAXI]
Quelqu'un aurait-il une piste ?
Je voudrais comprendre pourquoi une allocation d'un tableau (su'il soit
a une dimension ou deux) provoque une faute de segmentation dès que je
dépasse une certaine taille (pas réellement astronomique a vrai dire)...
Voici le code qui bugge :
// sur machine1 : 1400 ok, 1500 erreur segmentation
// si on commente la ligne gris[5]=6;, OK tout le temps...
// sur machine2 : 1600 ok, 1700 erreur segmentation
// si on commente la ligne gris[5]=6;, OK tout le temps...
const int MAXI = 1600;
int main()
{
int gris[MAXI*MAXI]; // c'est pareil avec [MAXI][MAXI]
Quelqu'un aurait-il une piste ?
Je voudrais comprendre pourquoi une allocation d'un tableau (su'il soit
a une dimension ou deux) provoque une faute de segmentation dès que je
dépasse une certaine taille (pas réellement astronomique a vrai dire)...
Voici le code qui bugge :
// sur machine1 : 1400 ok, 1500 erreur segmentation
// si on commente la ligne gris[5]=6;, OK tout le temps...
// sur machine2 : 1600 ok, 1700 erreur segmentation
// si on commente la ligne gris[5]=6;, OK tout le temps...
const int MAXI = 1600;
int main()
{
int gris[MAXI*MAXI]; // c'est pareil avec [MAXI][MAXI]
Quelqu'un aurait-il une piste ?
In article <crger4$sr5$, Fanny Chevalier
wrote:
Je voudrais comprendre pourquoi une allocation d'un tableau
(su'il soit a une dimension ou deux) provoque une faute de
segmentation dès que je dépasse une certaine taille (pas
réellement astronomique a vrai dire)...
Voici le code qui bugge :
// sur machine1 : 1400 ok, 1500 erreur segmentation
// si on commente la ligne gris[5]=6;, OK tout le temps...
// sur machine2 : 1600 ok, 1700 erreur segmentation
// si on commente la ligne gris[5]=6;, OK tout le temps...
const int MAXI = 1600;
int main()
{
int gris[MAXI*MAXI]; // c'est pareil avec [MAXI][MAXI]
Tu crées un tableau de 2560000 int, soit, en supposant des int à 4
octets, environ 10Mo.
Sans être énorme, en effet, ton OS peut être configuré pour refuser
d'allouer 10Mo dans l'espace d'allocation des variables automatiques
(souvent la pile).
In article <crger4$sr5$1@news.u-bordeaux.fr>, Fanny Chevalier
wrote:
Je voudrais comprendre pourquoi une allocation d'un tableau
(su'il soit a une dimension ou deux) provoque une faute de
segmentation dès que je dépasse une certaine taille (pas
réellement astronomique a vrai dire)...
Voici le code qui bugge :
// sur machine1 : 1400 ok, 1500 erreur segmentation
// si on commente la ligne gris[5]=6;, OK tout le temps...
// sur machine2 : 1600 ok, 1700 erreur segmentation
// si on commente la ligne gris[5]=6;, OK tout le temps...
const int MAXI = 1600;
int main()
{
int gris[MAXI*MAXI]; // c'est pareil avec [MAXI][MAXI]
Tu crées un tableau de 2560000 int, soit, en supposant des int à 4
octets, environ 10Mo.
Sans être énorme, en effet, ton OS peut être configuré pour refuser
d'allouer 10Mo dans l'espace d'allocation des variables automatiques
(souvent la pile).
In article <crger4$sr5$, Fanny Chevalier
wrote:
Je voudrais comprendre pourquoi une allocation d'un tableau
(su'il soit a une dimension ou deux) provoque une faute de
segmentation dès que je dépasse une certaine taille (pas
réellement astronomique a vrai dire)...
Voici le code qui bugge :
// sur machine1 : 1400 ok, 1500 erreur segmentation
// si on commente la ligne gris[5]=6;, OK tout le temps...
// sur machine2 : 1600 ok, 1700 erreur segmentation
// si on commente la ligne gris[5]=6;, OK tout le temps...
const int MAXI = 1600;
int main()
{
int gris[MAXI*MAXI]; // c'est pareil avec [MAXI][MAXI]
Tu crées un tableau de 2560000 int, soit, en supposant des int à 4
octets, environ 10Mo.
Sans être énorme, en effet, ton OS peut être configuré pour refuser
d'allouer 10Mo dans l'espace d'allocation des variables automatiques
(souvent la pile).
J'entends ça souvent dernièrement. Quels sont ces OS ? Je ne
l'ai pas essayé récemment, mais j'ai déjà alloué des tableaux de
plus d'un Go sous Solaris (sur Sparc). (Je sais que HP/UX avait
des limites assez bas, mais il n'y a pas de raison sur un Sparc
ou un Intel de ne pas permettre pratiquement tout l'espace
adressable dans un processus mono-thread.)
Sous Windows : la taille maximale de la pile est fixée à l'édition de lien
J'entends ça souvent dernièrement. Quels sont ces OS ? Je ne
l'ai pas essayé récemment, mais j'ai déjà alloué des tableaux de
plus d'un Go sous Solaris (sur Sparc). (Je sais que HP/UX avait
des limites assez bas, mais il n'y a pas de raison sur un Sparc
ou un Intel de ne pas permettre pratiquement tout l'espace
adressable dans un processus mono-thread.)
Sous Windows : la taille maximale de la pile est fixée à l'édition de lien
J'entends ça souvent dernièrement. Quels sont ces OS ? Je ne
l'ai pas essayé récemment, mais j'ai déjà alloué des tableaux de
plus d'un Go sous Solaris (sur Sparc). (Je sais que HP/UX avait
des limites assez bas, mais il n'y a pas de raison sur un Sparc
ou un Intel de ne pas permettre pratiquement tout l'espace
adressable dans un processus mono-thread.)
Sous Windows : la taille maximale de la pile est fixée à l'édition de lien
Marc Boyer wrote:In article <crger4$sr5$, Fanny Chevalier
wrote:Je voudrais comprendre pourquoi une allocation d'un tableau
(su'il soit a une dimension ou deux) provoque une faute de
segmentation dès que je dépasse une certaine taille (pas
réellement astronomique a vrai dire)...
Voici le code qui bugge :
// sur machine1 : 1400 ok, 1500 erreur segmentation
// si on commente la ligne gris[5]=6;, OK tout le temps...
// sur machine2 : 1600 ok, 1700 erreur segmentation
// si on commente la ligne gris[5]=6;, OK tout le temps...
const int MAXI = 1600;
int main()
{
int gris[MAXI*MAXI]; // c'est pareil avec [MAXI][MAXI]
Tu crées un tableau de 2560000 int, soit, en supposant des int à 4
octets, environ 10Mo.
Sans être énorme, en effet, ton OS peut être configuré pour refuser
d'allouer 10Mo dans l'espace d'allocation des variables automatiques
(souvent la pile).
J'entends ça souvent dernièrement. Quels sont ces OS ? Je ne
l'ai pas essayé récemment, mais j'ai déjà alloué des tableaux de
plus d'un Go sous Solaris (sur Sparc).
(Je sais que HP/UX avait des limites assez bas, mais il n'y a pas de
raison sur un Sparc ou un Intel de ne pas permettre pratiquement
tout l'espace adressable dans un processus mono-thread.)
Marc Boyer wrote:
In article <crger4$sr5$1@news.u-bordeaux.fr>, Fanny Chevalier
wrote:
Je voudrais comprendre pourquoi une allocation d'un tableau
(su'il soit a une dimension ou deux) provoque une faute de
segmentation dès que je dépasse une certaine taille (pas
réellement astronomique a vrai dire)...
Voici le code qui bugge :
// sur machine1 : 1400 ok, 1500 erreur segmentation
// si on commente la ligne gris[5]=6;, OK tout le temps...
// sur machine2 : 1600 ok, 1700 erreur segmentation
// si on commente la ligne gris[5]=6;, OK tout le temps...
const int MAXI = 1600;
int main()
{
int gris[MAXI*MAXI]; // c'est pareil avec [MAXI][MAXI]
Tu crées un tableau de 2560000 int, soit, en supposant des int à 4
octets, environ 10Mo.
Sans être énorme, en effet, ton OS peut être configuré pour refuser
d'allouer 10Mo dans l'espace d'allocation des variables automatiques
(souvent la pile).
J'entends ça souvent dernièrement. Quels sont ces OS ? Je ne
l'ai pas essayé récemment, mais j'ai déjà alloué des tableaux de
plus d'un Go sous Solaris (sur Sparc).
(Je sais que HP/UX avait des limites assez bas, mais il n'y a pas de
raison sur un Sparc ou un Intel de ne pas permettre pratiquement
tout l'espace adressable dans un processus mono-thread.)
Marc Boyer wrote:In article <crger4$sr5$, Fanny Chevalier
wrote:Je voudrais comprendre pourquoi une allocation d'un tableau
(su'il soit a une dimension ou deux) provoque une faute de
segmentation dès que je dépasse une certaine taille (pas
réellement astronomique a vrai dire)...
Voici le code qui bugge :
// sur machine1 : 1400 ok, 1500 erreur segmentation
// si on commente la ligne gris[5]=6;, OK tout le temps...
// sur machine2 : 1600 ok, 1700 erreur segmentation
// si on commente la ligne gris[5]=6;, OK tout le temps...
const int MAXI = 1600;
int main()
{
int gris[MAXI*MAXI]; // c'est pareil avec [MAXI][MAXI]
Tu crées un tableau de 2560000 int, soit, en supposant des int à 4
octets, environ 10Mo.
Sans être énorme, en effet, ton OS peut être configuré pour refuser
d'allouer 10Mo dans l'espace d'allocation des variables automatiques
(souvent la pile).
J'entends ça souvent dernièrement. Quels sont ces OS ? Je ne
l'ai pas essayé récemment, mais j'ai déjà alloué des tableaux de
plus d'un Go sous Solaris (sur Sparc).
(Je sais que HP/UX avait des limites assez bas, mais il n'y a pas de
raison sur un Sparc ou un Intel de ne pas permettre pratiquement
tout l'espace adressable dans un processus mono-thread.)
James Kanze wrote:
J'entends ça souvent dernièrement. Quels sont ces OS ? Je ne
l'ai pas essayé récemment, mais j'ai déjà alloué des tableaux de
plus d'un Go sous Solaris (sur Sparc). (Je sais que HP/UX avait
des limites assez bas, mais il n'y a pas de raison sur un Sparc
ou un Intel de ne pas permettre pratiquement tout l'espace
adressable dans un processus mono-thread.)
Sous Windows : la taille maximale de la pile est fixée à l'édition de lien
pour le thread principal, et par programmation lors du démarrage des threads
secondaires. Avec les outils courants, la valeur par défaut est de 1 MO pour
la pile du thread principal.
Je pense que sur les processeur Intel, c'est lié à la pile qui grossit "vers
le bas".
James Kanze wrote:
J'entends ça souvent dernièrement. Quels sont ces OS ? Je ne
l'ai pas essayé récemment, mais j'ai déjà alloué des tableaux de
plus d'un Go sous Solaris (sur Sparc). (Je sais que HP/UX avait
des limites assez bas, mais il n'y a pas de raison sur un Sparc
ou un Intel de ne pas permettre pratiquement tout l'espace
adressable dans un processus mono-thread.)
Sous Windows : la taille maximale de la pile est fixée à l'édition de lien
pour le thread principal, et par programmation lors du démarrage des threads
secondaires. Avec les outils courants, la valeur par défaut est de 1 MO pour
la pile du thread principal.
Je pense que sur les processeur Intel, c'est lié à la pile qui grossit "vers
le bas".
James Kanze wrote:
J'entends ça souvent dernièrement. Quels sont ces OS ? Je ne
l'ai pas essayé récemment, mais j'ai déjà alloué des tableaux de
plus d'un Go sous Solaris (sur Sparc). (Je sais que HP/UX avait
des limites assez bas, mais il n'y a pas de raison sur un Sparc
ou un Intel de ne pas permettre pratiquement tout l'espace
adressable dans un processus mono-thread.)
Sous Windows : la taille maximale de la pile est fixée à l'édition de lien
pour le thread principal, et par programmation lors du démarrage des threads
secondaires. Avec les outils courants, la valeur par défaut est de 1 MO pour
la pile du thread principal.
Je pense que sur les processeur Intel, c'est lié à la pile qui grossit "vers
le bas".
- l'espace (virtuel) pour la pile est reserve (au moins
sous Solaris) et entre en conflit avec les allocations
dynamiques. Permettre des grosses piles limite donc la
place disponible pour le reste
Est-ce que le système alloue ulimit -s sur la pile dès le
démarrage du programme ?
Est-ce que le système en alloue l'espace d'adressage dans le
processus selon ulimit -s ? Là, aussi, j'ai mes doutes, parce qu'il
y a toujours le problème si ulimit -s est illimité.
- l'espace (virtuel) pour la pile est reserve (au moins
sous Solaris) et entre en conflit avec les allocations
dynamiques. Permettre des grosses piles limite donc la
place disponible pour le reste
Est-ce que le système alloue ulimit -s sur la pile dès le
démarrage du programme ?
Est-ce que le système en alloue l'espace d'adressage dans le
processus selon ulimit -s ? Là, aussi, j'ai mes doutes, parce qu'il
y a toujours le problème si ulimit -s est illimité.
- l'espace (virtuel) pour la pile est reserve (au moins
sous Solaris) et entre en conflit avec les allocations
dynamiques. Permettre des grosses piles limite donc la
place disponible pour le reste
Est-ce que le système alloue ulimit -s sur la pile dès le
démarrage du programme ?
Est-ce que le système en alloue l'espace d'adressage dans le
processus selon ulimit -s ? Là, aussi, j'ai mes doutes, parce qu'il
y a toujours le problème si ulimit -s est illimité.
Jean-Marc Bourguet wrote:writes:- l'espace (virtuel) pour la pile est reserve (au moins
sous Solaris) et entre en conflit avec les
allocations dynamiques. Permettre des grosses piles
limite donc la place disponible pour le reste
Est-ce que le système alloue ulimit -s sur la pile dès le
démarrage du programme ?
Non.Est-ce que le système en alloue l'espace d'adressage dans le
processus selon ulimit -s ? Là, aussi, j'ai mes doutes,
parce qu'il y a toujours le problème si ulimit -s est
illimité.
De memoire, en variant ulimit -s, la somme de cette limite et
de ce que j'etais capable d'allouer avec malloc etait a peut
pres une constante et ne pas mettre de limite pour -s etait
equivalent a en mettre une a 2GB. On avait des donnees sur
lesquels on s'arraitait par manque de memoire avec un ulimit
-s unlimited et pas avec ulimit -s 8192.
Ce serait facile de refaire un petit programme qui fait des
malloc jusqu'a ce qu'ils echouent et de le lancer avec
differentes valeur de ulimit -s.
Pas si facile que ça. D'abord il faut avoir une machine avec
assez de mémoire:-).
Jean-Marc Bourguet wrote:
kanze@gabi-soft.fr writes:
- l'espace (virtuel) pour la pile est reserve (au moins
sous Solaris) et entre en conflit avec les
allocations dynamiques. Permettre des grosses piles
limite donc la place disponible pour le reste
Est-ce que le système alloue ulimit -s sur la pile dès le
démarrage du programme ?
Non.
Est-ce que le système en alloue l'espace d'adressage dans le
processus selon ulimit -s ? Là, aussi, j'ai mes doutes,
parce qu'il y a toujours le problème si ulimit -s est
illimité.
De memoire, en variant ulimit -s, la somme de cette limite et
de ce que j'etais capable d'allouer avec malloc etait a peut
pres une constante et ne pas mettre de limite pour -s etait
equivalent a en mettre une a 2GB. On avait des donnees sur
lesquels on s'arraitait par manque de memoire avec un ulimit
-s unlimited et pas avec ulimit -s 8192.
Ce serait facile de refaire un petit programme qui fait des
malloc jusqu'a ce qu'ils echouent et de le lancer avec
differentes valeur de ulimit -s.
Pas si facile que ça. D'abord il faut avoir une machine avec
assez de mémoire:-).
Jean-Marc Bourguet wrote:writes:- l'espace (virtuel) pour la pile est reserve (au moins
sous Solaris) et entre en conflit avec les
allocations dynamiques. Permettre des grosses piles
limite donc la place disponible pour le reste
Est-ce que le système alloue ulimit -s sur la pile dès le
démarrage du programme ?
Non.Est-ce que le système en alloue l'espace d'adressage dans le
processus selon ulimit -s ? Là, aussi, j'ai mes doutes,
parce qu'il y a toujours le problème si ulimit -s est
illimité.
De memoire, en variant ulimit -s, la somme de cette limite et
de ce que j'etais capable d'allouer avec malloc etait a peut
pres une constante et ne pas mettre de limite pour -s etait
equivalent a en mettre une a 2GB. On avait des donnees sur
lesquels on s'arraitait par manque de memoire avec un ulimit
-s unlimited et pas avec ulimit -s 8192.
Ce serait facile de refaire un petit programme qui fait des
malloc jusqu'a ce qu'ils echouent et de le lancer avec
differentes valeur de ulimit -s.
Pas si facile que ça. D'abord il faut avoir une machine avec
assez de mémoire:-).