Difference between revisions of "LlGetFreeMemory/fr"

From Second Life Wiki
Jump to navigation Jump to search
(Localized to french)
 
m (Big proofreading)
Line 4: Line 4:
|return_type=integer
|return_type=integer
|func_desc
|func_desc
|return_text=correspondant au nombre de bytes libres dans la pile
|return_text=correspondant au nombre d'octets libres dans la pile
|func_footer
|func_footer
|spec=
|spec=
La mémoire LSL est divisée en 4 sections : Byte-code, Stack, Mémoire libre, Heap. La mémoire libre n’est pas un espace mémoire alloué, il s’agit juste d’un espace entre les zones Stack & Heap. La taille combinée des 4 sections est de 16384 bytes.
La mémoire d'un script LSL est divisée en 4 sections : code exécutable (byte-code), pile (stack), mémoire libre, tas (heap). La mémoire libre n’est pas un espace mémoire alloué, il s’agit juste d’un espace entre les zones de la pile et du tas. La taille combinée des 4 sections est de 16384 octets.
   
   
Les [[String/fr|String]], les [[list/fr|list]] & les [[key/fr|key]] sont stockés dans la zone Heap. Les pointeurs de la zone Heap (pour les [[string/fr|string]], les [[list/fr|list]] & les [[key/fr|key]]) ainsi que les [[integer/fr|integer]], [[float/fr|float]], [[vector/fr|vector]] & les [[rotation/fr|rotation]] sont tous stockés temporairement dans la zone stack lorsque le script s’exécute.
Les [[String/fr|chaînes de caractères]], les [[list/fr|listes]] et les [[key/fr|clés]] sont stockés dans la zone du tas. Les pointeurs de la zone du tas (pour les [[string/fr|chaînes de caractères]], les [[list/fr|listes]] et les [[key/fr|clés]]) ainsi que les [[integer/fr|entiers]], [[float/fr|nombres en virgule flottante]], [[vector/fr|vecteurs]] et les [[rotation/fr|rotations]] sont tous stockés temporairement dans la zone de la pile lorsque le script s’exécute.


Durant l’exécution du script, la taille de la zone Stack évolue en fonction de la complexité du code exécuté. Contrairement à la zone Stack dont la taille peut diminuer, la taille de la zone Heap ne diminue pas. Quand il n’y a plus de mémoire de disponible et que les zones Heap et Stack se rencontrent, le script génère alors une erreur “Stack-Heap Collision“ qui fait crasher le script.
Durant l’exécution du script, la taille de la zone de la pile évolue en fonction de la complexité du code exécuté. Contrairement à la zone de la pile dont la taille peut diminuer, la taille de la zone du tas ne diminue pas. Quand il n’y a plus de mémoire de disponible et que les zones de la pile et du tas se rencontrent, le script génère une erreur “Stack-Heap Collision“ qui fait planter le script.


La zone Heap peut être fragmentée et certains blocs de mémoire peuvent devenir inutilisable. Il n’existe aucune fonction de défragmentation, mais il existe des techniques d’écriture de scripts qui peuvent aider à réduire cette fragmentation.
La zone de tas peut être fragmentée et certains blocs de mémoire peuvent devenir inutilisables. Il n’existe aucune fonction de défragmentation, mais il existe des techniques d’écriture de scripts qui peuvent aider à réduire cette fragmentation.
|caveats=
|caveats=
*Le nombre de byte de la zone Heap peut augmenter mais jamais diminuer.
*Le nombre d'octets de la zone du tas peut augmenter mais jamais diminuer.
|constants
|constants
|examples=
|examples=
L’appel à  llGetFreeMemory pourrait ressembler à cela:
L’appel à  llGetFreeMemory pourrait ressembler à cela :
<lsl>
<lsl>
integer Ki = 1024; // 1024 == (1 << 10);
integer ko = 1024; // 1024 == (1 << 10);
float maxPerScript = 16 * Ki;
float maxParScript = 16 * ko;
llOwnerSay((string) ((maxPerScript - llGetFreeMemory())/Ki) + " KiB de mémoire ont été utilisés au moins une fois par ce script depuis sa réinitialisation");
 
llOwnerSay((string) ((maxPerScript - llGetFreeMemory())/Ki) + " KiB de mémoire ont été utilisés au moins une fois par ce script depuis sa réinitialisation");
llOwnerSay((string) ((maxParScript - llGetFreeMemory()) / ko) +
                      " ko de mémoire ont été utilisés au moins une fois par ce script depuis sa réinitialisation");
llOwnerSay((string) ((maxParScript - llGetFreeMemory()) / ko) +
                    " ko de mémoire ont été utilisés au moins une fois par ce script depuis sa réinitialisation");
