sandbox_ipc.tex 4.2 KB

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