GNU/Linux >> Tutoriels Linux >  >> Linux

Quelle est la différence entre l'écriture dans un fichier et une mémoire mappée ?

  1. Une raison peut être que vous avez du code (hérité) configuré pour écrire dans un tampon de données, puis ce tampon est écrit dans un fichier en une seule fois à la fin. Dans ce cas, en utilisant 09 enregistrera au moins une copie des données, car le système d'exploitation peut directement écrire le tampon sur le disque.>19 .

  2. Non, la protection n'est pas pertinente ici, je dirais.

  3. Il peut enregistrer une ou deux copies des données, par exemple. app buffer vers libc buffer vers OS buffer, voir point 1. Cela peut faire une différence de performances lors de l'écriture de grandes quantités de données.

  4. Non. Autant que je sache, le système d'exploitation est libre d'écrire les données à tout moment, tant que les données ont été écrites sur le disque après un appel à 26 ou 30 sur cette région de mémoire. (Et pour la plupart des fichiers, il n'écrira probablement rien entre la plupart du temps, pour des raisons de performances :écrire un bloc entier sur le disque car un octet modifié est plutôt coûteux, en particulier s'il faut s'y attendre que beaucoup plus de modifications au bloc se produiront dans un proche avenir.)


Un fichier mappé en mémoire est en fait partiellement ou entièrement mappé en mémoire (RAM), alors qu'un fichier dans lequel vous écrivez serait écrit en mémoire puis vidé sur le disque. Un fichier mappé en mémoire est extrait du disque et placé explicitement en mémoire pour lecture et/ou écriture. Il y reste jusqu'à ce que vous le démappiez.

L'accès au disque est plus lent, donc lorsque vous avez écrit dans un fichier, il sera vidé sur le disque et ne résidera plus dans la RAM, ce qui signifie que la prochaine fois que vous aurez besoin du fichier, vous l'obtiendrez peut-être du disque ( lent), alors que dans les fichiers mappés en mémoire, vous savez que le fichier est dans la RAM et vous pouvez y accéder plus rapidement que lorsqu'il est sur le disque.

De plus, les fichiers mappés en mémoire sont souvent utilisés comme mécanisme IPC, de sorte que deux processus ou plus peuvent facilement partager le même fichier et y lire/écrire. (en utilisant les mécanismes de synchronisation nécessaires)

Lorsque vous avez souvent besoin de lire un fichier et que ce fichier est assez volumineux, il peut être avantageux de le mapper en mémoire afin d'y accéder plus rapidement, puis d'avoir à l'ouvrir et à le récupérer sur le disque à chaque fois.

MODIF :

Cela dépend sur vos besoins, lorsque vous avez un fichier qui devra être consulté très fréquemment par différents threads, alors je ne suis pas sûr que le mappage mémoire du fichier soit nécessairement une bonne idée, du point de vue que, vous aurez besoin de synchroniser accéder à ce fichier mmapé si vous souhaitez qu'il y écrive, aux mêmes endroits à partir de différents threads. Si cela se produit très souvent, cela pourrait être un point de conflit de ressources.

Il suffit de lire le fichier, alors cela pourrait être une bonne solution, car vous n'avez pas vraiment besoin de synchroniser l'accès, si vous êtes seulement lecture à partir de plusieurs threads. Au moment où vous commencez à écrire, vous devez utiliser des mécanismes de synchronisation.

Je suggère que chaque thread fasse son propre accès au fichier de manière locale, si vous devez écrire dans le fichier, comme vous le faites avec n'importe quel autre fichier. De cette façon, cela réduit le besoin de synchronisation des threads et la probabilité de bogues difficiles à trouver et à déboguer.


1) Vous avez mal compris l'appel système write(2). write() n'écrit pas, il copie simplement le contenu d'un tampon dans la chaîne de tampons du système d'exploitation et le marque comme sale. L'un des threads du système d'exploitation (bdflush IIRC) récupérera ces tampons, les écrira sur le disque et jouera avec certains drapeaux. plus tard.Avec mmap, vous accédez directement au tampon du système d'exploitation (mais si vous modifiez son contenu, il sera également marqué comme sale)

2) Il ne s'agit pas de protection, il s'agit de définir des drapeaux dans les entrées de la table des pages.

3) vous évitez la double mise en mémoire tampon. Vous pouvez également adresser le fichier en termes de caractères au lieu de blocs, ce qui est parfois plus pratique

4) Ce sont les tampons système (accrochés à votre espace d'adressage) que vous avez utilisés. Le système peut ou non en avoir écrit des parties sur le disque.

5) Si les threads appartiennent au même processus et partagent les tables de pages et l'espace d'adressage, oui.


Linux
  1. La différence entre .exrc et .vimrc ?

  2. Quelle est la différence entre la mémoire tampon et la mémoire cache sous Linux ?

  3. Quelle est la différence entre strtok_r et strtok_s en C ?

  4. Quelle est la différence entre `su -` et `su --login` ?

  5. Quelle est la différence entre `fallocate --dig-holes` et `fallocate --punch-hole` sous Linux ?

Quelle est la différence entre InnoDB et MyISAM ?

Quelle est la différence entre Linux et Unix ?

Qu'est-ce qu'un Hyperviseur ? Quelle est la différence entre les types 1 et 2 ?

Quelle est la différence entre curl et Wget ?

Quelle est la différence entre DMA et les E/S mappées en mémoire ?

Quelle est la différence entre unlink et rm ?