</lsl>
</lsl>
Le chat montre que la zone Heap a grandit au fil du temps après avoir diminué lors de la réinitialisation.<pre>
Le chat montre que la zone de tas a grandit au fil du temps après avoir diminué lors de la réinitialisation.<pre>
0.508789 KiB de mémoire ont été utilisés au moins une fois par ce script depuis sa réinitialisationreset
0.508789 ko de mémoire ont été utilisés au moins une fois par ce script depuis sa réinitialisation
0.524414 KiB de mémoire ont été utilisés au moins une fois par ce script depuis sa réinitialisation
0.524414 ko de mémoire ont été utilisés au moins une fois par ce script depuis sa réinitialisation
</pre>
</pre>
Réduire la zone heap, étonnamment, ne diminue pas la valeur renvoyée par llGetFreeMemory:
Réduire la zone de tas, étonnamment, ne diminue pas la valeur renvoyée par llGetFreeMemory:
<lsl>
<lsl>
default
default
Line 35: Line 38:
     state_entry()
     state_entry()
     {
     {
         llSay(0,"llGetFreeMemory() renvoie : "+(string)llGetFreeMemory()+"byte(s)");
         llSay(0, "llGetFreeMemory() renvoie : " + (string) llGetFreeMemory() + " octet(s)");
         //Renvoie la valeur de llGetFreeMemory() en bytes
         // Renvoie la valeur de llGetFreeMemory() en octets
         if(TRUE)
         if (TRUE)
         {
         {
             list TEST1;
             list TEST1;
             TEST1=[1,5334,"Bla, bla, bla",<345,3.78,34>,<0,0,0,1>,"TEST"];
             TEST1= [1,5334, "Bla, bla, bla", <345,3.78,34>, <0,0,0,1>, "TEST"];
             TEST1=TEST1+TEST1+llGetFreeMemory();
             TEST1 = TEST1 + TEST1 + llGetFreeMemory();
             integer i;
             integer i;
             for(i=0;i<llGetListLength(TEST1);i++)
             for (i = 0; i < llGetListLength(TEST1); i++)
             {
             {
                 llSay(0,"objet n° "+(string)i+" dans la liste : "+llList2String(TEST1,i));
                 llSay(0,"objet n°" + (string) i + " dans la liste : " + llList2String(TEST1, i));
             }
             }
             TEST1 = [];
             TEST1 = [];
         }
         }
         llSay(0,"List effacée!");
         llSay(0, "Liste effacée !");
         llSay(0,"à présent llGetFreeMemory renvoie : "+(string)llGetFreeMemory());
         llSay(0, "à présent llGetFreeMemory() renvoie : " + (string) llGetFreeMemory());
     }
     }
} // http://wiki.secondlife.com/wiki/User:TxMasterG_Ping/llGetFreeMemory
} // http://wiki.secondlife.com/wiki/User:TxMasterG_Ping/llGetFreeMemory
Line 62: Line 65:
<br/>
<br/>
<br/>
<br/>
Nous pouvons imaginer la fonction llGetFreeMemory comme un modèle UNIX classique composé de taches/processus fonctionnant en parallèle. Dans ce modèle, la tâche du script est toujours de 16384 bytes (16 KiB). Mise à part le code, la zone stack grandit du bas vers le haut, alors que la zone heap grandit du haut vers le bas. llGetFreeMemory renvoie alors "la valeur historiquement la plus basse de la zone Heap diminuée de la limite de la zone stack".<br/>
Nous pouvons imaginer la fonction llGetFreeMemory comme un modèle UNIX classique composé de tâches/processus fonctionnant en parallèle. Dans ce modèle, la tâche du script est toujours de 16 384 octets (16 ko). Mise à part le code, la zone de pile grandit du bas vers le haut, alors que la zone de tas grandit du haut vers le bas. llGetFreeMemory() renvoie alors "la valeur historiquement la plus basse de la zone de tas diminuée de la limite de la zone de pile".<br/>
<br/>
<br/>
llGetFreeMemory ne compte pas les bytes libres, llGetFreeMemory décompte uniquement les bytes jamais utilisés.<br/>
llGetFreeMemory() ne compte pas les octets libres, llGetFreeMemory() décompte uniquement les octets jamais utilisés.<br/>
<br/>
<br/>
Vous pouvez également consulter : les articles  "Script run-time error" &  "Stack-Heap Collision" dans  [[LSL Errors/fr|LSL Errors]]<br/>
Vous pouvez également consulter : les articles  "Script run-time error" &  "Stack-Heap Collision" dans  [[LSL Errors/fr|Erreurs LSL]]<br/>
Vous pouvez également consulter : [[Talk:LlGetFreeMemory]] pour la discution d’une théorie selon laquelle llGetFreeMemory pourrait renvoyer des nombres négatifs.
Vous pouvez également consulter : [[Talk:LlGetFreeMemory]] pour la discussion d’une théorie selon laquelle llGetFreeMemory pourrait renvoyer des nombres négatifs.
|cat1=Script/fr
|cat1=Script/fr
|cat2
|cat2

