Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2282 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  nombre de cases mémoire dans un système 32 bits

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

nombre de cases mémoire dans un système 32 bits

n°2036341
Glock 17Pr​o
Posté le 16-11-2010 à 14:57:06  profilanswer
 

Bonjour,
 
Sur un système 32 bits, combien de cases mémoires y a t-il  ? 2^32 ?
 
j'ai un doute car il existe le système de segment:offset, du coup n'y a t-il pas plus de cases mémoires disponible ?
 
Par ailleurs, en C++ si on déclare un objet trop grand, du moins sous visual studio, le compilateur sors cette erreur : class to large, je n'arrive pas à comprendre exactement pourquoi...
 
Merci!


---------------
.
mood
Publicité
Posté le 16-11-2010 à 14:57:06  profilanswer
 

n°2036405
olivthill
Posté le 16-11-2010 à 16:33:03  profilanswer
 

Citation :

Sur un système 32 bits

Il existe différents systèmes 32-bit. Il faudrait être plus précis.
 
Pour Windows, voir la page http://msdn.microsoft.com/en-us/library/aa366778.aspx qui donne les tailles maximales selon les différentes versions récentes de Windows.
 

Citation :

en C++ si on déclare un objet trop grand

Objet déclaré sur la pile ou sur le tas ?
La pile, par défaut, n'a une taille que de 1 mega-octet (autrefois, c'était 64 kilo-octets).

Message cité 1 fois
Message édité par olivthill le 16-11-2010 à 16:33:24
n°2036406
h3bus
Troll Inside
Posté le 16-11-2010 à 16:35:32  profilanswer
 

C'est compliqué... mais en gros avec les MMU aujourd'hui sur 32 bits on adresse 64GB sur les ordinateurs et OS grand public.
http://en.wikipedia.org/wiki/Physi [...] _Extension


Message édité par h3bus le 16-11-2010 à 16:38:01

---------------
sheep++
n°2036420
Glock 17Pr​o
Posté le 16-11-2010 à 17:27:59  profilanswer
 

olivthill a écrit :

Citation :

 
[quote]en C++ si on déclare un objet trop grand

Objet déclaré sur la pile ou sur le tas ?
La pile, par défaut, n'a une taille que de 1 mega-octet (autrefois, c'était 64 kilo-octets).


 
Sur le tas. Mais à priori, sauf erreur de ma part,  c'est dès qu'on dépasse 2^32 que le compilateur génère ce message.
 
donc si je me fie à la réponse de h3bus, le problème ne vient pas d'un nombre de case mémoire insuffisant


---------------
.
n°2036431
h3bus
Troll Inside
Posté le 16-11-2010 à 17:51:29  profilanswer
 

Glock 17Pro a écrit :


donc si je me fie à la réponse de h3bus, le problème ne vient pas d'un nombre de case mémoire insuffisant


 
Toujours de wikipedia

Citation :

This, theoretically, increases maximum physical memory size from 4 GB to 64 GB. The 32-bit size of the virtual address is not changed, so regular application software continues to use instructions with 32-bit addresses and (in a flat memory model) is limited to 4 gigabytes of virtual address space. The operating system uses page tables to map this 4-GB address space into the 64 GB of physical memory. The mapping is typically applied differently for each process. In this way, the extra memory is useful even though no single regular application can access it all simultaneously.


 
Ce qui veux dire en gros que pour dépasser les 4GB, il te faut plusieurs processus...


---------------
sheep++
n°2036490
Glock 17Pr​o
Posté le 16-11-2010 à 23:26:31  profilanswer
 

bon j'avoue c'est complexe..piou y a moulte notions à maitriser pour comprendre le pourquoi du commment concernant cette limitation..vraiment vaste l'info


Message édité par Glock 17Pro le 16-11-2010 à 23:27:08

---------------
.
n°2036499
mrbebert
Posté le 17-11-2010 à 00:28:45  profilanswer
 

En général, une case mémoire (l'unité d'allocation de la mémoire vive), c'est 4 ko. Le système y place les pages mémoire nécessaires.
Il y a un maximum pour l'ensemble du système et un maximum par processus (2 Go sur windows 32 bits hors PAE)
 
(mais je ne suis pas sur que ce soit ça la question [:petrus75] )


Message édité par mrbebert le 17-11-2010 à 00:29:28
n°2036509
Glock 17Pr​o
Posté le 17-11-2010 à 07:42:50  profilanswer
 

