Changes between Initial Version and Version 1 of processus_thread


Ignore:
Timestamp:
May 19, 2016, 7:29:40 PM (9 years ago)
Author:
alain
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • processus_thread

    v1 v1  
     1= Création dynamique des processus et des thread =
     2
     31) création d’un processus dans un cluster distant
     4
     5Ce mécanisme a été implémenté dans ALMOS-MK par Pierre-Yves Péneau, il est décrit dans la thèse de Mohamed Karaoui.
     6La création d’un processus distant utilise le mécanisme fork / exec.
     7On suppose qu’il existe un ordonnanceur par coeur, qui a pour rôle d’ordonnancer les threads qui ont été placés sur ce coeur.
     8
     91.1) fork()
     10Le processus père P s’exécute sur un coeur du cluster Z. Il fait un appel système fork() qui a principalement
     11pour rôle de sélectionner un cluster cible X qui deviendra le cluster propriétaire du processus fils F, et de dupliquer
     12le processus P dans le cluster Z. Le choix du cluster cible devrait en principe s’appuyer sur la DQDT, bien que
     13celle-ci ne soit pas implémentée actuellement dans ALMOS-MK.
     14
     15L’appel system fork() crée dans le cluster Z un nouveau descripteur de processus pour le processus clone P’, ainsi qu’un descripteur de thread  pour le thread principal attaché au processus P’.
     16Le descripteur du processus P’ contient en particulier la VSL(P’,Z), la PT(P’,Z), la FDT(P’,Z) qui sont des copies des tables correspondantes du processus P. En revanche la TRDL(P’,Z) ne contient que le thread nouvellement créé, ce qui signifie
     17que le processus P’ clone est mono-thread.
     18Puis l’appel système fork() demande au cluster cible X l’allocation d’un PID au moyen d’une FORK_RPC (bloquante), en transmettant en argument l’adresse étendue du descripteur de processus P’. Cette adresse est enregistrée dans la
     19table des processus du cluster, et le PID est enregistré dans le descripteur du processus P’ du cluster Z.
     20Finalement, le fork() enregistre le nouveau thread  dans l’ordonnanceur du coeur du cluster Z qui exécute le fork(),
     21et rend la main au processus P.
     22
     231.2) exec()
     24Une fois l'opération fork() terminée, le processus fils P’ peut exécuter l'appel système exec(). Cet appel système exec() effectue une EXEC_RPC vers le cluster X, avec les arguments suivants: le PID du processus fils, le nom de la fonction à exécuter, les arguments de la fonction s'il y en a, les variables d'environnement.
     25Cette RPC alloue un descripteur de processus pour le processus F, ainsi qu’un descripteur de thread. Il initialise ces descripteurs et les tables PT(F,X) , VSL(F,X), TRDL(F,X) en utilisant les arguments de la RPC. Il recopie le contenu de la FDT(P’,Z)
     26dans la FDT(F,X), en utilisant un remote_memcpy(), puisqu’il dispose de l’adresse étendue de P’.
     27Quand le processus P’ sur le cluster Z reçoit une réponse positive pour  cette EXEC_RPC,  le processus P’ intermédiaire
     28se suicide.
     29
     30Une fois que les structures sont initialisées, le thread principal du processus fils est attaché à l'ordonnanceur du cœur cible.
     31Le code binaire (segments code et data) sera chargé dans la mémoire du cluster cible, lors du traitement des défauts de page.
     32
     332) Création d’un thread dans un cluster distant
     34
     35Il y a deux types de threads : un thread “user” est créé suite à un appel système pthread_create().
     36Un thread “kernel” est créé pour exécuter un service système. On s’intéresse uniquement ici aux threads “user”.
     37
     38Un thread “user” peut être dans 6 états:
     39- CREATED : créée mais pas encore éligible
     40- RUNABLE : éligible par l’ordonnanceur
     41- RUNNING : en cours d’exécution
     42- BLOCKED : non éligible, en attente d’une ressource
     43- COMPLETED : non éligible, en attente de destruction effective suite à un pthread_join()
     44- UNUSED : le descripteur de thread peut être réutilisé pour un nouveau thread
     45
     46L’OS attribue à un thread d’un processus P un identifiant unique dans le processus. Ce TRDID est codé sur 32 bits,
     47et il est construit à partir des coordonnées [X,Y,L] du coeur assigné au thread, et de l’index LTID du thread dans l’ordonnanceur
     48du coeur assigné au thread (par exemple  X =  TRDID[31:24] / Y = TRDID[25:16] / L = TRDID[15:8] / LTID = TRDID[7:0]).
     49
     50Les principales informations stockées dans le descripteur de thread sont les suivantes :
     51- TYPE : KERNEL / USER / IDLE
     52- TRDID : thread identifier (contient les coordonnées [X,Y,L] du coeur)
     53- PID : processus identifier du processus contenant le thread
     54- STATE : CREATED / RUNNABLE / RUNNING / BLOCKED / COMPLETED
     55- SAVE : zone de sauvegarde des registres du coeur.
     56- PARENT : TRDID du thread parent qui doit être informé de la terminaison.
     57- IO : canaux alloués au thread dans le cas des périphériques multi-canaux.
     58- SIGNALS : vecteur de bits permettant d’enregistrer les signaux reçus par le thread
     59- etc.
     60
     61N’importe quel thread T de n’importe quel processus P s’exécutant sur n’importe quel cluster K peut créer un nouveau thread T’
     62dans n’importe quel cluster M. Ce thread T’ sera attaché  à l’ordonnanceur de l’un des coeurs du cluster M. Le choix de ce coeur
     63est effectué par l’instance du noyau du cluster M. Le cluster propriétaire du processus P peut être un troisième cluster Z.
     64
     65Seul le noyau du cluster propriétaire du processus P peut créer ou détruire un thread  appartenant au processus P.
     66(i.e. modifier la Liste des threads TRDL appartenant au processus P)
     67Ceci simplifie les problèmes de concurrence, et permet de simplifier les copies des descripteurs de processus dans
     68les clusters autres que le propriétaire de P.  La copie de la liste des threads TRDL(P,M) dans un cluster M autre
     69que  le cluster propriétaire de P ne contient que les descripteurs de thread qui s’exécutent localement sur un coeur de M,
     70alors que la TRDL(P,Z) du cluster Z propriétaire de P doit contenir tous les threads de P.
     71
     722.1) Le noyau du cluster K envoie une THREAD_REQ_RPC au cluster Z propriétaire. Les arguments sont le PID du processus,
     73le cluster cible M, la fonction à exécuter et ses arguments, … To Be Completed …
     74
     752.2) Le noyau du cluster Z propriétaire, envoie au cluster cible M une THREAD_CREATE_RPC dont les arguments sont le PID
     76du processus P, la fonction à exécuter et ses arguments, … To Be Completed …
     77
     782.3) Le noyau du cluster Y vérifie s’il possède une copie du descripteur du processus P.
     79Si ce n’est pas le cas il crée et enregistre un nouveau descripteur du processus P dans Y, et alloue les structures PT(P,X),
     80VSL(P,X), FDT(P,X), TRDL(P,X). Il initialise les structures VSL et FDT en utilisant des remote_memcpy() depuis le cluster Z.
     81La PT reste vide, et se remplira à la demande lors du traitement des défauts de page.
     82Quand il est sûr de posséder une copie du descripteur de processus P, il sélectionne un coeur charger d’ordonnancer
     83le nouveau thread T’. Il attribue un TDID au thread à T’, crée un descripteur de thread et l’enregistre dans la TRDL.
     84Finalement, il enregistre T’ dans l’ordonnanceur du coeur sélectionné, et renvoie le TRDID dans la réponse RPC au cluster Z.
     85
     862.4) Le noyau du cluster Z propriétaire de P alloue un descripteur de thread et l’enregistre dans sa TRDL(P,Z).
     87Cette TRDL(P,Z) est la seule à contenir la totalité des descripteurs de threads du processus P.
     88Puis il renvoie une réponse RPC au cluster X.
     89
     903) Destruction d’un thread
     91
     92On suppose que la destruction d’un thread TRDID s’exécutant sur un cluster K est déclenchée
     93- soit par le thread lui-même (appel système pthread_exit() ),
     94- soit par le noyau du cluster hôte K où s’exécute le thread,
     95- soit par un signal provenant d’un autre cluster.
     96Dans tous les cas, c’est le noyau du cluster hôte K, qui pilote cette destruction.
     97
     983.1) Le noyau du cluster K envoie une THREAD_EXIT_RPC au cluster Z propriétaire du processus P,
     99pour qu’il mette à jour la TRDL(P,Z) qui contient tous les thread de Private. Les arguments sont le PID et le TRDID.
     100
     1013.2) Le noyau du cluster Z propriétaire de P met à jour sa TRDL(P,Z), en supprimant le thread TRDID,
     102puis envoie la réponse RPC au cluster K.
     103
     1043.3) Le noyau du cluster K enregistre le signal KILL dans le descripteur de thread TRDID au moyen d’une opération atomique.
     105Lors du traitement de ce signal, le thread TRDID est éliminé de l’ordonnanceur, il est éliminé de la TRDL(P,X), et  la mémoire
     106allouée pour le descripteur de thread dans le cluster K est libérée.
     107
     1084) Destruction d’un processus
     109
     110Cette section n’est qu’une ébauche… [AG]
     111
     112On suppose que la destruction d’un processus P est déclenchée
     113- soit par un thread du processus P s’exécutant sur un cluster X quelconque (appel système exit() ),
     114- soit par le noyau du cluster Z propriétaire P,
     115- soit par un signal provenant d’un autre cluster
     116Dans tous les cas, c’est le noyau du cluster Z propriétaire de P, qui pilote cette destruction.
     117
     1184.1) Si l’appel système exit() est exécuté sur un cluster K différent du cluster Z propriétaire, le noyau du cluster K
     119envoie une EXIT_REQ_RPC vers le cluster Z propriétaire.
     120
     1214.2)  Pour exécuter la EXIT_REQ_RPC, le noyau du cluster Z propriétaire de P broadcaste une ALL_DELETE_BCRPC
     122vers tous les clusters M qui contiennent au moins un thread du processus P. L’argument est le PID du processus P.
     123
     1244.3) Dans chaque cluster M, le noyau recevant une ALL_DELETE_RPC enregistre le signal KILL dans les descripteurs
     125des threadsde P. Quand il détecte que la TRDL(P,M) est vide, il libère toutes les structures de données allouées au processus P
     126dans le cluster M. Finalement, il retourne la réponse au cluster Z.
     127
     1284.4) Lorsque toutes les réponses au ALL_DELETE_BCRCP ont été reçues par le cluster Z, celui-ci libère toutes les structures
     129de données allouées au processus P dans le cluster Z.