Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

des instructions atomiques en C à l'assembleur




  1. #1
    cosmoff

    des instructions atomiques en C à l'assembleur

    bonjour à tous,

    voila j'utilise de temps en temps des instructions atomiques et j'aimerais connaitre l'équivalent en code assembleur. Je ne trouve pas du tout comment en assembleur on arrive à bloquer l’accès d'une variable en mémoire pour d'autre processus ou thread.

    merci d'avance pour votre aide

    -----


  2. Publicité
  3. #2
    pm42

    Re : des instructions atomiques en C à l'assembleur

    Citation Envoyé par cosmoff Voir le message
    voila j'utilise de temps en temps des instructions atomiques et j'aimerais connaitre l'équivalent en code assembleur. Je ne trouve pas du tout comment en assembleur on arrive à bloquer l’accès d'une variable en mémoire pour d'autre processus ou thread.
    Les instructions atomiques sont une chose, le blocage de l'accès à une variable (typiquement via un mutex ou équivalent) en est une autre. On utilise les 1ère parce qu'elle ne bloque pas justement.
    Mais les instructions assembleur sont de type test-and-set et compare-and-swap. Les articles Wikipedia (et stackoverflow) en anglais détaillent pas mal.

  4. #3
    cosmoff

    Re : des instructions atomiques en C à l'assembleur

    Citation Envoyé par pm42 Voir le message
    Les instructions atomiques sont une chose, le blocage de l'accès d'une variable (typiquement via un mutex ou équivalent) en est une autre.
    il me semblait justement qu'une instruction atomique bloquait les acces d'une zone mémoire. Par exemple en C l'appel systeme write() est une instruction atomique qui permet de bloquer l'acces a d'autre processus ou thread vers une meme zone mémoire, non ?


  5. #4
    pm42

    Re : des instructions atomiques en C à l'assembleur

    Citation Envoyé par cosmoff Voir le message
    il me semblait justement qu'une instruction atomique bloquait les acces d'une zone mémoire
    Cela dépend du niveau auquel on considère l'atomicité. Comme tu en parles au niveau assembleur, j'en déduis instruction du processeur et dans ce cas, on utilise justement les instructions atomiques pour ne pas bloquer d'accès à une zone mémoire : c'est plus rapide et cela augmente la concurrence entre threads.

    Citation Envoyé par cosmoff Voir le message
    Par exemple en C l'appel systeme write() est une instruction atomique qui permet de bloquer l'acces a d'autre processus ou thread vers une meme zone mémoire, non ?
    A ma connaissance, write permet d'écrire dans un fichier.

    Ensuite, bloquer l'accès d'un autre thread est très différent de bloquer l'accès d'un autre processus : les threads partagent le même espace mémoire, les processus absolument pas sauf à utiliser de la mémoire partagée et là, on a d'autres mécanismes de synchronisation, typiquement des sémaphores.

  6. #5
    PA5CAL

    Re : des instructions atomiques en C à l'assembleur

    Bonsoir

    La réalisation d'opérations atomiques dépend du type d'opération et du type d'environnement matériel.

    Certaines opérations sont atomiques par nature, parce que le matériel veille à ce que l'instruction machine unique qui les invoque soit menée sans interaction jusqu'à son terme. Mais ce n'est pas toujours vrai, notamment dans certaines architectures CISC parallélisées ou multiprocesseurs, où plusieurs instructions uniques peuvent être exécutées concomitamment sur plusieurs cycles, et sans précaution risqueraient de se perturber mutuellement.


    On dispose généralement de mécanismes, puis ou moins complexes, qui permettent de rendre atomique une opération nécessitant une séquence de plusieurs instructions machine.

    Dans les cas les plus simples, il suffit d'interdire les interruptions durant l'exécution de cette séquence pour la rendre atomique.

    Par exemple, sur un micro-contrôleur AVR, on se contente le plus souvent de désactiver les interruptions avant la séquence (CLI = Clear Interrupt Flag) et de les réactiver après (SEI = Set Interrupt Flag) :
    Code:
      CLI          ; désactive les interruptions
      LDS  R16,VAR ; réalise l'opération atomique
      SUBI R16,63  ;
      STS  VAR,R16 ;
      SEI          ; réactive les interruptions
    ou dans le cas où l'état du flag d'interruption est inconnu, de sauver la valeur de ce dernier avant de désactiver les interruptions puis de rétablir cette valeur après la séquence atomique :
    Code:
      IN   R18,SREG ; sauvegarde les flags
      CLI           ; désactive les interruptions
      LDS  R16,VAR  ; réalise l'opération atomique
      SUBI R16,63   ;
      STS  VAR,R16  ;
      OUT  SREG,R18 ; rétablit les flags
    De plus, un registre intermédiaire de 8 bits peut stocker provisoirement le poids forts d'une valeur sur 16 bits susceptible d'évoluer, au moment de l'accès au poids faible :
    Code:
     ; écrit 0x01FF dans le registre de comptage du timer 16 bits
      LDI R19,0x01   ; prépare le poids faible (0x01)
      LDI R18,0xFF   ; prépare le poids fort (0xFF)
      CLI            ; désactive les interruptions
      OUT TCNTnH,R19 ; charge le registre intermédiaire avec le poids fort
      OUT TCNTnL,R18 ; effectue l'écriture du registre sur 16 bits (0x01FF)
      SEI            ; réactive les interruptions
    ...
    ; lit la valeur du registre de comptage du timer 16 bits
      CLI            ; désactive les interruptions
      IN R18,TCNTnL  ; effectue la lecture du registre sur 16 bits et récupère le poids failble
      IN R19,TCNTnH  ; récupère le poids fort depuis le registre intermédiaire
      SEI            ; réactive les interruptions

    Dans des cas plus complexes, le parallélisme des opérations nécessite d'ajouter des instructions afin de les synchroniser avant de réaliser une opération atomique. Par exemple, sur les ARM Cortex-M, on trouve les instructions machine :
    - DSB (Data Synchronization Barrier) qui impose que tous les accès mémoire avant cette instruction seront terminés avant de commencer l'exécution des instructions suivantes.
    - DMB (Data Memory Barrier) qui impose que tous les accès mémoire avant cette instruction seront terminés avant de commencer les accès mémoire suivant l'instruction.
    - ISB (Instruction Synchronization Barrier) force le rechargement du pipeline d'instructions, de sorte que toutes les modifications du contexte par les instructions précédentes soient prises en compte avant d'exécuter les instructions suivantes.
    Dernière modification par PA5CAL ; 02/01/2019 à 20h49.

  7. A voir en vidéo sur Futura

Discussions similaires

  1. Instructions string
    Par gecompany dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 14/05/2011, 11h55
  2. Réponses: 7
    Dernier message: 17/12/2010, 00h39
  3. Réponses: 5
    Dernier message: 14/05/2010, 17h47
  4. Instructions AT ELZ50
    Par thomasalbert1993 dans le forum Électronique
    Réponses: 3
    Dernier message: 03/05/2008, 10h40
  5. instructions??
    Par eul boïau rouge dans le forum Électronique
    Réponses: 3
    Dernier message: 16/11/2006, 15h36