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

  FORUM HardWare.fr
  Programmation
  C++

  Chargement d'un programme en mémoire

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Chargement d'un programme en mémoire

n°939658
Z3RgSp4wN
Posté le 06-01-2005 à 22:10:44  profilanswer
 

L'OS charge-t-il les fonctions d'un programme dans la RAM ?
Que devienne les fonctions definit mais non utilisées ? Car les fonctions non apelées n'ont aucun interet ds un programme (sauf pour les DLLs) donc je voulais savoir si j'avais à m'inquiéter en ce qui concerne le poid de l'executable et la RAM utilisé lorsque je créer un fonction...
Merci

mood
Publicité
Posté le 06-01-2005 à 22:10:44  profilanswer
 

n°939663
ffomnislas​h
Posté le 06-01-2005 à 22:15:24  profilanswer
 

C'est une bonne question dont j'aimerais bien connaitre la reponse

n°939664
chrisbk
-
Posté le 06-01-2005 à 22:17:20  profilanswer
 

une fonction ca pese pas lourd, en taille mémoire, bien moins que les inévitables données...

n°939716
yulara
Byte Hunter
Posté le 06-01-2005 à 22:56:41  profilanswer
 

tout depend de ton environnement.
si tu es sur PC, c'est royal donc la taille du code est pas primordiale.
si tu es dans l'embarqué, vaut mieux tout optimiser sinon tu feras vite de la chasse à l'octet. bien sur, dans ce cas tu es obligé de faire un compromis entre place memoire et vitesse d'execution.


Message édité par yulara le 06-01-2005 à 23:04:32

---------------
Quizz'n'Blind pour tester vos connaissances
n°939745
++fab
victime du syndrome IH
Posté le 06-01-2005 à 23:20:49  profilanswer
 

pour exécuter un programme, l'OS crée un processus.
Dans l'espace d'adressage du processus, il y a notament un segment text, qui contient le code.
l'OS mappe en mémoire certaines parties de l'espace d'adressage du processus, qui sont utilisé pour l'exécution.
Si tu n'utilises pas une fonction, elle ne sera pas dans l'exécutable, donc pas dans l'espace d'adressage, donc pas dans la RAM.
C'est différent pour les librairies dynamiques, le fonctionnement est trop dépendant de l'OS, je crois, pour pouvoir généraliser ...
Z3RgSp4wN> tu cherches à prendre un cours d'info accéléré ?

n°939749
bjone
Insert booze to continue
Posté le 06-01-2005 à 23:24:34  profilanswer
 

et dans le cas où une fonction inutilisée se retrouverait dans le binaire du process, la pagination de l'os pourrait permettre d'évincer la page mémoire de la fonction si elle est n'est jamais touchée.
mais bon ça doit arriver rarement...


Message édité par bjone le 06-01-2005 à 23:25:01
n°939756
++fab
victime du syndrome IH
Posté le 06-01-2005 à 23:33:53  profilanswer
 

disons que la fonction est rarement utilisé, et que la page est rarement demandée alors.

n°939760
bjone
Insert booze to continue
Posté le 06-01-2005 à 23:43:32  profilanswer
 

voy

n°939821
Panini
Posté le 07-01-2005 à 08:46:37  profilanswer
 

Si la fonction n'est pas utilisée, elle est tout simplement éjectée par le compilateur, du moins elle devrait l'être.

n°939893
HelloWorld
Salut tout le monde!
Posté le 07-01-2005 à 10:13:08  profilanswer
 

+1
Mais surtout comment veux-tu que l'OS détecte une fonction non utilisée dans un exe ? Une fois que c'est compilé, il voit ça comme un gros paquet de code exécutable.
Le loader charge l'exe au fur et à mesure des faults pages. Si tu suis le lancement d'un exe avec un soft genre filemon qui traque le moindre accès disque, tu remarques le nombre de "pages" de 4Ko de l'exe qui sont lues au fur et à mesure de son exécution. C'est d'ailleurs pour ça que les exe compressés c'est mal car là tout est décompressé et présent en mémoire et l'OS ne peut pas paginer.
Une autre discussion précédente m'a laissé penser que Windows savait détecter la non utilité de certains modules mappés dans un exe, avec les fonctions graphiques et GDI quand la fenêtre est minimisée par exemple. Car il diminue alors la taille du working set du process, c'est à dire qu'il autorise des bouts de ce dernier à être viré de la RAM.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
mood
Publicité
Posté le 07-01-2005 à 10:13:08  profilanswer
 

