Forum Linux.noyau comment marchent les mutex du point de vue du noyau

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
1
13
fév.
2019

Bonjour jeunes gens,

Je m'interroge sur comment fonctionnent les mutex. D'un point de vue assembleur il s'agit d'une instruction test_and_set, mais on peut très bien imaginer que deux threads en parallèles lancent au même coup d'horloge l'instruction test_and_set et donc le verrou du mutex n'aura pas le résultat espéré car aucun des threads a été bloqué.

J'imagine donc que le noyau gère cela, mais comment ? il existe un appel système pour modifier une variable ? mais même s'il y a un appel système, les deux threads peuvent très bien passer tous les deux en même temps en mode noyau et malheureusement travailler sur la même variable ?

bref je suis perdu.

Merci pour votre temps

  • # Instructions "atomiques"

    Posté par  (site web personnel) . Évalué à 4.

    Dans le sens où elles ne sont pas décomposables. Le test_and_set est une seule instruction qui fixe la valeur en mémoire et retourne la valeur précédente. Une autre tache ne peut pas intercaler une modification de la mémoire entre la lecture et la modification. Donc la tache qui arrive en second voit l'état de la mémoire modifiée par la première (et peut donc en déduire que la ressources est occupée).

    C'est généralement une instruction du processeur, surtout sur les machines multicœurs — il faut assurer l'atomicité de cette opération particulière vis-à-vis de la mémoire entre les différents cœurs.

    Python 3 - Apprendre à programmer dans l'écosystème Python → https://www.dunod.com/EAN/9782100809141

    • [^] # Re: Instructions "atomiques"

      Posté par  . Évalué à 1. Dernière modification le 13 février 2019 à 13:40.

      "il faut assurer l'atomicité de cette opération particulière vis-à-vis de la mémoire entre les différents cœurs."

      ok mais qui gere cette opération ?

      • [^] # Re: Instructions "atomiques"

        Posté par  . Évalué à 3.

        Intel en general. AMD de temps en temps ;)

        • [^] # Re: Instructions "atomiques"

          Posté par  . Évalué à 0.

          non ca ne peut pas être le processeur qui s'occupe de ca car sur un système multi coeur il n'y a aucun moyen de vérifier que deux threads lancent l'instruction test_and_set

          • [^] # Re: Instructions "atomiques"

            Posté par  (site web personnel) . Évalué à 4. Dernière modification le 13 février 2019 à 16:41.

            Hem, tu devrais creuser un peu le sujet avant d'exprimer ce genre de vérités.

            Il y a obligatoirement des synchros électroniques pour certaines opérations que peuvent faire les cœurs dès lors qu'ils sortent de leur fonctionnement interne (typiquement la prise en main des bus d'adressage pour les accès mémoires). Interne au proc quand on est en multicœur, et éventuellement externe (circuits dédiés) quand on est en multi-CPU.

            Python 3 - Apprendre à programmer dans l'écosystème Python → https://www.dunod.com/EAN/9782100809141

            • [^] # Re: Instructions "atomiques"

              Posté par  (site web personnel) . Évalué à 4. Dernière modification le 13 février 2019 à 16:42.

              Piste de recherche: "CPU multicore synchronization"

              Python 3 - Apprendre à programmer dans l'écosystème Python → https://www.dunod.com/EAN/9782100809141

              • [^] # Re: Instructions "atomiques"

                Posté par  . Évalué à 1.

                ok je ne savais pas que les processeurs étaient en quelques sorte connectés entre eux, je pensais qu'ils faisaient leurs vies chacun de leurs cotés.

                Donc si j'ai bien compris, des qu'il y a une instruction test_and_set fait par un processeur, tous les processeurs sont au courant, en gros c'est ca ?

                • [^] # Re: Instructions "atomiques"

                  Posté par  (site web personnel) . Évalué à 2.

                  Disons que s'ils essaient de faire un accès concurrent, par exemple sur la mémoire (le test and set est un accès mémoire atomique), ils sont d'une façon ou d'une autre électroniquement bloqués — je ne sais pas comment ça se traduit au niveau du cœur lui-même, probablement une mise en attente que le bus d'accès mémoire soit accessible (pour ça il faudrait voir l'architecture logique au niveau de l'électronique des processeurs).

                  L'information arrive donc quelque part sur chaque cœur au niveau d'une connexion électronique. Dans ce sens, on peut dire que tous les processeurs sont au courant, mais en fonctionnement normal un cœur ne la prend pas en compte dans sa logique.

                  Python 3 - Apprendre à programmer dans l'écosystème Python → https://www.dunod.com/EAN/9782100809141

                  • [^] # Re: Instructions "atomiques"

                    Posté par  . Évalué à 7.

                    mais en fonctionnement normal un cœur ne la prend pas en compte dans sa logique.

                    En fait si!
                    Les différents coeurs discutent en permanence selon un protocole spécialisé (qui passe par des bus dédiés) pour maintenir la cohérence des accès mémoire et des cache:
                    Protocole MOESI
                    En particulier dans le cas d'une instruction atomique "test and set", le coeur qui l'éxécute doit s'assurer de posséder en cache la donnée la plus à jour, se mettre en propriétaire exclusif sur la ligne de cache, invalider les caches des autres coeurs, mettre a jour la valeur, puis relâcher l'exclusivité pour permettre aux autres coeurs de recharger la nouvelle valeur.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.