Partage
  • Partager sur Facebook
  • Partager sur Twitter

Fonctionnement d'une mémoire tampon

Sujet résolu
Anonyme
    27 février 2018 à 21:46:02

    "Malheureusement, oui, le PDF est payant (j'avoue ne pas y avoir fait attention, désoler)."

    Ok c'étais pour être sur :)

    "Mais normalement, si je m'y tiens aux descriptions du PDF, je t'ai déjà donné pas mal d'informations via ce poste"

    Ok

    "N'oublie pas que je t'ai aussi donné un autre lien, vers une source Microsoft. Il est tout aussi bien je pense."

    Oui tqt :)

    Une petite question :Il y a qu'une seul table des pages pour l'ensemble des programmes ayant une mémoire virtuelle ou c'est par programme ?

    • Partager sur Facebook
    • Partager sur Twitter
      28 février 2018 à 17:27:03

      Franchement, je ne suis pas sûr de la réponse que je vais te donner, mais selon moi (et de ce que j'ai pu lire, notamment via la source Microsoft), il y a plusieurs pages accessibles pour tous les programmes, et allouée selon la mémoire qu'ils utilisent. C'est-à-dire que ces mêmes pages seraient "partitionnées" en fonction du mode d'exécution du software (qui une sorte "d'émulation", mais je ne vais pas rentrer dans les détailles).

      Ce schéma pourrait peut-être me donner raison :

      • Partager sur Facebook
      • Partager sur Twitter

      Le meilleur moyen de prédire l'avenir, c'est de l'inventer | N'oubliez pas [résolu] et +1 | Excusez mon ôrtograffe, j'essaie de l'améliorer...

      Anonyme
        10 mars 2018 à 1:14:35

        salut j’espère que ça sera pas trop long à lire :) 

        La mémoire Virtuelle est un fichier sur le disque dur appelé PageFile.sys dans la racine C qui peut d'ailleurs être augmenter 

        voici un lien qui pourrait servir à ceux qui le désire : https://www.astuces-pratiques.fr/informatique/gerer-la-memoire-virtuelle-pour-optimiser-windows-7

        ce fichier est structurer par l'OS de la même manière qu'il la fait pour la RAM c'est à dire même taille des pages même structure , le plus souvent par pagination(la taille d'une page fait le plus souvent 4KO , Virtuelle et physique). l'adresse d'une page dans ce fichier est appelé adresse logique ou adresse virtuelle . un emplacement de RAM est réserver c'est à dire que cet emplacement correspond à une adresse logique qui est placer dans une table des pages créer par l'os associer au programme et une table des pages est propre à son programme , et cette table des pages peut être stocker n'importe ou dans la RAM, l'OS ou un registre (je sais plus) garde l'emplacement des table des pages des différents programmes. l’ors-que que le programme désire d'utiliser des données dans la mémoire virtuelle un mécanisme de traduction est effectuer grâce au MMU qui se sert de la table des pages du programme qui garde la correspondance des adresses logiques vers les adresses physiques réserver. puis l'os déplace les données de(s) l'emplacement(s) virtuelle(s) désirer vers (les) (l')emplacement(s) de la RAM qui a été réserver. ceci s'appel le Swap ou Swapping (je sais plus) Vas et viens ex: DD-->RAM , RAM-->DD . je précise que seul la page d'une mémoire virtuelle est virtuelle car l'offset lui que ce soit dans la mémoire virtuelle ou physique correspond belle est bien à l'offset physique et n'a pas besoin d’être traduit ni d’être placer dans la Table des pages associer au programme

        La mémoire virtuelle est utiliser quand la RAM n'a suffisamment plus de place pour y mettre des données

        Bref il y encore plein de choses à expliquer ,les erreurs si une adresse virtuelle correspond à un emplacements de la RAM qui est déjà occupé , le registre PTBR, la protection etc etc...

        Tout ça pour dire que la mémoire virtuelle de Windows est le fichier PageFile.sys

        Pour revenir à Flush() , fflush() celui du C supprime toutes les données mise dans les différents fichier. Ces fichiers sont des fichiers Flux qui font office de Tampon . et dans la bibliothèque standard du langage C trois fichiers flux servant de tampon sont créer par défaut . ces fichiers sont 

        Sdtin ,Stdout et Stderr . le premier pour l'entrée standard qui est le clavier , le second pour la sortie standard l'écran et le dernier pour les erreurs . ces fichiers sont munis de descripteur de fichier par défaut qui sont 0 pour Stdin , 1 pour Stdout et 2 pour Stderr . ces fichiers et tous les autres fichiers ouverts (par ex: un fichier .txt) sont stocker dans une table de descripteurs de fichier c'est une structure contenant tout les details des fichiers ouvert par un programme . la source des données des Buffers Stdin ou de Stdout peut être modifié par exemple les données peuvent venir d'un fichier texte pour Stdin et pour Stdout les données peuvent etre envoyé vers un fichier dans le DD. Mais il y a encore un autre Buffer... celui de L'os qui lui fait une taille par defaut de 512KO qui est normalement gérées par le système d’exploitation, qui détermine le délai optimal pour écrire les données automatiquement sur le disque : lorsque une mémoire tampon est saturée, lorsqu’un flux est fermé ou lorsqu’un programme se termine normalement sans avoir à fermer le flux de données. Et il peut aussi etre augmenter . l'ors-que l'on desire écrire sur le DD par exemle et que la source des données viennent de Stdout par ex ou d'ailleurs ces données sont placer dans ce Buffers du systeme d'exploitation avant d'étre ecrits sur le disque . flush() et _flushall() ne permet pas de vider ce Buffer sauf si on l'asscocie avec COMMODE.OBJ.  qui en realité ne le vide pas mais permet de passer outre ce Buffer et d'écricre directement les données sur le DD .

        Voila voila je pense que j'ai du oublier d'expliquer quelques trucs mais en gros voila et j'espere que j'ai pas dis des conneries parce que je l'ai redigé en vitesse si c'est le cas n'hésite pas à me corriger ;)

        J'aurais quelques questions à te poser sous windows il utilise le terme FileHandle, ça signifie la meme chose ou c'est encore differents ?

        et es-ce que dans un langage de haut niveau comme le Vb.net il existe aussi des fichiers Flux ou c'est un systeme differents ?

        :)

        • Partager sur Facebook
        • Partager sur Twitter
          10 mars 2018 à 1:48:18

          Très bon résumé :) Il est tard, donc je n'ai pas tout vérifié, mais ça me semble correct dans l’absolu.

          FileHandle, je n'ai jamais entendu parler. Mais d'après mes sources, ce un simple fichier de gestion temporaire. Pas vraiment un buffer, mais un peu quand même.

          Sous VB, c'est encore différent. Parce que ce langage et son .NET sont très... assistés. De telle sorte à nous faire croire que l'on parle anglais à l'ordinateur. Donc, oui, c'est certainement possible (maintenant, je ne sais pas comment le faire, et si le framework le permet (parce que tout ça, c'est majoritairement du C), ça ne servirait à rien).

          • Partager sur Facebook
          • Partager sur Twitter

          Le meilleur moyen de prédire l'avenir, c'est de l'inventer | N'oubliez pas [résolu] et +1 | Excusez mon ôrtograffe, j'essaie de l'améliorer...

          Anonyme
            10 mars 2018 à 20:11:42

            vanaur a écrit:

            Très bon résumé :) Il est tard, donc je n'ai pas tout vérifié, mais ça me semble correct dans l’absolu.

            FileHandle, je n'ai jamais entendu parler. Mais d'après mes sources, ce un simple fichier de gestion temporaire. Pas vraiment un buffer, mais un peu quand même.

            Sous VB, c'est encore différent. Parce que ce langage et son .NET sont très... assistés. De telle sorte à nous faire croire que l'on parle anglais à l'ordinateur. Donc, oui, c'est certainement possible (maintenant, je ne sais pas comment le faire, et si le framework le permet (parce que tout ça, c'est majoritairement du C), ça ne servirait à rien).


            merci :)

            Quand t'on regarde un peu la définition de FileHandle ça serai aussi un Index un peu comme le descripteur de fichier mais je comprend pas trop leur explications, elle sont assez vague...

            Sous Vb.net comme tu le dis ça doit être encore différent parce-que l'ors-qu'on créer un objet pour manipuler un fichier avec FileStream si on veux par ex écrire ou lire il est mentionné sur ce lien https://msdn.microsoft.com/fr-fr/library/system.io.filestream.read(v=vs.110).aspx

            "Lit un bloc d'octets dans le flux et écrit les données dans une mémoire tampon donnée."

            "Le offset paramètre indique l’offset d’octet dans array (l’index de la mémoire tampon) à partir duquel commencer la lecture et le count paramètre indique le nombre maximal d’octets à lire dans ce flux."

            donc ça laisserait supposer que le tableau est le Tampon ?

            -
            Edité par Anonyme 10 mars 2018 à 20:13:03

            • Partager sur Facebook
            • Partager sur Twitter
              10 mars 2018 à 20:34:11

              Non, array c'est juste un paramètre de la fonction :lol:

              Et comme je l'ai déjà dit, plus anciennement, un tableau c'est, juste une variable à type structuré. Donc rien à voir avec un buffer. Du moins, je ne pense pas :)

              • Partager sur Facebook
              • Partager sur Twitter

              Le meilleur moyen de prédire l'avenir, c'est de l'inventer | N'oubliez pas [résolu] et +1 | Excusez mon ôrtograffe, j'essaie de l'améliorer...

              Anonyme
                24 mars 2018 à 16:31:55

                vanaur a écrit:

                Non, array c'est juste un paramètre de la fonction :lol:

                Et comme je l'ai déjà dit, plus anciennement, un tableau c'est, juste une variable à type structuré. Donc rien à voir avec un buffer. Du moins, je ne pense pas :)

                Salut, après plusieurs recherches et bien... si, Pour faire court le tableau est utilisé comme Tampon du moins qu'avec la classe FileStream en VB.net , FileStream commence son nom l'indique (Stream) il crée un flux en lisant dans un fichier par ex. Et les données du fichier et est placer dans un tableau faisant office de Buffer en attente d’être écrites, copiée ou autres suivant le code . Avec Filestream il crée un flux pour limiter les appel système qui sont plus long . Pas comme File qui lui fait appel au système pour manipuler les fichiers c'est peut être un peu plus court et simple à écrire son code mais il est plus long ...

                un Buffer est simplement un Index qui correspond à des caractères(données) à la manière d'un tableau. Et en regardant bien les Buffers du langage C Stdin Stdout Stderr sont simplement des fichiers qui sont structuré à la manière d'un Tableau, ils ont un Index correspondant à une ou plusieurs donnée(s).

                je pense qu'on peut mettre en résolu :)

                • Partager sur Facebook
                • Partager sur Twitter
                  24 mars 2018 à 16:48:42

                  Si on le prend dans ce sens-là, alors oui, le tableau (et tout autre container) peut être utilisé tel qu'un buffer.

                  Mais pour te faire une petite idée de ce qu'est un tableau dans la mémoire :

                  En fait, le mot "buffer" est trop largement utilisé... Mais retiens ce que tu viens de dire, c'est correct. Bien que le .NET "contourne" un peu les règles.

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Le meilleur moyen de prédire l'avenir, c'est de l'inventer | N'oubliez pas [résolu] et +1 | Excusez mon ôrtograffe, j'essaie de l'améliorer...

                  Anonyme
                    24 mars 2018 à 17:26:11

                    Ok donc FileStream utilise bien un Tableau comme un genre de Buffer intermédiaire pour y placer les données d'un fichier pour ensuite les manipuler ?

                    -
                    Edité par Anonyme 24 mars 2018 à 17:40:04

                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 mars 2018 à 17:40:55

                      Ça, je n'en sais rien. Si tu l'as lu dans le doc de Microsoft, c'est probablement vrai ;)
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Le meilleur moyen de prédire l'avenir, c'est de l'inventer | N'oubliez pas [résolu] et +1 | Excusez mon ôrtograffe, j'essaie de l'améliorer...

                      Anonyme
                        24 mars 2018 à 18:06:58

                        vanaur a écrit:

                        Ça, je n'en sais rien. Si tu l'as lu dans le doc de Microsoft, c'est probablement vrai ;)

                        Dans la description il est dit

                        Array : Mémoire tampon qui contient les données à écrire dans le flux

                        Mais ce tableau doit servir de tampon intermédiaire parce-que l’ors-que je fais MonFichier.fluch() il ne se passe rien le tableau ne se vide pas , donc Flush() doit servir que pour le Tampon de L'OS, pour le langage Vb.net biensur  

                        :)

                        -
                        Edité par Anonyme 24 mars 2018 à 18:08:44

                        • Partager sur Facebook
                        • Partager sur Twitter
                          24 mars 2018 à 18:32:09

                          Et c'est où que tu as vu ça ? Parce que je ne trouve pas dans la documentation.

                          Concernant l'architecture .NET, je te renvoie ici. Ça t'expliquera en gros comment les programmes .NET sont compilés.

                          Sinon, rappel toi ce qu'est une mémoire-tampon pour l'OS : une zone dans le RAM qui charge des données de manière temporaire afin qu'elles puissent être récupérées dans un certain temps d'activité.

                          Flush, d'après ton explication, semble "juste" vidé cette mémoire-tampon, elle la libère, la nettoie. Donc, son contenu n'est plus accessible, puisqu'il n'existe plus. Il y a sûrement des utilisations utiles de cette fonction pour le .NET, mais en utilisation lambda, elle ne nous concerne pas.

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Le meilleur moyen de prédire l'avenir, c'est de l'inventer | N'oubliez pas [résolu] et +1 | Excusez mon ôrtograffe, j'essaie de l'améliorer...

                          Anonyme
                            24 mars 2018 à 18:44:06

                            vanaur a écrit:

                            Et c'est où que tu as vu ça ? Parce que je ne trouve pas dans la documentation.

                            Concernant l'architecture .NET, je te renvoie ici. Ça t'expliquera en gros comment les programmes .NET sont compilés.

                            Sinon, rappel toi ce qu'est une mémoire-tampon pour l'OS : une zone dans le RAM qui charge des données de manière temporaire afin qu'elles puissent être récupérées dans un certain temps d'activité.

                            Flush, d'après ton explication, semble "juste" vidé cette mémoire-tampon, elle la libère, la nettoie. Donc, son contenu n'est plus accessible, puisqu'il n'existe plus. Il y a sûrement des utilisations utiles de cette fonction pour le .NET, mais en utilisation lambda, elle ne nous concerne pas.

                            "Et c'est où que tu as vu ça ? Parce que je ne trouve pas dans la documentation."

                            MonFichier.read(Tampon , 0 , TailleMax)
                            MonFichier.write(Tampon , 0 , TailleMax)

                            l'ors-que tu vas sur Tampon il y à une petite description 

                            "Donc, son contenu n'est plus accessible, puisqu'il n'existe plus" 

                            oui mais il est censé écrire les données de la mémoire tampon dans le fichier , hors le tableau qui sert de tampon contient des données prête à être écrites pourtant ce n'est pas le cas donc j'en déduis que ça ne vide pas ce Buffer mais celui de l'OS quand il écrit ou lit les données sur le disque 

                            -
                            Edité par Anonyme 24 mars 2018 à 18:52:03

                            • Partager sur Facebook
                            • Partager sur Twitter
                              24 mars 2018 à 18:51:04

                              Oui, mais il y a un ordre d'exécution :

                              [Chargement des données dans le tampon] → [Écriture des données dans le fichier] (→ [Suppression des données de la mémoire-tampon]).

                              Gusus a écrit:

                              j'en déduis que ça ne vide pas ce Buffer mais celui de l'OS quand il écrit ou lit les données sur le disque 

                              C'est possible. Mais, puisque ça passe par le .NET, je ne serais pas te dire exactement comment il effectue son opération. En effet, si tu te rappelles, l'architecture .NET est une sorte de mini-système intermédiaire. Il se peut que ce soit un buffer .NET et/ou le buffer physique correspondant.

                              Mais quoi qu'il en soit, ça passe par la mémoire, mais de façon soit virtuel, soit réel.

                              -
                              Edité par vanaur 24 mars 2018 à 18:52:36

                              • Partager sur Facebook
                              • Partager sur Twitter

                              Le meilleur moyen de prédire l'avenir, c'est de l'inventer | N'oubliez pas [résolu] et +1 | Excusez mon ôrtograffe, j'essaie de l'améliorer...

                              Anonyme
                                24 mars 2018 à 18:53:24

                                Mon_Fichier.Flush()
                                Mon_Fichier.Write(Tampon2, 0, Compteur)
                                
                                Mon_Fichier.Write(Tampon2, 0, Compteur)
                                Mon_Fichier.Flush()

                                ça ne change rien les données sont quand même écrites :)

                                -
                                Edité par Anonyme 24 mars 2018 à 19:00:45

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  24 mars 2018 à 18:59:36

                                  Oui, mais là tu vides le buffer avant qu'il y ait des informations dedans.

                                  Enfin, je t'avouerais ne pas trop connaitre la réponse. Tu peux aller voir ici pour plus d'informations.

                                  -
                                  Edité par vanaur 24 mars 2018 à 19:02:45

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Le meilleur moyen de prédire l'avenir, c'est de l'inventer | N'oubliez pas [résolu] et +1 | Excusez mon ôrtograffe, j'essaie de l'améliorer...

                                  Anonyme
                                    24 mars 2018 à 19:01:17

                                    vanaur a écrit:

                                    j'édit

                                    -
                                    Edité par vanaur il y a moins de 30s


                                    ?
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      24 mars 2018 à 19:05:58

                                      Je disais ça parce que j'éditais mon ancien message.
                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      Le meilleur moyen de prédire l'avenir, c'est de l'inventer | N'oubliez pas [résolu] et +1 | Excusez mon ôrtograffe, j'essaie de l'améliorer...

                                      Anonyme
                                        24 mars 2018 à 19:27:26

                                        Ah ok :)

                                        vanaur a écrit:

                                        Oui, mais là tu vides le buffer avant qu'il y ait des informations dedans.

                                        Enfin, je t'avouerais ne pas trop connaitre la réponse. Tu peux aller voir ici pour plus d'informations.

                                        -
                                        Edité par vanaur il y a 36 minutes


                                        c'est juste que j'ai pas mis la partie qui rempli le tableau

                                        mais sinon le voila

                                         If Mon_Fichier.CanWrite Then
                                        
                                        
                                                    Dim Tampon2(1024) As Byte
                                                    Dim Compteur As Integer = 0
                                        
                                                    For Each Lettres2 As Char In Me.EcrireText.Text.ToCharArray
                                        
                                                        Tampon2(Compteur) = Asc(Lettres2)
                                        
                                                        Compteur = Compteur + 1
                                        
                                                    Next
                                        
                                        
                                                    Mon_Fichier.flush()
                                                    Mon_Fichier.Write(Tampon2, 0, Compteur)
                                        
                                        end if
                                         If Mon_Fichier.CanWrite Then
                                        
                                        
                                                    Dim Tampon2(1024) As Byte
                                                    Dim Compteur As Integer = 0
                                        
                                                    For Each Lettres2 As Char In Me.EcrireText.Text.ToCharArray
                                        
                                                        Tampon2(Compteur) = Asc(Lettres2)
                                        
                                                        Compteur = Compteur + 1
                                        
                                                    Next
                                        
                                        
                                                   
                                                    Mon_Fichier.Write(Tampon2, 0, Compteur)
                                                    Mon_Fichier.flush()
                                        
                                        end if

                                        que le Flush() soit avant , apres ou pas du tout, ya rien qui change :) 

                                        donc j'en deduis qu'il vide le Buffer de l'OS et non le Tableau qui fait office de Buffer


                                        -
                                        Edité par Anonyme 24 mars 2018 à 19:51:10

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          24 mars 2018 à 20:03:21

                                          Bon, et bien après 50 messages, on est enfin arrivé au bout xD

                                          Bonnes continuations :)

                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          Le meilleur moyen de prédire l'avenir, c'est de l'inventer | N'oubliez pas [résolu] et +1 | Excusez mon ôrtograffe, j'essaie de l'améliorer...

                                          Anonyme
                                            24 mars 2018 à 20:41:05

                                            Si c'est ça xD

                                            merci à toi aussi :)

                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            Fonctionnement d'une mémoire tampon

                                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                            • Editeur
                                            • Markdown