12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- \section{Motivation}
- Chacun des morceaux de l'architecture de VLC se retrouvant isolé dans des
- processus indépendant, on a besoin d'un moyen de créer une communication
- inter-processus. Plus encore, on a besoin de pouvoir transférer la capacité de
- communiquer d'un processus à l'autre de façon à contrôler de façon fiable les
- autorisations de chaque processus.
- La communication entre les processus est importante car il s'agit de la base
- pour pouvoir effectuer des appels de fonctions distants -- ou RPC pour Remote
- Procedure Call. Cela va notamment nous servir à reproduire le modèle
- d'exécution actuel de VLC pour le faire progressivement évoluer vers une
- architecture plus découplée et moins contrainte.
- Bien entendu, reproduire l'architecture de VLC implique que les RPCs puissent
- renvoyer des valeurs et il faut donc que la communication entre deux étages soit
- systématiquement bidirectionnelle si elle existe.
- \section{Simplification vers le modèle broker}
- La situation n'est pas totalement la même entre une architecture broker et une
- architecture orchestrateur, mais nous allons voir que l'on peut se ramener de la
- seconde à la première sans perte d'abstraction dès lors qu'on peut produire des
- jetons d'accès pour les IPC.
- On peut en effet réaliser la construction suivante. On représente chaque lien
- entre deux processus par une paire d'objets \inltype{vlc_process_ipc_t}
- distribuée entre les deux processus. Il s'agit alors du modèle orchestrateur.
- Maintenant on le modifie pour casser le lien en deux et passer avec une
- architecture broker. Chaque lien devient donc une paire de lien avec d’abord une
- connexion worker-broker puis une autre connexion broker-worker. Le broker
- s’assure ainsi de faire le routage et vérifier les accès.
- On a donc découplé le fonctionnement du worker de la politique d’accès choisie.
- Cette propriété est très importante pour la suite, car elle permet de construire
- le modèle puis d’adapter l’implémentation à ce qui se rapproche le plus du
- fonctionnement du système sous-jacent.
- En pratique, ce comportement est actuellement obtenu avec de simples indices,
- n'apportant pas la garantie de sécurité attendue pour une sandbox mais
- permettant de tester et déboguer plus facilement le comportement de
- l'application en multiprocessus.
- \section{Abstraction des messages et RPC}
- % TODO: framework de sérialisation
- % TODO: format du message envoyés (header)
- % TODO: framework d'envoi et de réception
- % TODO: implémentation broker
- On a également besoin d'un moyen de sérialiser et envoyer des messages pour
- construire les appels de fonctions déportés (RPC, pour Remote Procedure Call)
- qui vont nous permettre de conserver le même modèle d'exécution qu'en
- multithread.
- N'étant pas le sujet principal et étant un problème déjà résolu de beaucoup de
- façon différentes, mon implémentation de ces messages est réduite à l'essentiel
- et permet d'une part de créer des messages avec \inltype{vlc_process_msg_new},
- puis d'autre part de sérialiser ou désérialiser des données dedans à partir de
- fonctions du type \inltype{vlc_msg_recv_{type}} ou
- \inltype{vlc_msg_append_{type}}.
- Étant donnée que l'architecture précédente est simulée avec des indices,
- les messages doivent indiquer le processus de destination. Ils doivent également
- indiquer l'action à effectuer, correspondant à une table indice vers type de RPC
- appelable.
- \section{Abstraction des moyens de communication}
- Pour masquer les détails de l'implémentation du bus de communication entre les
- processus, on introduit le type \inltype{vlc_process_ipc_t} qui est capable de
- stocker ce bus bidirectionnel et on construit les fonctions de communication
- dessus.
- En particulier, on va retrouver deux fonctions principales. Tout d'abord,
- \inltype{vlc_ipc_SendMsg} permet à partir d'envoyer un message et ses
- descripteurs de fichier sur une IPC, puis \inltype{vlc_ipc_RecvMsg} qui
- allouera le message et récupèrera les descripteurs de fichiers.
- \begin{code}{c}{Prototypes des fonctions d'envoi de messages}
- VLC_API int
- vlc_ipc_SendMsg( vlc_process_ipc_t *p_ipc, vlc_process_msg_t *p_msg );
- VLC_API int
- vlc_ipc_RecvMsg( vlc_process_ipc_t *p_ipc, vlc_process_msg_t **pp_msg );
- \end{code}
|