2013-05-20 3 views
1

Je vais écrire une application qui nécessite beaucoup de mémoire de manière dynamique. La majeure partie de la mémoire est utilisée à des fins de mise en cache et est simplement utilisée pour les accélérations. Ces pièces pourraient effectivement être libérées à la demande.Allocation de mémoire dynamique/Utilisation de la mémoire inutilisée

Malheureusement, mon noyau va tuer le processus s'il manque de mémoire. Mais il pourrait simplement libérer de la mémoire. Donc, ce que je veux est très similaire à la cache de pages Linux comme il est expliqué here. Est-il possible d'implémenter un tel comportement dans l'espace utilisateur de manière pratique?

Je pense à implémenter un tel cache avec des "fichiers de cache" qui sont stockés sur un ramfs/tmpfs avec un IO de fichier mappé en mémoire, mais je suis sûr qu'il y a un moyen plus confortable.

Merci d'avance!

+0

que diriez-vous malloc échoue, vous libérez de la mémoire? Si vous manquez de mémoire tout en allouant un nouveau cadre de pile, il n'y a pas grand-chose que vous puissiez faire ... –

+0

Vous pouvez aller à l'approche des fichiers comme vous l'avez mentionné peut également considérer les fichiers bitmap.Autre, vous pouvez utiliser le pool de mémoire option où vous pouvez allouer de la mémoire une fois et utiliser la mémoire du pool et redonner de la mémoire au pool lorsque cela n'est pas nécessaire. –

+0

@GradyPlayer: Ensuite, je serais obligé de tout moment pour reconnaître le manque de mémoire. En plus de cela, mon processus pourrait encore être tué. – rralf

Répondre

0

Oui, cela devrait être possible. La plupart des noyaux ont une méthode d'allocation de mémoire où le processus dort jusqu'à ce qu'il obtienne la mémoire demandée. (tous les noyaux ive ont travaillé avec). Si le vôtre n'est pas un bon moment pour en mettre un en place. Vous pouvez vérifier les fonctions de kmem dans Linux. Cependant, c'est une façon passive de faire ce que vous avez demandé. Le processus attendra que quelqu'un d'autre libère de la mémoire. Si vous voulez libérer de la mémoire de votre propre espace d'adressage de processus lorsqu'il n'y a pas de mémoire, cela peut être fait facilement à partir de l'espace utilisateur. Vous devez conserver un journal de la mémoire allouée et libérer ceux dont vous n'avez pas besoin à la demande en cas d'échec d'allocation.

+0

Hmm, mais je ne veux pas toucher mon noyau (j'utilise Linux). Je veux tout faire dans l'espace utilisateur. – rralf