Fork et consommation memoire

Fork et consommation memoire - Codes et scripts - Linux et OS Alternatifs

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 !! :jap:

Reply

Marsh Posté le 22-01-2003 à 15:32:06   

Reply

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 ;)

Reply

Marsh Posté le 22-01-2003 à 15:46:35    

tomate77 a écrit :

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 ;)


 
ok merci :jap:  
 
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!

Reply

Marsh Posté le 22-01-2003 à 16:07:09    

desole je sais po ce ke c est ke "copy on write" ou autre :D
 
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

Reply

Marsh Posté le 22-01-2003 à 16:08:56    

ok merci
je vais tester tout ca...

Reply

Marsh Posté le 22-01-2003 à 16:15:16    

de rien ;)

Reply

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 :D


 
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é.


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

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.


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
Reply

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?

Reply

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!

Reply

Marsh Posté le 22-01-2003 à 16:41:33   

Reply

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).


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
Reply

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 :pfff:

Reply

Marsh Posté le 22-01-2003 à 18:27:26    

tomate77 a écrit :

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 :pfff:

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.


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
Reply

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

Reply

Marsh Posté le 23-01-2003 à 10:21:53    

ne vous battez pas, vous m'avez tous bien aidé!
 
merci :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed