Changes between Version 17 and Version 18 of AS6-TME-B7


Ignore:
Timestamp:
Apr 12, 2022, 10:18:15 AM (2 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AS6-TME-B7

    v17 v18  
    2828{{{#!protected ------------------------------------------------------------------
    2929'''
    30  *
    31 '''
    32 }}}
    33 1. Un verrou est une mémoire à deux états, quelles sont les deux opérations de l'API de gestion ?
    34 {{{#!protected ------------------------------------------------------------------
    35 '''
    36  *
     30 * Dès lors que les allocations peuvent être demandées en parallèle et qu'elles ont besoin d'accéder en écriture à des structures partagées, il faut garantir que plusieurs modifications n'arrivent pas en même temps.
     31 * Dans kO6, les appels systèmes ne sont pas interruptibles. Cela signifie que, lorsque vous demandez au système de créer un objet (un thread par exemple) et qu'il utilise ses allocateurs de mémoire (`malloc_ustack()` et `kmalloc()`), il n'y a pas de risque de compétition avec d'autres threads sur le même core, parce que si le tick courant s'achève, l'IRQ du timer sera masquée et donc ne sera traitée que lorsque les allocations seront terminées. Mais il y a un risque s'il y a deux cores, parce qu'ils seront en vrai parallélisme. Pour le moment, il n'y a qu'un core parce qu'avec deux cores, il y a le problème de la cohérence des caches non traitée dans cette version du SoC. Il n'y a donc pas de risque pour les allocations du noyau, mais nous mettrons quand même les protections pour le futur.
     32 * Pour les allocations de l'utilisateur, il y a un vrai problème. Un malloc peut parfaitement être interrompu par une IRQ du timer provoquant un changement de thread, lequel peut aussi demander une allocation. 
     33'''
     34}}}
     351. Un verrou est une mémoire à deux états, quelles sont les deux opérations de l'API de gestion vu en cours ?
     36{{{#!protected ------------------------------------------------------------------
     37'''
     38 * Une opération de verrouillage pour mettre à 1 le verrou s'il est à 0 : `spin_lock(lock)`
     39 * Une opération de déverrouillage pour le mettre à 0 : `spin_unlock(lock)`
     40 * Parfois, on a des API où `spin_lock()` est nommée `lock_acquire()` et `spin_unlock()` est nommée `lock_release()`, mais c'est la même idée. `spin` fait bien pensée que c'est une attente active, c'est mieux je trouve.
     41 * Il y a des implémentations avec des timeouts, ou avec distribution de tickets pour un traitement dans l'ordre,...
    3742'''
    3843}}}