J'ai écrit une application Linux dans laquelle le processus principal de 'consommateur' forge un tas de processus 'lecteur' (~ 16) qui lisent les données du disque et les transmettent au 'consommateur' pour l'affichage. Les données sont passées sur un socket qui a été créé avant la fourche en utilisant socketpair.Si vous utilisez la mémoire partagée, y a-t-il encore des avantages pour les processus sur le threading?
Je l'origine écrit avec cette limite de processus pour 3 raisons:
Le processus de consommation a des contraintes en temps réel, donc je voulais éviter les allocations de mémoire dans le consommateur. Les lecteurs sont libres d'allouer de la mémoire comme ils le souhaitent, ou même d'être écrits dans une autre langue (par exemple avec la récupération de place), et ceci n'interrompt pas le consommateur, qui a la priorité FIFO. En outre, l'accès au disque ou d'autres E/S dans le processus de lecture n'interrompra pas le consommateur. Je me suis dit qu'avec des fils, je ne pouvais pas obtenir de telles garanties. L'utilisation de processus m'empêchera, le programmeur, de faire des choses stupides comme l'utilisation de variables globales et l'effondrement de la mémoire d'autres processus. Je pensais que le fait d'abandonner un tas de travailleurs serait le meilleur moyen d'utiliser plusieurs architectures CPU, et je me suis dit que l'utilisation de processus au lieu de threads serait généralement plus sûre.
Tous les lecteurs ne sont pas toujours actifs, mais ceux qui sont actifs envoient constamment de grandes quantités de données. Dernièrement, je pensais que pour optimiser cela en évitant les copies de mémoire associées à l'écriture et à la lecture de la socket, il serait bon de simplement lire les données directement dans un tampon de mémoire partagée (shm_open/mmap). Alors seulement un index dans cette mémoire partagée serait passé au-dessus de la douille, et le consommateur lirait directement de lui avant de le marquer comme disponible encore.
De toute façon, l'un des plus grands avantages des processus par rapport aux threads est de évitez d'écraser l'espace mémoire d'un autre thread. Pensez-vous que le passage à la mémoire partagée détruirait tous les avantages que j'ai dans cette architecture? Y a-t-il encore un avantage à utiliser des processus dans ce contexte, ou devrais-je simplement passer mon application à utiliser des threads?
Vraiment? D'une certaine façon, j'avais l'impression que si 'malloc' ressentait le besoin d'augmenter la taille du tas en utilisant' sbrk', cela pourrait bloquer tout le processus. De même, si un thread effectue des opérations de mémoire qui créent une erreur de page, il peut bloquer tous les threads dans le processus. Peut-être que c'est faux? – Steve
C'est faux. Il ne fait que bloquer le fil. Strictement parlant, il s'agit d'un détail d'implémentation (sauf peut-être sur les systèmes conformes à l'option POSIX realtime?), Mais aucune implémentation sensée ne permettrait à aucune de ces opérations de bloquer d'autres threads. Certainement sur Linux, les BSD, et tout autre Unix grand public c'est seulement le fil qui se bloque. –
D'accord, merci pour l'info. – Steve