TacOS-team / tacos

Système d'exploitation / Operating System
GNU General Public License v3.0
9 stars 4 forks source link

Multithreading #149

Open NicolasFloquet opened 12 years ago

NicolasFloquet commented 12 years ago

Voilà, il fallait que ce soit dit un jour alors je fais moi même le ticket: il nous faut du multithreading! Deux motivations pour cela: -Pour les IHM, c'est quand même un peu mieux -Le besoin de thread kernel est très important. Par exemple si drivers qui ont besoin de faire des attentes pouvaient avoir des threads, on pourrait facilement implémenter des attentes passives. D'autre part, les thread kernel seront indispensable pour implémenter certaines features (la pile réseau par exemple).

Première réflexion sur l'implémentation: Actuellement, la structure de processus contient directement l'état d'exécution (registres) du process et d'autres informations. Quand le processus est choisis par l'ordonnanceur, on sauvegarde l'état du process courant et on charge celui du nouveau. Une premier implémentation simple serait que la structure du processus contienne une liste de thread qui auraient chacun leur état d'exécution propre. Lors de l'ordonnancement, un premier ordonnanceur choisis le processus à exécuter, puis un deuxième ordonnanceur (avec éventuellement une politique différente) viendrait choisir, au sein de ce process, le thread à exécuter. La création d'un processus est du coup presque inchangée, la seule problématique sera de trouver dynamiquement une place pour les piles des threads qui seront créés au cours de l'exécution.

Donc c'est une première idée, à creuser, j'aimerais bien des retours/idées/remarques

MaximeCheramy commented 12 years ago

Est-ce qu'il n'y a pas deux choses similaires mais différentes en fait ? C'est une vraie question, je ne sais pas du tout.

NicolasFloquet commented 12 years ago

Ben je vois pas trop comment gérer ça uniquement au niveau userspace. Par exemple, cet ordonnanceur de thread doit avoir le pouvoir de passer d'userspace en kernel space (exemple, si le thread actuel est en userspace, et qu'on switch vers un thread qui a été interrompu pendant un appel système). ça, il faut être en kernel space pour le faire simplement je pense. Après on peut imaginer aussi qu'un processus ne peut faire qu'un seul appel système à la fois ce qui est très envisageable et facile à faire (un mutex dans syscall() ). Enfin je vois pas trop comment gérer un ordonnanceur userspace (par qui il est appelé? quand? comment il récupère l'état du thread courant?)

MaximeCheramy commented 12 years ago

Le principal problème de le faire en userspace serait de pas pouvoir interrompre un thread pendant un appel système. Ensuite pour le reste c'est jouable à l'aide de timers je pense. Mais oui c'est peut-être pas une bonne idée. À voir ce dont on a besoin côté kernel.

Tiens, je viens de tomber sur http://en.wikipedia.org/wiki/Native_POSIX_Thread_Library qui parle de problèmes avec l'ancienne implémentation des threads Linux et en quoi ceux posix sont mieux... Ça peut être enrichissant à comprendre.