Je pense que les deux font le même travail, comment décider lequel utiliser pour la synchronisation ?
Réponses
Trop de publicités?La règle d'utilisation des spinlocks est simple : utilisez un spinlock si et seulement si le temps réel pendant lequel le verrou est maintenu est limité et suffisamment petit.
Notez que les spinlocks généralement implémentés par l'utilisateur ne satisfont pas à cette exigence car ils ne désactivent pas les interruptions. À moins que les préemptions ne soient désactivées, une préemption pendant qu'un spinlock est maintenu viole l'exigence de temps limité.
Une taille suffisamment petite est une question d'appréciation et dépend du contexte.
Exception : certaines programmations du noyau doivent utiliser un spinlock même lorsque le temps n'est pas limité. En particulier, si une unité centrale n'a pas de travail à faire, elle n'a pas d'autre choix que de tourner jusqu'à ce qu'il y ait plus de travail.
Danger particulier : dans la programmation de bas niveau, faites très attention lorsque plusieurs priorités d'interruption existent (il y a généralement au moins une interruption non masquable). Dans ce cas, les préemptions de priorité supérieure peuvent s'exécuter même si les interruptions à la priorité du fil sont désactivées (comme les services matériels prioritaires, souvent liés à la gestion de la mémoire virtuelle). Pour autant qu'une séparation stricte des priorités soit maintenue, la condition de temps réel borné doit être relâchée et remplacée par un temps système borné à ce niveau de priorité. Notez que dans ce cas, non seulement le détenteur du verrou peut être préempté, mais que le spinner peut également être interrompu ; ce n'est généralement pas un problème car il n'y a rien à faire.
L'utilisation de spinlocks sur un système à un seul cœur/un seul processeur n'a généralement aucun sens, car tant que le polling du spinlock bloque le seul cœur de processeur disponible, aucun autre thread ne peut s'exécuter et comme aucun autre thread ne peut s'exécuter, le verrou ne sera pas déverrouillé non plus. En d'autres termes, un spinlock ne fait que gaspiller du temps CPU sur ces systèmes, sans aucun avantage réel.
C'est faux. Il n'y a pas de perte de cycles cpu en utilisant les spinlocks sur les systèmes uniprocesseurs, car une fois qu'un processus prend un spin lock, la préemption est désactivée, donc en tant que tel, il ne peut y avoir personne d'autre qui tourne ! C'est juste que l'utiliser n'a aucun sens ! Par conséquent, les spinlocks sur les systèmes Uni sont remplacés par preempt_disable au moment de la compilation par le noyau !
- Réponses précédentes
- Plus de réponses
1 votes
Duplicata possible de Spinlock contre Sémaphore !
13 votes
Mutex et Semaphore ne sont pas la même chose, donc je ne pense pas que ce soit un doublon. La réponse de l'article référencé l'indique correctement. Pour plus de détails, voir barrgroup.com/Embedded-Systems/How-To/RTOS-Mutex-Semaphore