当前位置:网站首页>Atomic in golang, and cas Operations
Atomic in golang, and cas Operations
2022-07-07 01:07:00 【Raoxiaoya】
CASAlgorithme sans verrouillage
Pour obtenir un accès sans verrouillage(lock-free)L'algorithme de non - blocage de,Parmi euxCAS(Comparaison et échange,Compare and swap)C'est un algorithme célèbre sans serrure.CAS- Oui.CPUDirectives,Dans la plupart des architectures de processeurs,Y compris: IA32、SpaceTout ce qui est utilisé dansCASDirectives,CASC'est la technologie de verrouillage optimiste,Lorsque plusieurs Threads essaient d'utiliserCASLorsque la même variable est mise à jour en même temps,Un seul des Threads peut mettre à jour la valeur de la variable,Et tous les autres fils ont échoué,Les fils échoués ne sont pas suspendus,Mais on lui a dit que la compétition avait échoué,Et peut essayer à nouveau.
CASIngolangRéalisation
for {
if atomic.CompareAndSwapInt64(&data, old, new) {
return new
}
}
CompareAndSwap
Il y aura d'abord une comparaison,SidataLa valeur de est égale àold,Ensuite, l'opération de remplacement est effectuée ettrue,Si ce n'est pas égal à,Est retourné après avoir été manipulé par un autre threadfalse,Donc ça ne marche pas toujours,Surtout en cas de grande concurrence,Alors utilisezforLe cycle vient de la rotation.Quand il y a peu de chances qu'un conflit de synchronisation se produise,Cette hypothèse peut entraîner une amélioration significative des performances.
Généralement utiliséi++
Fonctionnement,Le processus est d'abord lu à partir de la mémoirei
,Et ajouter1,Et ensuite assigner une valeur à la mémoire,Il est clair que ce processus n'est pas atomique,On peut utiliserCAS Pour réaliser l'atomisation .
func AddInt64(addr *int64, inc int64) int64 {
for {
old := *addr
if atomic.CompareAndSwapInt64(addr, old, old+inc) {
return old
}
}
}
Alors...,Basé surCAS, Nous pouvons comparer et assigner des valeurs à une adresse mémoire ,Atomicité garantie.
atomic Généralement mis en œuvre par le langage d'assemblage ,Comme les fichiers.src/runtime/internal/atomic/atomic_386.s
CASDirectives
J'ai compris.CAS Qu'est - ce que ça veut dire? , Ensuite, nous allons explorer CASPrincipe de réalisation,EtCASDeComparaison+Affectation
Comment les processus sont atomiques .
CAS L'atomicité de soi est déterminée par CPUDirective à mettre en œuvre, Je n'ai pas trouvé de code. , Voici le Code en ligne .
// Adding a lock prefix to an instruction on MP machine
// VC++ doesn't like the lock prefix to be on a single line // so we can't insert a label after the lock prefix.
// By emitting a lock prefix, we can define a label after it.
#define LOCK_IF_MP(mp) __asm cmp mp, 0 \
__asm je L0 \
__asm _emit 0xF0 \
__asm L0:
inline jint Atomic::cmpxchg (jint exchange_value, volatile jint* dest, jint compare_value) {
// alternative for InterlockedCompareExchange
int mp = os::is_MP();
__asm {
mov edx, dest
mov ecx, exchange_value
mov eax, compare_value
LOCK_IF_MP(mp)
cmpxchg dword ptr [edx], ecx
}
}
Le programme détermine si c'est le type de processeur actuel cmpxchgDirectives Ajouter lockPréfixe.Si le programme fonctionne sur plusieurs processeurs,C'est tout. cmpxchgDirectives Plus lockPréfixe(lock cmpxchg).Au contraire,Si le programme fonctionne sur un seul processeur,C'est tout. lockPréfixe(Un seul processeur lui - même maintient la cohérence séquentielle à l'intérieur d'un seul processeur,Pas besoin.lockL'effet de barrière de mémoire fourni par le préfixe).
intelLe manuel delockLa description du préfixe est la suivante
- Assurez - vous que la mémoire Lire-Modifier-Écris. Exécution atomique opérationnelle .InPentiumEtPentiumDans les processeurs précédents,AveclockLes instructions préfixées verrouillent le bus pendant l'exécution,Empêche temporairement d'autres processeurs d'accéder à la mémoire via le bus.C'est évident.,Ça va coûter cher.DePentium 4,Intel XeonEtP6Démarrage du processeur,intelUne optimisation significative est faite sur la base de la serrure de bus originale:Si vous voulez accéder à la zone mémoire(area of memory)InlockLe préfixe a été verrouillé dans le cache interne du processeur pendant l'exécution de l'instruction(C'est - à - dire que la ligne de cache contenant la zone mémoire est actuellement exclusive ou modifiée),Et la zone mémoire est entièrement contenue dans une seule ligne de cache(cache line)Moyenne,Le processeur exécutera alors l'instruction directement.Parce que la ligne de cache est verrouillée tout le temps pendant l'exécution de l'instruction,Les autres processeurs ne peuvent pas lire/Écrivez la zone mémoire à laquelle la directive doit accéder,Ainsi, l'atomicité de l'exécution de la directive est garantie.Cette procédure est appelée verrouillage du cache(cache locking),Le verrouillage du cache sera considérablement réduitlockFrais généraux d'exécution de l'instruction préfixe,Cependant, lorsque le niveau de concurrence entre les multiprocesseurs est élevé ou que les adresses mémoire auxquelles les instructions accèdent ne sont pas alignées,Le bus sera toujours verrouillé.
- Interdire le réarrangement de l'instruction avec les instructions de lecture et d'écriture précédentes et suivantes.
- Rafraîchir toutes les données du tampon d'écriture en mémoire.
À propos deCPU Les serrures sont les suivantes: 2Espèce
1. Utilisation d'un verrou de bus pour assurer l'atomicité
Le premier mécanisme est l'atomicité garantie par le verrouillage du bus.Si plusieurs processeurs réécrivent simultanément des variables partagées(i++C'est l'opération classique de réécriture de lecture)Fonctionnement,Les variables partagées sont alors manipulées simultanément par plusieurs processeurs,Pour que l'opération de réécriture ne soit pas atomique,La valeur de la variable partagée ne correspond pas à la valeur attendue après l'opération.La raison en est qu'il est possible que plusieurs processeurs lisent simultanément des variables à partir de leurs caches respectivesi,Ajouter séparément1Fonctionnement,Et les écrire séparément dans la mémoire du système.Donc, pour s'assurer que la lecture et l'écrasement des variables partagées sont atomiques,Il faut s'assurerCPU1Lire et écraser les variables partagées,CPU2Impossible d'utiliser le cache qui cache l'adresse mémoire de cette variable partagée.
Le processeur utilise des serrures de bus pour résoudre ce problème.Ce qu'on appelle une serrure de bus est une serrure fournie par un processeurLOCK#Signal,Quand un processeur émet ce signal sur le bus,Les demandes des autres processeurs seront bloquées,Le processeur peut alors utiliser exclusivement la mémoire partagée.
2. Utiliser des serrures de cache pour assurer l'atomicité
Le deuxième mécanisme est de garantir l'atomicité par le verrouillage du cache.En même temps, il suffit de s'assurer que l'opération sur une adresse mémoire est atomique,Mais le verrouillage du busCPULa communication avec la mémoire est verrouillée,Cela fait que pendant le verrouillage,Un autre processeur ne peut pas manipuler les données d'une autre adresse mémoire,Donc les frais généraux de verrouillage du bus sont plus élevés,Dans certains cas, les processeurs les plus récents utilisent le verrouillage du cache au lieu du verrouillage du bus pour optimiser.
La mémoire fréquemment utilisée est mise en cache dans le processeurL1,L2EtL3Dans le cache,Les opérations atomiques peuvent alors être effectuées directement dans le cache interne du processeur,Il n'est pas nécessaire de déclarer le verrouillage du bus,En courant.6Et peut être utilisé dans le processeur le plus proche“Verrouillage du cache”Pour réaliser une atomicité complexe.Ce qu'on appelle“Verrouillage du cache”C'est - à - dire si le cache est dans la zone mémoire de la ligne de cache du processeurLOCKVerrouillé pendant l'opération,Quand il effectue une opération de verrouillage pour écrire à la mémoire,Le processeur ne parle pas sur le busLOCK#Signal,Au lieu de cela, modifiez l'adresse mémoire interne,Et permet à son mécanisme de cohérence de cache de garantir l'atomicité de l'opération,Parce que le mécanisme de cohérence du cache empêche la modification simultanée des données de zone mémoire mises en cache par plus de deux processeurs,La ligne de cache devient invalide lorsque d'autres processeurs mettent à jour les données d'une ligne de cache verrouillée.
Mais il y a deux cas où le processeur n'utilise pas le verrouillage du cache.Le premier scénario est:Lorsque les données de l'opération ne peuvent pas être mises en cache à l'intérieur du processeur,Ou les données de l'opération s'étendent sur plusieurs lignes de cache(cache line),Le processeur appelle le verrouillage du bus.Le deuxième scénario est:Certains processeurs ne supportent pas le verrouillage du cache.PourInter486Et le processeur Pentium,Le verrouillage du bus est appelé même si la zone de mémoire verrouillée est dans la ligne de cache du processeur.
Ces deux mécanismes nous permettent deInterLe processeur offre beaucoup deLOCKInstructions préfixées pour implémenter.Comme les tests de bits et les instructions de modificationBTS,BTR,BTC,Échange de directivesXADD,CMPXCHGEt quelques autres opérandes et instructions logiques,Par exemple,ADD(Plus),OR(Ou)Attendez.,Les zones de mémoire qui sont manipulées par ces instructions sont verrouillées,Fait en sorte que d'autres processeurs ne puissent pas y accéder en même temps.
Verrouillage(lock)Coût
Les serrures sont la façon la plus simple de faire la concurrence,Bien sûr, c'est le prix le plus élevé.Le verrouillage de l'état du noyau nécessite un changement de contexte du système d'exploitation,Verrouillage、La libération de la serrure peut entraîner un changement de contexte plus important et un retard de programmation,Le fil qui attend la serrure est suspendu jusqu'à ce que la serrure soit libérée.Quand le contexte change,cpu Les instructions et les données précédemment mises en cache seront invalidées , Une grande perte de performance . Le système d'exploitation juge les serrures multithreadées comme si deux sœurs se disputaient pour un jouet. , Et le système d'exploitation décide qui a accès aux jouets. ,C'est lent.. Les serrures utilisateur évitent ces problèmes , Mais en fait, ils ne fonctionnent que lorsqu'il n'y a pas de vraie concurrence. .
CASInconvénients
1、 CASBien que très efficace pour résoudre les opérations atomiques,MaisCASTrois problèmes majeurs subsistent.
ABAQuestions.Parce queCASIl est nécessaire de vérifier si la valeur inférieure a changé au moment de l'opération,Mise à jour si aucun changement ne se produit,Mais si une valeur estA,Est devenuB,Est redevenuA,Alors, utilisezCASLa valeur n'a pas changé lors de la vérification,Mais ça a changé..ABALa solution au problème est d'utiliser le numéro de version.Ajouter le numéro de version avant la variable,Ajouter un numéro de version chaque fois que la variable est mise à jour,AlorsA-B-A Ça va devenir1A-2B-3A.
Les longs cycles coûtent cher.SpinCASSi ça ne marche pas longtemps,Oui.CPUAvec des frais généraux d'exécution très élevés.SiJVMCapable de supporter lespauseL'efficacité de la directive pourrait être améliorée,pauseLa directive a deux effets,Premièrement, il peut retarder l'exécution de la commande par Pipeline(de-pipeline),FaireCPUNe consomme pas trop de ressources d'exécution,Le délai dépend de la version de la mise en œuvre spécifique,Sur certains processeurs, le délai est nul.Deuxièmement, il évite les conflits d'ordre de mémoire lors de la sortie de la boucle(memory order violation)Et provoquerCPULe pipeline est vidé(CPU pipeline flush),Pour améliorerCPUEfficacité de l'exécution.
Une opération atomique qui ne peut garantir qu'une seule variable partagée.Lorsque vous travaillez sur une variable partagée,Nous pouvons utiliser des bouclesCASPour assurer le fonctionnement des atomes,Mais lorsque vous travaillez sur plusieurs variables partagées,CycleCASIl n'y a aucune garantie que l'atomicité de l'opération,On peut utiliser la serrure à ce moment - là.,Ou il y a une chance,Est de combiner plusieurs variables partagées en une seule variable partagée pour fonctionner.Comme avoir deux variables partagéesi=2,j=a,Fusionnerij=2a,Et utiliserCASPour opérerij.
2、 Comparaison des coûts CPURessources, Même s'il n'y a pas d'argument, il y a de l'oisiveté. .
3、 Augmente la complexité des tests de programme , Un peu de négligence peut causer des problèmes .
Application
CASL'avantage de l'opération est,Les opérations de substitution de valeurs simultanées et sécurisées peuvent être effectuées sans créer de zones critiques et de mutex.
Cela peut réduire considérablement la perte de performance du programme causée par la synchronisation.
Bien sûr.,CASLes opérations ont aussi des inconvénients.Lorsque la valeur de fonctionnement est fréquemment modifiée,CASL'opération n'est pas si facile à réussir.
1. Augmentation ou diminution
Opération atomique utilisée pour augmenter ou diminuer(Ci - après dénommé augmentation atomique/Moins opération)Les noms des fonctions pour“Add”Préfixe,Suivi du nom du type spécifique visé.
Mais,Parce queatomic.AddUint32
Fonctions etatomic.AddUint64
Le deuxième argument de la fonction est de typeuint32
Etuint64
,Nous ne pouvons donc pas réduire la valeur de fonctionnement en passant une valeur négative.atomic.AddUint32(&uint32, ^uint32(-NN-1))
Parmi euxNNReprésente un entier négatif.
2. Comparer et échangerfunc CompareAndSwapInt32(addr *int32, old, new int32) (swapped bool)
La valeur du premier paramètre doit être la valeur du pointeur vers la valeur à manipuler.Le type de valeur est*int32
.Les deux derniers paramètres sont de typeint32
Type.Leurs valeurs doivent représenter respectivement l'ancienne et la nouvelle valeur de la valeur à utiliser.CompareAndSwapInt32
La fonction détermine le paramètre après l'appeladdrValeurs et paramètres de fonctionnement pointésoldSi les valeurs de sont égales.Ce n'est que lorsque ce jugement aura donné un résultat positif,Cette fonction n'utilise que des argumentsnewLa nouvelle valeur représentée remplace l'ancienne valeur.Sinon,Les opérations de remplacement suivantes sont ignorées.
3. Chargementv := atomic.LoadInt32(&value)
Accepter un*int32
Valeur du pointeur pour le type,Et renvoie la valeur à laquelle la valeur du pointeur pointe. C'est bon.“Atomique”Cet adjectif signifie,Lisez icivalueEn même temps que la valeur de,Tout dans l'ordinateur actuelCPUAucune autre lecture ou écriture n'est effectuée pour cette valeur.Ces contraintes sont supportées par le matériel sous - jacent.
4. Stockage
Pendant que l'atome stocke une valeur,N'importe quoiCPUNi lire ni écrire pour la même valeur.Si nous changeons toutes les écritures pour cette valeur en opérations atomiques,Il n'y a donc pas de cas où l'opération de lecture pour cette valeur lit la moitié de la valeur modifiée parce qu'elle est effectuée simultanément.L'opération de stockage de valeur d'un atome réussit toujours,Parce qu'il ne se soucie pas de l'ancienne valeur de la valeur manipulée.Fonctionsatomic.StoreInt32
Deux paramètres sont acceptés.Le premier paramètre est de type*int 32
Type,Cela signifie également un pointeur vers la valeur à manipuler.Et le second paramètre estint32
Type,Sa valeur doit représenter la nouvelle valeur à stocker.D'autres fonctions similaires auront une liste similaire de déclarations de paramètres.
5. Echange
AvecCASFonctionnement différent,L'opération d'échange atomique ne se soucie pas de l'ancienne valeur de la valeur manipulée.Il fixe directement la nouvelle valeur.Mais c'est un pas de plus que l'opération de chargement atomique.En échange,Il renvoie l'ancienne valeur de la valeur manipulée.Ce type d'opération est comparé àCASMoins de contraintes opérationnelles,Et plus puissant que l'opération de chargement atomique.Paratomic.SwapInt32
Exemple de fonction.Il prend deux paramètres.Le premier paramètre représente l'adresse mémoire de la valeur à utiliser*int32
Valeur du type,Le deuxième paramètre est utilisé pour représenter la nouvelle valeur.Attention!,La fonction a une valeur de résultat.Cette valeur est l'ancienne valeur remplacée par la nouvelle valeur.atomic.SwapInt32
Une fois la fonction appelée,Placez la deuxième valeur du paramètre sur l'adresse mémoire indiquée par la première valeur du paramètre(C'est - à - dire modifier la valeur de fonctionnement),Et renvoie la valeur précédente à cette adresse comme résultat.
Remplacer par une opération atomique mutexVerrouillage
La raison principale est que,Les opérations atomiques sont prises en charge par le matériel sous - jacent,Et la serrure est fournie par le système d'exploitationAPIRéalisation.Si la même fonction est réalisée,Les premiers sont généralement plus efficaces.
边栏推荐
- UI control telerik UI for WinForms new theme - vs2022 heuristic theme
- mysql: error while loading shared libraries: libtinfo. so. 5: cannot open shared object file: No such
- pytorch之数据类型tensor
- [batch dos-cmd command - summary and summary] - string search, search, and filter commands (find, findstr), and the difference and discrimination between find and findstr
- ActiveReportsJS 3.1中文版|||ActiveReportsJS 3.1英文版
- Meet the level 3 requirements of ISO 2.0 with the level B construction standard of computer room | hybrid cloud infrastructure
- [Batch dos - cmd Command - Summary and Summary] - String search, find, Filter Commands (FIND, findstr), differentiation and Analysis of Find and findstr
- OSPF configuration command of Huawei equipment
- Chenglian premium products has completed the first step to enter the international capital market by taking shares in halber international
- 新手如何入门学习PostgreSQL?
猜你喜欢
Service asynchronous communication
windows安装mysql8(5分钟)
Deep understanding of distributed cache design
Return to blowing marshland -- travel notes of zhailidong, founder of duanzhitang
【JVM调优实战100例】04——方法区调优实战(上)
UI控件Telerik UI for WinForms新主题——VS2022启发式主题
【JVM调优实战100例】05——方法区调优实战(下)
"Exquisite store manager" youth entrepreneurship incubation camp - the first phase of Shunde market has been successfully completed!
[Batch dos - cmd Command - Summary and Summary] - String search, find, Filter Commands (FIND, findstr), differentiation and Analysis of Find and findstr
用tkinter做一个简单图形界面
随机推荐
Batch obtain the latitude coordinates of all administrative regions in China (to the county level)
Fastdfs data migration operation record
[牛客] [NOIP2015]跳石头
学习光线跟踪一样的自3D表征Ego3RT
Tencent cloud webshell experience
[force buckle]41 Missing first positive number
pytorch之数据类型tensor
ActiveReportsJS 3.1中文版|||ActiveReportsJS 3.1英文版
Service asynchronous communication
腾讯云 WebShell 体验
Levels - UE5中的暴雨效果
「笔记」折半搜索(Meet in the Middle)
UI control telerik UI for WinForms new theme - vs2022 heuristic theme
What kind of experience is it to realize real-time collaboration in jupyter
Meet the level 3 requirements of ISO 2.0 with the level B construction standard of computer room | hybrid cloud infrastructure
What is time
Part VI, STM32 pulse width modulation (PWM) programming
【批处理DOS-CMD命令-汇总和小结】-字符串搜索、查找、筛选命令(find、findstr),Find和findstr的区别和辨析
pyflink的安装和测试
OSPF configuration command of Huawei equipment