excellent ce lien  
http://members.shaw.ca/bsanders/Wi [...] ileEtc.htm
même si je suis un peu embrouillé par le fait qu'il y est dit que chaque processus a 4GO mais que sur ces 4go 2 sont utilisés par le processus et 2 par l'OS , hors sous visual je pouvais créer des objets de ~4Go...


Message édité par Glock 17Pro le 17-11-2010 à 08:12:00

---------------
.
n°2036515
Taz
bisounours-codeur
Posté le 17-11-2010 à 09:18:18  profilanswer
 

Montre ta classe voir :)

n°2036548
theshockwa​ve
I work at a firm named Koslow
Posté le 17-11-2010 à 10:36:52  profilanswer
 

ca fait un peu peur, cette histoire "d'objets" de 4Go ...


---------------
last.fm
mood
Publicité
Posté le 17-11-2010 à 10:36:52  profilanswer
 

n°2036567
Glock 17Pr​o
Posté le 17-11-2010 à 11:40:50  profilanswer
 

Code :
  1. #include <vector>
  2. #include <string>
  3. class Object
  4. {
  5. std::vector<std::string> vec2[99999999]; //ici ok
  6. std::vector<std::string> vec3[99999999]; //ça passse encore
  7. std::vector<std::string> vec31[99999999]; // aiie.... error C2089: 'Object' : 'class' too large
  8. };
  9. class Object2
  10. {
  11. char tab[0x7FFFFFFF]; //ok = 2GO  
  12. char tab1[0x8FFFFFFF]; //aiie....error C2148: total size of array must not exceed 0x7fffffff
  13. };
  14. void main()
  15. {
  16. }


 
 
Je suis sur un système 64 bits finalement


Message édité par Glock 17Pro le 17-11-2010 à 11:43:37

---------------
.
n°2036578
Riot
Buy me a riot
Posté le 17-11-2010 à 12:32:11  profilanswer
 

C'est ça que t'appelles le tas ?


---------------
Be the one with the flames.
n°2036585
Glock 17Pr​o
Posté le 17-11-2010 à 12:48:22  profilanswer
 

c'est sur la pile erreur mais
 

Code :
  1. void main()
  2. {
  3. char *pt  = new char[0x7FFFFFFF]; //ok = 2GO  
  4. char *pt2 = new char[0x8FFFFFFF]; //error C2148: total size of array must not exceed 0x7fffffff bytes   
  5. }


 
et
 

Code :
  1. class Object
  2. {
  3. Object()
  4. {
  5.  std::vector<std::string>* v = new std::vector<std::string>[99999999]; //ici ok
  6.  std::vector<std::string>* v2 = new std::vector<std::string>[99999999]; //ça passse encore
  7.  std::vector<std::string>* v3 = new std::vector<std::string>[99999999]; //ça passse encore
  8. }
  9. };


 
et
 

Code :
  1. #include <vector>
  2. #include <string>
  3. class Object
  4. {
  5. std::vector<std::string> vec2[100000000];
  6. std::vector<std::string> vec3[100000000];
  7. std::vector<std::string> vec31[14748364];
  8. };
  9. class Object2
  10. {
  11. std::vector<std::string> vec2[100000000];
  12. std::vector<std::string> vec3[100000000];
  13. std::vector<std::string> vec31[14748365]; // error 'Object' : 'class' too large  
  14. };
  15. void main()
  16. {
  17. size_t nb = sizeof(Object); //4 294 967 280 //ok  
  18. }


 
et  
 
 

Code :
  1. class Object2
  2. {
  3. Object2()
  4. {
  5.  std::vector<std::string> *vec2 = new std::vector<std::string>[100000000];
  6.  std::vector<std::string> *vec2z = new std::vector<std::string>[100000000];
  7.  std::vector<std::string> *vec2zs =  new std::vector<std::string>[14748365]; 
  8.  std::vector<std::string> *vec2zzs =  new std::vector<std::string>[14748365];
  9.  std::vector<std::string> *vecd2zzs =  new std::vector<std::string>[14748365];  //ok
  10. }
  11. };


 
bilan :
 
un tableau peut faire une taille max de 2Go sur la pile ET également sur le tas
un objet peut faire une taille max  de 4Go sur la pile et XXXGo sur le tas
 
 
exact ?
 
si oui pourquoi ? merci


Message édité par Glock 17Pro le 17-11-2010 à 13:14:25

---------------
.
n°2036610
theshockwa​ve
I work at a firm named Koslow
Posté le 17-11-2010 à 14:23:35  profilanswer
 

