« Limitation Mémoire par processus » : différence entre les versions

De Banane Atomic
Aller à la navigationAller à la recherche
Aucun résumé des modifications
 
Aucun résumé des modifications
 
(4 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
=OS 32-bits et application 32-bits=
[[Category:Windows]]
[[Category:CSharp]]
= Liens =
* [http://bilbrobloggins.com/wow64/hidden-secrets-of-w0w64-ndash-large-address-space Hidden secrets of W0W64 – Large Address Aware]
* [http://msdn.microsoft.com/en-us/library/windows/desktop/aa366778%28v=vs.85%29.aspx Memory and Address Space Limits]
 
= OS 32-bits et application 32-bits =
Les processus 32-bits peuvent utiliser au maximum 4Gio de RAM (2^32 = 4 294 967 296 o).<br/>
Les processus 32-bits peuvent utiliser au maximum 4Gio de RAM (2^32 = 4 294 967 296 o).<br/>
Mais l'application en elle-même ne pourra en utiliser que 2Gio car le noyau Windows s'en réserve 2Gio.<br/>
Mais l'application en elle-même ne pourra en utiliser que 2Gio car le noyau Windows s'en réserve 2Gio.<br/>
L'option « LARGEADDRESSAWARE » permet d'étendre la mémoire utilisable par l'application à 3Gio.
L'option « LARGEADDRESSAWARE » permet d'étendre la mémoire utilisable par l'application à 3Gio.


=OS 64-bits=
= OS 64-bits =
==Application 32-bits==
== Application 32-bits ==
Là encore l'application 32-bits ne peut utiliser que 2Gio.<br/>
Là encore l'application 32-bits ne peut utiliser que 2Gio.<br/>
L'option « LARGEADDRESSAWARE » permet d'étendre la mémoire utilisable par l'application à 4Gio.
L'option « LARGEADDRESSAWARE » permet d'étendre la mémoire utilisable par l'application à 4Gio.


==Application 64-bits==
== Application 64-bits ==
L'application 64-bits peut utiliser jusqu'à 8Tio.<br/>
L'application 64-bits peut utiliser jusqu'à 8Tio.<br/>
L'option « LARGEADDRESSAWARE » est activé par défaut sur les les applications 64-bits.
L'option « LARGEADDRESSAWARE » est activé par défaut sur les les applications 64-bits.


=LARGEADDRESSAWARE=
= LARGEADDRESSAWARE =
L'option « LARGEADDRESSAWARE » indique à l'éditeur de liens que l'application peut gérer des adresses supérieures à 2 gigaoctets.
L'option « LARGEADDRESSAWARE » indique à l'éditeur de liens que l'application peut gérer des adresses supérieures à 2 gigaoctets.


==Test==
== Test ==
{|
<kode lang='dos'>
!style="padding: 0 10px 0 0"| [[File:dos.png|40px]]
|
<syntaxhighlight lang="dos">
dumpbin /HEADERS MonApplication.exe
dumpbin /HEADERS MonApplication.exe
REM si le flag LARGEADDRESSAWARE est activé le résultat doit contenir
REM si le flag LARGEADDRESSAWARE est activé le résultat doit contenir
Ligne 26 : Ligne 29 :


REM C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\dumpbin.exe
REM C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\dumpbin.exe
</syntaxhighlight>
</kode>
|}


==Modification==
== Modification ==
{|
<kode lang='dos'>
!style="padding: 0 10px 0 0"| [[File:dos.png|40px]]
|
<syntaxhighlight lang="dos">
editbin /LARGEADDRESSAWARE MonApplication.exe
editbin /LARGEADDRESSAWARE MonApplication.exe


REM suppression du flag
REM suppression du flag
editbin /LARGEADDRESSAWARE:NO MonApplication.exe
editbin /LARGEADDRESSAWARE:NO MonApplication.exe


REM C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\editbin.exe
REM C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\editbin.exe
</syntaxhighlight>
</kode>
|}


=Test de saturation de la mémoire en C#=
= Test de saturation de la mémoire en C# =
{|
<kode lang='cs'>
!style="padding: 0 10px 0 0"| [[File:csharp.png|40px]]
|
<syntaxhighlight lang="csharp">
var maListe = new List<object>();
var maListe = new List<object>();
while (true)
while (true)
Ligne 58 : Ligne 52 :
// Le contenu de maListe est donc recopié, ce qui provoque une demande d'allocation mémoire de la taille de maListe.
// Le contenu de maListe est donc recopié, ce qui provoque une demande d'allocation mémoire de la taille de maListe.
// maListe va finir par atteindre quelques Go et cette demande d'allocation mémoire trop grande ne permettra pas de faire un test précis.
// maListe va finir par atteindre quelques Go et cette demande d'allocation mémoire trop grande ne permettra pas de faire un test précis.
</syntaxhighlight>
</kode>
|}


On utilise ici on arborescence d'objets, à chaque pas on ajoute la taille d'un nouvel objet jusqu'à saturation de la mémoire.
On utilise ici on arborescence d'objets, à chaque pas on ajoute la taille d'un nouvel objet jusqu'à saturation de la mémoire.
{|
<kode lang='cs'>
!style="padding: 0 10px 0 0"| [[File:csharp.png|40px]]
|
<syntaxhighlight lang="csharp">
public class Program
public class Program
{
{
Ligne 96 : Ligne 86 :
     }
     }
}
}
</syntaxhighlight>
</kode>
|}
 
=Liens=
[http://bilbrobloggins.com/wow64/hidden-secrets-of-w0w64-ndash-large-address-space Hidden secrets of W0W64 – Large Address Aware]<br/>
[http://msdn.microsoft.com/en-us/library/windows/desktop/aa366778%28v=vs.85%29.aspx Memory and Address Space Limits]
 
[[Category:Windows]]
[[Category:CSharp]]

Dernière version du 5 avril 2020 à 23:28

Liens

OS 32-bits et application 32-bits

Les processus 32-bits peuvent utiliser au maximum 4Gio de RAM (2^32 = 4 294 967 296 o).
Mais l'application en elle-même ne pourra en utiliser que 2Gio car le noyau Windows s'en réserve 2Gio.
L'option « LARGEADDRESSAWARE » permet d'étendre la mémoire utilisable par l'application à 3Gio.

OS 64-bits

Application 32-bits

Là encore l'application 32-bits ne peut utiliser que 2Gio.
L'option « LARGEADDRESSAWARE » permet d'étendre la mémoire utilisable par l'application à 4Gio.

Application 64-bits

L'application 64-bits peut utiliser jusqu'à 8Tio.
L'option « LARGEADDRESSAWARE » est activé par défaut sur les les applications 64-bits.

LARGEADDRESSAWARE

L'option « LARGEADDRESSAWARE » indique à l'éditeur de liens que l'application peut gérer des adresses supérieures à 2 gigaoctets.

Test

Dos.svg
dumpbin /HEADERS MonApplication.exe
REM si le flag LARGEADDRESSAWARE est activé le résultat doit contenir
REM Application can handle large (>2GB) addresses

REM C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\dumpbin.exe

Modification

Dos.svg
editbin /LARGEADDRESSAWARE MonApplication.exe

REM suppression du flag
editbin /LARGEADDRESSAWARE:NO MonApplication.exe

REM C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\editbin.exe

Test de saturation de la mémoire en C#

Cs.svg
var maListe = new List<object>();
while (true)
{
    maListe.Add(new object());
}

// Le problème avec List c'est que sa mémoire est ré-allouée lors de l'ajout d'un nouvel élément si elle n'a pas assez de place.
// Le contenu de maListe est donc recopié, ce qui provoque une demande d'allocation mémoire de la taille de maListe.
// maListe va finir par atteindre quelques Go et cette demande d'allocation mémoire trop grande ne permettra pas de faire un test précis.

On utilise ici on arborescence d'objets, à chaque pas on ajoute la taille d'un nouvel objet jusqu'à saturation de la mémoire.

Cs.svg
public class Program
{
    static void Main(string[] args)
    {
        var objetRacine = new MaClasse();
        var sousObjet = recursive(objetRacine);

        while (true)
        {
            sousObjet = recursive(sousObjet);
        }
    }

    static MaClasse recursive(MaClasse sousObjet)
    {
        sousObjet.SousObjet = new MaClasse();
        return sousObjet.SousObjet;
    }
}

class MaClasse
{
    public MaClasse SousObjet { get; set; }
    private object[] _tailleDeBase;

    public MaClasse()
    {
        _tailleDeBase= new object[1000000];
    }
}