n°940181
lsdYoYo
gravity powered
Posté le 07-01-2005 à 12:57:49  profilanswer
 

Je n'ai pas entendu parler de modules. Un source en C est composé de fichiers qui seront compilés en modules objets. On peut imaginer que des compilos soient assez intelligents pour ne pas compiler certaines fonctions déclarées en "static" mais l'intérêt est très limité, pour le reste, le compilo ne peut pas deviner si la fonction sera utilisée ou non par un autre module.
Toutes les fonctions seront donc présentes dans le module objet et intégrés dans des librairies (statiques ou DLL). Si une seule des fonctions existantes dans un module est appelée, le linkeur chargera l'ensemble du module qui sera donc présent dans le fichier exécutable ou en DLL externe.
Quant aux DLL sous Windows, l'OS les charge intégralement en RAM et non pas chaque module séparément (XP : lancer msinfo32.exe et aller dans Environnement logiciel / Modules chargés, y'a du monde).
En conclusion, si la taille du code exécutable est une priorité, il faut fractionner son source en modules séparés (fichier .c) notamment pour l'écriture de bibliothèques de fonctions, pratiquement un module par fonction...

n°940185
bjone
Insert booze to continue
Posté le 07-01-2005 à 13:04:34  profilanswer
 

pour les DLLs c'est pas parceque elle sont visibles qu'elles consomment des pages physiques, la pluspart des OS essayent de faire les choses à la demande.

n°940390
HelloWorld
Salut tout le monde!
Posté le 07-01-2005 à 16:05:06  profilanswer
 

Le terme module, je l'ai utilisé au sens module Windows, c.a.d essentiellement un fichier PE (exe, dll, ocx, ...)
Ces modules ne sont pas chargés intégralement en mémoire. Rienq ue les resources embarquées par exemple sont chargées à la demande.  

Citation :

Si une seule des fonctions existantes dans un module est appelée, le linkeur chargera l'ensemble du module qui sera donc présent dans le fichier exécutable ou en DLL externe.


Avec une lib statique, ca fait longtemps que les smart linker ne link que ce qui est nécessaire.

Citation :

Quant aux DLL sous Windows, l'OS les charge intégralement en RAM et non pas chaque module séparément


pas compris.

Citation :

En conclusion, si la taille du code exécutable est une priorité, il faut fractionner son source en modules séparés (fichier .c) notamment pour l'écriture de bibliothèques de fonctions, pratiquement un module par fonction...


Au point de vue code source, que tu ait 100.000 lignes de code dans 1 seul fichier ou 10.000 fichiers de 10 lignes ça revient au même, il faut compiler 100.000 lignes de code. Au linking un smart linker dégage tout seul ce qui n'est pas utilisé, donc je comprends pas ta conclusion.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°940420
Z3RgSp4wN
Posté le 07-01-2005 à 16:25:32  profilanswer
 

merci pour toute ces infos quelqu'un n'aurait pas un URL sur lequel je pourrait m'informer de comment marche les executable en mémoire ce qu'est une page... comment tout ça fonctionne en approfondie svp? Pour éviter de poser des questions sur ce forum...

n°940455
++fab
victime du syndrome IH
Posté le 07-01-2005 à 16:52:16  profilanswer
 

Z3RgSp4wN> des bouquins si tu veux ?
 
