*** empty log message ***

This commit is contained in:
glenux 2004-03-07 00:18:52 +00:00
parent 3e4c8e432c
commit d38314b67e
2 changed files with 86 additions and 65 deletions

View file

@ -1,12 +1,16 @@
\chapter{A venir} \chapter{Conclusion}
\par Bien que nous ayons fini le projet, il se peut qu'il ne soit pas \par Nous avons fini le projet, mais il n'est certainement pas exempt
sans défauts. C'est pourquoi dans l'avenir, il faudrai corriger les de bugs et d'autres défauts.
bogues éventuels que tous nos tests n'auraient pas fait appara{\^i}tre. C'est pourquoi dans l'avenir, il faudrai corriger les bogues éventuels que
Mais il n'y a pas que cela; le ``code'' pourrai {\^e}tre amélioré et tous nos tests n'auraient pas fait appara{\^i}tre. Le ``code'' lui-même pourrait {\^e}tre grandement amélioré et allégé car des choses plus ``subtiles'' auraient pu être écrite à certains endroits (nécessitant malheureusement un peu plus de temps).
allégé. Nous pourrions également faire plus ``subtil'' par endroits.
Nous devrions aussi vérifier tous les codes d'erreurs renvoyés par les \par De même la gestion des codes d'erreurs renvoyés par les fonctions pourrait être améliorée et la facilité de débuggage augmentée.
fonctions après leur appel. Il serai également possible de faire en sorte
d'utiliser moins de mémoire en réduisant le nombre de {\em shm}; pour \par Il serait également possible de faire en sorte d'utiliser moins de
cela il faudrai changer de structure de donnée. Nous aimerions également mémoire en réduisant le nombre de segment de mémoire partagée, mais pour
finir l'outil d'analyse {\em msgSpaceState} des {\em msgSpace}. cela il faudrai changer de structures de données.
\par De plus nous aimerions (d'ici la soutenance) rendre les outils de test et d'analyse des espaces de messages plus complet.
\par Enfin nous tenons à remercier M. Rifflet pour le cours (et son livre) ainsi que M. Bertier pour leurs nombreuses explications (si précieuses) qu'ils nous tout deux apportés.

View file

@ -5,7 +5,9 @@
\subsection{Travail collaboratif} \subsection{Travail collaboratif}
\par Nous avons travaillé ensemble gr{\^a}ce à CVS (Concurrent Versions System). Notre projet est hébergé chez Sourceforge\footnote{\url{http://www.sourceforge.net}}. \par Nous avons travaillé ensemble gr{\^a}ce à CVS (Concurrent Versions System). Notre projet est hébergé chez Sourceforge\footnote{\url{http://www.sourceforge.net}}.
Le CVS permet la modification du code du projet en m{\^e}me temps par plusieurs personnes. Les modifications et les mises à jour de chacun des membres du projet sont diffusées instantanément, avec un risque minimisé de conflits lors des modifications du m{\^e}me code. Le CVS permet la modification du code du projet en m{\^e}me temps par plusieurs
personnes. Les modifications et les mises à jour de chacun des membres du projet peuvent
ainsi être diffusées instantanément, avec un risque minimisé de conflits lors des modifications du m{\^e}me code.
\subsection{Moyens techniques} \subsection{Moyens techniques}
@ -13,10 +15,8 @@ Le CVS permet la modification du code du projet en m{\^e}me temps par plusieurs
\par Chacun selon nos préférences, nous avons utilisés des machines sous GNU/Linux ou Microsoft Windows et codé avec Vim. \par Chacun selon nos préférences, nous avons utilisés des machines sous GNU/Linux ou Microsoft Windows et codé avec Vim.
La personne sous Microsoft Windows avait une session graphique sur un serveur GNU/Linux, appartenant a un autre membre du projet, La personne sous Microsoft Windows avait une session graphique sur un serveur GNU/Linux, appartenant a un autre membre du projet,
gr{\^a}ce à l'utilisation de VNC\footnote{\url{http://www.realvnc.com}} (Virtual Network Computing). gr{\^a}ce à l'utilisation de VNC\footnote{\url{http://www.realvnc.com}} (Virtual Network Computing).
Cela afin de permettre à l'utilisateur de Microsoft Windows de pouvoir Cela afin de permettre à l'utilisateur de Microsoft Windows de pouvoir compiler et tester
tester la bibliothèque dans les meilleures conditions, car sous la bibliothèque dans de meilleurs conditions que sous son système initial\ldots
Microsoft Windows l'utilisateur n'est pas prévenu des
{\em segmentation fault} et autres erreurs système.
\section{Programmation} \section{Programmation}
@ -28,48 +28,63 @@ utilis
des fonctions dans le fichier \\``\verb+/src/proto.h+'', avec en des fonctions dans le fichier \\``\verb+/src/proto.h+'', avec en
commentaire le fichier d'où il est issu. Par contre pour les fonctions commentaire le fichier d'où il est issu. Par contre pour les fonctions
qui génèrent les {\em ids}, leur prototype est dans le fichier ``\verb+/src/ids.h+'', généré par ``\verb+/src/ids.c+''. qui génèrent les {\em ids}, leur prototype est dans le fichier ``\verb+/src/ids.h+'', généré par ``\verb+/src/ids.c+''.
Le fichier ``\verb+/src/proto.h+'' est connu des logiciels qui utilisent
\par Le fichier ``\verb+/src/proto.h+'' est connu des logiciels qui utilisent
notre bibliothèque, tandis que ``\verb+/src/ids.h+'' non. notre bibliothèque, tandis que ``\verb+/src/ids.h+'' non.
Nous allons donc vous décrire nos différentes fonctions en les classant Nous allons donc vous décrire nos différentes fonctions en les classant
par famille. par famille.
\newline \newline
\par Nous avons quatre grandes {\em familles} de fonctions. \par Nous avons quatre grandes {\em familles} de fonctions.
\begin{description} \begin{description}
\item{\sc msgBuffer*} Ce sont toutes les fonctions qui concernent les \item[msgBuffer*]{Ce sont toutes les fonctions qui concernent les
buffers : comment on les créés, les ``attachent'' aux processus. buffers : création, attachement aux processus\ldots}
\item{\sc msgPool*} Ce sont les fonctions qui permettent de créer ou de
\item[msgPool*]{Ce sont les fonctions qui permettent de créer ou de
détruire une {\em pool}, de l'ouvrir ou encore de poser un ``verrou''. détruire une {\em pool}, de l'ouvrir ou encore de poser un ``verrou''.
\begin{description} \begin{description}
\item{\sc msgPool*} Fonctions servant à gérer une {\em pool}, qui
correspond à un ensemble de {\em buffers}. \item[msgPool*]{Fonctions servant à gérer une {\em pool}, qui
\item{\sc msgPoolDataTab*} Fonctions utiles pour la gestion des correspond à un ensemble de {\em buffers}.}
\item[msgPoolDataTab*]{Fonctions utiles pour la gestion des
informations d'une {\em pool} telles que la taille des {\em buffers}, informations d'une {\em pool} telles que la taille des {\em buffers},
leur nombre\dots leur nombre\dots}
\end{description} \end{description}
\item{\sc msgQueue*} Toutes les fonctions gérant les ``queues'', {\em }
files de maessages}. On y
trouve celle qui en créé une, celles qui vérifient si elle est \item[msgQueue*]{Toutes les fonctions gérant les ``queues'', {\em
disponible ou pas, celles qui ajoutent un élément ou au contraire en files de messages}. On y trouve celle qui en créé une, celles i
enlève un. qui vérifient si elle est disponible ou pas, celles qui ajoutent
un élément ou au contraire en enlève un.
\begin{description} \begin{description}
\item{\sc msgQueue*} Rassemble toutes les fonctions servant à la gestion \item[msgQueue*]{ Rassemble toutes les fonctions servant à la gestion
des files de messages. des files de messages.}
\item{\sc msgQueueElem*} Les fonctions utiles pour gérer un élément
d'une file de messages. \item[msgQueueElem*]{ Les fonctions utiles pour gérer un élément
\item{\sc msgQueue(Prot/Read)*} Fonctions servant à protéger une file. d'une file de messages.}
\item[msgQueue(Prot|Read)*]{Fonctions servant à protéger une file
({\em read} indique la disponibilité d'une ressource en lecture,
{\em Prot} la protection contre les modification).}
\end{description} \end{description}
\item{\sc msgSpace*} Ensemble de fonctions qui gèrent les espaces de }
\item[msgSpace*]{Ensemble de fonctions qui gèrent les espaces de
messages : création, ouverture, listes\ldots messages : création, ouverture, listes\ldots
\begin{description} \begin{description}
\item{\sc msgSpace*} Fonctions pour la création, ``ouverture'', ``fermeture''\dots d'un espace de messages. \item[msgSpace*]{Fonctions pour la création, ``ouverture'', ``fermeture''\dots d'un espace de messages.}
\item{\sc msgSpaceList*} Ce sont toutes les fonctions utiles pour la
gestion de la liste cha{\^i}née des {\em msgSpace} existants. \item[msgSpaceList*]{Ce sont toutes les fonctions utiles pour la
\item{\sc msgSpaceListElem*} Fonctions correspondant à la gestion d'un gestion de la liste cha{\^i}née des {\em msgSpace} existants.}
élément de la {\em msgSpaceList}.
\item[msgSpaceListElem*]{ Fonctions correspondant à la gestion d'un
élément de la {\em msgSpaceList}.}
\end{description} \end{description}
}
\end{description} \end{description}
\subsection{Détails sur certaines fonctions} \subsection{Détails sur certaines fonctions}
\par Nous détaillerons ici quelques fonctions qui peuvent ne pas \par Nous détaillerons ici quelques fonctions qui peuvent ne pas
@ -110,43 +125,45 @@ espace de messages {\em msgSpace *}, un num
l'adresse d'un buffer {\em void *}. Elle insère le buffer dans le numéro l'adresse d'un buffer {\em void *}. Elle insère le buffer dans le numéro
de file de messages de l'espace de messages. Lorsque l'on appelle cette de file de messages de l'espace de messages. Lorsque l'on appelle cette
fonction, à la fin, on ``délocke'' le sémaphore sur la {\em queue}. fonction, à la fin, on ``délocke'' le sémaphore sur la {\em queue}.
\item{\sc msgSpaceState(\dots)} Cette fonction prend en argument, un
``id'' d'espace de message, {\em msgSpaceId}, et permet de conna{\^i}tre
l'état de l'espace de message dont l'``id'' est donnée en argument.
\end{itemize} \end{itemize}
\newpage \newpage
\section{Difficultés rencontrées} \section{Difficultés rencontrées}
\par Nous n'avons pas eu de grosses difficultés à proprement parlé. \subsection{Restrictions}
\par Nous n'avons pas eu de grosses difficultés à proprement parler.
Nous avions juste quelques restrictions, comme le fait de ne pas Nous avions juste quelques restrictions, comme le fait de ne pas
pouvoir utiliser de pointeurs absolus, car l'espace d'adressage entre pouvoir utiliser de pointeurs absolus, car l'espace d'adressage entre
les différents processus n'est pas forcément le m{\^e}me. Ils ont les différents processus n'est pas forcément le m{\^e}me. Ils ont
seulement un segment de mémoire partagée en commun. Il a donc seulement un segment de mémoire partagée en commun.
fallu utiliser les différentes {\em id} des espaces de messages {\em msgSpace}, ou \par Il a donc fallu utiliser les différentes {\em id} (c'est à dire les identifiants POSIX) des espaces de messages {\em msgSpace}, des {\em pools}
encore des {\em pools} pour pouvoir faire en sorte que les processus peuvent et autres types de données stockées en mémoire partagée pour pouvoir permettre a tous les processus d'accéder correctement aux données.
bien accéder aux {\em buffers} situés dans la mémoire partagée.
\subsection{Libertés d'implémentations de POSIX\ldots}
\par Le choix des identifiants ne fut pas simple non plus, car il \par Le choix des identifiants ne fut pas simple non plus, car il
fallait en changer en fonction des différentes implémentations. Par fallait en changer en fonction des différentes implémentations de POSIX.
exemple nous pouvions avoir des identifiants du type ``\verb+/tmp/identifiant+'', En effet la norme POSIX précise que l'identifiant doit commencer par un ``\verb+/+'' et si possible ne pas en comporter d'autres.
qui ne marchaient que sur un type de machines. Sur les autres il \par Si cela est vrai sur certains systèmes (comme GNU/Linux) d'autres
fallait en avoir un du type ``\verb+/identifiant+''. Cela nous a amener systemes (HP-UX, SunOS) requièrent que cet identifiant corresponde
à faire une distinction de cas et générer un identifiant différent au chemin absolu (dans l'arborescence UNIX) d'un fichier sur lequel
selon que l'on soit sur une machine de type {\em HP-UX}, {\em SunOS} on possède des droits\ldots
ou {\em Linux}.
\par Nous avons donc choisi les identifiants du type
``\verb+/tmp/identifiant+'', qui pour les systèmes avec la restrictions précédente et ``\verb+/identifiant+'' sur les autres. i
Cela nous a également conduit à faire une distinction dans le \verb+Makefile+
entre les options de compilation pour {\em HP-UX}, {\em SunOS} ou {\em Linux}.
\par Malheureusement le fait de travailler sur plusieurs types de \par Malheureusement le fait de travailler sur plusieurs types de
machines n'était pas seulement g{\^e}nant pour les identifiants, machines n'était pas seulement g{\^e}nant pour les identifiants,
mais également pour créer la bibliothèque. En effet, il faut ajouter mais également pour créer la bibliothèque. En effet, il faut ajouter
plus ou moins d'options à la compilation: soit il faut ajouter \verb+-lrt+, dans un cas ou \verb+-lrt -lpthread+ dans l'autre. Ceci afin plus ou moins d'options à la compilation: soit il faut ajouter \verb+-lrt+, dans un cas ou \verb+-lrt -lpthread+ dans l'autre. Ceci afin
d'inclure les bonnes librairies pour que notre bibliothèque puisse d'inclure les bonnes librairies pour que notre bibliothèque puisse
fonctionner convenablement. compiler et fonctionner convenablement.
\par Ces distinctions se font dans les {\em Makefile}, \verb+/src/Makefile+ et \verb+/test/Makefile+.
\par Encore une autre difficulté d{\^u}e à Posix, est la \par La seconde difficulté liée à POSIX, est la projection de fichier
projection de fichier ou {\em mapping} avec {\em mmap}. L'offset ou {\em mapping} avec {\em mmap}. Selon l'implémentation, l'offset (décalage par rapport au début de l'addresse mémoire du fichier) peut éventuellement {\^e}tre aligné sur la taille des pages mémoires\ldots
peut {\^e}tre aligné sur les pages mémoires sur \par Ceci est assez génant lorsque l'on veut accéder à bloc de donnée
certains systèmes. Or ceci est emb{\^e}tant lorsque l'on veut qui peut commencer n'importe où dans la zone de mémoire partagée.
accéder à un fichier qui commence n'importe où dans le bloc mémoire. Pour remédier à cela, nous {\em mappons} du début de la zone mémoire partagée jusqu'à ``juste derrière'' le bloc de donnée qui nous intéresse.
Pour remédier à cela, nous {\em mappons} jusqu'à ``juste derrière le \par Puis nous changeons les droits d'acces (\verb+mprotect+) pour nous autoriser la modifiction uniquement sur le bloc de données qui nous intéresse.
buffer''. Nous autorisons le buffer en lecture/écriture et nous déplaçons \par Enfin nous opérons le décalage d'addresse ``à la main'' et renvoyons l'addresse qui correspond au début du bloc de données demandé.
l'adresse obtenue au début du buffer.