Question

Y at-il un moyen de remplir la RAM sur une machine linux avec des données aléatoires?

La raison pour laquelle je demande ceci: Je travaille dans un groupe où nous faisons la programmation numérique en Fortran. Parfois, les gens gâcher le travail avec précision reals double, de sorte que les programmes qui devraient donner des résultats en double précision ne donnent qu'une simple précision.

Si je comprends bien, on verrait des fluctuations aléatoires du résultat après la limite de précision unique dans un tel programme. Autrement dit, si vous exécutez le même programme avec la même entrée plusieurs fois, vous obtenez au hasard résultat différent à chaque fois. Ce que vous voyez (la partie aléatoire) dépend des valeurs aléatoires dans la RAM de la machine. Mais dans la pratique, si vous exécutez le programme à plusieurs reprises sur la même machine, les mêmes parties de la mémoire ont tendance à être utilisé à plusieurs reprises, qui ont les mêmes données aléatoires en eux, conduisant la même sortie à chaque fois.

Mon idée est que si vous pouvez remplacer la mémoire avec des données aléatoires, vous verriez effectivement les fluctuations aléatoires de votre sortie du programme. Cela rendrait beaucoup plus facile de trouver ces bogues.

Est-ce détraqué idée, ou sinon, comment puis-je remplir la mémoire? Puis-je conduit / dev / random dans la RAM, ou quelque chose?

Était-ce utile?

La solution

Linux vous fournit /proc/pid/maps et /proc/pid/mem, pour votre propre plaisir. Bien sûr, vous devez être très prudent lors de l'écriture là-bas. De plus, gardez à l'esprit le seul segment de mémoire disponible pour chaque processus est lui-même, de sorte que vous aurez probablement à faire un peu de code et patcher fixation pour arriver là où vous voulez. Bonne chance, de toute façon. :)

modifier. Il est encore assez peu de fois plus compliqué qu'un audit de code - qui a aussi plus de chances de révéler la source réelle du problème

Autres conseils

Votre compréhension est incorrecte. Vous ne pouvez pas remplir la mémoire d'un programme avec des données aléatoires avant qu'elle ne commence à exécuter, et même si vous le pouviez, cela ne résoudrait pas le problème.

Si votre programme Fortran déclare une seule variable à virgule flottante de précision, le compilateur allouer une cellule 32 bits en mémoire pour maintenir la valeur. Chaque fois que votre programme lit la variable, le processeur va chercher une valeur 32 bits de la cellule. Chaque fois que vous attribuez à la variable, le processeur écrire une valeur 32 bits à la cellule. En aucun cas des bits aléatoires « suinter » dans la valeur des cellules avant ou après la cellule.

Alors que l'arithmétique à virgule flottante ne sont pas précis, il est pas non plus au hasard. Si vous calculez 1.0 / 3.0 + 1.0 / 3.0 + 1.0 / 3.0) mille fois, vous obtiendrez chaque 0.99999... et chaque fois.

Le second point est que, lorsque le programme est exécuté sur Linux, toute la mémoire de données est soigneusement préinitialisés à zéro par le système d'exploitation. Ceci est fait pour éviter que votre programme se comporter différemment chaque fois que vous exécutez: ce serait une mauvaise chose. EDIT:. Une autre raison pour laquelle cela est fait est d'éviter les fuites d'informations privées d'un processus à l'autre

(Commenters:. S'il vous plaît noter que j'ai délibérément sur un certain nombre patinais de questions pour simplifier l'explication)

Si vous avez un récent (> = 2.4 il semble) glibc vous pouvez utiliser définir l'environnement MALLOC_PERTURB_ variable pour faire malloc () La mémoire de retour qui est réglé sur une valeur. Voir http://udrepper.livejournal.com/11429.html et à l'intérieur http://people.redhat.com/drepper/defprogramming.pdf

Ensuite, la question est de savoir si votre programme Fortran utilise le malloc glibc (), je suppose que cela dépend du compilateur Fortran.

Je voudrais essayer d'écrire des tests unitaires en utilisant quelque chose comme fUnit pour faire en sorte que les valeurs doubles de précision fonctionnent toujours comme prévu en écrivant des tests qui nécessitent un double résultat de précision dans les cas où un seul résultat de précision est stockée montre souvent.

Par exemple:. Écrire un test qui appelle une fonction avec plusieurs entrées qui devraient générer des sorties doubles de précision et tester que cela fonctionne avec un assert ()

Qu'est-ce que vous voulez atteindre, bien que noble dans l'intention, et il est intéressant conçu, me rappelle du Wile E. Coyote plans pour attraper le Roadrunner, tandis qu'un fusil et une action des tireurs embusqués auraient été la meilleure option.

Si vous avez le problème que vous présentez, cela signifie qu'il ya un problème structurel dans votre code, et vous perdez le contrôle de votre programme. Même si je sais parfaitement comment le logiciel est développé dans le milieu universitaire, et Fortran, se jeter en bas de la falaise juste parce que le reste du monde, il ne pose problème.

Ce que vous devez faire est un audit de votre code. puis battre un étudiant diplômé s'il salit à nouveau.

Je pense que les données aléatoires feraient beaucoup de débogage beaucoup plus difficile. Le caractère aléatoire dans les réponses causées par des valeurs aléatoires dans la mémoire ou d'un bug de calcul? Je thnk fixe et connu valeurs serait mieux.

Du côté FORTRAN, vous dites chiffres « de précision mixtes » sont utilisés de façon interchangeable? Je ne suis pas clair sur le problème réel.

Mais je ne sais pas comment remplir la mémoire libre sous Linux avec quoi que ce soit.

Vous avez demandé de l'aide ito mettre en œuvre votre solution à un problème, étant la mémoire randomisation. Cependant, je pense qu'il est un étrange et peut-être difficile à la solution de débogage.

Il me semble que vous bénéficieriez plus de  - des outils d'analyse de code statique  - tests unitaires spécifiques  - listes de vérification pour la révision du code, en particulier à ce problème Ciblée

Parfois, on peut penser à des solutions encore plus simple; si vous pouvez le faire sans calcul simple précision, vous pouvez empêcher la mise en relation de ces bibliothèques, de sorte que l'erreur apparaîtrait une erreur de lien; au début de votre processus de développement. Bonne chance.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top