pourquoi tu voudrais faire des tableaux de vecteurs ?
et oui, sinon, ce n'est pas surprenant que tu aies la même erreur en utilisant des int, des char ou des vectors, tant que tu en mets tant que le sizeof de ta classe dépasse une certaine valeur.
 
Mais de toute façon, dans quelles conditions aurais-tu besoin de ca ?


---------------
last.fm
n°2037324
Glock 17Pr​o
Posté le 20-11-2010 à 12:49:33  profilanswer
 

l'erreur n'est pas la meme.
dans le cas du char, 2Go max sont autorisé
dans le cas de l'objet c'est 4GO.
 
Cela provient-il d'une notion de mémorie contigüe ?
 


---------------
.
n°2037557
Glock 17Pr​o
Posté le 22-11-2010 à 11:19:34  profilanswer
 

?


---------------
.
n°2037565
theshockwa​ve
I work at a firm named Koslow
Posté le 22-11-2010 à 11:38:57  profilanswer
 

pour les comportements différents, rien à voir avec la contiguité de la mémoire : que ce soit pour un tableau ou pour des membres, tu as le même genre de contraintes sur la disposition mémoire
 
par contre, j'imagine que ce ne sont pas les mêmes limites sur lesquelles tu tombes sur les tailles de classes et tailles de tableau simplement parce qu'une classe, tant qu'elle n'est pas instanciée, ne devrait pas poser de problème technique immédiat si ce n'est la génération de code forcément faux dès que tu veux accéder aux membres (dans un adressage 32 bits, comment tu veux ajouter un offset de 4Go à ton adresse de début d'instance ?)
 
pour ton tableau, s'il est statique, il doit probablement lui réserver la taille dans ton exécutable (suivant les valeurs qu'il aura par défaut) et déjà lui trouver une adresse à laquelle il aura 2Go de mémoire contigüe utilisable (dans ton espace d'adressage évidemment, pas en mémoire physique nécessairement) or, déjà dans ton espaced d'adressage, tu ne peux pas trouver ca : tu as ton code en plein milieu de la plage de 2Go adressable par -et réservée à- ton processus, donc c'est juste pas possible pour lui de s'en sortir.
 
Bref, tout ca pour dire que, de toute façon, tu ne devrais pas avoir à rencontrer de problèmes avec ces limites. Ca montre juste que tu as un problème en amont dans ta conception.


Message édité par theshockwave le 22-11-2010 à 11:39:21

---------------
last.fm
n°2037592
Glock 17Pr​o
Posté le 22-11-2010 à 13:46:50  profilanswer
 

Je voulais juste connaitre l'espace max allouable en statique.
 
"dans un adressage 32 bits, comment tu veux ajouter un offset de 4Go à ton adresse de début d'instance"
 
mais avec la combo segment:offset / pagination peut être que c'est possible non ?
 
on découpe les 4Go en segment donc on a 2^32 segments et on se sert d'un autre registre pour gérer l'offset dans chaque segment
 
EDIT:PRECISON IMPORTANTE sachant que je suis dans un système 64 bits et qu'il y a quand même cette limitation de 4GO


Message édité par Glock 17Pro le 22-11-2010 à 14:30:11

---------------
.
n°2037622
theshockwa​ve
I work at a firm named Koslow
Posté le 22-11-2010 à 16:07:27  profilanswer
 

les segments/offset, ca ne se fait plus depuis qu'on est en 32 bits.
 
Au temps du 16 bits, tu avais 16 bits de segment, 16 bits d'offset, maintenant, tu as un 32 bits point barre.
On aurait pu faire un système équivalent pour adresser du 64 bits, effectivement (et ca a peut-être même été fait sur certains OS obscurs, ou des OS plus courants via des tweaks ou des APIs cachées) mais je ne connais pas de telles choses. Pour bénéficier du 64 bits dans ton processus, il faut que ton processus soit 64 bits, c'est la règle, et c'est clairement ce qui sera le moins pénible.
 
Si tu es dans un environnement intégralement 64 bits, assure-toi que tes flags sont bons. Si tu génères bien un exécutable 64 bits, alors c'est probablement une limite compilateur.
 
Edit : d'ailleurs, c'est confus, ta "précision importante". Ce qui est important, ce n'est pas que ton OS soit 64 bits, mais que ton exécutable (et donc ton processus) soit 64 bits.


Message édité par theshockwave le 22-11-2010 à 16:08:30

---------------
last.fm
n°2038785
el muchach​o
Comfortably Numb
Posté le 27-11-2010 à 07:01:12  profilanswer
 

Et puis c'est plus utile de connaitre l'espace que l'OS est prêt à t'allouer à un moment donné plutôt que des valeurs théoriques.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°2039242
Taz
bisounours-codeur
Posté le 30-11-2010 à 11:58:40  profilanswer
 

Y a personne pour faire remarquer qu'il y a probablement méprise sur l'utilisation de std::vector ?

n°2039321
Glock 17Pr​o
Posté le 30-11-2010 à 20:47:02  profilanswer
 

Taz a écrit :

Y a personne pour faire remarquer qu'il y a probablement méprise sur l'utilisation de std::vector ?


  :ange: oui c'est un code que j'ai repris


---------------
.
n°2039487
Glock 17Pr​o
Posté le 01-12-2010 à 20:34:10  profilanswer
 

j'ai cru comprendre que windows en l'occurence alloué 4GO à chaque processus, 2Go pour usage privé 2GO pour je sais pas trop quoi .Cela veut -il dire que lorsque l'on fait new on tappe dans une mémoire déjà pré-réservée?

Message cité 1 fois
Message édité par Glock 17Pro le 01-12-2010 à 20:39:13

---------------
.
n°2039520
mrbebert
Posté le 01-12-2010 à 22:36:59  profilanswer
 

Glock 17Pro a écrit :

j'ai cru comprendre que windows en l'occurence alloué 4GO à chaque processus, 2Go pour usage privé 2GO pour je sais pas trop quoi .Cela veut -il dire que lorsque l'on fait new on tappe dans une mémoire déjà pré-réservée?

Ce qu'il faut bien comprendre (ce n'est pas simple à priori mais après tout devient plus facile), c'est que les adresses manipulées dans le processus sont des adresses virtuelles.
C'est une adresse dans l'espace d'adressage du processus et qui n'a pas grand chose à voir avec l'adresse réelle dans la mémoire du PC.
 
