1

J'aimerais bien faire un petit sondage. Le but est de connaitre la mémoire virtuelle maximale allouable par un système.

Donc le petit programme suivant la "calcule" plus ou moins bien (plutôt moins que plus d'ailleurs) #include <stdlib.h> #include <stdio.h> #include <limits.h> size_t maxsize(void) { size_t n = 0; int i, j; void *s = &i; /* Find upper limit for stack size */ for (i = 10; i < (int) (CHAR_BIT*sizeof n) && s != NULL; i++) { n = 1UL << i; s = malloc (n); if (s != NULL) free (s); } n = 1UL << (i-2); for (j = i-3; j > i-8; j--) { s = malloc (n + (1UL << j)); if (s != NULL) { free (s); n += 1UL <<j; } } return n; } int main() { size_t n = maxsize(); void *p = malloc (n); double alloc = n; while (p != NULL) { p = malloc (n); alloc += n; } alloc -= n; printf ("Max allocatable virtual memory=%fGb\n", alloc/1024.0/1024.0/1024.0); return 0; }

Si possible, ça serait pour avoir des retours sur différents systèmes (curiosité lorsque tu nous tiens). Donc à votre bon cœur. C'est Noël ! grin
Les résultats:
Machine Linux 3.2.0-4-amd64 / RAM = 4GB / SWAP = 8 GB / Overcommit = ON / RESULT = 68470 GB to 131056.5 GB
Machine Linux mint 3.13.0-24 / RAM = 8GB / SWAP = 8GB / Overcommit = ON / RESULT = 63787GB to 65988Gb
Machine Linux 3.16.0-4-amd64 / RAM = 16GB / SWAP = 16 GB / Overcommit = ON / RESULT = 131040. GB
Machine Linux 3.2.0-4-amd64 / RAM = 4GB / SWAP = 8 GB / Overcommit = OFF / RESULT = 7.75Gb
Machine Linux mint 3.13.0-24 / RAM = 8GB / SWAP = 8GB / Overcommit = OFF / RESULT = 8.25Gb
Machine Linux 3.16.0-4-amd64 / RAM = 16GB / SWAP = 16 GB / Overcommit = OFF / RESULT = 22. GB
Machine Raspberry Pi B raspbian / RAM = 512MB / carte SD 2GB / RESULT = 2.734375Gb
Machine MacBook Air / RAM = 4Go / SWAP = ? = / RESULT = 129024Gb
Machine Windows 7 64bits / RAM = 4GB / SWAP = 4GB / 32 bits / RESULT = 1.781250Gb
Machine Windows 8.1 64 bits / RAM =  8 Go / SWAP= ? / 32 bits / RESULT = 1.972656Gb
Machine Windows 8.1 64 bits / RAM =  8 Go / SWAP= ? / 64 bits / RESULT = 17.859375Gb
Machine Windows 7 64bits / RAM = 16GB / SWAP = ? / 32 bits / RESULT = 1.812500Gb
Machine Windows 7 64bits / RAM = 16GB / SWAP = ? / 64 bits / RESULT = 23.625000Gb
Machine Windows 8.1 64bits / RAM = 16GB / SWAP = 16 Gb to ? / 64 bits / RESULT = 57.093750Gb


PS: Si vous utilisez clang, ne pas activer de directive d'optimisation Il freeze sur ce code (c'est un bug connu dans la base clang qui traine qui consiste à croire que malloc ne peut pas retourner NULL).
PPS: Sous Linux, overcommit ON: echo 0 > /proc/sys/vm/overcommit_memory / Overcommit OFF: echo 2 > /proc/sys/vm/overcommit_memory
EDIT: Update results

2

-

3

$ uname -a
Darwin xxxx 14.0.0 Darwin Kernel Version 14.0.0: Fri Sep 19 00:26:44 PDT 2014; root:xnu-2782.1.97~2/RELEASE_X86_64 x86_64

$ ./a.out 
a.out(9483,0x7fff774d7300) malloc: *** mach_vm_map(size=140737488355328) failed (error code=3)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
a.out(9483,0x7fff774d7300) malloc: *** mach_vm_map(size=138538465099776) failed (error code=3)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Max allocatable virtual memory=129024.000000Gb

(MacBook Air avec 4 Go de RAM)
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

4

┌─(XX-XXXXXX-XXXX - ...ument/Work/Repository/Windows/Desktop)─────────(14:48)─┐
└─ $ uname -a                                                          ──(OK)─┘
CYGWIN_NT-6.1-WOW64 XX-XXXX-XXXX 1.7.32(0.274/5/3) 2014-08-13 23:03 i686 Cygwin
┌─(XX-XXXXXX-XXXX - ...ument/Work/Repository/Windows/Desktop)─────────(14:48)─┐
└─ $ ./a.exe                                                           ──(OK)─┘
Max allocatable virtual memory=1.812500Gb
┌─(XX-XXXXXX-XXXX - ...ument/Work/Repository/Windows/Desktop)─────────(14:48)─┐
└─ $                                                                   ──(OK)─┘

(Desktop Win7 64 avec 16go de RAM)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

5