Revision as of 05:34, 9 August 2008

Description

Fonction: integer llGetFreeMemory( );

Renvoie un integer correspondant au nombre d'octets libres dans la pile


Spécifications

La mémoire d'un script LSL est divisée en 4 sections : code exécutable (byte-code), pile (stack), mémoire libre, tas (heap). La mémoire libre n’est pas un espace mémoire alloué, il s’agit juste d’un espace entre les zones de la pile et du tas. La taille combinée des 4 sections est de 16384 octets.

Les chaînes de caractères, les listes et les clés sont stockés dans la zone du tas. Les pointeurs de la zone du tas (pour les chaînes de caractères, les listes et les clés) ainsi que les entiers, nombres en virgule flottante, vecteurs et les rotations sont tous stockés temporairement dans la zone de la pile lorsque le script s’exécute.

Durant l’exécution du script, la taille de la zone de la pile évolue en fonction de la complexité du code exécuté. Contrairement à la zone de la pile dont la taille peut diminuer, la taille de la zone du tas ne diminue pas. Quand il n’y a plus de mémoire de disponible et que les zones de la pile et du tas se rencontrent, le script génère une erreur “Stack-Heap Collision“ qui fait planter le script.

La zone de tas peut être fragmentée et certains blocs de mémoire peuvent devenir inutilisables. Il n’existe aucune fonction de défragmentation, mais il existe des techniques d’écriture de scripts qui peuvent aider à réduire cette fragmentation.

Avertissements

  • Le nombre d'octets de la zone du tas peut augmenter mais jamais diminuer.

Exemples

L’appel à llGetFreeMemory pourrait ressembler à cela : <lsl> integer ko = 1024; // 1024 == (1 << 10); float maxParScript = 16 * ko;

llOwnerSay((string) ((maxParScript - llGetFreeMemory()) / ko) +

                     " ko de mémoire ont été utilisés au moins une fois par ce script depuis sa réinitialisation");

llOwnerSay((string) ((maxParScript - llGetFreeMemory()) / ko) +

                    " ko de mémoire ont été utilisés au moins une fois par ce script depuis sa réinitialisation");

</lsl>

Le chat montre que la zone de tas a grandit au fil du temps après avoir diminué lors de la réinitialisation.
0.508789 ko de mémoire ont été utilisés au moins une fois par ce script depuis sa réinitialisation
0.524414 ko de mémoire ont été utilisés au moins une fois par ce script depuis sa réinitialisation

Réduire la zone de tas, étonnamment, ne diminue pas la valeur renvoyée par llGetFreeMemory: <lsl> default {

   state_entry()
   {
       llSay(0, "llGetFreeMemory() renvoie : " + (string) llGetFreeMemory() + " octet(s)");
       // Renvoie la valeur de llGetFreeMemory() en octets
       if (TRUE)
       {
           list TEST1;
           TEST1= [1,5334, "Bla, bla, bla", <345,3.78,34>, <0,0,0,1>, "TEST"];
           TEST1 = TEST1 + TEST1 + llGetFreeMemory();
           integer i;
           for (i = 0; i < llGetListLength(TEST1); i++)
           {
               llSay(0,"objet n°" + (string) i + " dans la liste : " + llList2String(TEST1, i));
           }
           TEST1 = [];
       }
       llSay(0, "Liste effacée !");
       llSay(0, "à présent llGetFreeMemory() renvoie : " + (string) llGetFreeMemory());
   }

} // http://wiki.secondlife.com/wiki/User:TxMasterG_Ping/llGetFreeMemory </lsl>

Notes

Cette fonction ne renvoie pas la mémoire libre contrairement à ce que son nom pourrait laisser supposer. Certaines personnes souhaiteraient que cette fonction évolue ou soit remplacée par une fonction plus utile quand le LSL passera en LSL2 (cf. Mono).

Nous pouvons imaginer la fonction llGetFreeMemory comme un modèle UNIX classique composé de tâches/processus fonctionnant en parallèle. Dans ce modèle, la tâche du script est toujours de 16 384 octets (16 ko). Mise à part le code, la zone de pile grandit du bas vers le haut, alors que la zone de tas grandit du haut vers le bas. llGetFreeMemory() renvoie alors "la valeur historiquement la plus basse de la zone de tas diminuée de la limite de la zone de pile".

llGetFreeMemory() ne compte pas les octets libres, llGetFreeMemory() décompte uniquement les octets jamais utilisés.

Vous pouvez également consulter : les articles "Script run-time error" & "Stack-Heap Collision" dans Erreurs LSL
Vous pouvez également consulter : Talk:LlGetFreeMemory pour la discussion d’une théorie selon laquelle llGetFreeMemory pourrait renvoyer des nombres négatifs.

Vous cherchez encore des informations ? Peut-être cette page du LSLwiki pourra vous renseigner.