Ca permet pas mal de choses :
- l'OS peut déplacer les blocs de mémoire sans se préoccuper du processus, juste en maintenant à jour la table de conversion. Par exemple, pour mettre sur disque la mémoire d'un processus qui ne fait rien et libérer de la place
- conséquence : on peut avoir plus de mémoire utilisée que l'on n'a de mémoire physique
- isolation des processus : un processus ne manipulant pas des adresses réelles, c'est d'autant plus facile d'éviter qu'il n'accède à la mémoire d'un autre processus
- facilite la manipulation des adresses : un processus étant seul dans son espace d'adressage, il n'a pas à tenir compte d'autres processus
- souplesse de l'allocation
 
C'est ce dernier point qui intervient ici. On peut considérer que les adresses < 2 Go sont celles du processus et que celles > 2 Go pointent en fait vers les données/procédures du noyau :)  
Donc, tous les processus accédant à une adresse > 2 Go accéderont au même endroit. Par contre 2 processus qui accéderaient à une même adresse virtuelle < 2 Go accéderaient en fait à des données stockées en mémoire physique à des endroits différents.
 
Lors d'un accès mémoire, une conversion est faite par le processeur (avec l'aide de l'OS) pour retrouver l'adresse réelle des données à partir de l'adresse virtuelle fournie par le processus.
 
L'espace d'adressage (ensemble des adresses accessibles) est sur 4 Go, mais l'OS ne va évidemment pas les allouer en mémoire dès que tu lances un processus (pour un bloc-note ou un démineur, ce serait gâché). En faisant "new", tu vas demander l'allocation de mémoire physique que l'OS fera correspondre à certaines des adresses virtuelles :)  

Spoiler :

C'est pas compliqué mais j'ai du mal à l'expliquer clairement :pt1cable:


Message édité par mrbebert le 01-12-2010 à 22:41:11

---------------
Doucement le matin, pas trop vite le soir.
n°2039581
bjone
Insert booze to continue
Posté le 02-12-2010 à 10:50:49  profilanswer
 

Tout en rajoutant que la pagination permet le partage de pages physiques entre plusieurs process.

n°2040418
Taz
bisounours-codeur
Posté le 07-12-2010 à 00:16:31  profilanswer
 

Glock 17Pro a écrit :


  :ange: oui c'est un code que j'ai repris


Code :
  1. std::vector<std::string> *vec2 = new std::vector<std::string>[100000000];


 
Quizz:
1) ce code alloue un vector de 100000000 de string;
2) ce code alloue un "tableau" de 100000000 vector de string?

