--- tags: cours, sys2, gaby, ing1 author: Robin 'Pachichi' BOUCHER date: 20/03/2019 title: SYS2 --- # SYS2 * thread * SIMD: Single Instruction Multiple Data * SSE, AVX Un cache ça marche par cacheline. On a deux cores qui executent 2 instructions. Ils mettent ça dans une cacheline commune -> ==False sharing== Le problème est lors du "commit" de la cacheline, les 2 cachelines risquent de ne pas être les memes -> conflits Une solution (qui ajoute un autre problème) serait de synchroniser les cachelines entre elles. Si la cacheline 1 vient d'être changée, alors elle prévient la cacheline 2 du changement. La cacheline 2 se synchronise avec 1 pour etre à jour et éviter tout conflit lors d'un "commit". Inconvénient -> vérification et/ou synchronisation à chaque changement d'une cacheline Ne pas utiliser stat("file") -> entre un stat() et un open(), on a pu changer le "file", les infos du stat() ne sont plus valides -> utiliser fstat() à la place --- On parle d'une liste (???) ==Section critique==: ajout ou suppression dans la liste -> situation critique On marque les instructions dangereuses sur la liste pour savoir si on peut faire une autre instruction en parallèle. ```pug * marquage instruction_dangereuse * marquage ``` On ne lock pas les datas, ça n'a pas de sens. Ce qui nous intéresse, c'est l'état de la liste. Atomic Primitives: * test and set -> TAS * compare and swap -> CAS (*x86*) ```cpp // lock for (; ;){ if (v == 0){ // CAS: compare and v = 1; // swap break; } } // volatile ``` volatile -> ne fait pas d'optimisation à cet endroit-là -> Attente active (CPU est en train d'attendre que la valeur soit à 0) * Spinlock ```cpp // lock for (; ;){ if (v == 0){ // CAS: compare and v = 1; // swap break; } sleep(0); } // volatile ``` * Mutex * Semaphore -> quand on a besoin de compter * Count * Queue de process en attente * Dans POSIX, on a des semaphores qui marchent entre des processes --- * Deadlock * Livelock -> Deux personnes dans un couloir étroit en train de s'éviter l'un et l'autre -> Invasion de priorité