Question

Systèmes d'exploitation lus à partir du disque plus que ce programme demande effectivement, parce qu'un programme est susceptible d'avoir besoin à proximité des informations à l'avenir. Dans ma demande, quand je vais chercher un élément à partir du disque, je voudrais montrer un intervalle d'information autour de l'élément. Il y a un compromis entre la quantité d'informations que je demande et montrer, et la vitesse. Cependant, étant donné que le système d'exploitation lit déjà plus que ce que j'ai demandé, l'accès à ces octets déjà en mémoire est libre. Que puis-je utiliser l'API pour savoir ce qui est dans les caches OS?

Sinon, je pourrais utiliser des fichiers de mémoire mappées. Dans ce cas, le problème se réduit à savoir si une page est permuté sur le disque ou non. Cela peut-il être fait dans un système d'exploitation commun?

EDIT: document connexe http://www.azulsystems.com/events/mspc_2008 /2008_MSPC.pdf

Était-ce utile?

La solution

Vous pouvez en effet utiliser votre deuxième méthode, au moins sur Linux. mmap() le fichier, puis utilisez la fonction mincore() pour déterminer quelles pages sont résidents. De la page man:

  

int mincore(void *addr, size_t length, unsigned char *vec);

     

mincore() renvoie un vecteur qui   indique si les pages de l'appel   la mémoire virtuelle de processus résident   dans le noyau (RAM), et ainsi de ne pas causer de   l'accès au disque (défaut de page) si   référencé. Le noyau renvoie   renseignements sur la résidence sur le   pages à partir de la addr d'adresses,   et continue des octets de length.

Il y a bien sûr une condition de course ici - mincore() peut vous dire qu'une page est résidente, mais il pourrait alors être échangé juste avant d'y accéder. C'est la vie .

Autres conseils

Vous débutez d'une présomption erronée. Au moins sur Linux, le système d'exploitation va essayer de comprendre les modèles d'accès du programme. Si vous lisez un fichier séquentiel, le noyau prefetch séquentiellement. Si vous sautez dans le fichier beaucoup, le noyau sera probablement confus au début, mais il arrêtera préchargement.

Donc, si vous avez réellement sont accéder à votre fichier séquentiel, vous savez ce qui est probablement prélecture: le prochain bloc de données. Si vous cherchez au hasard, sans doute rien d'autre à proximité est prélecture.

Essayez d'aborder cette manière différente. Avant d'appeler lecture () pour obtenir les informations que vous besoin , appel fadvise () pour laisser le système d'exploitation savoir ce que vous voulez pour commencer le chargement ..

Je suis aussi curieux de savoir quel type d'application que vous utilisez qui peut fonctionner correctement que par l'exploitation des données qui se trouve à être dans le cache de fichiers par hasard. Je me sens comme nous avons pu trouver une bonne façon de répondre à vos besoins si vous avez publié un peu plus d'informations.

Il ne peut certainement pas être fait sur Windows. Sur les fenêtres de lecture comportement avant est à l'OS, et même si elle pourrait vous dire combien il avait lu avant, il ne serait pas vous faire du bien parce que dès que vous le découvriez, la dans les pages de mémoire qui sont utilisé pour la mise en cache aurait pu être remis en état pour une autre utilisation.

La même chose vaut pour déterminer si une page est résident ou non. Dès que vous avez trouvé la réponse pourrait changer quand un autre thread a besoin de la mémoire pour autre chose.

Si vous voulez vraiment faire amincit genre de chose sous Windows, vous pouvez désactiver mise en mémoire tampon et de gérer les tampons vous-même. Ceci est le plus rapide chemin IO, mais il est aussi le plus complexe -. Il faut être très prudent, et souvent le système d'exploitation peut encore faire mieux

  

Qu'est-ce que l'API puis-je utiliser pour savoir ce qui est dans les caches OS?

Il n'y a certainement pas de manière standard de le faire pour tout système POSIX, et je ne connais aucun moyen non standard spécifique à Linux. La seule chose que vous pouvez savoir (presque) sûr est que le système de fichiers aura lu dans un multiple de la taille de la page, habituellement 4Ko. Donc, si votre lit sont petites, vous pouvez savoir avec une forte probabilité (mais pas sûr) que les données sur la page environnante est en mémoire.

Vous pouvez, je suppose, faire des choses tricksy comme le moment combien de temps il a fallu un système de lecture pour terminer. S'il est rapide, c'est-100s de microsecondes ou moins, ce fut probablement un coup de cache. Une fois qu'il se lève à une milliseconde ou alors, il était probablement un manque de cache. Bien sûr, cela ne fait pas vous aider beaucoup, et il est très très fragile.

S'il vous plaît noter que, une fois le système de fichiers a copié les données à des tampons d'utilisateurs, il est libre de jeter immédiatement les tampons contenant les données à partir du disque. Il probablement ne le fait pas tout de suite, mais vous ne pouvez pas dire à coup sûr.

Enfin, je @ deuxième suggestion de Karmastan: expliquer la fin plus large que vous essayez d'atteindre. Il y a probablement une façon de le faire, mais celui que vous avez dit est pas.

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