Cette question me mystifie depuis des années et, compte tenu du nom de ce site, c'est ici qu'il faut la poser.
Pourquoi nous, les programmeurs, avons encore cette StackOverflow
problème ?
Pourquoi, dans tous les principaux langages, la mémoire de la pile de threads doit-elle être allouée statiquement à la création du thread ?
Je vais parler dans le contexte de C#/Java, parce que je les utilise le plus, mais c'est probablement un problème plus large.
Une taille de pile fixe entraîne d'énormes problèmes :
- Il est impossible d'écrire un algorithme récursif à moins d'être absolument sûr que la profondeur de la récursion est minuscule. La complexité mémoire linéaire de l'algorithme récursif est souvent inacceptable.
- Il n'y a pas de moyen bon marché de commencer de nouveaux fils de discussion. Vous devez allouer un énorme bloc de mémoire pour la pile afin de tenir compte de toutes les utilisations possibles du fil.
- Même si vous n'utilisez pas de récursion très profonde, vous risquez toujours de manquer d'espace dans la pile, car la taille de la pile est un nombre fixe arbitraire. Considérant que le StackOverflow est généralement irrécupérable, c'est un gros problème à mes yeux.
Maintenant, si la pile était redimensionnée dynamiquement, tous les problèmes ci-dessus seraient grandement atténués, car le débordement de la pile ne serait possible que lorsqu'il y a un débordement de mémoire.
Mais ce n'est pas encore le cas. Pourquoi ? Les processeurs modernes présentent-ils des limitations fondamentales qui rendraient la chose impossible ou inefficace ? Si vous pensez à l'impact sur les performances que les réallocations imposeraient, cela devrait être acceptable car les gens utilisent des structures telles que ArrayList
tout le temps sans souffrir beaucoup.
Donc, la question est, est-ce que je rate quelque chose et la StackOverflow n'est pas un problème, ou bien j'ai raté quelque chose et il y a beaucoup de langages avec une pile dynamique, ou bien il y a une raison importante pour que cela soit impossible/difficile à mettre en œuvre ?
Edit : Certaines personnes ont dit que la performance serait un gros problème, mais considérez ceci :
- Nous laissons le code compilé intact. L'accès à la pile reste le même, donc les performances du "cas habituel" restent les mêmes.
- Nous gérons l'exception CPU qui se produit lorsque le code tente d'accéder à la mémoire non allouée et lançons notre routine de "réallocation". Les réallocations ne seront pas fréquentes car <mettez votre argument habituel ArrayList ici>. Cela devrait fonctionner sur la plupart des CPU en mode protégé sans perte de performance. Non ?