n°2040480
Glock 17Pr​o
Posté le 07-12-2010 à 13:15:56  profilanswer
 

je dirais 2.
Ca peut avoir un sens si on veut une matrice  avec 100000000 de lignes et un nombre variable de colonne, non ?


Message édité par Glock 17Pro le 07-12-2010 à 13:17:19

---------------
.
n°2040560
theshockwa​ve
I work at a firm named Koslow
Posté le 07-12-2010 à 17:52:25  profilanswer
 

J'imagine mal ce cas arriver, de toute façon, tu pourras toujours faire des assertions sur ce que contient ta matrice pour avoir une structure plus adaptée (genre matrices creuses ou je ne sais quoi)


---------------
last.fm
n°2040610
Glock 17Pr​o
Posté le 07-12-2010 à 21:37:41  profilanswer
 

imaginons on veut classifier 100M de molécules en précisant pour chacune un nombre variable de caractéristiques et on veut l'avoir en RAM car on effectue toute une batterie de calcul  dessus... on a notre cas

Message cité 1 fois
Message édité par Glock 17Pro le 07-12-2010 à 22:51:49

---------------
.
n°2040686
theshockwa​ve
I work at a firm named Koslow
Posté le 08-12-2010 à 10:22:07  profilanswer
 

dans ce genre de cas, tu vas travailler avec des Deques, pas des vectors ou des tableaux, parce que précisément, tu n'as pas un strict besoin que tout soit contigu sur l'ensemble de tes données, que ce soit contigu par parties va être suffisant pour te fournir un niveau de performance raisonnable dans ton parcours tout en te retirant tes contraintes ahurissantes sur la mémoire.


---------------
last.fm
n°2040690
Glock 17Pr​o
Posté le 08-12-2010 à 10:43:13  profilanswer
 

je veux bien que tu précises concernant l'aspect contigu.
de ce que je comprends avec vector la mémoire est contigu mais pas avec dequeu ? elle serait comment alors ? un bout sur le disque dur
 
pas sûr de comprendre
merci

Message cité 1 fois
Message édité par Glock 17Pro le 08-12-2010 à 10:49:09

---------------
.
n°2040773
bjone
Insert booze to continue
Posté le 08-12-2010 à 13:54:25  profilanswer
 

Glock 17Pro a écrit :

imaginons on veut classifier 100M de molécules en précisant pour chacune un nombre variable de caractéristiques et on veut l'avoir en RAM car on effectue toute une batterie de calcul  dessus... on a notre cas


 
std::vector<CMolecule>...
 
ton exemple est trop vague/ingénu.

n°2040916
theshockwa​ve
I work at a firm named Koslow
Posté le 08-12-2010 à 17:07:41  profilanswer
 

Glock 17Pro a écrit :

je veux bien que tu précises concernant l'aspect contigu.
de ce que je comprends avec vector la mémoire est contigu mais pas avec dequeu ? elle serait comment alors ? un bout sur le disque dur
 
pas sûr de comprendre
merci


 
que tu utilises un vector, un tableau ou un deque, ta mémoire sera probablement en partie en swap sur le disque dur si tu manipules de trops gros volumes de données. C'est l'adressage virtuel de ta machine qui le permet (ca a été expliqué quelques posts plus haut).
 
La contrainte que tu as quand tu fais un vector ou un tableau, c'est que tous les éléments contenus sont contigus, ca implique que tu as besoin de trouver une plage libre énorme dans ton espace d'adressage virtuel.
 
Si tu passes par un deque, tu estomperas tes contraintes mémoires sur l'adressage virtuel. Tu peux voir un deque comme un ensemble de vecteurs. tes données sont contigües par partie.


---------------
last.fm
n°2040920
Glock 17Pr​o
Posté le 08-12-2010 à 17:13:05  profilanswer
 

je vois merci


---------------
.
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  nombre de cases mémoire dans un système 32 bits

 

Sujets relatifs
Limitation du nombre de connexions sur un portSystème open source de gestion de matériels
Compter le nombre de fois ou le meme mot apparait ?aide pour detecter les acteurs et les uses cases
aide pour algo "somme des chiffres d'un nombre"Contraintes php/mysql pour site à grand nombre de visiteurs
[RESOLU]Convertir un nombre entier en decimal si ce nombre est plus...système de popup javascript
Générer les pages plutôt que système de cacheAttribuer un nombre à du texte sur liste déroulante
Plus de sujets relatifs à : nombre de cases mémoire dans un système 32 bits


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR