Fork et consommation memoire - Codes et scripts - Linux et OS Alternatifs
Marsh Posté le 22-01-2003 à 15:37:37
en C, je crois ke tout est duplique
en effet, le pere et le fils n ont pas acces a la meme memoire (copie des variables et pointeurs) avec un fork classique
pour partager la mem (en C tjs), il fo utiliser vfork
voilou
Marsh Posté le 22-01-2003 à 15:46:35
tomate77 a écrit : en C, je crois ke tout est duplique |
ok merci
et meme le code est dupliqué? c'est pas du "lecture seule" et partagé par les processus (une histoire de "réentrance standard des processus" ) ? ca ca marche que pour un fork et pas en lancant duex processus" à la mains" non? et le copy on write ca intervient sur la partie non "lecture seule" c'est ca?
je suis desolé de poser des questions debiles, je suis totalement nouveau dans ce monde sans pitiée des OS unix!
Marsh Posté le 22-01-2003 à 16:07:09
desole je sais po ce ke c est ke "copy on write" ou autre
je sais ke les process crees par le pere ne partage pas grand chose (copie des variables, pour le code je ne sais pas du tout)
mais 2 process lances a la main ne partagent rien (ca c est sur !), pour le fork, le pere connait le pid du fils (le fils ne connait pas le pid du pere je crois puisque 0 est renvoye dans le cas ou on se trouve ds le fils)
voilou
Marsh Posté le 22-01-2003 à 16:25:00
tomate77 a écrit : desole je sais po ce ke c est ke "copy on write" ou autre |
Moi je sais, mais c'est trop long à expliquer pendant que je bosse. Dans la pratique, même si on a l'impression que tout est dupliqué, c'est pas forcément le cas en réalité.
Marsh Posté le 22-01-2003 à 16:28:06
Tomate77, quand on ne sait pas, on se tait.
Sous Linux, le fork est implémenté par clone(), donc sans rien copier. Les processus gardent les mêmes zones mémoire, sauf que le processus fils n'a pas les droits d'écriture sur ces pages. À chaque fois qu'il essaie d'écrire sur une nouvelle page, ça génère une exception (puisqu'il n'a pas les droits) et la page est copiée (copy-on-write) pour qu'il puisse le faire. Conclusion, seules les pages (de 4 Ko) utilisées par les deux processus pour y écrire des données sont réellement copiées.
Donc quand le système t'affiche 8×12 Mo, c'est en fait de la mémoire partagée, à part les quelques pages qui diffèrent entre tes processus (plus le contexte d'exécution).
Note bien que même quand tu lances plusieurs fois le programme, le code et les bibliothèques partagées sont mappés en mémoire, mais ne sont lus sur le disque que si nécessaire (bien entendu dans la même zone mémoire pour tous les processus), donc là aussi la taille de tes processus est surestimée.
Marsh Posté le 22-01-2003 à 16:39:21
donc lancer deux processus dans deux terminaux, ou lancer deux processus avec un '&', ou lancer un processus qui fork ca revient exactement au meme?
sous windows c'est tout dupliqué (meme les dll)?
ou faut-il que je regarde pour voir la consommation memoire reelle?
Marsh Posté le 22-01-2003 à 16:41:33
oups j'avais pas bien lu ton message! tu repond à ma question!
merci beaucoup à vous tous!
Marsh Posté le 22-01-2003 à 16:43:08
pospos a écrit : donc lancer deux processus dans deux terminaux, ou lancer deux processus avec un '&', ou lancer un processus qui fork ca revient exactement au meme? |
Non, car un processus qui forke garde toutes les pages mémoire en commun.
Citation : sous windows c'est tout dupliqué (meme les dll)? |
Je n'en sais rien.
Citation : ou faut-il que je regarde pour voir la consommation memoire reelle? |
La seule méthode fiable, c'est de regarder ta mémoire utilisée avant et après le lancement (attention au buffer cache, c'est traître dans la mesure).
Marsh Posté le 22-01-2003 à 17:49:29
c super sympa, j aide plus personne ds ce cas
Jar Jar t etonne pas si peu de personnes veulent passer a linux, vu comment tu reponds gentiement
Marsh Posté le 22-01-2003 à 18:27:26
tomate77 a écrit : c super sympa, j aide plus personne ds ce cas |
C'est peut-être très gentil de vouloir répondre et ça part certainement d'un bon sentiment, mais si c'est pour répondre des conneries en avouant que tu ne sais pas vraiment de quoi tu parles, il vaut mieux se taire.
Marsh Posté le 22-01-2003 à 19:35:46
En tout cas les pages de code ne sont pas dupliqués.
Tu perds qq ko du a la nouvelle table de MMU du process aussi
Marsh Posté le 22-01-2003 à 15:32:06
bonjour!
bon j'ai une question concernant la facon dont la memoire est gérée lors d'un fork:
je viens du monde windows, et pour moi faire un fork ca revien purement et simplement à lacer un deuxieme process, avec donc une consommation double de la memoire
ca se passe comment sous linux? j'ai entendu parler de "Copy-On-Write", kk1 pourrait m'eclairer la dessus?
en fait voila mon probleme concret:
j'ai un script perl, developpé sous win2k, et qui a besoin d'etre lancé en plusieurs exemplaires.
j'avais tout d'abord pensé utiliser les nouvelles possibilités multithread de perl 5.8, mais c'est pas encore la folie (tout est dupliqué, ca bouffe de la ram à mort).
Donc pour l'instant je lance plusieurs process, mais chacun me bouffe environ 12Mo (interpreteur perl + librairies + ...)
j'ai essay sous linux, en lancant egalement les process un par un, et ca me fait la meme chose (12Mo par porcess)
esque si je fais un fork dans le code perl (ou que je le lance avec un '&' dans le terminal, c'est pareil k'un fork?) ca me bouffera pas 12Mo pour chaque process?
merci de vos reponses, messieurs les gourous de l'unix !!