[gull] Truc et astuces: multithread en bash

Daniel Cordey dc at pxcluster.com
Wed Dec 30 00:19:57 CET 2020


> On Tue, Dec 29, 2020 at 05:53:07PM +0100, Marc Mongenet wrote:

Je réponds à Marc de manière générale, en me référant aux autres 
derniers mails à ce sujet.


>> Je n'étais jamais tombé sur la confusion entre thread et processus
>> avant aujourd'hui.
> Moi non plus (uniquement la formulation générale "c'est du multithread"
> qui est suffisamment vague pour signifer tout).

Il y a en effet confusion et c'est ce qui a engendré ma réponse à Félix. 
Comme Marc l'a dit, le multi-thread a longtemps été boudé par le monde 
UNIX et c'est, il me semble, dans les première versions Berkeley que 
l'on a vu arrivé les "threads" sous UNIX. Jusque là, on ne disposait que 
des outils classiques de multi-processing avec fork/exec et les 
shm/sem/msg pour les gérer.

>> Peut-être que par chance cette confusion entre thread et processus
>> reste cantonnée à la littérature sur Bash?
> On parle plutôt de jobs et de jobs control, dans bash, que de thread ou
> de processus. Ce sont bien sûr des processus, bash n'étant à ma
> connaissance pas multithreadé (au sens thread usuel).

En effet, bash n'est pas en mesure de gérer des "threads". Il est donc 
faux de parler de multi-thread en bash.

La confusion est entretenue par plein de gens qui n'ont pas compris les 
différences entre les deux. Ce n'est pas vraiment une grosse différence 
au niveau du kernel, mais une différence de la manière dont l'un ou 
l'autre sont gérés. Tout process a au moins un thread (le maître) et 
tous les autres threads doivent être créés à partir de celui-ci. Un 
thread partage donc la mémoire (intégralement, y compris la shered 
memory) avec les autres threads, ainsi que les fichiers du programme 
principal. Un thread a donc son propre stack, mais il n'y a pas de 
duplication de code/data comme avec un fork. Si un thread ferme un 
fichier, celui-ci se ferme aussi pour les autres threads, y compris le 
process principal. A contrario, lors d'un fork, on hérite des fichiers 
du programme appelant, mais en ayant des structures différentes ainsi 
que toute les segments data entièrement indépendants. Ce qui fait que si 
l'on ferme un fichier dans le processus issu d'un fork, ceci n'affecte 
en rien le programme appelant. Il y donc un lien très fort en entre les 
threads, alors que ce lien n'existe pas entre des processus issus d'un 
fork. Autre exemple, on peut envoyer un signal a un process, et seul 
celui-ci sera affecté, alors que si l'on envoie un SIGTERM à un thread 
(pthread_kill) on tue ce thread et le process qui l'héberge... tuant 
aussi tous les autres threads associés à celui-ci. On voit donc que les 
threads sont très orientés "synchrone", alors que les process (PID) sont 
avant tout orientés de manière à être indépendants et asynchrones (sans 
que l'on soit empêcher de passer d'un mode à un autre).

La confusion est sans doute issue du monde Java qui fait un usage très 
intense des "threads" en négligeant totalement que dans certains cas le 
multi-process pourrait être plus efficace (le compilateur ayant aussi de 
la peine à comprendre une écriture logique et propre de la séquence 
bind/accept/select). Il y a donc toute une génération qui ne comprend 
que les threads et qui ne parle que de ça.

Pour que ce soit bien compris par les autres lecteurs silencieux de la 
liste, il existe plein d'articles qui expliquent ces différences sur le 
net, dont :

https://linux-attitude.fr/post/processus-et-threads

Donc, à partir du moment où un fait un fork... on fait du 
multi-processing et non du multi-threading. Deuxièmement, à partir du 
moment où on ne peut pas échanger les valeurs au travers de symboles 
(variable) partagées, et que l'on est donc obligé d'avoir recours à un 
file/socket pour le faire, on est aussi en multi-process et non en 
multi-thread.

Le script de Félix est donc du multi-process, et non du multi-threading. 
Il partage élégamment des fichiers pour échanger des informations et 
utilise un fork/exec (ping); ce qui le place en effet dans la notion de 
multi-process .

Pour bien comprendre ces différences, j'encourage quiconque à pratiquer 
un peu de code dans les deux modes avec un langage permettant le 
multi-threading, comme Python, C/C++, Java (et d'autres mais pas PHP, ni 
Perl, ni Bash). Par exemple :

https://www.tutorialspoint.com/python/python_multithreading.htm

Bonne soirée

dc




More information about the gull mailing list