je crois que pour les librairies statiques, on est d'accord, si le linker fait bien son boulot, il n'y a pas de code inutile dans les exécutables.
Par contre les fichiers objet contiennent le code qu'on lui a demandé de compiler! meme les fonctions static "au sens C" (désuete en C++ au passage si c'est bien de cet utilisation de static dont lsdyoyo parle. Celles-ci sont compilées mais ne sont pas exportées).
Après pour les libs dynamiques, il y a pas mal d'OS qui utilise le mappage de fichiers. Les fichiers à mapper sont les bibliothèques dynamiques. L'OS mappe donc la lib dynamique, et fait en sorte de fixer les bonnes permissions  pour que d'autres processus puissent partager le code de la lib (on dit mapper aussi je crois, mais c'est pas terrible).
 
Pour en revenir à la question de départ, il ne faut pas présupposer qu'on a à faire a tel ou tel OS. Le principe de compilation, linkage, librairies statique et dynamique est bien fait et permet de se concentrer sur le C++, en faisant abstraction de l'environnement d'exécution.

n°940462
++fab
victime du syndrome IH
Posté le 07-01-2005 à 16:56:38  profilanswer
 

A un niveau au dessus, on fait aussi largement abstraction du mécanisme de gestion de la mémoire virtuelle. On fait confiance à ce mécanisme qui va évincé les pages inutilisés ...

n°940466
Z3RgSp4wN
Posté le 07-01-2005 à 16:59:13  profilanswer
 

C'est quoi la mémoire virtuelle ? (en vite fait)

n°940472
++fab
victime du syndrome IH
Posté le 07-01-2005 à 17:06:19  profilanswer
 

en vite fait, l'OS fait comme s'il avait beaucoup plus de mémoire qu'il n'en a réellement (physiquement).

n°940475
bjone
Insert booze to continue
Posté le 07-01-2005 à 17:08:14  profilanswer
 

c'est un espace de mémoire, découpé en pages qui peut être ou non en mémoire physique.
 
----------
 
c'est comme les clusters de la fat pour un disque dur, ton fichier quand tu le charges, c'est séquentiellement, mais en fait il peut être éclaté en petites portions sur tout la surface du disque (et donc ton application peut lire séquentiellement un fichier, mais le dur va pas arrêter des faire des allez-retours).  
 
-----
 
en gros ça permet:
 
1) séparer les espaces de travail entre les process (il ne peuvent pas se taper dessus les uns sur les autres)
 
2) de retarder le plus tard possible la consommation de la mémoire (tu peux allouer 1Go de ram sur une machine qui n'a que 64Mo, tant que tu te balades pas dans le Go, rien ne sera consommé)
 
3) gagner de l'espace mémoire physique, car par exemple plusieures ressources physiques peuvent être partagées via plusieurs espaces mémoire virtuels
 

n°940617
Z3RgSp4wN
Posté le 07-01-2005 à 19:24:56  profilanswer
 

le 1 Go de ressource il ne le stocke pas entierement en mem vive c'est ça ?!

n°940633
bjone
Insert booze to continue
Posté le 07-01-2005 à 19:31:38  profilanswer
 

valà, il y a un roulement des ressources qui est faite derrière.

n°940641
Z3RgSp4wN
Posté le 07-01-2005 à 19:37:59  profilanswer
 

Ok merci pour l'explication (même si certains vont piquer un crise parceque je cherche pas toujours sur google) ^^

n°940763
blackgodde​ss
vive le troll !
Posté le 07-01-2005 à 22:45:48  profilanswer
 

c'est quoi au fait le rapport avec la cat o_O


---------------
-( BlackGoddess )-
mood
Publicité
Posté le   profilanswer
 


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

  Chargement d'un programme en mémoire

 

Sujets relatifs
comment lancer son programme au démarrage[VC++] Utiliser TRACE dans un programme Win32
Programme pour automatiser une connexion a une site tt les 0.1 secondeLibération de mémoire qui ne se fait pas...
Programme Image--->MatriceUtiliser un fichier .c dans mon programme avec QT designer
[C] fork() - étudier la mémoireVBS- Executer et tester la presence d'un programme
[JDBC] Mon programme trouve pas les driversintegrer un programme dans la barre des taches...
Plus de sujets relatifs à : Chargement d'un programme en mémoire


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