advanced UNIX :mmap()

advanced UNIX :mmap() - Programmation

Marsh Posté le 08-04-2002 à 11:19:49    

bonjour,    
je suis face au problème suivant : je veux partager beaucoup de mémoires entre deux process, je voudrais le faire en utilisant mmap().    
je suis sous linux, j'ai donc pensé à utiliser shmget (shared memory d'ipc) mais cela permet d'alouer 4M au max  hors il me faudrait 32M environ... (1024*768*32*10)    
quelqu'un sait il ce qui se passe si    
1/ je crée un fichier    
2/ je le mmap plusieurs fois avec des offset diff    
3/ je modifie la mémoire (ce qui est equivalent à écrire dans le fichier)    
4/ je ne fais pas de msync()    
   
est ce que cela va : fonctionnner de la manière attendue cad allouer de la mémoire, permettre de modifier cette mémoire (les bons flags sont possitionés) entre divers process    
   
en fait je me pose la question : que ce passe t il si l'on mmap() un fichier avec un offset en dehors du fichier (par ex un fichier de 1ko mmapé avec un offset de 1M)?

Reply

Marsh Posté le 08-04-2002 à 11:19:49   

Reply

Marsh Posté le 08-04-2002 à 11:56:54    

Si tu veux partager beaucoup de mémoire, ça ne serait pas plus simple d'utiliser des threads POSIX ?


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

Marsh Posté le 08-04-2002 à 13:18:30    

Jar Jar a écrit a écrit :

Si tu veux partager beaucoup de mémoire, ça ne serait pas plus simple d'utiliser des threads POSIX ?  




Sauf qu'il veut partager de la mémoire entre 2 process, pas 2 threads.
 
Quel est l'intéret d'utiliser des threads pour partager de la mémoire entre processus distincts?
Sauf si les process sont crés avec la commande fork(), auquel cas je suis d'accord avec toi: il serait sans doute possible de revoir un peu la conception du programme pour qu'il soit multithrred au lieu de multiprocess.

Reply

Marsh Posté le 08-04-2002 à 14:29:20    

oui je sais, c'est déjà un multithread  
mais en fait l'api de ma lib utilise des commandes posix like : open, close, read, write, ioctl, mmap...  
   
et je me suis demandé s'il ne serait pas possible d'utiliser le vrai mmap pour faire une bonne partie du travail... surtout que je veux à therme permettre d'interrompre le système et de résumer et utiliser mmap pour sauvegarder les buffers cela me semble une bonne idée : je crée un fichier je le mmap, tant que je ne fais pas de msync rien n'est écrit, et si je veux sauvegarder j'ai juste à faire un msync...  
le problème c'est de savoir ce qui se passe si l'on mmap après la fin.....  
je vais tester ce soir...  
 
et puis il y aurait peut être besoin de partage entre process... je suis en pleine exploration alors les idées elle pleuvent et souvent je m'aperçoit après coup que ce n'est pas une si bonne idée.... :pt1cable:

 

[jfdsdjhfuetppo]--Message édité par cityhunterxyz--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 09-04-2002 à 10:34:16    

bon voici la réponse :
si l'on mmap un fichier et qu'on accède en dehors du fichier alors on a un sigbus....
pour la mémoire partagée utiliser shm_open() qui n'est pas dans les man pages mais dispo dans <sys/mman.h> c'est une commande posix... :)
et c'est plus facile à utiliser que shmget() ;)
!!!! shm_open retourne un fd ce dernier peut être fermé avec close() mais il semble que la mémoire ne soit désalouée qu'avec l'appel à shm_unlink() !!!

Reply

Sujets relatifs:

Leave a Replay

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