Orion_ (./2) :
y'a peut être un soucis avec ta méthode cheeky

Peut être. Ce que ça essaye de faire est d'allouer le maximum de fois des espaces de taille maximale.
Et sous Windows, j'ai toujours eu ces soucis. Il faudrait cependant être sur que ce sont des exécutables 64 bits et pas 32 bits qui sont générés (particulièrement pour Zeph. Je suis pratiquement sûr que c'est un exécutable 32 bits qui a été généré).

(et merci pour les retours !)

6

Portable sous Windows 8.1 avec 16 Go de RAM :
Max allocatable virtual memory=57.093750Gb
avatar

7

-

8

(quand je te disais que c'était foireux ton truc, PpHd tongue)
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

9

PpHd (./5) :
(particulièrement pour Zeph. Je suis pratiquement sûr que c'est un exécutable 32 bits qui a été généré).

Oui, tu n'avais pas demandé 64 bits smile Compilé en en 64 bits donc :

┌─(XX-XXXXXX-XXXX - ...ument/Work/Repository/Windows/Desktop)─────────(17:20)─┐
└─ $ ./a.exe                                                           ──(OK)─┘
Max allocatable virtual memory=23.625000Gb
┌─(XX-XXXXXX-XXXX - ...ument/Work/Repository/Windows/Desktop)─────────(17:20)─┐
└─ $                                                                   ──(OK)─┘
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

10

-

11

ah je me demandais d'ou ca venait ce truc uber lourd grin

12

Orion_ (./7) :
Ben je parlais surtout pour le Raspberry Pi, comment peut il allouer 2.7Go sur une machine qui n'a que 2go de disque + 512 de ram ?

Et les retour des machines Linux ne t'ont pas choquées ? wink
C'est de l'over-commit. Linux, OSX, et autres Unix allouent bien plus de mémoire que ce qu'ils ont réellement en espérant que les programmes n'utilisent pas.
En général, cela fonctionne bien. Et surtout avec fork c'est indispensable. cf. http://www.win.tue.nl/~aeb/linux/lk/lk-9.html partie overcommit.
(et pour certains de mes programmes c'est indispensable tongue)
et chose bizarre, après avoir lancé ton programme, je ne pouvais plus supprimer aucun fichier, il me disait que le disque n'était dispo qu'en lecture seule, j'ai jamais eu ça avant

Oui mais non. Tu as le code source smile Tu peux vérifier que je ne fais rien de méchant. Ca ressemble plus à un bon bug de ton système qui a été poussé dans ses retranchements wink
Zeph (./9) :
Oui, tu n'avais pas demandé 64 bits smile.gif?7

Les deux sont intéressants mon capitaine !
Zerosquare (./8) :
(quand je te disais que c'était foireux ton truc, PpHd )

(Je suis prêt pour tester ton code que tu vas généreusement proposé tongue)

13

PpHd > Je trouve ça assez bizarre que tu comptes la mémoire virtuelle allouable en utilisant des malloc. En tout cas sur Windows, j'aurais tendance à penser que tu obtiens de meilleurs résultats avec VirtualAlloc:
#include <stdio.h> #include <Windows.h> int main(int argc, char** argv) { const SIZE_T size = 4 * 1024 * 1024; SIZE_T allocated = 0; while (VirtualAlloc(NULL, size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE) != NULL) { allocated += size; } printf("Max allocatable virtual memory=%fGb\n", allocated / 1024 / 1024 / 1024.0); return 0; }

Avec le code ci-dessus, j'obtiens ça:
32 bits: Max allocatable virtual memory=1.972656Gb
64 bits: Max allocatable virtual memory=17.859375Gb

Avec ton exécutable, j'obtiens ça, mais ça fait gravement freezer le PC pendant presque 1 minute: (i.e. je peux même plus bouger la souris grin)
64 bits: Max allocatable virtual memory=17.718750Gb

Au final, ça donne un résultat comparable, mais faut savoir que les chiffres que j'obtiens sont pour un système avec 8Go de RAM et pas mal d'applications ouvertes.
J'ai fermé Steam et j'ai gagné 0.1 Go quasi instantanément, je vais voir ce que ça donne avec Chrome fermé.

EDIT: Avec les applications graphiques fermées, j'obtiens 22.394531Gb… Et 1,5Go de mémoire utilisé d'après le gestionnaire des tâches. J'aurais tendance à en conclure que mon Windows se permet d'autoriser jusqu'à 3x la mémoire physique du système, tout processus confondus.
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

14

PpHD> Et quelque chose à base de mmap anonymes? Tu ne dépendrais pas de l'implémentation de malloc au moins. Sans oublier le bookkeeping.

Je me disais aussi que tu consommerais sans doute moins de mémoire en essayant d'allouer (MAXINT/2+1), puis quand ça marche plus tu divises par 2. Tu arrêtes la boucle quand i < 2^20 et t'as une bonne approximation au Mo près, en ayant réservé pas trop de blocs.

Voilà dans l'idée :
size = 2^63
total = 0
while size ≥ 2^20:
    while allocate(size):
        total = total + size
    size = size / 2

15

PpHd (./12) :
(Je suis prêt pour tester ton code que tu vas généreusement proposé tongue.gif?7)
Je ne peux pas te proposer de code pour implémenter un truc que je considère comme fondamentalement branlant grin
D'ailleurs, le lien que tu donnes considère que l'overcommit est une mauvaise chose. Tu en as besoin dans quel cas ?
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

16

GoldenCrystal (./13) :
Avec ton exécutable, j'obtiens ça, mais ça fait gravement freezer le PC pendant presque 1 minute: (i.e. je peux même plus bouger la souris grin.gif?7)
C'est pas ton installation qui a un problème ?
Ici, la mesure ne prend que quelques secondes :
21:52:40,78
Max allocatable virtual memory=57.093750Gb
21:52:45,00
On peut noter que j'obtiens la même chose qu'en ./6.

J'ai essayé ton code et la différence avec le résultat de celui de PpHd est un peu plus grande que chez toi :
Max allocatable virtual memory=58.308594Gb

(Il faudrait peut-être remplacer Gb par GB, non ? smile)
avatar

17

RHJPP (./16) :
GoldenCrystal (./13) :
Avec ton exécutable, j'obtiens ça, mais ça fait gravement freezer le PC pendant presque 1 minute: (i.e. je peux même plus bouger la souris grin.gif?7)
C'est pas ton installation qui a un problème ?
Bah, c'est à dire que comme ça utilisé malloc, et que j'ai compilé en debug, la mémoire allouée est réellement utilisée, et du coup ça a bouffé tout mon espace disque restant…
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

18

Zerosquare (./15) :
Tu en as besoin dans quel cas ?

topics/168770-maylib-075-thread

19

Zerosquare (./15) :
Je ne peux pas te proposer de code pour implémenter un truc que je considère comme fondamentalement branlant grin.gif?7

Oh !
Zerosquare (./15) :
D'ailleurs, le lien que tu donnes considère que l'overcommit est une mauvaise chose. Tu en as besoin dans quel cas ?

Chacun est juge de savoir si c'est bien ou pas. Ce pourquoi j'en ai besoin est décrit dans un topic yaronet. embarrassed Faut pas gâcher les points (n'est-ce pas Folco wink )
GoldenCrystal (./13) :
PpHd > Je trouve ça assez bizarre que tu comptes la mémoire virtuelle allouable en utilisant des malloc. En tout cas sur Windows, j'aurais tendance à penser que tu obtiens de meilleurs résultats avec VirtualAlloc:

Je pensais aussi, mais finalement ton test m'a montré que je me suis pas trompé et que ca marche aussi. Merci smile

20

-

21

Orion_ (./20) :
c'est quoi ce truc d'overcommit c'est complétement débile comme concept confus
c'est comme vendre un disque dur marqué 2To en esperant que l'utilisateur en utilise que 1To triso

Non, rien à voir, on parle pas de stockage mais de "mémoire vue comme disponible", et c'est loin d'être complètement débile, vu ça peut servir et simplifier énormément de choses dans certains cas, cf ./18
D'ailleurs, si les OS modernes le permettent, il doit bien y avoir une raison, tu crois pas ? cheeky

22

Sans aller jusque là, cela se fait sous Unix à cause de la fonction fork, qui a besoin de ce genre de mécanique, ou autrement c'est très lent (Bonjour cygwin).

23

Ou même simplement pour le fichier d'échange: Y'a plein de données que les applications n'utilisent pas souvent, voire pas du tout, alors qu'elles les ont chargé en mémoire, et il y a d'autres processus qui ont vraiment besoin de mémoire. Donc tu fais croire aux premiers que la mémoire qu'ils ont demandé leur est toujours alloué (alors que tu la fous dans un fichier sur le disque), et à la place tu l'alloues aux seconds.
De la même manière si tu mappes un fichier en mémoire (mmap sous Linux) le système n'a pas besoin de te connecter réellement l'espace mémoire tant que tu n'as pas essayé de t'en servir. (Ou lorsque tu n'essayes plus de t'en servir: Si le map est bien supporté par un fichier physique, il suffira de récupérer les données dedans)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

24

-

25

Et bien lis le lien en ./18, il y a des mécaniques de programmation grandement facilitées avec cette technique. Bon ok, avant d'avoir lu cet exemple et me rendre compte que c'était pas complètement inutile, je trouvais ça tout aussi débile grin

26

Orion_ (./24) :
non mais, si j'alloue 2.7go sur un système qui ne les a pas (tant en mémoire qu'en espace disque), et que je décide de les remplirs, a par planter le système je vois pas bien l'utilité
je comprend pas comment un programme peut demander d'allouer plus de mémoire qu'il n'en a besoin, ça n'a aucun sens

Tu peux les allouer pour avoir un espace continue de mémoire sans être sûr de vraiment les consommer, mais juste pour éviter de devoir les réallouer plus tard (qui au pire impossible, au mieux, extrêmement couteux). Typiquement les piles des threads.

27

28

grin
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

29

omg grin

30

boh, c'est un classique

mais ca m'a fait penser a l'over-commit avec les cles usb sans-fond qui annoncent plus de capacite que de memoire flash dispo.