oups
This commit is contained in:
parent
61d7f9a8f4
commit
29a2223ed0
@ -29,4 +29,4 @@ Algorithme pour de la convergence BFT. (Reflexions sur des erreurs byzanties pos
|
||||
|
||||
__tseng_distributed_2019__, "Algo BFT pour cohérence causale (preuve + experiences)"
|
||||
|
||||
__misra_byzantine_2021__, "Preuve d'impossibilité de BFT dans un certain contexte pour de la cohérence causale + 2 algo pour de la cohérence causale BFT"
|
||||
__misra_byzantine_2021__, "Preuve d'impossibilité de BFT dans un certain contexte pour de la cohérence causale + 2 algo pour de la cohérence causale BFT"4
|
32
docs/presentations/SoutenanceStage/conclusion/index.tex
Normal file
32
docs/presentations/SoutenanceStage/conclusion/index.tex
Normal file
@ -0,0 +1,32 @@
|
||||
\begin{frame}
|
||||
\frametitle{Conclusion}
|
||||
|
||||
\begin{block}{Bilan Moral}
|
||||
\begin{itemize}
|
||||
\item Mon intégration à Parsec
|
||||
\item Ma présence au laboratoire et mon rythme de travail
|
||||
\end{itemize}
|
||||
\end{block}
|
||||
|
||||
\pause
|
||||
|
||||
\begin{block}{La suite ?}
|
||||
\begin{itemize}
|
||||
\item Étudier des applications existantes d'édition collaborative adoptant de la cohérence faible.
|
||||
\item Continuer mon travail avec Parsec :
|
||||
\begin{itemize}
|
||||
\item fournir un rapport de l'état de l'art adapté à leur problématique
|
||||
\item fournir une preuve de concept de l'éditeur collaboratif
|
||||
\end{itemize}
|
||||
|
||||
\end{itemize}
|
||||
\end{block}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Merci !}
|
||||
|
||||
Place aux questions !
|
||||
|
||||
|
||||
\end{frame}
|
14
docs/presentations/SoutenanceStage/consistency/byzantin.tex
Normal file
14
docs/presentations/SoutenanceStage/consistency/byzantin.tex
Normal file
@ -0,0 +1,14 @@
|
||||
\begin{frame}
|
||||
\frametitle{La cohérence faible appliquée aux milieux malveillant}
|
||||
|
||||
\begin{block}{Plusieurs directions de recherches :}
|
||||
\begin{itemize}
|
||||
\item Le critère de cohérence réduit par design le champ des attaques malicieuses possibles.
|
||||
\item Le critère de cohérence introduit de nouveaux types d'erreurs byzantines.
|
||||
\begin{itemize}
|
||||
\item Hypothèse la plus étayée sur le sujet. Mais pas de réponse satisfaisante.
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\end{block}
|
||||
|
||||
\end{frame}
|
82
docs/presentations/SoutenanceStage/consistency/faible.tex
Normal file
82
docs/presentations/SoutenanceStage/consistency/faible.tex
Normal file
@ -0,0 +1,82 @@
|
||||
\begin{frame}
|
||||
\frametitle{Les classes de cohérences}
|
||||
|
||||
\begin{columns}
|
||||
\column{0.6\textwidth}
|
||||
|
||||
\begin{figure}
|
||||
\resizebox{\columnwidth}{!}{
|
||||
\includegraphics{images/carte_criteres.png}
|
||||
}
|
||||
\caption{Perrin, \emph{Concurrence et cohérence dans les systèmes répartis}, 2017}
|
||||
\end{figure}
|
||||
|
||||
\column{0.4\columnwidth}
|
||||
\begin{block}{Les classes de cohérences}
|
||||
Deux grandes familles :
|
||||
\begin{itemize}
|
||||
\item Cohérence Forte
|
||||
\item Cohérence Faible :
|
||||
\begin{itemize}
|
||||
\item Convergence (EC)
|
||||
\item Localité d'état (SL)
|
||||
\item Validité (V)
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\end{block}
|
||||
\end{columns}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Convergence (EC)}
|
||||
|
||||
\begin{block}{Définition}
|
||||
Les \textbf{lectures infinies} d'un document n'étant plus soumis à \textbf{aucune opération d'écriture} doit retourner pour tout nœud du système \textbf{la même valeur}.
|
||||
\end{block}
|
||||
|
||||
\begin{figure}
|
||||
\centering
|
||||
\resizebox{0.7\columnwidth}{!}{
|
||||
\begin{tcolorbox}[colframe=green!50!black]
|
||||
\input{schemas/convergence}
|
||||
\end{tcolorbox}
|
||||
}
|
||||
\end{figure}
|
||||
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Localité d'état (SL)}
|
||||
|
||||
\begin{block}{Définition}
|
||||
Chaque processus, indépendamment des autres, doit garder une cohérence de ses lectures en fonction de leurs ordres locaux.
|
||||
\end{block}
|
||||
|
||||
|
||||
\begin{figure}
|
||||
\centering
|
||||
\resizebox{0.7\columnwidth}{!}{
|
||||
\begin{tcolorbox}[colframe=green!50!black]
|
||||
\input{schemas/localiteetat}
|
||||
\end{tcolorbox}
|
||||
}
|
||||
\end{figure}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Validité (V)}
|
||||
|
||||
\begin{block}{Definition}
|
||||
Chaque lecture doit résulter d'une suite d'opérations d'écriture valides impliquant l'ensemble des opérations d'écriture connue par le nœud à cet instant.
|
||||
\end{block}
|
||||
|
||||
|
||||
\begin{figure}
|
||||
\centering
|
||||
\resizebox{0.7\columnwidth}{!}{
|
||||
\begin{tcolorbox}[colframe=green!50!black]
|
||||
\input{schemas/validite}
|
||||
\end{tcolorbox}
|
||||
}
|
||||
\end{figure}
|
||||
\end{frame}
|
61
docs/presentations/SoutenanceStage/consistency/forte.tex
Normal file
61
docs/presentations/SoutenanceStage/consistency/forte.tex
Normal file
@ -0,0 +1,61 @@
|
||||
\begin{frame}
|
||||
\frametitle{La cohérence selon Lamport}
|
||||
|
||||
Leslie Lamport :
|
||||
|
||||
\begin{itemize}
|
||||
\item Initialement ingénieur chez Intel dans les années 60.
|
||||
\item Il a travaillé sur les premières problématiques d'architectures multicœurs.
|
||||
\item Il a ainsi posé les bases de l'informatique distribuée.
|
||||
\end{itemize}
|
||||
|
||||
Il a (entre autre) proposé une formalisation mathématique du comportement attendu d'un système réparti. \\
|
||||
Il propose 3 registres permettant de spécifier un comportement séquentiel dans un environnement distribué.
|
||||
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Sûreté}
|
||||
\begin{block}{Définition}
|
||||
Chaque opération de \textbf{lecture} réalisée dans le même espace \textbf{non-concurrent} doit fournir le même resultat.
|
||||
\end{block}
|
||||
\begin{figure}
|
||||
\input{schemas/linearisation_surete_hc}
|
||||
\end{figure}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Régularité}
|
||||
\begin{block}{Définition}
|
||||
Une \textbf{opération de lecture concurrente à une opération d'écriture} doit fournir une valeur \textbf{antérieure ou postérieure à l'écriture}.
|
||||
\end{block}
|
||||
\begin{figure}
|
||||
\input{schemas/linearisation_regularite_hc}
|
||||
\end{figure}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Atomicité}
|
||||
\begin{block}{Definition}
|
||||
Si \textbf{deux opérations de lecture sont non-concurrentes} alors la seconde doit fournir une valeur \textbf{au moins aussi récente que} la précédente.
|
||||
\end{block}
|
||||
\begin{figure}
|
||||
\input{schemas/linearisation_atomicite_hc}
|
||||
\end{figure}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Cohérence Atomique ($C_\top$)}
|
||||
|
||||
\begin{block}{Définition}
|
||||
La cohérence atomique est le critère de cohérence le plus "fort".
|
||||
\begin{itemize}
|
||||
\item Propose une interactivité très faible.
|
||||
\item Nécessite une synchronisation forte entre chaque opération.
|
||||
\begin{itemize}
|
||||
\item Chaque opération est bloquante et doit attendre la fin des opérations précédentes pour être exécutée.
|
||||
\end{itemize}
|
||||
\item Elle est utilisée comme référence pour les autres classes de cohérence.
|
||||
\end{itemize}
|
||||
\end{block}
|
||||
\end{frame}
|
8
docs/presentations/SoutenanceStage/consistency/index.tex
Normal file
8
docs/presentations/SoutenanceStage/consistency/index.tex
Normal file
@ -0,0 +1,8 @@
|
||||
\subsection*{Cohérence forte}
|
||||
\include{consistency/forte.tex}
|
||||
|
||||
\subsection*{Les compromis de la cohérence faible}
|
||||
\include{consistency/faible.tex}
|
||||
|
||||
\subsection*{Dans un contexte malveillant ?}
|
||||
\include{consistency/byzantin.tex}
|
32
docs/presentations/SoutenanceStage/distr_sys/bases.tex
Normal file
32
docs/presentations/SoutenanceStage/distr_sys/bases.tex
Normal file
@ -0,0 +1,32 @@
|
||||
\begin{frame}
|
||||
\frametitle{Un système distribué}
|
||||
|
||||
\begin{block}{Définition}
|
||||
Un système distribué est un ensemble d'\textbf{acteurs} capable de communiquer \textbf{les uns avec les autres} et travaillant ensemble à la réalisation d'une \textbf{tâche commune}.
|
||||
\end{block}
|
||||
|
||||
\begin{figure}
|
||||
\centering
|
||||
\resizebox{0.75\columnwidth}{!}{
|
||||
\includegraphics{images/distributedsystems.png}
|
||||
}
|
||||
\caption{Thibaut Arribe, \emph{Conception des chaînes éditoriales}}
|
||||
\end{figure}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Un système distribué est un système vivant}
|
||||
|
||||
Les systèmes distribués évoluent au fil du temps
|
||||
|
||||
Il y a plusieurs approches permettant d'étudier ces changements :
|
||||
\begin{itemize}
|
||||
\item concentrés sur le \textbf{churn} (ajout ou retrait de nœuds)
|
||||
\item concentrés sur les \textbf{messages}
|
||||
\item concentrés sur la \textbf{connectivité}
|
||||
\item concentrés sur les \textbf{états} $\Leftarrow$
|
||||
\item sûrement d'autres... ?
|
||||
\end{itemize}
|
||||
|
||||
|
||||
\end{frame}
|
2
docs/presentations/SoutenanceStage/distr_sys/index.tex
Normal file
2
docs/presentations/SoutenanceStage/distr_sys/index.tex
Normal file
@ -0,0 +1,2 @@
|
||||
\subsection*{Définition}
|
||||
\include{distr_sys/bases}
|
BIN
docs/presentations/SoutenanceStage/images/carte_criteres.png
Executable file
BIN
docs/presentations/SoutenanceStage/images/carte_criteres.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 159 KiB |
BIN
docs/presentations/SoutenanceStage/images/distributedsystems.png
Normal file
BIN
docs/presentations/SoutenanceStage/images/distributedsystems.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 12 KiB |
2
docs/presentations/SoutenanceStage/intro/index.tex
Normal file
2
docs/presentations/SoutenanceStage/intro/index.tex
Normal file
@ -0,0 +1,2 @@
|
||||
\subsection*{Présentation de l'entreprise}
|
||||
\include{intro/suite.tex}
|
16
docs/presentations/SoutenanceStage/intro/presentation.tex
Normal file
16
docs/presentations/SoutenanceStage/intro/presentation.tex
Normal file
@ -0,0 +1,16 @@
|
||||
\begin{frame}
|
||||
\frametitle{Présentation}
|
||||
|
||||
\begin{itemize}
|
||||
\item Amaury JOLY
|
||||
\item Master Informatique
|
||||
\begin{itemize}
|
||||
\item Option Fiabilité Sécurité Informatique (FSI)
|
||||
\end{itemize}
|
||||
|
||||
\end{itemize}
|
||||
|
||||
|
||||
|
||||
|
||||
\end{frame}
|
61
docs/presentations/SoutenanceStage/intro/suite.tex
Normal file
61
docs/presentations/SoutenanceStage/intro/suite.tex
Normal file
@ -0,0 +1,61 @@
|
||||
\begin{frame}
|
||||
\frametitle{Présentation de l'entreprise}
|
||||
|
||||
\begin{itemize}
|
||||
\item D'avril à août 2023
|
||||
\item Collaboration entre Parsec (SCILLE) et le Laboratoire d'Informatique et Systèmes (AMU)
|
||||
\end{itemize}
|
||||
|
||||
\pause
|
||||
|
||||
\begin{itemize}
|
||||
\item Présentation de Scille.
|
||||
\begin{itemize}
|
||||
\item Scille est une startup bordelaise initialement prestataire de services.
|
||||
\item Ils ont développé en parallèle de leurs activités un logiciel de partage de fichier dans une approche "zero-trust"
|
||||
\item Dû à la popularité du logiciel, les activités de l'entreprises se sont tournées exclusivement sur le développement de Parsec
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Présentation du logiciel}
|
||||
|
||||
\begin{itemize}
|
||||
\item Parsec fonctionne dans une approche "zero-trust"
|
||||
\begin{itemize}
|
||||
\item Adopte un chiffrement de bout en bout
|
||||
\item Parsec est donc une architecture de logiciels comportant trois parties :
|
||||
\begin{itemize}
|
||||
\item Une PKI
|
||||
\item Un serveur de stockage des fichiers
|
||||
\item Un serveur de stockage des méta-données
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
|
||||
\item Parsec souhaite ajouter une fonctionnalité d'édition Collaborative :
|
||||
\begin{itemize}
|
||||
\item En restant cohérent avec l'approche "zero-trust" (donc impliquant probablement de la décentralisation)
|
||||
\item Proposant une approche innovante de l'éditeur collaboratif (basse latence, haute disponibilité)
|
||||
\end{itemize}
|
||||
\item Le sujet est donc \textit{Cohérence faible appliquée au cloud pour une application distribuée}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Présentation du Laboratoire}
|
||||
|
||||
\begin{itemize}
|
||||
\item J'ai été accueilli au LIS qui est un laboratoire de recherche en Informatique
|
||||
\item Sous l'encadrement d'Emmanuel GODARD et Corentin TRAVERS.
|
||||
\item Au sein de l'équipe DALGO
|
||||
\item Rythme très libre et porté sur l'autonomie :
|
||||
\begin{itemize}
|
||||
\item Des réunions hebdomadaires avec mes tuteurs
|
||||
\item La participation aux séminaires et conférences de l'équipe de recherche
|
||||
\item L'inclusion dans un laboratoire de recherche (rencontre d'autres stagiaires / doctorants / chercheurs)
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\end{frame}
|
65
docs/presentations/SoutenanceStage/main.tex
Executable file
65
docs/presentations/SoutenanceStage/main.tex
Executable file
@ -0,0 +1,65 @@
|
||||
\documentclass{beamer}
|
||||
\usetheme{Boadilla}
|
||||
\usecolortheme{orchid}
|
||||
|
||||
\usepackage[T1]{fontenc}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage[french]{babel}
|
||||
\usepackage{stackengine}
|
||||
|
||||
\addtobeamertemplate{navigation symbols}{}{%
|
||||
\usebeamerfont{footline}%
|
||||
\usebeamercolor[fg]{footline}%
|
||||
\hspace{1em}%
|
||||
\insertframenumber/\inserttotalframenumber
|
||||
}
|
||||
\usepackage{ulem}
|
||||
\usepackage{tkz-tab}
|
||||
\setbeamertemplate{blocks}[rounded]%
|
||||
[shadow=true]
|
||||
\AtBeginSection{%
|
||||
\begin{frame}
|
||||
\tableofcontents[sections=\value{section}]
|
||||
\end{frame}
|
||||
}
|
||||
|
||||
\usepackage{tikz}
|
||||
\usetikzlibrary{positioning}
|
||||
\usetikzlibrary{calc}
|
||||
\usetikzlibrary{arrows.meta}
|
||||
|
||||
\usepackage{tcolorbox}
|
||||
|
||||
\title[bwconsistency]{Présentation de Stage M2 FSI}
|
||||
\subtitle{Étude de la cohérence dans les systèmes distribués}
|
||||
\author[JOLY Amaury]{JOLY Amaury\\ \textbf{Encadrants :} GODARD Emmanuel, TRAVERS Corentin }
|
||||
% \\[2ex] \includegraphics[scale=0.1]{./img/amu.png}
|
||||
\institute[LIS, Scille]{LIS-LAB, Scille}
|
||||
\date{\today}
|
||||
|
||||
\AtBeginSection{}
|
||||
|
||||
\begin{document}
|
||||
|
||||
\maketitle
|
||||
|
||||
\begin{frame}{Table des matières}
|
||||
\tableofcontents
|
||||
\end{frame}
|
||||
|
||||
\section{Entre industrie et recherche}
|
||||
\input{intro/index.tex}
|
||||
|
||||
\section{Les systèmes distribués et l'étude de la cohérence}
|
||||
\input{distr_sys/index.tex}
|
||||
|
||||
\section{Les compromis dans la gestion de la cohérence}
|
||||
\input{consistency/index.tex}
|
||||
|
||||
\section{Mes contributions}
|
||||
\input{work/index.tex}
|
||||
|
||||
\section{Ce qui nous attend}
|
||||
\input{conclusion/index.tex}
|
||||
|
||||
\end{document}
|
BIN
docs/presentations/SoutenanceStage/schemas/ccv_hc_1.png
Executable file
BIN
docs/presentations/SoutenanceStage/schemas/ccv_hc_1.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 72 KiB |
35
docs/presentations/SoutenanceStage/schemas/convergence.tex
Executable file
35
docs/presentations/SoutenanceStage/schemas/convergence.tex
Executable file
@ -0,0 +1,35 @@
|
||||
\resizebox{\columnwidth}{!}{
|
||||
\begin{tikzpicture}[
|
||||
roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,},
|
||||
ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,},
|
||||
arrow/.style={|->, thick,},
|
||||
message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}},
|
||||
]
|
||||
|
||||
\node[roundnode] (11) {};
|
||||
\node[left] at (11.west) {$p_0$};
|
||||
\node[above] at (11.north) {$ecrire(1)$};
|
||||
\node[roundnode] (12) [right=50pt of 11] {};
|
||||
\node[above] at (12.north) {$ecrire(0)$};
|
||||
\node[roundnode] (13) [right=50pt of 12] {};
|
||||
\node[above] at (13.north) {$lire/\emptyset$};
|
||||
|
||||
\draw[arrow] (11) -- (12);
|
||||
\draw[arrow] (12) -- (13);
|
||||
|
||||
\node[roundnode] (21) [below=10pt of 11] {};
|
||||
\node[left] at (21.west) {$p_1$};
|
||||
\node[below] at (21.south) {$ecrire(2)$};
|
||||
\node[roundnode] (22) [right=50pt of 21] {};
|
||||
\node[below] at (22.south) {$lire/2$};
|
||||
\node[roundnode] (23) [right=50pt of 22] {};
|
||||
\node[below] at (23.south) {$lire/\emptyset$};
|
||||
|
||||
\draw[arrow] (21) -- (22);
|
||||
\draw[arrow] (22) -- (23);
|
||||
|
||||
\draw (23) -- (13);
|
||||
|
||||
\draw[dashed] ($(13)!0.5!(12) + (0,1)$) -- ++(0, -2.9);
|
||||
\end{tikzpicture}
|
||||
}
|
31
docs/presentations/SoutenanceStage/schemas/linearisation_atomicite_hc.tex
Executable file
31
docs/presentations/SoutenanceStage/schemas/linearisation_atomicite_hc.tex
Executable file
@ -0,0 +1,31 @@
|
||||
\resizebox{\columnwidth}{!}{%
|
||||
\begin{tikzpicture}[
|
||||
roundedrectangle/.style={draw, rounded corners, rectangle, minimum height=10pt, minimum width=20pt},
|
||||
invisible/.style={draw=none, fill=none},
|
||||
]
|
||||
|
||||
\node[invisible] (10) {};
|
||||
\node[roundedrectangle, minimum width=150pt] (11) [right=100pt of 10] {$ecriture(1)$};
|
||||
\node[invisible] (12) [right=100pt of 11] {};
|
||||
|
||||
\node[invisible] (20) [below=15pt of 10] {};
|
||||
\node[roundedrectangle, minimum width=75pt] (21) [right=25pt of 20] {\textcolor{blue}{$lecture/0$}};
|
||||
\node[roundedrectangle, minimum width=50pt] (22) [right=75pt of 21] {\textcolor{blue}{$lecture/0$}};
|
||||
\node[roundedrectangle, minimum width=50pt] (23) [right=75pt of 22] {\textcolor{red}{$lecture/1$}};
|
||||
\node[invisible] (24) [below=15pt of 12] {};
|
||||
|
||||
\node[invisible] (30) [below=15pt of 20] {};
|
||||
\node[roundedrectangle, minimum width=50pt] (31) [right=125pt of 30] {\textcolor{red}{$lecture/1$}};
|
||||
\node[roundedrectangle, minimum width=80pt] (32) [right=40pt of 31] {\textcolor{red}{$lecture/1$}};
|
||||
\node[invisible] (33) [below=15pt of 24] {};
|
||||
|
||||
\node[invisible] (40) [below=25pt of 30] {};
|
||||
\node[invisible] (41) [below=25pt of 33] {};
|
||||
|
||||
\draw (10) -- (11) -- (12);
|
||||
\draw (20) -- (21) -- (22) -- (23) -- (24);
|
||||
\draw (30) -- (31) -- (32) -- (33);
|
||||
|
||||
\draw[->] (40) -- node [above] {temps} (41);
|
||||
\end{tikzpicture}
|
||||
}
|
31
docs/presentations/SoutenanceStage/schemas/linearisation_regularite_hc.tex
Executable file
31
docs/presentations/SoutenanceStage/schemas/linearisation_regularite_hc.tex
Executable file
@ -0,0 +1,31 @@
|
||||
\resizebox{\columnwidth}{!}{%
|
||||
\begin{tikzpicture}[
|
||||
roundedrectangle/.style={draw, rounded corners, rectangle, minimum height=10pt, minimum width=20pt},
|
||||
invisible/.style={draw=none, fill=none},
|
||||
]
|
||||
|
||||
\node[invisible] (10) {};
|
||||
\node[roundedrectangle, minimum width=150pt] (11) [right=100pt of 10] {$ecriture(1)$};
|
||||
\node[invisible] (12) [right=100pt of 11] {};
|
||||
|
||||
\node[invisible] (20) [below=15pt of 10] {};
|
||||
\node[roundedrectangle, minimum width=75pt] (21) [right=25pt of 20] {\textcolor{blue}{$lecture/0$}};
|
||||
\node[roundedrectangle, minimum width=50pt] (22) [right=75pt of 21] {\textcolor{blue}{$lecture/0$}};
|
||||
\node[roundedrectangle, minimum width=50pt] (23) [right=75pt of 22] {\textcolor{red}{$lecture/1$}};
|
||||
\node[invisible] (24) [below=15pt of 12] {};
|
||||
|
||||
\node[invisible] (30) [below=15pt of 20] {};
|
||||
\node[roundedrectangle, minimum width=50pt] (31) [right=125pt of 30] {\textcolor{red}{$lecture/1$}};
|
||||
\node[roundedrectangle, minimum width=80pt] (32) [right=40pt of 31] {\textcolor{blue}{$lecture/0$}};
|
||||
\node[invisible] (33) [below=15pt of 24] {};
|
||||
|
||||
\node[invisible] (40) [below=25pt of 30] {};
|
||||
\node[invisible] (41) [below=25pt of 33] {};
|
||||
|
||||
\draw (10) -- (11) -- (12);
|
||||
\draw (20) -- (21) -- (22) -- (23) -- (24);
|
||||
\draw (30) -- (31) -- (32) -- (33);
|
||||
|
||||
\draw[->] (40) -- node [above] {temps} (41);
|
||||
\end{tikzpicture}
|
||||
}
|
31
docs/presentations/SoutenanceStage/schemas/linearisation_surete_hc.tex
Executable file
31
docs/presentations/SoutenanceStage/schemas/linearisation_surete_hc.tex
Executable file
@ -0,0 +1,31 @@
|
||||
\resizebox{\columnwidth}{!}{%
|
||||
\begin{tikzpicture}[
|
||||
roundedrectangle/.style={draw, rounded corners, rectangle, minimum height=10pt, minimum width=20pt},
|
||||
invisible/.style={draw=none, fill=none},
|
||||
]
|
||||
|
||||
\node[invisible] (10) {};
|
||||
\node[roundedrectangle, minimum width=150pt] (11) [right=100pt of 10] {$ecriture(1)$};
|
||||
\node[invisible] (12) [right=100pt of 11] {};
|
||||
|
||||
\node[invisible] (20) [below=15pt of 10] {};
|
||||
\node[roundedrectangle, minimum width=75pt] (21) [right=25pt of 20] {\textcolor{blue}{$lecture/0$}};
|
||||
\node[roundedrectangle, minimum width=50pt] (22) [right=75pt of 21] {\textcolor{blue}{$lecture/0$}};
|
||||
\node[roundedrectangle, minimum width=50pt] (23) [right=75pt of 22] {\textcolor{red}{$lecture/1$}};
|
||||
\node[invisible] (24) [below=15pt of 12] {};
|
||||
|
||||
\node[invisible] (30) [below=15pt of 20] {};
|
||||
\node[roundedrectangle, minimum width=80pt] (31) [right=125pt of 30] {\textcolor{red!50!blue}{$lecture/27$}};
|
||||
\node[roundedrectangle, minimum width=50pt] (32) [right=40pt of 31] {\textcolor{red}{$lecture/1$}};
|
||||
\node[invisible] (33) [below=15pt of 24] {};
|
||||
|
||||
\node[invisible] (40) [below=25pt of 30] {};
|
||||
\node[invisible] (41) [below=25pt of 33] {};
|
||||
|
||||
\draw (10) -- (11) -- (12);
|
||||
\draw (20) -- (21) -- (22) -- (23) -- (24);
|
||||
\draw (30) -- (31) -- (32) -- (33);
|
||||
|
||||
\draw[->] (40) -- node [above] {temps} (41);
|
||||
\end{tikzpicture}
|
||||
}
|
34
docs/presentations/SoutenanceStage/schemas/localiteetat.tex
Executable file
34
docs/presentations/SoutenanceStage/schemas/localiteetat.tex
Executable file
@ -0,0 +1,34 @@
|
||||
\resizebox{\columnwidth}{!}{%
|
||||
\begin{tikzpicture}[
|
||||
roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,},
|
||||
ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,},
|
||||
arrow/.style={|->, thick,},
|
||||
message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}},
|
||||
]
|
||||
|
||||
\node[roundnode] (11) {};
|
||||
\node[left] at (11.west) {$p_0$};
|
||||
\node[above] at (11.north) {$ecrire(0)$};
|
||||
\node[roundnode] (12) [right=50pt of 11] {};
|
||||
\node[above] at (12.north) {$lire/\emptyset$};
|
||||
\node[roundnode] (13) [right=50pt of 12] {};
|
||||
\node[above] at (13.north) {$lire/1$};
|
||||
|
||||
\draw[arrow] (11) -- (12);
|
||||
\draw[arrow] (12) -- (13);
|
||||
|
||||
\node[roundnode] (21) [below=10pt of 11] {};
|
||||
\node[left] at (21.west) {$p_1$};
|
||||
\node[below] at (21.south) {$ecrire(1)$};
|
||||
\node[roundnode] (22) [right=50pt of 21] {};
|
||||
\node[below] at (22.south) {$lire/\emptyset$};
|
||||
\node[roundnode] (23) [right=50pt of 22] {};
|
||||
\node[below] at (23.south) {$lire/0$};
|
||||
|
||||
\draw[arrow] (21) -- (22);
|
||||
\draw[arrow] (22) -- (23);
|
||||
|
||||
\draw[message] (11) -- ($(22)!0.5!(23)$);
|
||||
\draw[message] (21) -- ($(12)!0.5!(13)$);
|
||||
\end{tikzpicture}
|
||||
}
|
31
docs/presentations/SoutenanceStage/schemas/validite.tex
Executable file
31
docs/presentations/SoutenanceStage/schemas/validite.tex
Executable file
@ -0,0 +1,31 @@
|
||||
\resizebox{\columnwidth}{!}{%
|
||||
\begin{tikzpicture}[
|
||||
roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,},
|
||||
ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,},
|
||||
arrow/.style={|->, thick,},
|
||||
message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}},
|
||||
]
|
||||
|
||||
\node[roundnode] (11) {};
|
||||
\node[left] at (11.west) {$p_0$};
|
||||
\node[above] at (11.north) {$ecrire(1)$};
|
||||
\node[roundnode] (12) [right=50pt of 11] {};
|
||||
\node[above] at (12.north) {$lire/1$};
|
||||
\node[roundnode] (13) [right=50pt of 12] {};
|
||||
\node[above] at (13.north) {$lire/1$};
|
||||
|
||||
\draw[arrow] (11) -- (12);
|
||||
\draw[arrow] (12) -- (13);
|
||||
|
||||
\node[roundnode] (21) [below=10pt of 11] {};
|
||||
\node[left] at (21.west) {$p_1$};
|
||||
\node[below] at (21.south) {$lire/1$};
|
||||
\node[roundnode] (22) [right=50pt of 21] {};
|
||||
\node[below] at (22.south) {$supprimer(1)$};
|
||||
\node[roundnode] (23) [right=50pt of 22] {};
|
||||
\node[below] at (23.south) {$lire/\emptyset$};
|
||||
|
||||
\draw[arrow] (21) -- (22);
|
||||
\draw[arrow] (22) -- (23);
|
||||
\end{tikzpicture}
|
||||
}
|
42
docs/presentations/SoutenanceStage/schemas/wcc_hc_1.tex
Executable file
42
docs/presentations/SoutenanceStage/schemas/wcc_hc_1.tex
Executable file
@ -0,0 +1,42 @@
|
||||
\resizebox{\columnwidth}{!}{%
|
||||
\begin{tikzpicture}[
|
||||
roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,},
|
||||
ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,},
|
||||
arrow/.style={|->, thick,},
|
||||
message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}},
|
||||
]
|
||||
|
||||
\node[roundnode, color=red] (11) {};
|
||||
\node[above] at (11.north) {$w(1)$};
|
||||
\node[roundnode, color=red!50] (12) [right=of 11] {};
|
||||
\node[above] at (12.north) {$r/(0,1)$};
|
||||
\node[roundnode, color=red!25] (13) [right=of 12] {};
|
||||
\node[above] at (13.north) {$r/(3,2)^\omega$};
|
||||
|
||||
\draw[arrow] (11) -- (12);
|
||||
\draw[arrow] (12) -- (13);
|
||||
|
||||
\node[roundnode, color=green!75!black] (21) [below=20pt of 11] {};
|
||||
\node[left] at (21.west) {$r/(3,1)$};
|
||||
\node[roundnode, color=green!95!black] (22) [right=of 21] {};
|
||||
\node[right] at (22.east) {$w(2)$};
|
||||
|
||||
\draw[arrow] (21) -- (22);
|
||||
|
||||
\node[roundnode, color=blue] (31) [below=20pt of 21] {};
|
||||
\node[below] at (31.south) {$w(3)$};
|
||||
\node[roundnode, color=blue!50] (32) [right=of 31] {};
|
||||
\node[below] at (32.south) {$r/(3,1)$};
|
||||
\node[roundnode, color=blue!25] (33) [right=of 32] {};
|
||||
\node[below] at (33.south) {$r/(3,2)^\omega$};
|
||||
|
||||
\draw[arrow] (31) -- (32);
|
||||
\draw[arrow] (32) -- (33);
|
||||
|
||||
\draw[message] (11) -- (21);
|
||||
\draw[message] (31) -- (21);
|
||||
\draw[message] (21) -- (32);
|
||||
\draw[message] (22) -- (13);
|
||||
\draw[message] (22) -- (33);
|
||||
\end{tikzpicture}
|
||||
}
|
29
docs/presentations/SoutenanceStage/schemas/wcc_hc_2.tex
Executable file
29
docs/presentations/SoutenanceStage/schemas/wcc_hc_2.tex
Executable file
@ -0,0 +1,29 @@
|
||||
\resizebox{\columnwidth}{!}{%
|
||||
\begin{tikzpicture}[
|
||||
roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,},
|
||||
ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,},
|
||||
arrow/.style={|->, thick,},
|
||||
message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}},
|
||||
]
|
||||
|
||||
\node[roundnode] (11) {};
|
||||
\node[above] at (11.north) {$w(1)$};
|
||||
\node[roundnode] (12) [right=of 11] {};
|
||||
\node[above] at (12.north) {$r/(2,1)$};
|
||||
\node[roundnode] (13) [right=of 12] {};
|
||||
\node[above] at (13.north) {$r/(2,1)^\omega$};
|
||||
|
||||
\draw[arrow] (11) -- (12);
|
||||
\draw[arrow] (12) -- (13);
|
||||
|
||||
\node[roundnode] (21) [below=20pt of 11] {};
|
||||
\node[left] at (21.west) {$r/(0,1)$};
|
||||
\node[roundnode] (22) [right=of 21] {};
|
||||
\node[right] at (22.east) {$w(2)$};
|
||||
|
||||
\draw[arrow] (21) -- (22);
|
||||
|
||||
\draw[message] (11) -- (21);
|
||||
\draw[message] (22) -- (12);
|
||||
\end{tikzpicture}
|
||||
}
|
41
docs/presentations/SoutenanceStage/schemas/wcc_hc_3.tex
Executable file
41
docs/presentations/SoutenanceStage/schemas/wcc_hc_3.tex
Executable file
@ -0,0 +1,41 @@
|
||||
\resizebox{\columnwidth}{!}{%
|
||||
\begin{tikzpicture}[
|
||||
roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,},
|
||||
ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,},
|
||||
arrow/.style={|->, thick,},
|
||||
message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}},
|
||||
]
|
||||
|
||||
\node[roundnode, color=red] (11) {};
|
||||
\node[above] at (11.north) {$w(1)$};
|
||||
\node[roundnode, color=red!50] (12) [right=of 11] {};
|
||||
\node[above] at (12.north) {$r/(3,1)$};
|
||||
\node[roundnode, color=red!25] (13) [right=of 12] {};
|
||||
\node[above] at (13.north) {$r/(1,2)^\omega$};
|
||||
|
||||
\draw[arrow] (11) -- (12);
|
||||
\draw[arrow] (12) -- (13);
|
||||
|
||||
\node[roundnode, color=green!75!black] (21) [below=20pt of 11] {};
|
||||
\node[left] at (21.west) {$r/(0,0)$};
|
||||
\node[roundnode, color=green!95!black] (22) [right=of 21] {};
|
||||
\node[right] at (22.east) {$w(2)$};
|
||||
|
||||
\draw[arrow] (21) -- (22);
|
||||
|
||||
\node[roundnode, color=blue] (31) [below=20pt of 21] {};
|
||||
\node[below] at (31.south) {$w(3)$};
|
||||
\node[roundnode, color=blue!50] (32) [right=of 31] {};
|
||||
\node[below] at (32.south) {$r/(1,3)$};
|
||||
\node[roundnode, color=blue!25] (33) [right=of 32] {};
|
||||
\node[below] at (33.south) {$r/(3,2)^\omega$};
|
||||
|
||||
\draw[arrow] (31) -- (32);
|
||||
\draw[arrow] (32) -- (33);
|
||||
|
||||
\draw[message] (11) -- (31);
|
||||
\draw[message] (31) -- (12);
|
||||
\draw[message] (22) -- (13);
|
||||
\draw[message] (22) -- (33);
|
||||
\end{tikzpicture}
|
||||
}
|
25
docs/presentations/SoutenanceStage/work/index.tex
Normal file
25
docs/presentations/SoutenanceStage/work/index.tex
Normal file
@ -0,0 +1,25 @@
|
||||
\begin{frame}
|
||||
\frametitle{Travail réalisé}
|
||||
|
||||
\begin{columns}
|
||||
\column{0.4\columnwidth}
|
||||
\begin{block}{LIS}
|
||||
\begin{itemize}
|
||||
\item Une réflexion sur l'approche à prendre avec la problématique de Parsec
|
||||
\item Une étude et une compréhension profonde de l'architecture derrière Parsec
|
||||
\end{itemize}
|
||||
\end{block}
|
||||
|
||||
\column{0.4\columnwidth}
|
||||
\begin{block}{Scille}
|
||||
\begin{itemize}
|
||||
\item L'étude et la réalisation de l'état de l'art.
|
||||
\item Des présentations dans le cadre du LIS
|
||||
\end{itemize}
|
||||
\end{block}
|
||||
\vspace{50pt}
|
||||
|
||||
|
||||
\end{columns}
|
||||
|
||||
\end{frame}
|
@ -0,0 +1,17 @@
|
||||
\begin{frame}
|
||||
\frametitle{Le principe de la commutativité}
|
||||
|
||||
\begin{block}{Définition}
|
||||
Une opération est commutative si l'ordre dans lequel elle est appliquée n'a pas d'importance.
|
||||
\end{block}
|
||||
|
||||
\begin{exampleblock}{Exemple}
|
||||
\begin{itemize}
|
||||
\item $a + b = b + a$
|
||||
\item $a \times b = b \times a$ MAIS $a \times b \times c \neq a \times c \times b$
|
||||
\item $a \div b \neq b \div a$
|
||||
\end{itemize}
|
||||
\end{exampleblock}
|
||||
|
||||
L'idée est de restreindre les opérations possibles de l'application à seulement celles qui sont commutatives entre elles.
|
||||
\end{frame}
|
BIN
docs/presentations/scille/séminaire_printemps_2024/images/carte_criteres.png
Executable file
BIN
docs/presentations/scille/séminaire_printemps_2024/images/carte_criteres.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 159 KiB |
52
docs/presentations/scille/séminaire_printemps_2024/main.tex
Executable file
52
docs/presentations/scille/séminaire_printemps_2024/main.tex
Executable file
@ -0,0 +1,52 @@
|
||||
\documentclass{beamer}
|
||||
\usetheme{Boadilla}
|
||||
\usecolortheme{orchid}
|
||||
|
||||
\usepackage[T1]{fontenc}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage[french]{babel}
|
||||
\usepackage{stackengine}
|
||||
|
||||
\addtobeamertemplate{navigation symbols}{}{%
|
||||
\usebeamerfont{footline}%
|
||||
\usebeamercolor[fg]{footline}%
|
||||
\hspace{1em}%
|
||||
\insertframenumber/\inserttotalframenumber
|
||||
}
|
||||
\usepackage{ulem}
|
||||
\usepackage{tkz-tab}
|
||||
\setbeamertemplate{blocks}[rounded]%
|
||||
[shadow=true]
|
||||
\AtBeginSection{%
|
||||
\begin{frame}
|
||||
\tableofcontents[sections=\value{section}]
|
||||
\end{frame}
|
||||
}
|
||||
|
||||
\usepackage{tikz}
|
||||
\usetikzlibrary{positioning}
|
||||
\usetikzlibrary{calc}
|
||||
\usetikzlibrary{arrows.meta}
|
||||
|
||||
\title[bwconsistency]{Cohérence faible byzantine appliquée au cloud}
|
||||
\subtitle{Présentation intermédiaire : Cohérence faible}
|
||||
\author[JOLY Amaury]{JOLY Amaury\\ \textbf{Encadrants :} GODARD Emmanuel, TRAVERS Corentin }
|
||||
% \\[2ex] \includegraphics[scale=0.1]{./img/amu.png}
|
||||
\institute[LIS, Scille]{LIS-LAB, Scille}
|
||||
\date{\today}
|
||||
|
||||
\begin{document}
|
||||
|
||||
\maketitle
|
||||
|
||||
\begin{frame}{Table des matières}
|
||||
\tableofcontents
|
||||
\end{frame}
|
||||
|
||||
% \section{Introduction}
|
||||
% \input{définition/index.tex}
|
||||
|
||||
\section{Les CRDT (Conflict-free Replicated Data Types)}
|
||||
\input{crdt/index.tex}
|
||||
|
||||
\end{document}
|
27
docs/presentations/scille/séminaire_printemps_2024/script.md
Executable file
27
docs/presentations/scille/séminaire_printemps_2024/script.md
Executable file
@ -0,0 +1,27 @@
|
||||
# Script présentation Cohérence Faible
|
||||
|
||||
## Plan
|
||||
|
||||
1. Présenter un processus séquentiel classique
|
||||
- exemple : processeur monocœur
|
||||
2. Introduire le concept de cohérence via la cohérence forte (le plus intuitif)
|
||||
- exemple : processeur multicœur, application distribuée centralisée.
|
||||
- notions : respect de l'ordre, atomicité, isolation
|
||||
3. Introduire le concept de cohérence faible
|
||||
- exemple : application distribuée décentralisée
|
||||
4. Définir les propriétés d'un système réparti
|
||||
5. Définir les différents modèles de cohérence faible (des plus trivial aux moins)
|
||||
1. Cohérence Séquentielle (SC)
|
||||
2. Linéarisabilité -> Serialisabilité
|
||||
3. Convergence/Convergence Forte
|
||||
1. Définit le concept de convergence
|
||||
2. Pourquoi ? + les apports de la convergence forte
|
||||
3. Types de données basés sur la convergence (pourquoi ?)
|
||||
4. Cohérence Pipeline
|
||||
1. On présente la notion d'Intention
|
||||
2. On l'oppose à la cohérence Pipeline
|
||||
|
||||
6. Cohérence d'écriture
|
||||
1. Ce que ne couvre pas les modèles précédents
|
||||
2. Cohérence d'écriture et cohérence d'écriture forte.
|
||||
|
96
docs/rapport/rapport_etat_art/coherence_forte/index.tex
Normal file
96
docs/rapport/rapport_etat_art/coherence_forte/index.tex
Normal file
@ -0,0 +1,96 @@
|
||||
La cohérence forte présente, dans un premier temps, l'approche la plus intuitive pour une application collaborative dans le cloud.
|
||||
Prenons l'approche de chercher à répliquer un processus d'édition local d'un document. Formalisons dans un premier temps ce qu'on attend d'une application d'édition de document local.
|
||||
|
||||
\begin{figure}[!h]
|
||||
\centering
|
||||
\resizebox{!}{.4\columnwidth}{
|
||||
\input{images/local1.latex}
|
||||
}
|
||||
\caption{Bob edit un document localement}
|
||||
\label{local_1}
|
||||
\end{figure}
|
||||
|
||||
On voit sur la figure \ref{local_1} que Bob émet une requête à son interface utilisateur. À partir de là le clavier partage l'information au système jusqu'à l'application d'édition. En fonction du traitement de cette information, si elle est acceptée par l'application d'édition, alors elle affiche un document modifié en accord avec la saisie de Bob à l'écran. Ce qui donne un feedback à Bob concernant son action initiale.
|
||||
Dans notre modélisation, nous séparons bien les actions de l'utilisateur sur ses interfaces (l'écran et le clavier) des interactions au sein du système.
|
||||
|
||||
Dans un cas d'usage courant, une application d'édition local ne présente pas de problèmes liés à la présence de plusieurs éditeurs en simultanés. Il y a en effet une seule interface homme-machine, c'est-à-dire de façon pragmatique un unique écran et clavier.
|
||||
|
||||
Imaginons ainsi un cas où Alice et Bob souhaitent éditer ensemble un même document. Si on voulait simplement appliquer le fonctionnement local que nous venons de décrire à cette nouvelle problématique. Il conviendrait de simplement rajouter un IHM à Alice. Ainsi il y a toujours une seule application d'édition collaborative sur lequel viennent se connecter cette fois-ci deux interfaces (comme visible dans la figure \ref{local_2}).
|
||||
|
||||
\begin{figure}[!h]
|
||||
\begin{multicols}{2}
|
||||
|
||||
\centering
|
||||
\resizebox{!}{.7\columnwidth}{
|
||||
\input{images/local2.latex}
|
||||
}
|
||||
\caption{Alice et Bob éditent un document localement}
|
||||
\label{local_2}
|
||||
|
||||
\columnbreak
|
||||
|
||||
\centering
|
||||
\resizebox{!}{.8\columnwidth}{
|
||||
\input{images/local2fail.latex}
|
||||
}
|
||||
\caption{Alice et Bob éditent un document localement de manière concurente}
|
||||
\label{local_2_fail}
|
||||
\end{multicols}
|
||||
\end{figure}
|
||||
|
||||
|
||||
Nous avons à présents deux acteurs qui éditent et lise le document, et un autre qui s'occupe de stocker et de synchroniser le document entre ces deux acteurs.
|
||||
|
||||
La limite liée à cette approche réside dans le fait que les communications entre Alice et l'application et Bob et l'application ne peuvent pas être garentits comme équitables. En effet, Alice et Bob peuvent très bien se retrouver déconnectés de manière non prévisible et asynchrone. Ou bien avoir des temps de transmissions de leurs informations qui diffèrent. Le caractère non-deterministe des ces erreurs peut résulter en des incohérences dans l'ordre d'arrivé des informations soumises par Alice et Bob. Ce qui peut a terme créer des incohérences dans le document final.
|
||||
|
||||
C'est néanmoins une problèmatique qui peut être assimilée à de la gestion de la concurrence entre processus. C'est en effet un domaine qui est étudié depuis l'apparition des premiers processeurs multi-coeur. Une approche que nous pouvons donc prendre à la programmation concurente serait de résoudre ce problème en venant utliser des techniques de synchronisation de processus. C'est-à-dire en utilisant des mécanismes de synchronisation tel que des verrous dans notre application. On peut par exemple utiliser des sémaphores pour gérer les accès concurrents à la mémoire partagée. Ce qui resulterais en l'execution suivante:
|
||||
|
||||
\begin{figure}[!h]
|
||||
\centering
|
||||
\resizebox{!}{.7\columnwidth}{
|
||||
\input{images/serialized.latex}
|
||||
}
|
||||
\caption{Alice et Bob éditent un document localement avec des vérous}
|
||||
\label{serialized}
|
||||
\end{figure}
|
||||
|
||||
On voit sur la figure \ref{serialized} que les actions d'Alice et Bob sont sérialisées. C'est-à-dire que les actions d'Alice et Bob sont exécutées l'une après l'autre. Ce qui permet d'éviter les problèmes de concurrence entre les deux acteurs. Cependant, cette approche est très limitée. En effet, elle ne permet pas de profiter des avantages de l'édition collaborative. En effet, cela signifie que l'un des deux acteurs doit attendre que l'autre ait fini d'éditer le document pour pouvoir à son tour l'éditer. Ce qui rabaisse les performance de l'application à la latence de l'acteur le plus lent.
|
||||
|
||||
En revenons dans notre contexte initial qui est une applicationn d'édition collaborative nous souhaitons pouvoir gérér un grand nombre d'utilisateur en simultanés. Ainsi la probabilité d'avoir une expérience dégradé pour l'ensemble des utilisateur croit avec le nombre d'utilisateur. Pour pallier à ce problème l'approche qui peut être adopté est d'exclure les utilisateurs possèdant des connections trop limités avec le serveur.
|
||||
|
||||
C'est néanmoins la seule approche qui nous permet d'obtenir une cohérence absolue autant dans la prise en compte des opérations d'écritures des acteurs que dans le traitement de leurs lectures.
|
||||
|
||||
Selon Perrin on se placerait dans une approche qui relèverait de la cohérence séquentielle.
|
||||
|
||||
\subsection{Cohérence séquentielle}
|
||||
|
||||
% blbla sur la cohérence séquentielle de manière très théorique et fondamentale
|
||||
|
||||
|
||||
|
||||
\paragraph{Validité}
|
||||
|
||||
Dans une application d'édition collaborative on s'attend à ce que toutes les entrées des utilisateurs soient prises en compte. Il nous parait en effet inacceptable que des saisies disparaisses de manière aléatoire durant l'exécution.
|
||||
|
||||
Ce principe nous permet d'introduire une première propriété utilisée par Perrin pour définir et classer les différents critères de cohérence qu'est la validité.
|
||||
|
||||
La validité peut ainsi être résumé comme la propriété qui permet d'assurer que toutes les saisies réalisées, et seulement elles, soient prises en compte dans l'exécution du système.
|
||||
|
||||
Ceci se traduit par l'affichage d'un retour quant à la saisie de bob sur son application. Lui signifiant que son interaction avec l'application à bien était prise en compte, et n'est donc pas passée à la trappe. Elle n'implique néanmoins aucune notion d'ordre dans les saisies, ce qui signifie que les saisies peuvent être réagencées durant l'exécution.
|
||||
|
||||
\paragraph{Convergence}
|
||||
|
||||
Une autre attente d'une application d'édition collaborative est en quelque sorte sont determinisme sur une durée infinie. On s'attend en effet, une fois toutes les éditions terminés, que le document soit identique pour tous les acteurs. C'est-à-dire que peut importe l'ordre dans lequel les saisies ont été réalisées, le document final doit être identique pour tous les noeuds.
|
||||
|
||||
C'est ce que Perrin appelle la convergence qu'il définit plus formellement comment étant la propriété qui assure que si un nombre finit d'ecriture et infini de lecture sont réaliséés, alors tous les noeuds finissent par avoir la même valeur.
|
||||
|
||||
\paragraph{Localité D'état}
|
||||
|
||||
La dernière propriétée du model de Perrin est la localité d'état.
|
||||
|
||||
Elle consiste en le fait que chaque acteur doivent garder une vision local cohérente du système. Par exemple, comme illustrée dans la Figure \ref{local_state}, au fur et à mesure des éditions de Bob, sa vue local va évoluer en conséquence, mais si il recoit à un moment donné une édition d'Alice qui est antérieur à une de ses éditions, alors il doit privilégier sa propre édition. C'est-à-dire que sa vue local doit être cohérente avec son historique d'édition quitte à diverger de la vue local d'Alice.
|
||||
|
||||
\begin{figure}[!h]
|
||||
\caption{Localité d'état}
|
||||
\label{local_state}
|
||||
\end{figure}
|
@ -1,7 +1,68 @@
|
||||
\subsection{Etat des différents critères}
|
||||
\subsubsection{Les modèles de mémoires partagées}
|
||||
Nous venons de définir la cohérence séquentielle et de proposer une approche pour la réalisser. Néanmoins nous avons vue que cette approche est limitès puisqu'elle pousse le système à être nivelé par le bas en s'adaptant à l'acteur le plus lent.
|
||||
Nous allons donc explorer d'autres approches réalisant plus de compromis dans la gestion de la cohérence du système.
|
||||
|
||||
\subsubsection{La cohérence forte}
|
||||
Cohérence Séquentielle \cite{lamport_how_1979}
|
||||
Ainsi là où la cohérence séquentielle (et par extension la cohérence forte) permettait de garantir nos 3 propriétées que sont la validité, la convergence et la localité d'état. Nous allons explorer des solution qui certaines de ces propriétées afin de gagner en performance et en résilience.
|
||||
|
||||
\subsubsection{La cohérence Faible}
|
||||
\subsection{Adaptation à notre problème}
|
||||
|
||||
Dans le cadre de notre problématique il convient dans un premier temps de spécifier quels sont les critères qui semblent être essentiels à la réalisation d'une application d'édition collaborative. Pour ca nous pouvons dèja imaginer ce qu'implique concretement ces différents critères sur le comportement de notre application.
|
||||
|
||||
\subsubsection{Validité}
|
||||
|
||||
Comme dit précèdemment, la validité permet d'assurer que les saisies de Bob soient toujours prise en compte en tout point du système. C'est-à-dire que si Bob saisit "Hello" puis "World" alors il s'attend à ce que ces deux saisies soient prises en compte. Ce qui se traduit par l'affichage de "Hello World" ou "World Hello sur son écran. Les états finaux incorects qui ne respecterais pas la validité sont alors "Hello", "World" ou "$\emptyset$".
|
||||
|
||||
De la même manière, les saisies des aitres acteurs du sytème peuvent donc très bien étre ignorés, intercalés entre les saises de Bob, et réagencés durant l'éxécution.
|
||||
|
||||
Ne pas prendre en compte le critère de validité dans notre application reviendrait donc à être capable d'ignorer des saisies soumises par l'utilisateur. C'est ce qui est formalisé par le critère de cohérence dit de Sérialization (selon Perrin).
|
||||
|
||||
L'application de la validité demande à notre système une approche d'acknowledgement. Puisque toutes saisies ce doit d'être considéré, le client doit s'assurer que sa saisie à bien était recu par l'ensemble des noeuds. Dans le cas d'une application centralisé, seul un intermédiaire doit être contacté. Mais dans un contexte plus distriué, le problème augmente en compléxité et en coût pour le réseau.
|
||||
|
||||
\paragraph{La Serialisation}
|
||||
|
||||
La sérialisation se propose donc comme étant l'exact inverse de la validité, c'est à dire un critère de cohérence fort auquel nous aurions retiré la validité. ($SER = \{C_\top\} - \{V\}$)
|
||||
|
||||
\subsubsection{Convergence}
|
||||
|
||||
La convergence permet d'assurer que le document final soit identique pour tous les acteurs. C'est-à-dire que peut importe l'ordre dans lequel les saisies ont été recu par chaque noeud, le document final doit être identique pour tous.
|
||||
|
||||
Il est important de noter que la convergence seule ne dit rien sur la source des données qui composent le document. Ainsi il est possible que le document final ne prenne pas en compte toutes les saisies réalisées sur le système. Ou bien même qu'il prenne en compte des saisies qui n'ont jamais été réalisées.
|
||||
|
||||
Appliqué à notre problème, la convergence assure que le document final soit identique pour tous les acteurs, ce qui peut sembler essentiel dans notre cas.
|
||||
|
||||
L'application de la convergence introduit dans notre système une notion de gestion des conflits. Si plusieurs acteurs souhaitent écrire au même moments, alors des mécanismes doivent être mise en place pour une gestion des conflits deterministe. C'est à dire, permettant de garantir une seule version pour tous les acteurs quelque soit sa position dans le système, et donc l'ordre potentiel de reception des saisies.
|
||||
|
||||
[Un exemple de gestion de conflits pas si évidente que ca]
|
||||
|
||||
Cette gestion des conflit peut être réalisé de manière distribué impliquant la mise en place d'un algorithme de consensus. Ce qui peut être très couteux en terme de performance et de complexité. Ou bien être délégué à un acteur centralisé qui aura le pouvoir de manipuler l'ordre final des saisies. Ce qui peut poser des problèmes en termes de gouvernance du système, donnant le pouvoir à un seul acteur.
|
||||
|
||||
Il est bon de noter que bien que la convergence est une propriétée qui semble importante dans le cadre d'une application d'édition collaborative classique. Il existe des manière de concevoir une application collaborative fournissant un document final identique, mais ne garantissant pas nécéssairement la convergence dans l'ordre où les saisies sont interprétés. Ce point sera discuté lorsque nous aborderons les CRDTs.
|
||||
|
||||
\subsubsection{Localité d'état}
|
||||
|
||||
La localité d'état permet d'assurer que les mises à jour d'affichages futures soient toujours cohérentes avec les mises à jour d'affichages passées. Indirectement, cela interdit le changement de l'ordre dans lequel les transactions passés sont interprétés une fois que le résultat est affiché à l'utilisateur. Mais empeche aussi l'insertion et la supression de transctions dans ce même passé.
|
||||
|
||||
L'objectif à haut niveau est de garder une expérience cohérente pour l'utilisateur, en interdisant à l'application de tolérer des retours en arrières de l'état courant.
|
||||
|
||||
Appliqué à notre problème, la localité d'état permet d'assurer que les saisies de Bob et celles qu'il a reçu soient toujours affichés dans l'ordre où elles ont étaient interprétés initialement. Cette propriétée permet par exemple d'empecher le cas où Alice traiterais la saisie de bob, bob de son coté suprime la saisie qu'il vient de réalisé, et Alice renvoit à Bob la saisie qu'elle vient de modifier. Ce cas est explicité dans la figure \ref{local_state_fail}.
|
||||
|
||||
\begin{figure}[!h]
|
||||
\centering
|
||||
\resizebox{!}{0.7\columnwidth}{
|
||||
\input{images/localiteEtatFail.latex}
|
||||
}
|
||||
\caption{Localité d'état non respectée}
|
||||
\label{local_state_fail}
|
||||
\end{figure}
|
||||
|
||||
Du point de vue de Bob, il vient de revoir aparaitre une ligne qu'il vient de supprimer, ce qui rend son expérience incohérente.
|
||||
|
||||
En effet, premièrement Bob à vue s'afficher sur son écran la ligne qu'il venant de saisir \\ $\delta = \{"Hello World"\}$ qui est le resultat de l'éxécution $\text{inserer}("Hello World")$. Puis il supprime le mot "World". Le passé des éxécutions de Bob devient donc $\text{inserer}("Hello World") \cdot \text{supprimer}(" World") = \{"Hello"\}$. Mettant ainsi à jour son état local. Enfin il recoit l'opération d'Alice qui vinet de réaliser une modification en se basant sur un état antérieur à l'état actuel de Bob. L'état qu'il recoit est donc le résultat des opérations $\text{inserer}("Hello World") \cdot \text{inserer}("Hello World") = \{"Hello World"\}$. On omet ici une opération que Bob à soumise, qu'il à pu constater comme étant comptabilisé dans le calcul de son état local, mais qui à ensuite était ignoré par le système. La cohérence de l'état local de Bob n'a donc pas était respectée.
|
||||
|
||||
|
||||
% \subsection{Etat des différents critères}
|
||||
% \subsubsection{Les modèles de mémoires partagées}
|
||||
|
||||
% \subsubsection{La cohérence forte}
|
||||
% Cohérence Séquentielle \cite{lamport_how_1979}
|
||||
|
||||
% \subsubsection{La cohérence Faible}
|
||||
|
43
docs/rapport/rapport_etat_art/images/local1.latex
Normal file
43
docs/rapport/rapport_etat_art/images/local1.latex
Normal file
@ -0,0 +1,43 @@
|
||||
% generated by Plantuml 1.2022.7
|
||||
\definecolor{plantucolor0000}{RGB}{24,24,24}
|
||||
\definecolor{plantucolor0001}{RGB}{0,0,0}
|
||||
\definecolor{plantucolor0002}{RGB}{226,226,240}
|
||||
\begin{tikzpicture}[yscale=-1
|
||||
,pstyle0/.style={color=plantucolor0000,line width=0.5pt,dash pattern=on 5.0pt off 5.0pt}
|
||||
,pstyle1/.style={color=plantucolor0000,fill=plantucolor0002,line width=0.5pt}
|
||||
,pstyle3/.style={color=plantucolor0000,fill=plantucolor0000,line width=1.0pt}
|
||||
,pstyle4/.style={color=plantucolor0000,line width=1.0pt}
|
||||
]
|
||||
\draw[pstyle0] (23pt,84.0679pt) -- (23pt,311.01pt);
|
||||
\draw[pstyle0] (134.7162pt,84.0679pt) -- (134.7162pt,311.01pt);
|
||||
\draw[pstyle0] (208.3289pt,84.0679pt) -- (208.3289pt,311.01pt);
|
||||
\draw[pstyle0] (368.0101pt,84.0679pt) -- (368.0101pt,311.01pt);
|
||||
\node at (5pt,65pt)[below right,color=black]{Bob};
|
||||
\draw[pstyle1] (23.3692pt,13.5pt) ellipse (8pt and 8pt);
|
||||
\draw[color=plantucolor0000,line width=0.5pt] (23.3692pt,21.5pt) -- (23.3692pt,48.5pt)(10.3692pt,29.5pt) -- (36.3692pt,29.5pt)(23.3692pt,48.5pt) -- (10.3692pt,63.5pt)(23.3692pt,48.5pt) -- (36.3692pt,63.5pt);
|
||||
\draw[pstyle1] (100.7162pt,55pt) arc (180:270:5pt) -- (105.7162pt,50pt) -- (164.3289pt,50pt) arc (270:360:5pt) -- (169.3289pt,55pt) -- (169.3289pt,78.0679pt) arc (0:90:5pt) -- (164.3289pt,83.0679pt) -- (105.7162pt,83.0679pt) arc (90:180:5pt) -- (100.7162pt,78.0679pt) -- cycle;
|
||||
\node at (107.7162pt,57pt)[below right,color=black]{Clavier};
|
||||
\draw[pstyle1] (179.3289pt,55pt) arc (180:270:5pt) -- (184.3289pt,50pt) -- (233.3289pt,50pt) arc (270:360:5pt) -- (238.3289pt,55pt) -- (238.3289pt,78.0679pt) arc (0:90:5pt) -- (233.3289pt,83.0679pt) -- (184.3289pt,83.0679pt) arc (90:180:5pt) -- (179.3289pt,78.0679pt) -- cycle;
|
||||
\node at (186.3289pt,57pt)[below right,color=black]{Ecran};
|
||||
\draw[pstyle1] (330.0101pt,55pt) arc (180:270:5pt) -- (335.0101pt,50pt) -- (402.2546pt,50pt) arc (270:360:5pt) -- (407.2546pt,55pt) -- (407.2546pt,78.0679pt) arc (0:90:5pt) -- (402.2546pt,83.0679pt) -- (335.0101pt,83.0679pt) arc (90:180:5pt) -- (330.0101pt,78.0679pt) -- cycle;
|
||||
\node at (337.0101pt,57pt)[below right,color=black]{Système};
|
||||
\draw[pstyle3] (123.0226pt,113.7739pt) -- (133.0226pt,117.7739pt) -- (123.0226pt,121.7739pt) -- (127.0226pt,117.7739pt) -- cycle;
|
||||
\draw[pstyle4] (23.3692pt,117.7739pt) -- (129.0226pt,117.7739pt);
|
||||
\node at (30.3692pt,98.0679pt)[below right,color=black]{Ecrit "Hello"};
|
||||
\draw[pstyle3] (356.6323pt,145.4799pt) -- (366.6323pt,149.4799pt) -- (356.6323pt,153.4799pt) -- (360.6323pt,149.4799pt) -- cycle;
|
||||
\draw[pstyle4] (135.0226pt,149.4799pt) -- (362.6323pt,149.4799pt);
|
||||
\node at (142.0226pt,129.7739pt)[below right,color=black]{Envoie "Hello"};
|
||||
\draw[pstyle4] (368.6323pt,198.892pt) -- (410.6323pt,198.892pt);
|
||||
\draw[pstyle4] (410.6323pt,198.892pt) -- (410.6323pt,211.892pt);
|
||||
\draw[pstyle4] (369.6323pt,211.892pt) -- (410.6323pt,211.892pt);
|
||||
\draw[pstyle3] (379.6323pt,207.892pt) -- (369.6323pt,211.892pt) -- (379.6323pt,215.892pt) -- (375.6323pt,211.892pt) -- cycle;
|
||||
\node at (375.6323pt,161.4799pt)[below right,color=black]{Accepte la saisie et};
|
||||
\node at (375.6323pt,179.186pt)[below right,color=black]{modifie le document};
|
||||
\draw[pstyle3] (219.8289pt,257.304pt) -- (209.8289pt,261.304pt) -- (219.8289pt,265.304pt) -- (215.8289pt,261.304pt) -- cycle;
|
||||
\draw[pstyle4] (213.8289pt,261.304pt) -- (367.6323pt,261.304pt);
|
||||
\node at (225.8289pt,223.892pt)[below right,color=black]{Afiche le document};
|
||||
\node at (225.8289pt,241.598pt)[below right,color=black]{mis à jour};
|
||||
\draw[pstyle3] (34.3692pt,289.01pt) -- (24.3692pt,293.01pt) -- (34.3692pt,297.01pt) -- (30.3692pt,293.01pt) -- cycle;
|
||||
\draw[pstyle4] (28.3692pt,293.01pt) -- (207.8289pt,293.01pt);
|
||||
\node at (40.3692pt,273.304pt)[below right,color=black]{Regarde};
|
||||
\end{tikzpicture}
|
16
docs/rapport/rapport_etat_art/images/local1.puml
Normal file
16
docs/rapport/rapport_etat_art/images/local1.puml
Normal file
@ -0,0 +1,16 @@
|
||||
@startuml local1
|
||||
|
||||
hide footbox
|
||||
|
||||
actor Bob
|
||||
participant Clavier
|
||||
participant Ecran
|
||||
participant Système
|
||||
|
||||
Bob -> Clavier : Ecrit "Hello"
|
||||
Clavier -> Système : Envoie "Hello"
|
||||
Système -> Système : Accepte la saisie et\nmodifie le document
|
||||
Système -> Ecran : Afiche le document\nmis à jour
|
||||
Ecran -> Bob : Regarde
|
||||
|
||||
@enduml
|
41
docs/rapport/rapport_etat_art/images/local2.latex
Normal file
41
docs/rapport/rapport_etat_art/images/local2.latex
Normal file
@ -0,0 +1,41 @@
|
||||
% generated by Plantuml 1.2022.7
|
||||
\definecolor{plantucolor0000}{RGB}{24,24,24}
|
||||
\definecolor{plantucolor0001}{RGB}{0,0,0}
|
||||
\definecolor{plantucolor0002}{RGB}{226,226,240}
|
||||
\begin{tikzpicture}[yscale=-1
|
||||
,pstyle0/.style={color=plantucolor0000,line width=0.5pt,dash pattern=on 5.0pt off 5.0pt}
|
||||
,pstyle1/.style={color=plantucolor0000,fill=plantucolor0002,line width=0.5pt}
|
||||
,pstyle2/.style={color=plantucolor0000,line width=0.5pt}
|
||||
,pstyle3/.style={color=plantucolor0000,fill=plantucolor0000,line width=1.0pt}
|
||||
,pstyle4/.style={color=plantucolor0000,line width=1.0pt}
|
||||
]
|
||||
\draw[pstyle0] (26pt,84.0679pt) -- (26pt,294.304pt);
|
||||
\draw[pstyle0] (75.9pt,84.0679pt) -- (75.9pt,294.304pt);
|
||||
\draw[pstyle0] (235.9633pt,84.0679pt) -- (235.9633pt,294.304pt);
|
||||
\node at (5pt,65pt)[below right,color=black]{Alice};
|
||||
\draw[pstyle1] (26.45pt,13.5pt) ellipse (8pt and 8pt);
|
||||
\draw[pstyle2] (26.45pt,21.5pt) -- (26.45pt,48.5pt)(13.45pt,29.5pt) -- (39.45pt,29.5pt)(26.45pt,48.5pt) -- (13.45pt,63.5pt)(26.45pt,48.5pt) -- (39.45pt,63.5pt);
|
||||
\node at (57.9pt,65pt)[below right,color=black]{Bob};
|
||||
\draw[pstyle1] (76.2692pt,13.5pt) ellipse (8pt and 8pt);
|
||||
\draw[pstyle2] (76.2692pt,21.5pt) -- (76.2692pt,48.5pt)(63.2692pt,29.5pt) -- (89.2692pt,29.5pt)(76.2692pt,48.5pt) -- (63.2692pt,63.5pt)(76.2692pt,48.5pt) -- (89.2692pt,63.5pt);
|
||||
\draw[pstyle1] (184.9633pt,55pt) arc (180:270:5pt) -- (189.9633pt,50pt) -- (282.623pt,50pt) arc (270:360:5pt) -- (287.623pt,55pt) -- (287.623pt,78.0679pt) arc (0:90:5pt) -- (282.623pt,83.0679pt) -- (189.9633pt,83.0679pt) arc (90:180:5pt) -- (184.9633pt,78.0679pt) -- cycle;
|
||||
\node at (191.9633pt,57pt)[below right,color=black]{Application};
|
||||
\draw[pstyle3] (224.2932pt,113.7739pt) -- (234.2932pt,117.7739pt) -- (224.2932pt,121.7739pt) -- (228.2932pt,117.7739pt) -- cycle;
|
||||
\draw[pstyle4] (26.45pt,117.7739pt) -- (230.2932pt,117.7739pt);
|
||||
\node at (33.45pt,98.0679pt)[below right,color=black]{saisir("Hello")};
|
||||
\draw[pstyle3] (37.45pt,145.4799pt) -- (27.45pt,149.4799pt) -- (37.45pt,153.4799pt) -- (33.45pt,149.4799pt) -- cycle;
|
||||
\draw[pstyle4] (31.45pt,149.4799pt) -- (235.2932pt,149.4799pt);
|
||||
\node at (43.45pt,129.7739pt)[below right,color=black]{lire("Hello")};
|
||||
\draw[pstyle3] (87.2692pt,177.186pt) -- (77.2692pt,181.186pt) -- (87.2692pt,185.186pt) -- (83.2692pt,181.186pt) -- cycle;
|
||||
\draw[pstyle4] (81.2692pt,181.186pt) -- (235.2932pt,181.186pt);
|
||||
\node at (93.2692pt,161.4799pt)[below right,color=black]{lire("Hello")};
|
||||
\draw[pstyle3] (224.2932pt,208.892pt) -- (234.2932pt,212.892pt) -- (224.2932pt,216.892pt) -- (228.2932pt,212.892pt) -- cycle;
|
||||
\draw[pstyle4] (76.2692pt,212.892pt) -- (230.2932pt,212.892pt);
|
||||
\node at (83.2692pt,193.186pt)[below right,color=black]{saisir(" World")};
|
||||
\draw[pstyle3] (37.45pt,240.598pt) -- (27.45pt,244.598pt) -- (37.45pt,248.598pt) -- (33.45pt,244.598pt) -- cycle;
|
||||
\draw[pstyle4] (31.45pt,244.598pt) -- (235.2932pt,244.598pt);
|
||||
\node at (43.45pt,224.892pt)[below right,color=black]{lire("Hello World")};
|
||||
\draw[pstyle3] (87.2692pt,272.304pt) -- (77.2692pt,276.304pt) -- (87.2692pt,280.304pt) -- (83.2692pt,276.304pt) -- cycle;
|
||||
\draw[pstyle4] (81.2692pt,276.304pt) -- (235.2932pt,276.304pt);
|
||||
\node at (93.2692pt,256.598pt)[below right,color=black]{lire("Hello World")};
|
||||
\end{tikzpicture}
|
38
docs/rapport/rapport_etat_art/images/local2.puml
Normal file
38
docs/rapport/rapport_etat_art/images/local2.puml
Normal file
@ -0,0 +1,38 @@
|
||||
@startuml local2
|
||||
|
||||
!pragma teoz true
|
||||
hide footbox
|
||||
|
||||
actor Alice
|
||||
actor Bob
|
||||
participant Application
|
||||
|
||||
Alice ->(15) Application: saisir("Hello")
|
||||
Application ->(15) Alice: lire("Hello")
|
||||
& Application ->(30) Bob
|
||||
|
||||
Bob ->(15) Application: saisir(" World")
|
||||
Application ->(15) Alice: lire("Hello World")
|
||||
& Application ->(30) Bob
|
||||
|
||||
@enduml
|
||||
|
||||
@startuml local2fail
|
||||
|
||||
!pragma teoz true
|
||||
hide footbox
|
||||
|
||||
actor Alice
|
||||
participant Application
|
||||
actor Bob
|
||||
|
||||
Alice ->(15) Application: saisir("Le chat")
|
||||
Application ->(15) Alice: lire("Le chat")
|
||||
& Application ->(15) Bob: lire("Le chat")
|
||||
|
||||
Bob ->(15) Application: saisir(" mange")
|
||||
& Alice ->(20) Application: saisir(" boit")
|
||||
Application ->(15) Alice: lire("Le chat mange boit")
|
||||
& Application ->(15) Bob: lire("Le chat mange boit")
|
||||
|
||||
@enduml
|
44
docs/rapport/rapport_etat_art/images/local2fail.latex
Normal file
44
docs/rapport/rapport_etat_art/images/local2fail.latex
Normal file
@ -0,0 +1,44 @@
|
||||
% generated by Plantuml 1.2022.7
|
||||
\definecolor{plantucolor0000}{RGB}{24,24,24}
|
||||
\definecolor{plantucolor0001}{RGB}{0,0,0}
|
||||
\definecolor{plantucolor0002}{RGB}{226,226,240}
|
||||
\begin{tikzpicture}[yscale=-1
|
||||
,pstyle0/.style={color=plantucolor0000,line width=0.5pt,dash pattern=on 5.0pt off 5.0pt}
|
||||
,pstyle1/.style={color=plantucolor0000,fill=plantucolor0002,line width=0.5pt}
|
||||
,pstyle2/.style={color=plantucolor0000,line width=0.5pt}
|
||||
,pstyle3/.style={color=plantucolor0000,fill=plantucolor0000,line width=1.0pt}
|
||||
,pstyle4/.style={color=plantucolor0000,line width=1.0pt}
|
||||
]
|
||||
\draw[pstyle0] (26.45pt,84.0679pt) -- (26.45pt,293.892pt);
|
||||
\draw[pstyle0] (230.5952pt,84.0679pt) -- (230.5952pt,293.892pt);
|
||||
\draw[pstyle0] (434.7404pt,84.0679pt) -- (434.7404pt,293.892pt);
|
||||
\node at (5pt,65pt)[below right,color=black]{Alice};
|
||||
\draw[pstyle1] (26.45pt,13.5pt) ellipse (8pt and 8pt);
|
||||
\draw[pstyle2] (26.45pt,21.5pt) -- (26.45pt,48.5pt)(13.45pt,29.5pt) -- (39.45pt,29.5pt)(26.45pt,48.5pt) -- (13.45pt,63.5pt)(26.45pt,48.5pt) -- (39.45pt,63.5pt);
|
||||
\draw[pstyle1] (179.2654pt,55pt) arc (180:270:5pt) -- (184.2654pt,50pt) -- (276.9251pt,50pt) arc (270:360:5pt) -- (281.9251pt,55pt) -- (281.9251pt,78.0679pt) arc (0:90:5pt) -- (276.9251pt,83.0679pt) -- (184.2654pt,83.0679pt) arc (90:180:5pt) -- (179.2654pt,78.0679pt) -- cycle;
|
||||
\node at (186.2654pt,57pt)[below right,color=black]{Application};
|
||||
\node at (416.3712pt,65pt)[below right,color=black]{Bob};
|
||||
\draw[pstyle1] (434.7404pt,13.5pt) ellipse (8pt and 8pt);
|
||||
\draw[pstyle2] (434.7404pt,21.5pt) -- (434.7404pt,48.5pt)(421.7404pt,29.5pt) -- (447.7404pt,29.5pt)(434.7404pt,48.5pt) -- (421.7404pt,63.5pt)(434.7404pt,48.5pt) -- (447.7404pt,63.5pt);
|
||||
\draw[pstyle3] (218.9152pt,126.0519pt) -- (228.5952pt,130.7739pt) -- (218.329pt,134.0304pt) -- (222.6114pt,130.3343pt) -- cycle;
|
||||
\draw[pstyle4] (26.45pt,115.7739pt) -- (228.5952pt,130.7739pt);
|
||||
\node at (33.45pt,96.0679pt)[below right,color=black]{saisir("Le chat")};
|
||||
\draw[pstyle3] (37.13pt,172.7579pt) -- (27.45pt,177.4799pt) -- (37.7162pt,180.7364pt) -- (33.4339pt,177.0403pt) -- cycle;
|
||||
\draw[pstyle4] (229.5952pt,162.4799pt) -- (26.45pt,177.4799pt);
|
||||
\node at (43.45pt,142.7739pt)[below right,color=black]{lire("Le chat")};
|
||||
\draw[pstyle3] (423.0604pt,172.7579pt) -- (432.7404pt,177.4799pt) -- (422.4742pt,180.7364pt) -- (426.7566pt,177.0403pt) -- cycle;
|
||||
\draw[pstyle4] (230.5952pt,162.4799pt) -- (432.7404pt,177.4799pt);
|
||||
\node at (237.5952pt,142.7739pt)[below right,color=black]{lire("Le chat")};
|
||||
\draw[pstyle3] (241.2752pt,219.4639pt) -- (231.5952pt,224.186pt) -- (241.8615pt,227.4424pt) -- (237.5791pt,223.7463pt) -- cycle;
|
||||
\draw[pstyle4] (433.7404pt,209.186pt) -- (230.5952pt,224.186pt);
|
||||
\node at (247.5952pt,189.4799pt)[below right,color=black]{saisir(" mange")};
|
||||
\draw[pstyle3] (219.0329pt,224.23pt) -- (228.5952pt,229.186pt) -- (218.2529pt,232.1919pt) -- (222.6238pt,228.601pt) -- cycle;
|
||||
\draw[pstyle4] (26.45pt,209.186pt) -- (228.5952pt,229.186pt);
|
||||
\node at (33.45pt,189.4799pt)[below right,color=black]{saisir(" boit")};
|
||||
\draw[pstyle3] (37.13pt,271.1699pt) -- (27.45pt,275.892pt) -- (37.7162pt,279.1484pt) -- (33.4339pt,275.4523pt) -- cycle;
|
||||
\draw[pstyle4] (229.5952pt,260.892pt) -- (26.45pt,275.892pt);
|
||||
\node at (43.45pt,241.186pt)[below right,color=black]{lire("Le chat mange boit")};
|
||||
\draw[pstyle3] (423.0604pt,271.1699pt) -- (432.7404pt,275.892pt) -- (422.4742pt,279.1484pt) -- (426.7566pt,275.4523pt) -- cycle;
|
||||
\draw[pstyle4] (230.5952pt,260.892pt) -- (432.7404pt,275.892pt);
|
||||
\node at (237.5952pt,241.186pt)[below right,color=black]{lire("Le chat mange boit")};
|
||||
\end{tikzpicture}
|
22
docs/rapport/rapport_etat_art/images/localiteEtat.puml
Normal file
22
docs/rapport/rapport_etat_art/images/localiteEtat.puml
Normal file
@ -0,0 +1,22 @@
|
||||
@startuml localiteEtatFail
|
||||
|
||||
Bob -> Bob : inserer("Hello World")
|
||||
Bob -> Bob : afficher() -> "Hello World"
|
||||
Bob -> Alice : partager("Hello World")
|
||||
|
||||
!pragma teoz true
|
||||
|
||||
Alice -> Alice : afficher() : "Hello World"
|
||||
|
||||
Alice -> Alice : souligner("Hello World")
|
||||
& Bob -> Bob : supprimer("Hello World", " World")
|
||||
|
||||
Alice -> Alice : afficher() : "__Hello World__"
|
||||
& Bob -> Bob : afficher() : "Hello"
|
||||
|
||||
Alice ->(25) Bob : \t\t partager("__Hello World__")\n
|
||||
& Bob ->(25) Alice : partager("Hello")
|
||||
Bob -> Bob : afficher() -> "__Hello World__"
|
||||
& Alice -> Alice : afficher() -> "__Hello__"
|
||||
|
||||
@enduml
|
76
docs/rapport/rapport_etat_art/images/localiteEtatFail.latex
Normal file
76
docs/rapport/rapport_etat_art/images/localiteEtatFail.latex
Normal file
@ -0,0 +1,76 @@
|
||||
% generated by Plantuml 1.2022.7
|
||||
\definecolor{plantucolor0000}{RGB}{24,24,24}
|
||||
\definecolor{plantucolor0001}{RGB}{226,226,240}
|
||||
\definecolor{plantucolor0002}{RGB}{0,0,0}
|
||||
\begin{tikzpicture}[yscale=-1
|
||||
,pstyle0/.style={color=plantucolor0000,line width=0.5pt,dash pattern=on 5.0pt off 5.0pt}
|
||||
,pstyle1/.style={color=plantucolor0000,fill=plantucolor0001,line width=0.5pt}
|
||||
,pstyle2/.style={color=plantucolor0000,line width=1.0pt}
|
||||
,pstyle3/.style={color=plantucolor0000,fill=plantucolor0000,line width=1.0pt}
|
||||
]
|
||||
\draw[pstyle0] (27.3692pt,39.0679pt) -- (27.3692pt,431.4221pt);
|
||||
\draw[pstyle0] (295.551pt,39.0679pt) -- (295.551pt,431.4221pt);
|
||||
\draw[pstyle1] (5pt,10pt) arc (180:270:5pt) -- (10pt,5pt) -- (44.7385pt,5pt) arc (270:360:5pt) -- (49.7385pt,10pt) -- (49.7385pt,33.0679pt) arc (0:90:5pt) -- (44.7385pt,38.0679pt) -- (10pt,38.0679pt) arc (90:180:5pt) -- (5pt,33.0679pt) -- cycle;
|
||||
\node at (12pt,12pt)[below right,color=black]{Bob};
|
||||
\draw[pstyle1] (270.101pt,10pt) arc (180:270:5pt) -- (275.101pt,5pt) -- (316.001pt,5pt) arc (270:360:5pt) -- (321.001pt,10pt) -- (321.001pt,33.0679pt) arc (0:90:5pt) -- (316.001pt,38.0679pt) -- (275.101pt,38.0679pt) arc (90:180:5pt) -- (270.101pt,33.0679pt) -- cycle;
|
||||
\node at (277.101pt,12pt)[below right,color=black]{Alice};
|
||||
\draw[pstyle1] (5pt,436.4221pt) arc (180:270:5pt) -- (10pt,431.4221pt) -- (44.7385pt,431.4221pt) arc (270:360:5pt) -- (49.7385pt,436.4221pt) -- (49.7385pt,459.49pt) arc (0:90:5pt) -- (44.7385pt,464.49pt) -- (10pt,464.49pt) arc (90:180:5pt) -- (5pt,459.49pt) -- cycle;
|
||||
\node at (12pt,438.4221pt)[below right,color=black]{Bob};
|
||||
\draw[pstyle1] (270.101pt,436.4221pt) arc (180:270:5pt) -- (275.101pt,431.4221pt) -- (316.001pt,431.4221pt) arc (270:360:5pt) -- (321.001pt,436.4221pt) -- (321.001pt,459.49pt) arc (0:90:5pt) -- (316.001pt,464.49pt) -- (275.101pt,464.49pt) arc (90:180:5pt) -- (270.101pt,459.49pt) -- cycle;
|
||||
\node at (277.101pt,438.4221pt)[below right,color=black]{Alice};
|
||||
\draw[pstyle2] (27.3692pt,70.7739pt) -- (69.3692pt,70.7739pt);
|
||||
\draw[pstyle2] (69.3692pt,70.7739pt) -- (69.3692pt,83.7739pt);
|
||||
\draw[pstyle2] (28.3692pt,83.7739pt) -- (69.3692pt,83.7739pt);
|
||||
\draw[pstyle3] (38.3692pt,79.7739pt) -- (28.3692pt,83.7739pt) -- (38.3692pt,87.7739pt) -- (34.3692pt,83.7739pt) -- cycle;
|
||||
\node at (34.3692pt,51.0679pt)[below right,color=black]{inserer("Hello World")};
|
||||
\draw[pstyle2] (27.3692pt,115.4799pt) -- (69.3692pt,115.4799pt);
|
||||
\draw[pstyle2] (69.3692pt,115.4799pt) -- (69.3692pt,128.4799pt);
|
||||
\draw[pstyle2] (28.3692pt,128.4799pt) -- (69.3692pt,128.4799pt);
|
||||
\draw[pstyle3] (38.3692pt,124.4799pt) -- (28.3692pt,128.4799pt) -- (38.3692pt,132.4799pt) -- (34.3692pt,128.4799pt) -- cycle;
|
||||
\node at (34.3692pt,95.7739pt)[below right,color=black]{afficher() -\textgreater "Hello World"};
|
||||
\draw[pstyle3] (283.551pt,156.186pt) -- (293.551pt,160.186pt) -- (283.551pt,164.186pt) -- (287.551pt,160.186pt) -- cycle;
|
||||
\draw[pstyle2] (27.3692pt,160.186pt) -- (289.551pt,160.186pt);
|
||||
\node at (34.3692pt,140.4799pt)[below right,color=black]{partager("Hello World")};
|
||||
\draw[pstyle2] (295.551pt,191.892pt) -- (337.551pt,191.892pt);
|
||||
\draw[pstyle2] (337.551pt,191.892pt) -- (337.551pt,204.892pt);
|
||||
\draw[pstyle2] (296.551pt,204.892pt) -- (337.551pt,204.892pt);
|
||||
\draw[pstyle3] (306.551pt,200.892pt) -- (296.551pt,204.892pt) -- (306.551pt,208.892pt) -- (302.551pt,204.892pt) -- cycle;
|
||||
\node at (302.551pt,172.186pt)[below right,color=black]{afficher() : "Hello World"};
|
||||
\draw[pstyle2] (295.551pt,236.598pt) -- (337.551pt,236.598pt);
|
||||
\draw[pstyle2] (337.551pt,236.598pt) -- (337.551pt,249.598pt);
|
||||
\draw[pstyle2] (296.551pt,249.598pt) -- (337.551pt,249.598pt);
|
||||
\draw[pstyle3] (306.551pt,245.598pt) -- (296.551pt,249.598pt) -- (306.551pt,253.598pt) -- (302.551pt,249.598pt) -- cycle;
|
||||
\node at (302.551pt,216.892pt)[below right,color=black]{souligner("Hello World")};
|
||||
\draw[pstyle2] (27.3692pt,236.598pt) -- (69.3692pt,236.598pt);
|
||||
\draw[pstyle2] (69.3692pt,236.598pt) -- (69.3692pt,249.598pt);
|
||||
\draw[pstyle2] (28.3692pt,249.598pt) -- (69.3692pt,249.598pt);
|
||||
\draw[pstyle3] (38.3692pt,245.598pt) -- (28.3692pt,249.598pt) -- (38.3692pt,253.598pt) -- (34.3692pt,249.598pt) -- cycle;
|
||||
\node at (34.3692pt,216.892pt)[below right,color=black]{supprimer("Hello World", " World")};
|
||||
\draw[pstyle2] (295.551pt,281.304pt) -- (337.551pt,281.304pt);
|
||||
\draw[pstyle2] (337.551pt,281.304pt) -- (337.551pt,294.304pt);
|
||||
\draw[pstyle2] (296.551pt,294.304pt) -- (337.551pt,294.304pt);
|
||||
\draw[pstyle3] (306.551pt,290.304pt) -- (296.551pt,294.304pt) -- (306.551pt,298.304pt) -- (302.551pt,294.304pt) -- cycle;
|
||||
\node at (302.551pt,261.598pt)[below right,color=black]{afficher() : "\underline{Hello World}"};
|
||||
\draw[pstyle2] (27.3692pt,281.304pt) -- (69.3692pt,281.304pt);
|
||||
\draw[pstyle2] (69.3692pt,281.304pt) -- (69.3692pt,294.304pt);
|
||||
\draw[pstyle2] (28.3692pt,294.304pt) -- (69.3692pt,294.304pt);
|
||||
\draw[pstyle3] (38.3692pt,290.304pt) -- (28.3692pt,294.304pt) -- (38.3692pt,298.304pt) -- (34.3692pt,294.304pt) -- cycle;
|
||||
\node at (34.3692pt,261.598pt)[below right,color=black]{afficher() : "Hello"};
|
||||
\draw[pstyle3] (37.9548pt,363.8051pt) -- (28.3692pt,368.716pt) -- (38.6973pt,371.7706pt) -- (34.3433pt,368.1591pt) -- cycle;
|
||||
\draw[pstyle2] (294.551pt,343.716pt) -- (27.3692pt,368.716pt);
|
||||
\node at (44.3692pt,306.304pt)[below right,color=black]{\qquad\qquad\qquad\qquad\qquad\qquad\qquad partager("\underline{Hello World}")};
|
||||
\node at (44.3692pt,324.01pt)[below right,color=black]{ };
|
||||
\draw[pstyle3] (283.9655pt,363.8051pt) -- (293.551pt,368.716pt) -- (283.2229pt,371.7706pt) -- (287.577pt,368.1591pt) -- cycle;
|
||||
\draw[pstyle2] (27.3692pt,343.716pt) -- (293.551pt,368.716pt);
|
||||
\node at (34.3692pt,324.01pt)[below right,color=black]{partager("Hello")};
|
||||
\draw[pstyle2] (27.3692pt,400.4221pt) -- (69.3692pt,400.4221pt);
|
||||
\draw[pstyle2] (69.3692pt,400.4221pt) -- (69.3692pt,413.4221pt);
|
||||
\draw[pstyle2] (28.3692pt,413.4221pt) -- (69.3692pt,413.4221pt);
|
||||
\draw[pstyle3] (38.3692pt,409.4221pt) -- (28.3692pt,413.4221pt) -- (38.3692pt,417.4221pt) -- (34.3692pt,413.4221pt) -- cycle;
|
||||
\node at (34.3692pt,380.716pt)[below right,color=black]{afficher() : "\underline{Hello World}"};
|
||||
\draw[pstyle2] (295.551pt,400.4221pt) -- (337.551pt,400.4221pt);
|
||||
\draw[pstyle2] (337.551pt,400.4221pt) -- (337.551pt,413.4221pt);
|
||||
\draw[pstyle2] (296.551pt,413.4221pt) -- (337.551pt,413.4221pt);
|
||||
\draw[pstyle3] (306.551pt,409.4221pt) -- (296.551pt,413.4221pt) -- (306.551pt,417.4221pt) -- (302.551pt,413.4221pt) -- cycle;
|
||||
\node at (302.551pt,380.716pt)[below right,color=black]{afficher() : "\underline{Hello}"};
|
||||
\end{tikzpicture}
|
25
docs/rapport/rapport_etat_art/images/seriaized.puml
Normal file
25
docs/rapport/rapport_etat_art/images/seriaized.puml
Normal file
@ -0,0 +1,25 @@
|
||||
@startuml serialized
|
||||
|
||||
!pragma teoz true
|
||||
hide footbox
|
||||
|
||||
participant Alice
|
||||
participant Server
|
||||
participant Bob
|
||||
|
||||
|
||||
Alice ->(10) Server : lock()
|
||||
Server -->(10) Alice : true
|
||||
|
||||
Bob -> Server : lock()
|
||||
& Alice ->(10) Server : inserer("hello world")
|
||||
Server -->(10) Bob : false
|
||||
& Alice ->(10) Server : lire()
|
||||
Server -->(10) Alice : "hello world"
|
||||
Alice -> Server : unlock()
|
||||
Bob -> Server : lock()
|
||||
Bob -> Server : lire()
|
||||
Server -->(10) Bob : "hello world"
|
||||
Bob -> Server : unlock()
|
||||
|
||||
@enduml
|
57
docs/rapport/rapport_etat_art/images/serialized.latex
Normal file
57
docs/rapport/rapport_etat_art/images/serialized.latex
Normal file
@ -0,0 +1,57 @@
|
||||
% generated by Plantuml 1.2022.7
|
||||
\definecolor{plantucolor0000}{RGB}{24,24,24}
|
||||
\definecolor{plantucolor0001}{RGB}{226,226,240}
|
||||
\definecolor{plantucolor0002}{RGB}{0,0,0}
|
||||
\begin{tikzpicture}[yscale=-1
|
||||
,pstyle0/.style={color=plantucolor0000,line width=0.5pt,dash pattern=on 5.0pt off 5.0pt}
|
||||
,pstyle1/.style={color=plantucolor0000,fill=plantucolor0001,line width=0.5pt}
|
||||
,pstyle2/.style={color=plantucolor0000,fill=plantucolor0000,line width=1.0pt}
|
||||
,pstyle3/.style={color=plantucolor0000,line width=1.0pt}
|
||||
,pstyle4/.style={color=plantucolor0000,line width=1.0pt,dash pattern=on 2.0pt off 2.0pt}
|
||||
]
|
||||
\draw[pstyle0] (30.45pt,39.0679pt) -- (30.45pt,434.1281pt);
|
||||
\draw[pstyle0] (210.5241pt,39.0679pt) -- (210.5241pt,434.1281pt);
|
||||
\draw[pstyle0] (328.7611pt,39.0679pt) -- (328.7611pt,434.1281pt);
|
||||
\draw[pstyle1] (5pt,10pt) arc (180:270:5pt) -- (10pt,5pt) -- (50.9pt,5pt) arc (270:360:5pt) -- (55.9pt,10pt) -- (55.9pt,33.0679pt) arc (0:90:5pt) -- (50.9pt,38.0679pt) -- (10pt,38.0679pt) arc (90:180:5pt) -- (5pt,33.0679pt) -- cycle;
|
||||
\node at (12pt,12pt)[below right,color=black]{Alice};
|
||||
\draw[pstyle1] (177.9423pt,10pt) arc (180:270:5pt) -- (182.9423pt,5pt) -- (238.1059pt,5pt) arc (270:360:5pt) -- (243.1059pt,10pt) -- (243.1059pt,33.0679pt) arc (0:90:5pt) -- (238.1059pt,38.0679pt) -- (182.9423pt,38.0679pt) arc (90:180:5pt) -- (177.9423pt,33.0679pt) -- cycle;
|
||||
\node at (184.9423pt,12pt)[below right,color=black]{Server};
|
||||
\draw[pstyle1] (306.3919pt,10pt) arc (180:270:5pt) -- (311.3919pt,5pt) -- (346.1303pt,5pt) arc (270:360:5pt) -- (351.1303pt,10pt) -- (351.1303pt,33.0679pt) arc (0:90:5pt) -- (346.1303pt,38.0679pt) -- (311.3919pt,38.0679pt) arc (90:180:5pt) -- (306.3919pt,33.0679pt) -- cycle;
|
||||
\node at (313.3919pt,12pt)[below right,color=black]{Bob};
|
||||
\draw[pstyle2] (198.7612pt,76.2256pt) -- (208.5241pt,80.7739pt) -- (198.3177pt,84.2133pt) -- (202.5333pt,80.4412pt) -- cycle;
|
||||
\draw[pstyle3] (30.45pt,70.7739pt) -- (208.5241pt,80.7739pt);
|
||||
\node at (37.45pt,51.0679pt)[below right,color=black]{lock()};
|
||||
\draw[pstyle2] (41.2128pt,117.9316pt) -- (31.45pt,122.4799pt) -- (41.6564pt,125.9193pt) -- (37.4408pt,122.1473pt) -- cycle;
|
||||
\draw[pstyle4] (209.5241pt,112.4799pt) -- (30.45pt,122.4799pt);
|
||||
\node at (47.45pt,92.7739pt)[below right,color=black]{true};
|
||||
\draw[pstyle2] (221.5241pt,150.186pt) -- (211.5241pt,154.186pt) -- (221.5241pt,158.186pt) -- (217.5241pt,154.186pt) -- cycle;
|
||||
\draw[pstyle3] (215.5241pt,154.186pt) -- (327.7611pt,154.186pt);
|
||||
\node at (227.5241pt,134.4799pt)[below right,color=black]{lock()};
|
||||
\draw[pstyle2] (198.7612pt,159.6376pt) -- (208.5241pt,164.186pt) -- (198.3177pt,167.6253pt) -- (202.5333pt,163.8533pt) -- cycle;
|
||||
\draw[pstyle3] (30.45pt,154.186pt) -- (208.5241pt,164.186pt);
|
||||
\node at (37.45pt,134.4799pt)[below right,color=black]{inserer("hello world")};
|
||||
\draw[pstyle2] (317.1338pt,201.0635pt) -- (326.7611pt,205.892pt) -- (316.4596pt,209.035pt) -- (320.7825pt,205.3863pt) -- cycle;
|
||||
\draw[pstyle4] (210.5241pt,195.892pt) -- (326.7611pt,205.892pt);
|
||||
\node at (217.5241pt,176.186pt)[below right,color=black]{false};
|
||||
\draw[pstyle2] (198.7612pt,201.3437pt) -- (208.5241pt,205.892pt) -- (198.3177pt,209.3314pt) -- (202.5333pt,205.5593pt) -- cycle;
|
||||
\draw[pstyle3] (30.45pt,195.892pt) -- (208.5241pt,205.892pt);
|
||||
\node at (37.45pt,176.186pt)[below right,color=black]{lire()};
|
||||
\draw[pstyle2] (41.2128pt,243.0497pt) -- (31.45pt,247.598pt) -- (41.6564pt,251.0374pt) -- (37.4408pt,247.2653pt) -- cycle;
|
||||
\draw[pstyle4] (209.5241pt,237.598pt) -- (30.45pt,247.598pt);
|
||||
\node at (47.45pt,217.892pt)[below right,color=black]{"hello world"};
|
||||
\draw[pstyle2] (198.5241pt,275.304pt) -- (208.5241pt,279.304pt) -- (198.5241pt,283.304pt) -- (202.5241pt,279.304pt) -- cycle;
|
||||
\draw[pstyle3] (30.45pt,279.304pt) -- (204.5241pt,279.304pt);
|
||||
\node at (37.45pt,259.598pt)[below right,color=black]{unlock()};
|
||||
\draw[pstyle2] (221.5241pt,307.01pt) -- (211.5241pt,311.01pt) -- (221.5241pt,315.01pt) -- (217.5241pt,311.01pt) -- cycle;
|
||||
\draw[pstyle3] (215.5241pt,311.01pt) -- (327.7611pt,311.01pt);
|
||||
\node at (227.5241pt,291.304pt)[below right,color=black]{lock()};
|
||||
\draw[pstyle2] (221.5241pt,338.716pt) -- (211.5241pt,342.716pt) -- (221.5241pt,346.716pt) -- (217.5241pt,342.716pt) -- cycle;
|
||||
\draw[pstyle3] (215.5241pt,342.716pt) -- (327.7611pt,342.716pt);
|
||||
\node at (227.5241pt,323.01pt)[below right,color=black]{lire()};
|
||||
\draw[pstyle2] (317.1338pt,379.5935pt) -- (326.7611pt,384.4221pt) -- (316.4596pt,387.5651pt) -- (320.7825pt,383.9164pt) -- cycle;
|
||||
\draw[pstyle4] (210.5241pt,374.4221pt) -- (326.7611pt,384.4221pt);
|
||||
\node at (217.5241pt,354.716pt)[below right,color=black]{"hello world"};
|
||||
\draw[pstyle2] (221.5241pt,412.1281pt) -- (211.5241pt,416.1281pt) -- (221.5241pt,420.1281pt) -- (217.5241pt,416.1281pt) -- cycle;
|
||||
\draw[pstyle3] (215.5241pt,416.1281pt) -- (327.7611pt,416.1281pt);
|
||||
\node at (227.5241pt,396.4221pt)[below right,color=black]{unlock()};
|
||||
\end{tikzpicture}
|
@ -10,6 +10,13 @@
|
||||
\usepackage{biblatex}
|
||||
\addbibresource{../../recherches/Stage.bib}
|
||||
|
||||
\usepackage{tikz}
|
||||
\usepackage{aeguill}
|
||||
|
||||
\usepackage{amsmath}
|
||||
|
||||
\usepackage{multicol}
|
||||
|
||||
\begin{document}
|
||||
|
||||
\title{Critères de Cohérence faible byzantine appliquée aux environements cloud}
|
||||
@ -34,6 +41,9 @@
|
||||
\section{Introduction}
|
||||
\input{intro/index.tex}
|
||||
|
||||
\section{Cohérence Forte}
|
||||
\input{coherence_forte/index.tex}
|
||||
|
||||
\section{Les critères de cohérence}
|
||||
\input{consistency_criteria/index.tex}
|
||||
|
||||
|
34
docs/rapport/rapport_etat_artv2/CRDT/index.tex
Normal file
34
docs/rapport/rapport_etat_artv2/CRDT/index.tex
Normal file
@ -0,0 +1,34 @@
|
||||
Les CRDT sont des types de données qui supporte de manière intrinsèque les critères de convergence (Strong Eventual Consistency) et de cohérence pipeline (qui est un compromis entre la validité et la Localité d'état).
|
||||
|
||||
Pour y parvenir, un type de donnée dit CRDT doit proposer une bibliothèque d'opérations qui sont commutatives l'une à l'autre. Ainsi pour deux suites d'opérations $S$ et $S'$, soit $L$ l'ensemble contenant tous les termes de $S$ et $L'$ l'ensemble contenant tous les termes de $S'$. Si $L$ et $L'$ sont indiscernables, alors les résultats de $S$ et $S'$ l'est aussi. [REF CRDT]
|
||||
|
||||
Ces types de données présentent un très grand intérêt pour le problème de l'édition collaborative. En effet, ils permettent de mettre en place des approches qui sont dites local-first. C'est à dire que les modifications sont dans un premier temps appliquées localement au client, pour ensuite être éventuellement fusionnées, sans avoir à gérer d'hypothétiques conflits (puisque le type de donnée ne le permet pas).
|
||||
|
||||
Cette approche est déjà utilisée par certains projets déjà en production, notamment à travers le protocole YATA [REF YATA] qui trouve son implémentation dans l'application Yjs. Yjs est une application de prise de note, d'organisation et de productivité utilisant des CRDT, ce qui lui permet d'être résilient aux pannes réseaux et de permettre une synchronisation entre plusieurs terminaux pour un seul client sans utiliser d'entité centrale. Cette solution apporte toutefois une limite, qui est le manque de clarté dans l'expérience utilisateur sur ce qui est synchronisé et ce qui ne l'est pas. Ce comportement est toute fois intrinsèque au design de l'application est relève d'un compromis technique.
|
||||
|
||||
L'usage des CRDT dans Yjs est toutefois assez limité, puisque proposant une application "un seul utilisateur". Et pour cause, l'ajout de plusieurs utilisateurs introduit une nouvelle problématique qui est celle des droits d'accès et d'édition.
|
||||
Dans l'approche d'Yjs, rien de ce que peut soumettre l'utilisateur ne peut provoquer d'état illégal. Puisque par définition TOUT est accepté. De plus, aucun comportement arbitraire et malveillant n'a à être envisagé puisqu'une nouvelle fois, il n'y a pas de notion de malveillance.
|
||||
|
||||
Mais si Yjs fait ce choix, c'est parce que les CRDT passe très mal l'épreuve du problème des généraux byzantins. Le problème des généraux byzantin est un problème connu en algorithmie distribuée. Il vise à introduire dans notre système des noeuds aux comportements arbitraires. C'est à dire des noeuds qui dévieraient du protocole attendu afin de réaliser des actions aléatoires, imprévisibles et irrationnelles (dans le cas d'un bug dans l'implémentation par exemple), ou bien des actions malveillantes et donc rationnels (dans le cas d'une attaque du protocole par un membre malveillant du réseau).
|
||||
|
||||
% En effet les CRDT ne proposent aucun mécanisme permettant de mitiger les actions d'un attaquant. Reprenons l'exemple d'Yjs, qui ne définit pas de notion d'état illégal. Ceci est du au fait que pour satisfaire les propriétés des CRDT, le choix de YATA est d'utiliser un "grow only set". C'est à dire une structure de donnée qui ne peut que s'agrandir. La seule opération possible est donc l'insertion d'un élement, facilitant ainsi la commutativité des opérations, Et la suppression y est traitée comme une opération spécifique d'insertion du point de vue de la structure de donnée, la donnée ne disparait donc pas, mais se voit attribuer un "marqueur" qui la rend invisible.
|
||||
|
||||
% Ainsi la notion de légalité dans un grow only set n'existe pas puisque toutes les suites d'opérations sont valides. Or si Bob tente d'insérer dans une zone de texte où seule Alice a le droit en écriture, il est attendu que l'opération soit rejetée. Ce qui n'a pas de sens dans un grow only set, et empêcherait la convergence des états à la fin de l'exécution.
|
||||
|
||||
% Pour palier à ce problème, l'approche du PCDO
|
||||
|
||||
Notamment un problème connu qui est celui de l'équivocation. L'équivocation est le fait pour un noeud malveillant devant normalement envoyer une information à l'ensemble des noeuds d'un réseau distribué, d'envoyer une opération $A$ à une partie du réseau et une opération $B$ à l'autre partie. Créant ainsi une divergence dans les suites d'opérations que maintiennent chaque partie concernée du réseau.
|
||||
Plusieurs papiers tendent à montrer qu'une certaine classe de CRDT peut être améliorée afin de mitiger ce problème. Une approche intéressante consiste en la mise en place d'un DAG (un graph dirigé acyclique) stockant tous les états atteints par le réseau ainsi que leurs parents. Et d'accrocher une trace de ce DAG à l'opération qui est envoyé aux autres noeuds. Ainsi l'ensemble des noeuds légitimes seraient en capacité de détecter si leur propre DAG manque d'information, et seraient donc à même de redemander l'information manquante. [REF MEG22] Cette solution proposerait ainsi un mécanisme de resynchronisation entre noeuds légitimes.
|
||||
|
||||
Un autre aspect limitant des CRDT est qu'ils ne conviennent pas à tous les types d'applications. En effet, de par leur aspect commutatif, ils ne peuvent opérer que sur des données qui ne présentent pas de notion d'états illégaux. Prenons le cas d'un compteur sur lequel nous pouvons appliquer des opérations d'additions ou de soustractions (et qui sont donc commutatives les unes avec les autres). Peu importe si nous appliquons toutes les soustractions puis toutes les additions, ou bien l'inverse, ou encore un mélange aléatoire de celles-ci. Le compteur qui se verra évoluer au fil du temps n'entrera jamais dans un état "interdit".
|
||||
|
||||
Or, dans beaucoup d'application nous avons besoin de restreindre la donnée à un ensemble d'état dits valides. Et d'interdire un ensemble d'état dits invalides. Ce serait le cas dans le traitement d'un solde d'une carte de débit. L'utilisateur peut soumettre un ensemble d'opérations qui vont venir débiter ou créditer la carte. Mais même si l'utilisateur ne cherche pas à dépenser de l'argent qu'il ne possède pas, nous ne pouvons pas appliquer les opérations dans tous les ordres possibles. Par exemple si toutes les opérations de débit sont soumises les unes après les autres, le solde se trouvera en négatif ce qui n'est pas permis, même pour un état qu'on pourrait qualifier de "temporaire".
|
||||
|
||||
C'est pour palier à ce problème que Reynal [REF Raynal 23] propose un nouveau type de donnée qui hérite des CRDT et qu'il nomme PCDO (Process-Commutative Distributed Objects). cette solution améliore les CRDT pour proposer un type de donnée empêchant l'atteinte d'état illégaux. Pour ce faire il divise les opérations possibles en deux groupe. Les opérations qui sont réalisables par tous les membres du réseau, et les opérations qui sont spécifiques à un acteur. Il définit alors deux règles. Les opérations communes ne doivent jamais permettre d'atteindre un état illégal. Et seule l'application de plusieurs opérations spécifique à un seul processus permet d'atteindre un état illégal.
|
||||
|
||||
Cette solution contraint en réalité l'usage des CRDT, puisqu'elle semble reposer sur la mise en place de plusieurs registres SWMR (Single Writer Multiple Reader) comme théorisé par Lamport en 198X [REF LAMPORT SWMR]. Cette approche ne posant en effet aucun problême de cohérence sur le registre en tant que tel, puisque l'ordre est défini par le seul noeud capable d'édition. La somme de ses registres propose par contre une cohérence partielle, puisque les opérations se retrouvent ordonnées via un ordre lui-même partiel.
|
||||
|
||||
Le contre coüt est donc dans la généralisation de ce type de donnée, puisqu'il demande à ce que l'application découpe la donnée partagée en plusieurs registres SWMR ce qui n'est pas applicable dans tous les contextes.
|
||||
|
||||
Pour ces raisons, l'application des CRDTs pour l'édition collaborative n'est pas évidente. Puisque dans un contexte multi-utilisateur avec des politiques de contrôle d'accès au document (et dans le corps du document), les CRDT se retrouvent peu résistantes aux problématiques d'édition malveillante. De plus, l'application des CRDT à l'édition collaborative ne résout pas tous les problèmes de résolutions de conflits, et certains cas de figure peuvent encore causer des incohérences et à terme des divergences importantes dans le document final.
|
||||
|
125
docs/rapport/rapport_etat_artv2/coherence_forte/index.tex
Normal file
125
docs/rapport/rapport_etat_artv2/coherence_forte/index.tex
Normal file
@ -0,0 +1,125 @@
|
||||
La cohérence forte présente, dans un premier temps, l’approche la plus intuitive pour une application collaborative dans le cloud.
|
||||
Cherchons dans un premier temps à répliquer un processus d’édition local d’un document. Formalisons alors ce qu’on attend d’une application d’édition de document seulement local.
|
||||
|
||||
Nous avons un acteur qui va réaliser deux types d’actions différentes, la lecture ou l’écriture d’un document. Ces opérations sont des opérations atomiques du point de vue de l’utilisateur et il ne peut les exécuter que l’une après l’autre. Dans notre manière d’appréhender ce modèle nous partons du principe que l’écriture n’implique pas nécessairement une lecture, forçant ainsi l’acteur à soumettre une opération de lecture pour pouvoir vérifier que son opération d’écriture a bien été prise en compte. Ce point est important puisque la cohérence du point de vue de l’utilisateur sera conditionné par ces opérations de lecture.
|
||||
|
||||
L’application de ce modèle sur un seul acteur résultera donc en une suite finit d’opérations d’écritures et de lectures, pour terminer par une suite de lecture infinies (qui est le moment où l’utilisateur arrête d’éditer le document).
|
||||
|
||||
\begin{math}
|
||||
w('he') \cdot r/\{'he'\} \cdot w('llo') \cdot r/\{'hello'\}^\omega
|
||||
\end{math}
|
||||
|
||||
\begin{figure}[! h]
|
||||
\centering
|
||||
\resizebox{0.5\columnwidth}{!}{
|
||||
\input{images/local1_tzk.tex}
|
||||
}
|
||||
\caption{Modification local d'un document}
|
||||
\label{local_1}
|
||||
\end{figure}
|
||||
|
||||
On voit sur la figure \ref{local_1} que le noeud émet deux requêtes atomiques de modification $w('h')$ et $w('e')$ (regroupées sous la forme d'une seule pour soucis de lisibilité). Il réalise ensuite une requête de lecture $r/\{'h','e'\}$ qui lui permet de vérifier que ses modifications ont bien été prises en compte. Puis il écrit $w('llo')$ et récupère un retour en lisant $r/\{'h','e','l','l','o'\}$ qui lui permet de vérifier que ses modifications ont bien été prises en compte. Il réalise ensuite une suite infinie de lecture $r/\{'h','e','l','l','o'\}^\omega$ correspondant à la consultation du document sur un temps infini.
|
||||
|
||||
Cette modélisation nous permet de mettre en avant les points critiques dans la mise en place d'une expérience cohérente pour l'utilisateur. Dans un premier temps nous pouvons nous concentrer sur le lien entre les écritures et les lectures :
|
||||
|
||||
Lorsque l'utilisateur soumet les écritures $w('h')$ et $w('e')$ il lui attribue une notion d'ordre. L'écriture de $w('h')$ est donc antérieur à celle de $w('e')$, il serait donc incohérent que au moment de la lecture qui suit, l'utilisateur constate un ordre différent. Cela représente une première propriété de la cohérence séquentielle, la préservation de l'ordre entre les écritures.
|
||||
|
||||
Une seconde propriété est la préservation de la validité des écritures. C'est-à-dire que si l'utilisateur soumet une écriture $w('h')$ et une écriture $w('e')$ il s'attend à ce que la lecture qui suit retourne un état qui contient uniquement $'h'$ et $'e'$. Il serait en effet incohérent de recevoir tout autre état.
|
||||
|
||||
La troisième propriété est la préservation de la cohérence entre les lectures, c'est-à-dire que si l'utilisateur lit à un instant $t$ un état $\alpha$, alors toutes lectures réalisées à un instant $t' > t$ doivent retourner un état $\beta$ tel que $\alpha \subseteq \beta$.
|
||||
|
||||
Ces trois propriétés sont celles définit par Lamport [REF LAMPORT89] et permettent de définir ce qu'il nomme "registre atomique".
|
||||
|
||||
\fbox{
|
||||
\begin{minipage}{0.94\linewidth}
|
||||
\paragraph{Un registre}
|
||||
est une structure mathématique qui sert d'abstraction pour parler d'un système qui permet de réaliser des opérations d'écritures et de lectures. L'approche du registre permet de se concentrer sur le point de vue d'un client sans considérer les aspects topologiques du système. Il est donc tout trouvé pour spécifier les problématiques liées à la cohérence dans les systèmes distribués.
|
||||
\end{minipage}
|
||||
}
|
||||
|
||||
|
||||
Le registre atomique de lamport permet de définir le comportement attendu dans un système SWMR (Single Writer Multiple Reader). C'est-à-dire un système où un seul acteur peut écrire et plusieurs peuvent lire. Ce modèle est pertinent dans notre cas d'édition à un seul acteur puisque nous avons un acteur qui écrit et un acteur qui lit (en l'occurrence toujours le même).
|
||||
|
||||
\emph{TODO : Résumer papier Lamport89}
|
||||
|
||||
Dans un cas d’usage courant, une application d’édition local ne présente pas de problèmes liés à la présence de plusieurs éditeurs en simultanés. Il y a en effet une seule interface homme-machine, c’est-à-dire de façon pragmatique un unique écran et clavier.
|
||||
|
||||
Imaginons ainsi un cas où Alice et Bob souhaitent éditer ensemble un même document. Si on voulait simplement appliquer le fonctionnement local que nous venons de décrire à cette nouvelle problématique. Il conviendrait de simplement rajouter une IHM à Alice. Ainsi il y a toujours une seule application d’édition collaborative sur lequel viennent se connecter cette fois-ci deux interfaces (comme visible dans la figure \ref{local_2}).
|
||||
|
||||
\begin{figure}[! h]
|
||||
\begin{multicols}{2}
|
||||
|
||||
\centering
|
||||
\resizebox{!}{.7\columnwidth}{
|
||||
\input{images/local2.latex}
|
||||
}
|
||||
\caption{Alice et Bob éditent un document localement}
|
||||
\label{local_2}
|
||||
|
||||
\columnbreak
|
||||
|
||||
\centering
|
||||
\resizebox{!}{.8\columnwidth}{
|
||||
\input{images/local2fail.latex}
|
||||
}
|
||||
\caption{Alice et Bob éditent un document localement de manière concurrente}
|
||||
\label{local_2_fail}
|
||||
\end{multicols}
|
||||
\end{figure}
|
||||
|
||||
|
||||
Nous avons à présents deux acteurs qui éditent et lisent le document, et un autre qui s’occupe de stocker et de synchroniser le document entre ces deux acteurs.
|
||||
|
||||
La limite liée à cette approche réside dans le fait que les communications entre Alice et l’application et Bob et l’application ne peuvent pas être garantis comme équitables. En effet, Alice et Bob peuvent très bien se retrouver déconnectés de manière non prévisible et asynchrone. Ou bien avoir des temps de transmissions de leurs informations qui diffèrent. Le caractère non-deterministe de ces erreurs peut résulter en des incohérences dans l’ordre d’arrivée des informations soumises par Alice et Bob. Ce qui peut a terme créer des incohérences dans le document final.
|
||||
|
||||
C’est néanmoins une problématique qui peut être assimilée à de la gestion de la concurrence entre processus. C’est en effet un domaine qui est étudié depuis l’apparition des premiers processeurs multi-cœur. Une approche que nous pouvons donc prendre à la programmation concurrente serait de résoudre ce problème en venant utiliser des techniques de synchronisation de processus. C’est-à-dire en utilisant des mécanismes de synchronisation tel que des verrous dans notre application. On peut par exemple utiliser des sémaphores pour gérer les accès concurrents à la mémoire partagée. Ce qui résulterait en l’exécution suivante :
|
||||
|
||||
\begin{figure}[! h]
|
||||
\centering
|
||||
\resizebox{!}{.7\columnwidth}{
|
||||
\input{images/serialized.latex}
|
||||
}
|
||||
\caption{Alice et Bob éditent un document localement avec des vérrous}
|
||||
\label{serialized}
|
||||
\end{figure}
|
||||
|
||||
On voit sur la figure \ref{serialized} que les actions d’Alice et Bob sont sérialisés. C’est-à-dire que les actions d’Alice et Bob sont exécutés l’une après l’autre. Ce qui permet d’éviter les problèmes de concurrence entre les deux acteurs. Cependant, cette approche est très limitée. En effet, elle ne permet pas de profiter des avantages de l’édition collaborative. En effet, cela signifie que l’un des deux acteurs doit attendre que l’autre ait fini d’éditer le document pour pouvoir à son tour l’éditer. Ce qui rabaisse les performances de l’application à la latence de l’acteur le plus lent.
|
||||
|
||||
En revenons dans notre contexte initial qui est une application d’édition collaborative nous souhaitons pouvoir gérer un grand nombre d’utilisateur en simultanés. Ainsi la probabilité d’avoir une expérience dégradée pour l’ensemble des utilisateurs croit avec le nombre d’utilisateur. Pour pallier à ce problème l’approche qui peut être adopté est d’exclure les utilisateurs possédant des connexions trop limités avec le serveur.
|
||||
|
||||
C’est néanmoins la seule approche qui nous permet d’obtenir une cohérence absolue autant dans la prise en compte des opérations d’écritures des acteurs que dans le traitement de leurs lectures.
|
||||
|
||||
Selon Perrin on se placerait dans une approche qui relèverait de la cohérence séquentielle.
|
||||
|
||||
\subsection{Cohérence séquentielle}
|
||||
|
||||
% blbla sur la cohérence séquentielle de manière très théorique et fondamentale
|
||||
|
||||
|
||||
|
||||
\paragraph{Validité}
|
||||
|
||||
Dans une application d’édition collaborative on s’attend à ce que toutes les entrées des utilisateurs soient prises en compte. Il nous parait en effet inacceptable que des saisies disparaisses de manière aléatoire durant l’exécution.
|
||||
|
||||
Ce principe nous permet d’introduire une première propriété utilisée par Perrin pour définir et classer les différents critères de cohérence qu’est la validité.
|
||||
|
||||
La validité peut ainsi être résumé comme la propriété qui permet d’assurer que toutes les saisies réalisées, et seulement elles, soient prises en compte dans l’exécution du système.
|
||||
|
||||
Ceci se traduit par l’affichage d’un retour quant à la saisie de bob sur son application. Lui signifiant que son interaction avec l’application à bien était prise en compte, et n’est donc pas passée à la trappe. Elle n’implique néanmoins aucune notion d’ordre dans les saisies, ce qui signifie que les saisies peuvent être réagencées durant l’exécution.
|
||||
|
||||
\paragraph{Convergence}
|
||||
|
||||
Une autre attente d’une application d’édition collaborative est en quelque sorte sont determinisme sur une durée infinie. On s’attend en effet, une fois toutes les éditions terminés, que le document soit identique pour tous les acteurs. C’est-à-dire que peut importe l’ordre dans lequel les saisies ont été réalisées, le document final doit être identique pour tous les nœuds.
|
||||
|
||||
C’est ce que Perrin appelle la convergence qu’il définit plus formellement comment étant la propriété qui assure que si un nombre finit d’ecriture et infini de lecture sont réaliséés, alors tous les nœuds finissent par avoir la même valeur.
|
||||
|
||||
\paragraph{Localité D’état}
|
||||
|
||||
La dernière propriétée du model de Perrin est la localité d’état.
|
||||
|
||||
Elle consiste en le fait que chaque acteur doivent garder une vision local cohérente du système. Par exemple, comme illustrée dans la Figure \ref{local_state}, au fur et à mesure des éditions de Bob, sa vue local va évoluer en conséquence, mais si il recoit à un moment donné une édition d’Alice qui est antérieur à une de ses éditions, alors il doit privilégier sa propre édition. C’est-à-dire que sa vue local doit être cohérente avec son historique d’édition quitte à diverger de la vue local d’Alice.
|
||||
|
||||
\begin{figure}[! h]
|
||||
\caption{Localité d’état}
|
||||
\label{local_state}
|
||||
\end{figure}
|
70
docs/rapport/rapport_etat_artv2/consistency_criteria/index.tex
Executable file
70
docs/rapport/rapport_etat_artv2/consistency_criteria/index.tex
Executable file
@ -0,0 +1,70 @@
|
||||
Nous venons de définir la cohérence séquentielle et de proposer une approche pour la réaliser. Néanmoins nous avons vu que cette approche est limitée puisqu’elle pousse le système à être nivelé par le bas en s’adaptant à l’acteur le plus lent.
|
||||
Nous allons donc explorer d’autres approches réalisant plus de compromis dans la gestion de la cohérence du système.
|
||||
|
||||
Ainsi là où la cohérence séquentielle (et par extension la cohérence forte) permettait de garantir nos 3 propriété que sont la validité, la convergence et la localité d’état. Nous allons explorer des solutions qui certaines de ces propriétés afin de gagner en performance et en résilience.
|
||||
|
||||
\subsection{Adaptation à notre problème}
|
||||
|
||||
Dans le cadre de notre problématique il convient dans un premier temps de spécifier quels sont les critères qui semblent être essentiels à la réalisation d’une application d’édition collaborative. Pour ça nous pouvons déjà imaginer ce qu’impliquent concrètement ces différents critères sur le comportement de notre application.
|
||||
|
||||
\subsubsection{Validité}
|
||||
|
||||
Comme dit précédemment, la validité permet d’assurer que les saisies de Bob soient toujours prises en compte en tout point du système. C’est-à-dire que si Bob saisit “Hello” puis “World” alors il s’attend à ce que ces deux saisies soient prises en compte. Ce qui se traduit par l’affichage de « Hello World » ou « World Hello sur son écran. Les états finaux incorrects qui ne respecterait pas la validité sont alors “Hello”, “World” ou "$\emptyset$".
|
||||
|
||||
De la même manière, les saisies des aitres acteurs du système peuvent donc très bien être ignorés, intercalés entre les saisis de Bob, et réagencés durant l’exécution.
|
||||
|
||||
Ne pas prendre en compte le critère de validité dans notre application reviendrait donc à être capable d’ignorer des saisies soumises par l’utilisateur. C’est ce qui est formalisé par le critère de cohérence dit de Sérialisation (selon Perrin).
|
||||
|
||||
L’application de la validité demande à notre système une approche d’acknowledgement. Puisque toutes saisies ce doit d’être considéré, le client doit s’assurer que sa saisie a bien été reçue par l’ensemble des nœuds. Dans le cas d’une application centralisé, seul un intermédiaire doit être contacté. Mais dans un contexte plus distribué, le problème augmente en complexité et en coût pour le réseau.
|
||||
|
||||
\paragraph{La Sérialisation}
|
||||
|
||||
La sérialisation se propose donc comme étant l’exact inverse de la validité, c’est-à-dire un critère de cohérence fort auquel nous aurions retiré la validité. ($SER = \{C_\top\} - \{V\}$)
|
||||
|
||||
\subsubsection{Convergence}
|
||||
|
||||
La convergence permet d’assurer que le document final soit identique pour tous les acteurs. C’est-à-dire que, peu importe l’ordre dans lequel les saisies ont été reçus par chaque nœud, le document final doit être identique pour tous.
|
||||
|
||||
Il est important de noter que la convergence seule ne dit rien sur la source des données qui composent le document. Ainsi il est possible que le document final ne prenne pas en compte toutes les saisies réalisées sur le système. Ou bien même qu’il prenne en compte des saisies qui n’ont jamais été réalisées.
|
||||
|
||||
Appliqué à notre problème, la convergence assure que le document final soit identique pour tous les acteurs, ce qui peut sembler essentiel dans notre cas.
|
||||
|
||||
L’application de la convergence introduit dans notre système une notion de gestion des conflits. Si plusieurs acteurs souhaitent écrire au même moments, alors des mécanismes doivent être mis en place pour une gestion des conflits déterministe. C’est-à-dire, permettant de garantir une seule version pour tous les acteurs quelle que soit sa position dans le système, et donc l’ordre potentiel de réception des saisies.
|
||||
|
||||
[Un exemple de gestion de conflits pas si évidente que ça]
|
||||
|
||||
Cette gestion des conflits peut être réalisée de manière distribuée impliquant la mise en place d’un algorithme de consensus. Ce qui peut être très couteux en termes de performance et de complexité. Ou bien être délégué à un acteur centralisé qui aura le pouvoir de manipuler l’ordre final des saisies. Ce qui peut poser des problèmes en termes de gouvernance du système, donnant le pouvoir à un seul acteur.
|
||||
|
||||
Il est bon de noter que bien que la convergence est une propriété qui semble importante dans le cadre d’une application d’édition collaborative classique. Il existe des manières de concevoir une application collaborative fournissant un document final identique, mais ne garantissant pas nécessairement la convergence dans l’ordre où les saisies sont interprétées. Ce point sera discuté lorsque nous aborderons les CRDTs.
|
||||
|
||||
\subsubsection{Localité d’état}
|
||||
|
||||
La localité d’état permet d’assurer que les mises à jour d’affichages futurs soient toujours cohérentes avec les mises à jour d’affichages passés. Indirectement, cela interdit le changement de l’ordre dans lequel les transactions passées sont interprétés une fois que le résultat est affiché à l’utilisateur. Mais empêche aussi l’insertion et la suppression de transactions dans ce même passé.
|
||||
|
||||
L’objectif à haut niveau est de garder une expérience cohérente pour l’utilisateur, en interdisant à l’application de tolérer des retours en arrières de l’état courant.
|
||||
|
||||
Appliqué à notre problème, la localité d’état permet d’assurer que les saisies de Bob et celles qu’il a reçu soient toujours affichés dans l’ordre où elles ont été interprétées initialement. Cette propriété permet par exemple d’empêcher le cas où Alice traiterait la saisie de bob, bob de son côté supprime la saisie qu’il vient de réaliser, et Alice renvoi à Bob la saisie qu’elle vient de modifier. Ce cas est explicité dans la figure \ref{local_state_fail}.
|
||||
|
||||
|
||||
|
||||
\begin{figure}[! h]
|
||||
\centering
|
||||
\resizebox{!}{0.7\columnwidth}{
|
||||
\input{images/localiteEtatFail.latex}
|
||||
}
|
||||
\caption{Localité d’état non respectée}
|
||||
\label{local_state_fail}
|
||||
\end{figure}
|
||||
|
||||
Du point de vue de Bob, il vient de revoir apparaitre une ligne qu’il vient de supprimer, ce qui rend son expérience incohérente.
|
||||
|
||||
En effet, premièrement Bob à vue s’afficher sur son écran la ligne qu’il venait de saisir \\ $\delta = \{"Hello World"\}$ qui est le résultat de l’exécution $\text{insérer}("Hello World")$. Puis il supprime le mot “World”. Le passé des exécutions de Bob devient donc $\text{insérer}("Hello World") \cdot \text{supprimer}("World") = \{"Hello"\}$. Mettant ainsi à jour son état local. Enfin il recoit l’opération d’Alice qui vient de réaliser une modification en se basant sur un état antérieur à l’état actuel de Bob. L’état qu’il reçoit est donc le résultat des opérations $\text{insérer}("Hello World") \cdot \text{insérer}("Hello World") = \{"Hello World"\}$. On omet ici une opération que Bob à soumise, qu’il a pu constater comme étant comptabilisé dans le calcul de son état local, mais qui a ensuite été ignoré par le système. La cohérence de l’état local de Bob n’a donc pas était respectée.
|
||||
|
||||
|
||||
% \subsection{État des différents critères}
|
||||
% \subsubsection{Les modèles de mémoires partagées}
|
||||
|
||||
% \subsubsection{La cohérence forte}
|
||||
% Cohérence Séquentielle \cite{lamport_how_1979}
|
||||
|
||||
% \subsubsection{La cohérence Faible}
|
43
docs/rapport/rapport_etat_artv2/images/local1.latex
Normal file
43
docs/rapport/rapport_etat_artv2/images/local1.latex
Normal file
@ -0,0 +1,43 @@
|
||||
% generated by Plantuml 1.2022.7
|
||||
\definecolor{plantucolor0000}{RGB}{24,24,24}
|
||||
\definecolor{plantucolor0001}{RGB}{0,0,0}
|
||||
\definecolor{plantucolor0002}{RGB}{226,226,240}
|
||||
\begin{tikzpicture}[yscale=-1
|
||||
,pstyle0/.style={color=plantucolor0000,line width=0.5pt,dash pattern=on 5.0pt off 5.0pt}
|
||||
,pstyle1/.style={color=plantucolor0000,fill=plantucolor0002,line width=0.5pt}
|
||||
,pstyle3/.style={color=plantucolor0000,fill=plantucolor0000,line width=1.0pt}
|
||||
,pstyle4/.style={color=plantucolor0000,line width=1.0pt}
|
||||
]
|
||||
\draw[pstyle0] (23pt,84.0679pt) -- (23pt,311.01pt);
|
||||
\draw[pstyle0] (134.7162pt,84.0679pt) -- (134.7162pt,311.01pt);
|
||||
\draw[pstyle0] (208.3289pt,84.0679pt) -- (208.3289pt,311.01pt);
|
||||
\draw[pstyle0] (368.0101pt,84.0679pt) -- (368.0101pt,311.01pt);
|
||||
\node at (5pt,65pt)[below right,color=black]{Bob};
|
||||
\draw[pstyle1] (23.3692pt,13.5pt) ellipse (8pt and 8pt);
|
||||
\draw[color=plantucolor0000,line width=0.5pt] (23.3692pt,21.5pt) -- (23.3692pt,48.5pt)(10.3692pt,29.5pt) -- (36.3692pt,29.5pt)(23.3692pt,48.5pt) -- (10.3692pt,63.5pt)(23.3692pt,48.5pt) -- (36.3692pt,63.5pt);
|
||||
\draw[pstyle1] (100.7162pt,55pt) arc (180:270:5pt) -- (105.7162pt,50pt) -- (164.3289pt,50pt) arc (270:360:5pt) -- (169.3289pt,55pt) -- (169.3289pt,78.0679pt) arc (0:90:5pt) -- (164.3289pt,83.0679pt) -- (105.7162pt,83.0679pt) arc (90:180:5pt) -- (100.7162pt,78.0679pt) -- cycle;
|
||||
\node at (107.7162pt,57pt)[below right,color=black]{Clavier};
|
||||
\draw[pstyle1] (179.3289pt,55pt) arc (180:270:5pt) -- (184.3289pt,50pt) -- (233.3289pt,50pt) arc (270:360:5pt) -- (238.3289pt,55pt) -- (238.3289pt,78.0679pt) arc (0:90:5pt) -- (233.3289pt,83.0679pt) -- (184.3289pt,83.0679pt) arc (90:180:5pt) -- (179.3289pt,78.0679pt) -- cycle;
|
||||
\node at (186.3289pt,57pt)[below right,color=black]{Ecran};
|
||||
\draw[pstyle1] (330.0101pt,55pt) arc (180:270:5pt) -- (335.0101pt,50pt) -- (402.2546pt,50pt) arc (270:360:5pt) -- (407.2546pt,55pt) -- (407.2546pt,78.0679pt) arc (0:90:5pt) -- (402.2546pt,83.0679pt) -- (335.0101pt,83.0679pt) arc (90:180:5pt) -- (330.0101pt,78.0679pt) -- cycle;
|
||||
\node at (337.0101pt,57pt)[below right,color=black]{Système};
|
||||
\draw[pstyle3] (123.0226pt,113.7739pt) -- (133.0226pt,117.7739pt) -- (123.0226pt,121.7739pt) -- (127.0226pt,117.7739pt) -- cycle;
|
||||
\draw[pstyle4] (23.3692pt,117.7739pt) -- (129.0226pt,117.7739pt);
|
||||
\node at (30.3692pt,98.0679pt)[below right,color=black]{Ecrit "Hello"};
|
||||
\draw[pstyle3] (356.6323pt,145.4799pt) -- (366.6323pt,149.4799pt) -- (356.6323pt,153.4799pt) -- (360.6323pt,149.4799pt) -- cycle;
|
||||
\draw[pstyle4] (135.0226pt,149.4799pt) -- (362.6323pt,149.4799pt);
|
||||
\node at (142.0226pt,129.7739pt)[below right,color=black]{Envoie "Hello"};
|
||||
\draw[pstyle4] (368.6323pt,198.892pt) -- (410.6323pt,198.892pt);
|
||||
\draw[pstyle4] (410.6323pt,198.892pt) -- (410.6323pt,211.892pt);
|
||||
\draw[pstyle4] (369.6323pt,211.892pt) -- (410.6323pt,211.892pt);
|
||||
\draw[pstyle3] (379.6323pt,207.892pt) -- (369.6323pt,211.892pt) -- (379.6323pt,215.892pt) -- (375.6323pt,211.892pt) -- cycle;
|
||||
\node at (375.6323pt,161.4799pt)[below right,color=black]{Accepte la saisie et};
|
||||
\node at (375.6323pt,179.186pt)[below right,color=black]{modifie le document};
|
||||
\draw[pstyle3] (219.8289pt,257.304pt) -- (209.8289pt,261.304pt) -- (219.8289pt,265.304pt) -- (215.8289pt,261.304pt) -- cycle;
|
||||
\draw[pstyle4] (213.8289pt,261.304pt) -- (367.6323pt,261.304pt);
|
||||
\node at (225.8289pt,223.892pt)[below right,color=black]{Afiche le document};
|
||||
\node at (225.8289pt,241.598pt)[below right,color=black]{mis à jour};
|
||||
\draw[pstyle3] (34.3692pt,289.01pt) -- (24.3692pt,293.01pt) -- (34.3692pt,297.01pt) -- (30.3692pt,293.01pt) -- cycle;
|
||||
\draw[pstyle4] (28.3692pt,293.01pt) -- (207.8289pt,293.01pt);
|
||||
\node at (40.3692pt,273.304pt)[below right,color=black]{Regarde};
|
||||
\end{tikzpicture}
|
16
docs/rapport/rapport_etat_artv2/images/local1.puml
Normal file
16
docs/rapport/rapport_etat_artv2/images/local1.puml
Normal file
@ -0,0 +1,16 @@
|
||||
@startuml local1
|
||||
|
||||
hide footbox
|
||||
|
||||
actor Bob
|
||||
participant Clavier
|
||||
participant Ecran
|
||||
participant Système
|
||||
|
||||
Bob -> Clavier : Ecrit "Hello"
|
||||
Clavier -> Système : Envoie "Hello"
|
||||
Système -> Système : Accepte la saisie et\nmodifie le document
|
||||
Système -> Ecran : Afiche le document\nmis à jour
|
||||
Ecran -> Bob : Regarde
|
||||
|
||||
@enduml
|
21
docs/rapport/rapport_etat_artv2/images/local1_tzk.tex
Normal file
21
docs/rapport/rapport_etat_artv2/images/local1_tzk.tex
Normal file
@ -0,0 +1,21 @@
|
||||
\begin{tikzpicture}[
|
||||
roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,},
|
||||
ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,},
|
||||
arrow/.style={|->, thick,},
|
||||
message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}},
|
||||
]
|
||||
|
||||
\node[roundnode] (11) {};
|
||||
\node[left] at (11.west) {$p_0$};
|
||||
\node[above] at (11.north) {$w('he')$};
|
||||
\node[roundnode] (12) [right=40pt of 11] {};
|
||||
\node[above] at (12.north) {$r/\{'he'\}$};
|
||||
\node[roundnode] (13) [right=40pt of 12] {};
|
||||
\node[above] at (13.north) {$w('llo')$};
|
||||
\node[roundnode] (14) [right=40pt of 13] {};
|
||||
\node[above] at (14.north) {$r/\{'hello'\}^\omega$};
|
||||
|
||||
\draw[arrow] (11) -- (12);
|
||||
\draw[arrow] (12) -- (13);
|
||||
\draw[arrow] (13) -- (14);
|
||||
\end{tikzpicture}
|
41
docs/rapport/rapport_etat_artv2/images/local2.latex
Normal file
41
docs/rapport/rapport_etat_artv2/images/local2.latex
Normal file
@ -0,0 +1,41 @@
|
||||
% generated by Plantuml 1.2022.7
|
||||
\definecolor{plantucolor0000}{RGB}{24,24,24}
|
||||
\definecolor{plantucolor0001}{RGB}{0,0,0}
|
||||
\definecolor{plantucolor0002}{RGB}{226,226,240}
|
||||
\begin{tikzpicture}[yscale=-1
|
||||
,pstyle0/.style={color=plantucolor0000,line width=0.5pt,dash pattern=on 5.0pt off 5.0pt}
|
||||
,pstyle1/.style={color=plantucolor0000,fill=plantucolor0002,line width=0.5pt}
|
||||
,pstyle2/.style={color=plantucolor0000,line width=0.5pt}
|
||||
,pstyle3/.style={color=plantucolor0000,fill=plantucolor0000,line width=1.0pt}
|
||||
,pstyle4/.style={color=plantucolor0000,line width=1.0pt}
|
||||
]
|
||||
\draw[pstyle0] (26pt,84.0679pt) -- (26pt,294.304pt);
|
||||
\draw[pstyle0] (75.9pt,84.0679pt) -- (75.9pt,294.304pt);
|
||||
\draw[pstyle0] (235.9633pt,84.0679pt) -- (235.9633pt,294.304pt);
|
||||
\node at (5pt,65pt)[below right,color=black]{Alice};
|
||||
\draw[pstyle1] (26.45pt,13.5pt) ellipse (8pt and 8pt);
|
||||
\draw[pstyle2] (26.45pt,21.5pt) -- (26.45pt,48.5pt)(13.45pt,29.5pt) -- (39.45pt,29.5pt)(26.45pt,48.5pt) -- (13.45pt,63.5pt)(26.45pt,48.5pt) -- (39.45pt,63.5pt);
|
||||
\node at (57.9pt,65pt)[below right,color=black]{Bob};
|
||||
\draw[pstyle1] (76.2692pt,13.5pt) ellipse (8pt and 8pt);
|
||||
\draw[pstyle2] (76.2692pt,21.5pt) -- (76.2692pt,48.5pt)(63.2692pt,29.5pt) -- (89.2692pt,29.5pt)(76.2692pt,48.5pt) -- (63.2692pt,63.5pt)(76.2692pt,48.5pt) -- (89.2692pt,63.5pt);
|
||||
\draw[pstyle1] (184.9633pt,55pt) arc (180:270:5pt) -- (189.9633pt,50pt) -- (282.623pt,50pt) arc (270:360:5pt) -- (287.623pt,55pt) -- (287.623pt,78.0679pt) arc (0:90:5pt) -- (282.623pt,83.0679pt) -- (189.9633pt,83.0679pt) arc (90:180:5pt) -- (184.9633pt,78.0679pt) -- cycle;
|
||||
\node at (191.9633pt,57pt)[below right,color=black]{Application};
|
||||
\draw[pstyle3] (224.2932pt,113.7739pt) -- (234.2932pt,117.7739pt) -- (224.2932pt,121.7739pt) -- (228.2932pt,117.7739pt) -- cycle;
|
||||
\draw[pstyle4] (26.45pt,117.7739pt) -- (230.2932pt,117.7739pt);
|
||||
\node at (33.45pt,98.0679pt)[below right,color=black]{saisir("Hello")};
|
||||
\draw[pstyle3] (37.45pt,145.4799pt) -- (27.45pt,149.4799pt) -- (37.45pt,153.4799pt) -- (33.45pt,149.4799pt) -- cycle;
|
||||
\draw[pstyle4] (31.45pt,149.4799pt) -- (235.2932pt,149.4799pt);
|
||||
\node at (43.45pt,129.7739pt)[below right,color=black]{lire("Hello")};
|
||||
\draw[pstyle3] (87.2692pt,177.186pt) -- (77.2692pt,181.186pt) -- (87.2692pt,185.186pt) -- (83.2692pt,181.186pt) -- cycle;
|
||||
\draw[pstyle4] (81.2692pt,181.186pt) -- (235.2932pt,181.186pt);
|
||||
\node at (93.2692pt,161.4799pt)[below right,color=black]{lire("Hello")};
|
||||
\draw[pstyle3] (224.2932pt,208.892pt) -- (234.2932pt,212.892pt) -- (224.2932pt,216.892pt) -- (228.2932pt,212.892pt) -- cycle;
|
||||
\draw[pstyle4] (76.2692pt,212.892pt) -- (230.2932pt,212.892pt);
|
||||
\node at (83.2692pt,193.186pt)[below right,color=black]{saisir(" World")};
|
||||
\draw[pstyle3] (37.45pt,240.598pt) -- (27.45pt,244.598pt) -- (37.45pt,248.598pt) -- (33.45pt,244.598pt) -- cycle;
|
||||
\draw[pstyle4] (31.45pt,244.598pt) -- (235.2932pt,244.598pt);
|
||||
\node at (43.45pt,224.892pt)[below right,color=black]{lire("Hello World")};
|
||||
\draw[pstyle3] (87.2692pt,272.304pt) -- (77.2692pt,276.304pt) -- (87.2692pt,280.304pt) -- (83.2692pt,276.304pt) -- cycle;
|
||||
\draw[pstyle4] (81.2692pt,276.304pt) -- (235.2932pt,276.304pt);
|
||||
\node at (93.2692pt,256.598pt)[below right,color=black]{lire("Hello World")};
|
||||
\end{tikzpicture}
|
38
docs/rapport/rapport_etat_artv2/images/local2.puml
Normal file
38
docs/rapport/rapport_etat_artv2/images/local2.puml
Normal file
@ -0,0 +1,38 @@
|
||||
@startuml local2
|
||||
|
||||
!pragma teoz true
|
||||
hide footbox
|
||||
|
||||
actor Alice
|
||||
actor Bob
|
||||
participant Application
|
||||
|
||||
Alice ->(15) Application: saisir("Hello")
|
||||
Application ->(15) Alice: lire("Hello")
|
||||
& Application ->(30) Bob
|
||||
|
||||
Bob ->(15) Application: saisir(" World")
|
||||
Application ->(15) Alice: lire("Hello World")
|
||||
& Application ->(30) Bob
|
||||
|
||||
@enduml
|
||||
|
||||
@startuml local2fail
|
||||
|
||||
!pragma teoz true
|
||||
hide footbox
|
||||
|
||||
actor Alice
|
||||
participant Application
|
||||
actor Bob
|
||||
|
||||
Alice ->(15) Application: saisir("Le chat")
|
||||
Application ->(15) Alice: lire("Le chat")
|
||||
& Application ->(15) Bob: lire("Le chat")
|
||||
|
||||
Bob ->(15) Application: saisir(" mange")
|
||||
& Alice ->(20) Application: saisir(" boit")
|
||||
Application ->(15) Alice: lire("Le chat mange boit")
|
||||
& Application ->(15) Bob: lire("Le chat mange boit")
|
||||
|
||||
@enduml
|
44
docs/rapport/rapport_etat_artv2/images/local2fail.latex
Normal file
44
docs/rapport/rapport_etat_artv2/images/local2fail.latex
Normal file
@ -0,0 +1,44 @@
|
||||
% generated by Plantuml 1.2022.7
|
||||
\definecolor{plantucolor0000}{RGB}{24,24,24}
|
||||
\definecolor{plantucolor0001}{RGB}{0,0,0}
|
||||
\definecolor{plantucolor0002}{RGB}{226,226,240}
|
||||
\begin{tikzpicture}[yscale=-1
|
||||
,pstyle0/.style={color=plantucolor0000,line width=0.5pt,dash pattern=on 5.0pt off 5.0pt}
|
||||
,pstyle1/.style={color=plantucolor0000,fill=plantucolor0002,line width=0.5pt}
|
||||
,pstyle2/.style={color=plantucolor0000,line width=0.5pt}
|
||||
,pstyle3/.style={color=plantucolor0000,fill=plantucolor0000,line width=1.0pt}
|
||||
,pstyle4/.style={color=plantucolor0000,line width=1.0pt}
|
||||
]
|
||||
\draw[pstyle0] (26.45pt,84.0679pt) -- (26.45pt,293.892pt);
|
||||
\draw[pstyle0] (230.5952pt,84.0679pt) -- (230.5952pt,293.892pt);
|
||||
\draw[pstyle0] (434.7404pt,84.0679pt) -- (434.7404pt,293.892pt);
|
||||
\node at (5pt,65pt)[below right,color=black]{Alice};
|
||||
\draw[pstyle1] (26.45pt,13.5pt) ellipse (8pt and 8pt);
|
||||
\draw[pstyle2] (26.45pt,21.5pt) -- (26.45pt,48.5pt)(13.45pt,29.5pt) -- (39.45pt,29.5pt)(26.45pt,48.5pt) -- (13.45pt,63.5pt)(26.45pt,48.5pt) -- (39.45pt,63.5pt);
|
||||
\draw[pstyle1] (179.2654pt,55pt) arc (180:270:5pt) -- (184.2654pt,50pt) -- (276.9251pt,50pt) arc (270:360:5pt) -- (281.9251pt,55pt) -- (281.9251pt,78.0679pt) arc (0:90:5pt) -- (276.9251pt,83.0679pt) -- (184.2654pt,83.0679pt) arc (90:180:5pt) -- (179.2654pt,78.0679pt) -- cycle;
|
||||
\node at (186.2654pt,57pt)[below right,color=black]{Application};
|
||||
\node at (416.3712pt,65pt)[below right,color=black]{Bob};
|
||||
\draw[pstyle1] (434.7404pt,13.5pt) ellipse (8pt and 8pt);
|
||||
\draw[pstyle2] (434.7404pt,21.5pt) -- (434.7404pt,48.5pt)(421.7404pt,29.5pt) -- (447.7404pt,29.5pt)(434.7404pt,48.5pt) -- (421.7404pt,63.5pt)(434.7404pt,48.5pt) -- (447.7404pt,63.5pt);
|
||||
\draw[pstyle3] (218.9152pt,126.0519pt) -- (228.5952pt,130.7739pt) -- (218.329pt,134.0304pt) -- (222.6114pt,130.3343pt) -- cycle;
|
||||
\draw[pstyle4] (26.45pt,115.7739pt) -- (228.5952pt,130.7739pt);
|
||||
\node at (33.45pt,96.0679pt)[below right,color=black]{saisir("Le chat")};
|
||||
\draw[pstyle3] (37.13pt,172.7579pt) -- (27.45pt,177.4799pt) -- (37.7162pt,180.7364pt) -- (33.4339pt,177.0403pt) -- cycle;
|
||||
\draw[pstyle4] (229.5952pt,162.4799pt) -- (26.45pt,177.4799pt);
|
||||
\node at (43.45pt,142.7739pt)[below right,color=black]{lire("Le chat")};
|
||||
\draw[pstyle3] (423.0604pt,172.7579pt) -- (432.7404pt,177.4799pt) -- (422.4742pt,180.7364pt) -- (426.7566pt,177.0403pt) -- cycle;
|
||||
\draw[pstyle4] (230.5952pt,162.4799pt) -- (432.7404pt,177.4799pt);
|
||||
\node at (237.5952pt,142.7739pt)[below right,color=black]{lire("Le chat")};
|
||||
\draw[pstyle3] (241.2752pt,219.4639pt) -- (231.5952pt,224.186pt) -- (241.8615pt,227.4424pt) -- (237.5791pt,223.7463pt) -- cycle;
|
||||
\draw[pstyle4] (433.7404pt,209.186pt) -- (230.5952pt,224.186pt);
|
||||
\node at (247.5952pt,189.4799pt)[below right,color=black]{saisir(" mange")};
|
||||
\draw[pstyle3] (219.0329pt,224.23pt) -- (228.5952pt,229.186pt) -- (218.2529pt,232.1919pt) -- (222.6238pt,228.601pt) -- cycle;
|
||||
\draw[pstyle4] (26.45pt,209.186pt) -- (228.5952pt,229.186pt);
|
||||
\node at (33.45pt,189.4799pt)[below right,color=black]{saisir(" boit")};
|
||||
\draw[pstyle3] (37.13pt,271.1699pt) -- (27.45pt,275.892pt) -- (37.7162pt,279.1484pt) -- (33.4339pt,275.4523pt) -- cycle;
|
||||
\draw[pstyle4] (229.5952pt,260.892pt) -- (26.45pt,275.892pt);
|
||||
\node at (43.45pt,241.186pt)[below right,color=black]{lire("Le chat mange boit")};
|
||||
\draw[pstyle3] (423.0604pt,271.1699pt) -- (432.7404pt,275.892pt) -- (422.4742pt,279.1484pt) -- (426.7566pt,275.4523pt) -- cycle;
|
||||
\draw[pstyle4] (230.5952pt,260.892pt) -- (432.7404pt,275.892pt);
|
||||
\node at (237.5952pt,241.186pt)[below right,color=black]{lire("Le chat mange boit")};
|
||||
\end{tikzpicture}
|
22
docs/rapport/rapport_etat_artv2/images/localiteEtat.puml
Normal file
22
docs/rapport/rapport_etat_artv2/images/localiteEtat.puml
Normal file
@ -0,0 +1,22 @@
|
||||
@startuml localiteEtatFail
|
||||
|
||||
Bob -> Bob : inserer("Hello World")
|
||||
Bob -> Bob : afficher() -> "Hello World"
|
||||
Bob -> Alice : partager("Hello World")
|
||||
|
||||
!pragma teoz true
|
||||
|
||||
Alice -> Alice : afficher() : "Hello World"
|
||||
|
||||
Alice -> Alice : souligner("Hello World")
|
||||
& Bob -> Bob : supprimer("Hello World", " World")
|
||||
|
||||
Alice -> Alice : afficher() : "__Hello World__"
|
||||
& Bob -> Bob : afficher() : "Hello"
|
||||
|
||||
Alice ->(25) Bob : \t\t partager("__Hello World__")\n
|
||||
& Bob ->(25) Alice : partager("Hello")
|
||||
Bob -> Bob : afficher() -> "__Hello World__"
|
||||
& Alice -> Alice : afficher() -> "__Hello__"
|
||||
|
||||
@enduml
|
@ -0,0 +1,76 @@
|
||||
% generated by Plantuml 1.2022.7
|
||||
\definecolor{plantucolor0000}{RGB}{24,24,24}
|
||||
\definecolor{plantucolor0001}{RGB}{226,226,240}
|
||||
\definecolor{plantucolor0002}{RGB}{0,0,0}
|
||||
\begin{tikzpicture}[yscale=-1
|
||||
,pstyle0/.style={color=plantucolor0000,line width=0.5pt,dash pattern=on 5.0pt off 5.0pt}
|
||||
,pstyle1/.style={color=plantucolor0000,fill=plantucolor0001,line width=0.5pt}
|
||||
,pstyle2/.style={color=plantucolor0000,line width=1.0pt}
|
||||
,pstyle3/.style={color=plantucolor0000,fill=plantucolor0000,line width=1.0pt}
|
||||
]
|
||||
\draw[pstyle0] (27.3692pt,39.0679pt) -- (27.3692pt,431.4221pt);
|
||||
\draw[pstyle0] (295.551pt,39.0679pt) -- (295.551pt,431.4221pt);
|
||||
\draw[pstyle1] (5pt,10pt) arc (180:270:5pt) -- (10pt,5pt) -- (44.7385pt,5pt) arc (270:360:5pt) -- (49.7385pt,10pt) -- (49.7385pt,33.0679pt) arc (0:90:5pt) -- (44.7385pt,38.0679pt) -- (10pt,38.0679pt) arc (90:180:5pt) -- (5pt,33.0679pt) -- cycle;
|
||||
\node at (12pt,12pt)[below right,color=black]{Bob};
|
||||
\draw[pstyle1] (270.101pt,10pt) arc (180:270:5pt) -- (275.101pt,5pt) -- (316.001pt,5pt) arc (270:360:5pt) -- (321.001pt,10pt) -- (321.001pt,33.0679pt) arc (0:90:5pt) -- (316.001pt,38.0679pt) -- (275.101pt,38.0679pt) arc (90:180:5pt) -- (270.101pt,33.0679pt) -- cycle;
|
||||
\node at (277.101pt,12pt)[below right,color=black]{Alice};
|
||||
\draw[pstyle1] (5pt,436.4221pt) arc (180:270:5pt) -- (10pt,431.4221pt) -- (44.7385pt,431.4221pt) arc (270:360:5pt) -- (49.7385pt,436.4221pt) -- (49.7385pt,459.49pt) arc (0:90:5pt) -- (44.7385pt,464.49pt) -- (10pt,464.49pt) arc (90:180:5pt) -- (5pt,459.49pt) -- cycle;
|
||||
\node at (12pt,438.4221pt)[below right,color=black]{Bob};
|
||||
\draw[pstyle1] (270.101pt,436.4221pt) arc (180:270:5pt) -- (275.101pt,431.4221pt) -- (316.001pt,431.4221pt) arc (270:360:5pt) -- (321.001pt,436.4221pt) -- (321.001pt,459.49pt) arc (0:90:5pt) -- (316.001pt,464.49pt) -- (275.101pt,464.49pt) arc (90:180:5pt) -- (270.101pt,459.49pt) -- cycle;
|
||||
\node at (277.101pt,438.4221pt)[below right,color=black]{Alice};
|
||||
\draw[pstyle2] (27.3692pt,70.7739pt) -- (69.3692pt,70.7739pt);
|
||||
\draw[pstyle2] (69.3692pt,70.7739pt) -- (69.3692pt,83.7739pt);
|
||||
\draw[pstyle2] (28.3692pt,83.7739pt) -- (69.3692pt,83.7739pt);
|
||||
\draw[pstyle3] (38.3692pt,79.7739pt) -- (28.3692pt,83.7739pt) -- (38.3692pt,87.7739pt) -- (34.3692pt,83.7739pt) -- cycle;
|
||||
\node at (34.3692pt,51.0679pt)[below right,color=black]{inserer("Hello World")};
|
||||
\draw[pstyle2] (27.3692pt,115.4799pt) -- (69.3692pt,115.4799pt);
|
||||
\draw[pstyle2] (69.3692pt,115.4799pt) -- (69.3692pt,128.4799pt);
|
||||
\draw[pstyle2] (28.3692pt,128.4799pt) -- (69.3692pt,128.4799pt);
|
||||
\draw[pstyle3] (38.3692pt,124.4799pt) -- (28.3692pt,128.4799pt) -- (38.3692pt,132.4799pt) -- (34.3692pt,128.4799pt) -- cycle;
|
||||
\node at (34.3692pt,95.7739pt)[below right,color=black]{afficher() -\textgreater "Hello World"};
|
||||
\draw[pstyle3] (283.551pt,156.186pt) -- (293.551pt,160.186pt) -- (283.551pt,164.186pt) -- (287.551pt,160.186pt) -- cycle;
|
||||
\draw[pstyle2] (27.3692pt,160.186pt) -- (289.551pt,160.186pt);
|
||||
\node at (34.3692pt,140.4799pt)[below right,color=black]{partager("Hello World")};
|
||||
\draw[pstyle2] (295.551pt,191.892pt) -- (337.551pt,191.892pt);
|
||||
\draw[pstyle2] (337.551pt,191.892pt) -- (337.551pt,204.892pt);
|
||||
\draw[pstyle2] (296.551pt,204.892pt) -- (337.551pt,204.892pt);
|
||||
\draw[pstyle3] (306.551pt,200.892pt) -- (296.551pt,204.892pt) -- (306.551pt,208.892pt) -- (302.551pt,204.892pt) -- cycle;
|
||||
\node at (302.551pt,172.186pt)[below right,color=black]{afficher() : "Hello World"};
|
||||
\draw[pstyle2] (295.551pt,236.598pt) -- (337.551pt,236.598pt);
|
||||
\draw[pstyle2] (337.551pt,236.598pt) -- (337.551pt,249.598pt);
|
||||
\draw[pstyle2] (296.551pt,249.598pt) -- (337.551pt,249.598pt);
|
||||
\draw[pstyle3] (306.551pt,245.598pt) -- (296.551pt,249.598pt) -- (306.551pt,253.598pt) -- (302.551pt,249.598pt) -- cycle;
|
||||
\node at (302.551pt,216.892pt)[below right,color=black]{souligner("Hello World")};
|
||||
\draw[pstyle2] (27.3692pt,236.598pt) -- (69.3692pt,236.598pt);
|
||||
\draw[pstyle2] (69.3692pt,236.598pt) -- (69.3692pt,249.598pt);
|
||||
\draw[pstyle2] (28.3692pt,249.598pt) -- (69.3692pt,249.598pt);
|
||||
\draw[pstyle3] (38.3692pt,245.598pt) -- (28.3692pt,249.598pt) -- (38.3692pt,253.598pt) -- (34.3692pt,249.598pt) -- cycle;
|
||||
\node at (34.3692pt,216.892pt)[below right,color=black]{supprimer("Hello World", " World")};
|
||||
\draw[pstyle2] (295.551pt,281.304pt) -- (337.551pt,281.304pt);
|
||||
\draw[pstyle2] (337.551pt,281.304pt) -- (337.551pt,294.304pt);
|
||||
\draw[pstyle2] (296.551pt,294.304pt) -- (337.551pt,294.304pt);
|
||||
\draw[pstyle3] (306.551pt,290.304pt) -- (296.551pt,294.304pt) -- (306.551pt,298.304pt) -- (302.551pt,294.304pt) -- cycle;
|
||||
\node at (302.551pt,261.598pt)[below right,color=black]{afficher() : "\underline{Hello World}"};
|
||||
\draw[pstyle2] (27.3692pt,281.304pt) -- (69.3692pt,281.304pt);
|
||||
\draw[pstyle2] (69.3692pt,281.304pt) -- (69.3692pt,294.304pt);
|
||||
\draw[pstyle2] (28.3692pt,294.304pt) -- (69.3692pt,294.304pt);
|
||||
\draw[pstyle3] (38.3692pt,290.304pt) -- (28.3692pt,294.304pt) -- (38.3692pt,298.304pt) -- (34.3692pt,294.304pt) -- cycle;
|
||||
\node at (34.3692pt,261.598pt)[below right,color=black]{afficher() : "Hello"};
|
||||
\draw[pstyle3] (37.9548pt,363.8051pt) -- (28.3692pt,368.716pt) -- (38.6973pt,371.7706pt) -- (34.3433pt,368.1591pt) -- cycle;
|
||||
\draw[pstyle2] (294.551pt,343.716pt) -- (27.3692pt,368.716pt);
|
||||
\node at (44.3692pt,306.304pt)[below right,color=black]{\qquad\qquad\qquad\qquad\qquad\qquad\qquad partager("\underline{Hello World}")};
|
||||
\node at (44.3692pt,324.01pt)[below right,color=black]{ };
|
||||
\draw[pstyle3] (283.9655pt,363.8051pt) -- (293.551pt,368.716pt) -- (283.2229pt,371.7706pt) -- (287.577pt,368.1591pt) -- cycle;
|
||||
\draw[pstyle2] (27.3692pt,343.716pt) -- (293.551pt,368.716pt);
|
||||
\node at (34.3692pt,324.01pt)[below right,color=black]{partager("Hello")};
|
||||
\draw[pstyle2] (27.3692pt,400.4221pt) -- (69.3692pt,400.4221pt);
|
||||
\draw[pstyle2] (69.3692pt,400.4221pt) -- (69.3692pt,413.4221pt);
|
||||
\draw[pstyle2] (28.3692pt,413.4221pt) -- (69.3692pt,413.4221pt);
|
||||
\draw[pstyle3] (38.3692pt,409.4221pt) -- (28.3692pt,413.4221pt) -- (38.3692pt,417.4221pt) -- (34.3692pt,413.4221pt) -- cycle;
|
||||
\node at (34.3692pt,380.716pt)[below right,color=black]{afficher() : "\underline{Hello World}"};
|
||||
\draw[pstyle2] (295.551pt,400.4221pt) -- (337.551pt,400.4221pt);
|
||||
\draw[pstyle2] (337.551pt,400.4221pt) -- (337.551pt,413.4221pt);
|
||||
\draw[pstyle2] (296.551pt,413.4221pt) -- (337.551pt,413.4221pt);
|
||||
\draw[pstyle3] (306.551pt,409.4221pt) -- (296.551pt,413.4221pt) -- (306.551pt,417.4221pt) -- (302.551pt,413.4221pt) -- cycle;
|
||||
\node at (302.551pt,380.716pt)[below right,color=black]{afficher() : "\underline{Hello}"};
|
||||
\end{tikzpicture}
|
25
docs/rapport/rapport_etat_artv2/images/seriaized.puml
Normal file
25
docs/rapport/rapport_etat_artv2/images/seriaized.puml
Normal file
@ -0,0 +1,25 @@
|
||||
@startuml serialized
|
||||
|
||||
!pragma teoz true
|
||||
hide footbox
|
||||
|
||||
participant Alice
|
||||
participant Server
|
||||
participant Bob
|
||||
|
||||
|
||||
Alice ->(10) Server : lock()
|
||||
Server -->(10) Alice : true
|
||||
|
||||
Bob -> Server : lock()
|
||||
& Alice ->(10) Server : inserer("hello world")
|
||||
Server -->(10) Bob : false
|
||||
& Alice ->(10) Server : lire()
|
||||
Server -->(10) Alice : "hello world"
|
||||
Alice -> Server : unlock()
|
||||
Bob -> Server : lock()
|
||||
Bob -> Server : lire()
|
||||
Server -->(10) Bob : "hello world"
|
||||
Bob -> Server : unlock()
|
||||
|
||||
@enduml
|
57
docs/rapport/rapport_etat_artv2/images/serialized.latex
Normal file
57
docs/rapport/rapport_etat_artv2/images/serialized.latex
Normal file
@ -0,0 +1,57 @@
|
||||
% generated by Plantuml 1.2022.7
|
||||
\definecolor{plantucolor0000}{RGB}{24,24,24}
|
||||
\definecolor{plantucolor0001}{RGB}{226,226,240}
|
||||
\definecolor{plantucolor0002}{RGB}{0,0,0}
|
||||
\begin{tikzpicture}[yscale=-1
|
||||
,pstyle0/.style={color=plantucolor0000,line width=0.5pt,dash pattern=on 5.0pt off 5.0pt}
|
||||
,pstyle1/.style={color=plantucolor0000,fill=plantucolor0001,line width=0.5pt}
|
||||
,pstyle2/.style={color=plantucolor0000,fill=plantucolor0000,line width=1.0pt}
|
||||
,pstyle3/.style={color=plantucolor0000,line width=1.0pt}
|
||||
,pstyle4/.style={color=plantucolor0000,line width=1.0pt,dash pattern=on 2.0pt off 2.0pt}
|
||||
]
|
||||
\draw[pstyle0] (30.45pt,39.0679pt) -- (30.45pt,434.1281pt);
|
||||
\draw[pstyle0] (210.5241pt,39.0679pt) -- (210.5241pt,434.1281pt);
|
||||
\draw[pstyle0] (328.7611pt,39.0679pt) -- (328.7611pt,434.1281pt);
|
||||
\draw[pstyle1] (5pt,10pt) arc (180:270:5pt) -- (10pt,5pt) -- (50.9pt,5pt) arc (270:360:5pt) -- (55.9pt,10pt) -- (55.9pt,33.0679pt) arc (0:90:5pt) -- (50.9pt,38.0679pt) -- (10pt,38.0679pt) arc (90:180:5pt) -- (5pt,33.0679pt) -- cycle;
|
||||
\node at (12pt,12pt)[below right,color=black]{Alice};
|
||||
\draw[pstyle1] (177.9423pt,10pt) arc (180:270:5pt) -- (182.9423pt,5pt) -- (238.1059pt,5pt) arc (270:360:5pt) -- (243.1059pt,10pt) -- (243.1059pt,33.0679pt) arc (0:90:5pt) -- (238.1059pt,38.0679pt) -- (182.9423pt,38.0679pt) arc (90:180:5pt) -- (177.9423pt,33.0679pt) -- cycle;
|
||||
\node at (184.9423pt,12pt)[below right,color=black]{Server};
|
||||
\draw[pstyle1] (306.3919pt,10pt) arc (180:270:5pt) -- (311.3919pt,5pt) -- (346.1303pt,5pt) arc (270:360:5pt) -- (351.1303pt,10pt) -- (351.1303pt,33.0679pt) arc (0:90:5pt) -- (346.1303pt,38.0679pt) -- (311.3919pt,38.0679pt) arc (90:180:5pt) -- (306.3919pt,33.0679pt) -- cycle;
|
||||
\node at (313.3919pt,12pt)[below right,color=black]{Bob};
|
||||
\draw[pstyle2] (198.7612pt,76.2256pt) -- (208.5241pt,80.7739pt) -- (198.3177pt,84.2133pt) -- (202.5333pt,80.4412pt) -- cycle;
|
||||
\draw[pstyle3] (30.45pt,70.7739pt) -- (208.5241pt,80.7739pt);
|
||||
\node at (37.45pt,51.0679pt)[below right,color=black]{lock()};
|
||||
\draw[pstyle2] (41.2128pt,117.9316pt) -- (31.45pt,122.4799pt) -- (41.6564pt,125.9193pt) -- (37.4408pt,122.1473pt) -- cycle;
|
||||
\draw[pstyle4] (209.5241pt,112.4799pt) -- (30.45pt,122.4799pt);
|
||||
\node at (47.45pt,92.7739pt)[below right,color=black]{true};
|
||||
\draw[pstyle2] (221.5241pt,150.186pt) -- (211.5241pt,154.186pt) -- (221.5241pt,158.186pt) -- (217.5241pt,154.186pt) -- cycle;
|
||||
\draw[pstyle3] (215.5241pt,154.186pt) -- (327.7611pt,154.186pt);
|
||||
\node at (227.5241pt,134.4799pt)[below right,color=black]{lock()};
|
||||
\draw[pstyle2] (198.7612pt,159.6376pt) -- (208.5241pt,164.186pt) -- (198.3177pt,167.6253pt) -- (202.5333pt,163.8533pt) -- cycle;
|
||||
\draw[pstyle3] (30.45pt,154.186pt) -- (208.5241pt,164.186pt);
|
||||
\node at (37.45pt,134.4799pt)[below right,color=black]{inserer("hello world")};
|
||||
\draw[pstyle2] (317.1338pt,201.0635pt) -- (326.7611pt,205.892pt) -- (316.4596pt,209.035pt) -- (320.7825pt,205.3863pt) -- cycle;
|
||||
\draw[pstyle4] (210.5241pt,195.892pt) -- (326.7611pt,205.892pt);
|
||||
\node at (217.5241pt,176.186pt)[below right,color=black]{false};
|
||||
\draw[pstyle2] (198.7612pt,201.3437pt) -- (208.5241pt,205.892pt) -- (198.3177pt,209.3314pt) -- (202.5333pt,205.5593pt) -- cycle;
|
||||
\draw[pstyle3] (30.45pt,195.892pt) -- (208.5241pt,205.892pt);
|
||||
\node at (37.45pt,176.186pt)[below right,color=black]{lire()};
|
||||
\draw[pstyle2] (41.2128pt,243.0497pt) -- (31.45pt,247.598pt) -- (41.6564pt,251.0374pt) -- (37.4408pt,247.2653pt) -- cycle;
|
||||
\draw[pstyle4] (209.5241pt,237.598pt) -- (30.45pt,247.598pt);
|
||||
\node at (47.45pt,217.892pt)[below right,color=black]{"hello world"};
|
||||
\draw[pstyle2] (198.5241pt,275.304pt) -- (208.5241pt,279.304pt) -- (198.5241pt,283.304pt) -- (202.5241pt,279.304pt) -- cycle;
|
||||
\draw[pstyle3] (30.45pt,279.304pt) -- (204.5241pt,279.304pt);
|
||||
\node at (37.45pt,259.598pt)[below right,color=black]{unlock()};
|
||||
\draw[pstyle2] (221.5241pt,307.01pt) -- (211.5241pt,311.01pt) -- (221.5241pt,315.01pt) -- (217.5241pt,311.01pt) -- cycle;
|
||||
\draw[pstyle3] (215.5241pt,311.01pt) -- (327.7611pt,311.01pt);
|
||||
\node at (227.5241pt,291.304pt)[below right,color=black]{lock()};
|
||||
\draw[pstyle2] (221.5241pt,338.716pt) -- (211.5241pt,342.716pt) -- (221.5241pt,346.716pt) -- (217.5241pt,342.716pt) -- cycle;
|
||||
\draw[pstyle3] (215.5241pt,342.716pt) -- (327.7611pt,342.716pt);
|
||||
\node at (227.5241pt,323.01pt)[below right,color=black]{lire()};
|
||||
\draw[pstyle2] (317.1338pt,379.5935pt) -- (326.7611pt,384.4221pt) -- (316.4596pt,387.5651pt) -- (320.7825pt,383.9164pt) -- cycle;
|
||||
\draw[pstyle4] (210.5241pt,374.4221pt) -- (326.7611pt,384.4221pt);
|
||||
\node at (217.5241pt,354.716pt)[below right,color=black]{"hello world"};
|
||||
\draw[pstyle2] (221.5241pt,412.1281pt) -- (211.5241pt,416.1281pt) -- (221.5241pt,420.1281pt) -- (217.5241pt,416.1281pt) -- cycle;
|
||||
\draw[pstyle3] (215.5241pt,416.1281pt) -- (327.7611pt,416.1281pt);
|
||||
\node at (227.5241pt,396.4221pt)[below right,color=black]{unlock()};
|
||||
\end{tikzpicture}
|
5
docs/rapport/rapport_etat_artv2/intro/index.tex
Executable file
5
docs/rapport/rapport_etat_artv2/intro/index.tex
Executable file
@ -0,0 +1,5 @@
|
||||
\subsection{Motivation}
|
||||
\input{intro/motivation.tex}
|
||||
|
||||
\subsection{Introduction}
|
||||
\input{intro/intro.tex}
|
10
docs/rapport/rapport_etat_artv2/intro/intro.tex
Normal file
10
docs/rapport/rapport_etat_artv2/intro/intro.tex
Normal file
@ -0,0 +1,10 @@
|
||||
Les comportements des systèmes distribués sont étudiés depuis les années 1970, depuis l’arrivée des premiers processeurs multicœur.
|
||||
Dans ce contexte il semblait essentiel de pouvoir répartir une tâche entre plusieurs acteurs de manières asynchrone afin d’accroitre les performances sur une unique tâche.
|
||||
Ainsi Lamport définit un modèle de cohérence qu’il nomme “séquentiel”. Il présente la séquentialité de la manière suivante : une tâche est décomposable en un ensemble finit d’opération atomique. S’il est possible de réordonner ces opérations de façon à ce que leur remaniement séquentiel émette des résultats indiscernables pour un opérateur extérieur par rapport à l’exécution séquentielle non-distribuée. Alors la cohérence atteinte par ce système peut être appelée séquentiel.
|
||||
Aujourd’hui nous savons que cette approche nécessite de garder une synchronicité forte entre les acteurs [REF].
|
||||
La difficulté à préserver cette synchronicité croit considérablement avec le nombre d’acteur et le temps de transmission de l’information. L’usage d’une approche séquentiel sur des applications visant à faire travailler des acteurs distants à travers un réseau mondial tel qu’internet semble à ce titre loin d’être efficace. Restreignant les applications dans un dilemme, nécessitant de choisir entre un usage hautement interactif mais excluant les nœuds les plus lents du réseau, ou permettant à l’ensemble des noeuds de participer au prix d’une très grande latence pour l’ensemble du réseau.
|
||||
% Parallèle édition collaborative synchrone VS git
|
||||
|
||||
Néanmoins là ou l’approche séquentiel est la seule fournissant une cohérence absolue dans la gestion des données du point de vue général et du point de vue de l’utilisateur.
|
||||
Il est possible d’accepter une perte de cette cohérence partielle ou total afin de gagner en performances sur des applications à grande échelle.
|
||||
Ce compromis entre cohérence et performances est l’objet de ce document qui vise à faire un état du paysage des différentes approches et solutions existantes, en définissant les cas d’usages associés.
|
9
docs/rapport/rapport_etat_artv2/intro/motivation.tex
Normal file
9
docs/rapport/rapport_etat_artv2/intro/motivation.tex
Normal file
@ -0,0 +1,9 @@
|
||||
La plupart des applications collaboratifs sur le marché prennent la forme d’une entité centralisée traitant des données, puis les redistribuent aux différents clients en résolvant au passage les possibles problèmes de cohérences qui auraient pu survenir.
|
||||
De manière à favoriser l’interactivité de l’application et ainsi fournir l’expérience utilisateur la plus optimale, on constate que certaines de ces applications font appels à des algorithmes qui ne respectent pas ce qu’on attendrait d’une exécution séquentielle, pouvant ainsi mener à des incohérences dans les exécutions.
|
||||
Et à terme avoir un impact sur l’expérience utilisateur.
|
||||
|
||||
Il nous semble donc intéressant de se pencher sur l’état de la recherche concernant les divers manières d’aborder ce compromis dans la gestion de la cohérence dans ce genre de systèmes. Et ainsi mettre en avant les différentes propriétés qui en résultent. L’intérêt ici est de fournir une base permettant d’éclairer la prise de décision lors de l’implémentation d’un algorithme visant à satisfaire un problème distribué.
|
||||
|
||||
Ce document est réalisé dans le cadre de la réalisation de ma thèse à fin de servir de base en tant qu’état de l’art sur le sujet.
|
||||
L’objectif est de fournir un état de l’art de la recherche autour des différents compromis réalisables dans la gestion de la cohérence dans le contexte d’applications distribués.
|
||||
Il a pour but de servir de base à un projet de thèse en CIFRE financé par l’entreprise Scille SAS, et encadré par le Laboratoire d’Informatique et Système.
|
59
docs/rapport/rapport_etat_artv2/main.tex
Executable file
59
docs/rapport/rapport_etat_artv2/main.tex
Executable file
@ -0,0 +1,59 @@
|
||||
\documentclass{article}
|
||||
|
||||
\usepackage[T1]{fontenc}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage[french]{babel}
|
||||
\usepackage[affil-it]{authblk}
|
||||
\usepackage{fullpage}
|
||||
\usepackage{graphicx}
|
||||
|
||||
\usepackage{biblatex}
|
||||
\addbibresource{../../recherches/Stage.bib}
|
||||
|
||||
\usepackage{tikz}
|
||||
\usetikzlibrary{positioning}
|
||||
\usetikzlibrary{calc}
|
||||
\usetikzlibrary{arrows.meta}
|
||||
\usepackage{aeguill}
|
||||
|
||||
\usepackage{amsmath}
|
||||
|
||||
\usepackage{multicol}
|
||||
|
||||
\begin{document}
|
||||
|
||||
\title{DRAFT: Critères de Cohérence faible byzantine appliquée aux environements cloud}
|
||||
\author{JOLY Amaury \\ \textbf{Encadrants :} GODARD Emmanuel, TRAVERS Corentin}
|
||||
\affil{Aix-Marseille Université, Scille}
|
||||
\date{\today}
|
||||
|
||||
\begin{titlepage}
|
||||
\maketitle
|
||||
|
||||
\end{titlepage}
|
||||
|
||||
\begin{abstract}
|
||||
DRAFT !
|
||||
\end{abstract}
|
||||
|
||||
\newpage
|
||||
|
||||
\tableofcontents
|
||||
|
||||
\newpage
|
||||
|
||||
\section{Introduction}
|
||||
\input{intro/index.tex}
|
||||
|
||||
\section{Cohérence Forte}
|
||||
\input{coherence_forte/index.tex}
|
||||
|
||||
\section{Les critères de cohérence}
|
||||
\input{consistency_criteria/index.tex}
|
||||
|
||||
\section{Les CRDT}
|
||||
\input{CRDT/index.tex}
|
||||
|
||||
\printbibliography
|
||||
|
||||
\end{document}
|
Loading…
Reference in New Issue
Block a user