source: trunk/unix/unix.tex @ 212

Last change on this file since 212 was 212, checked in by nanardon, 16 years ago
  • fix some typo, better order for files
File size: 24.2 KB
RevLine 
[191]1% $Id: perl.tex 183 2008-09-04 23:55:50Z nanardon $
2\documentclass[notes]{beamer}
3\usepackage[frenchb]{babel}
4\usepackage[T1]{fontenc}
5\usepackage{moreverb}
6\usepackage{graphicx}
7\usepackage{listings}
8\usepackage{color}
9
10\mode<presentation>
11{
12  \definecolor{beamerstructure}{RGB}{143,79,112}
13  \definecolor{sidebackground}{RGB}{230,242,250}
14  \color{beamerstructure}
15  \usetheme[secheader]{Madrid}
16  \usepackage{times}
17  \userightsidebarcolortemplate{\color{sidebackground}}
18  \beamertemplateballitem
19}
20
21\AtBeginSection[]
22{
23\begin{frame}<beamer>
24    \frametitle{Plan}
25    \tableofcontents[currentsection,hideothersubsections]
26\end{frame}
27}
28
29\AtBeginSubsection[]
30{
31\begin{frame}<beamer>
32    \frametitle{}
33    \tableofcontents[sectionstyle=show/hide,subsectionstyle=show/shaded/hide]
34\end{frame}
35}
36
37\title{UNIX/Linux}
38\subtitle{Jouer avec le système}
39\author{Olivier Thauvin}
40\date{\today}
41
42\begin{document}
43
44\frame{\titlepage}
45
46\begin{frame}
47\tableofcontents[hideallsubsections]
48\end{frame}
49
[198]50\section{Préambule}
[191]51
[198]52\subsection{L'Ordinateur}
[191]53
54\begin{frame}
55\frametitle{Principaux composants}
56\begin{columns}[c]
[204]57\column{2in}
58\begin{exampleblock}{ASUS AV7333}
[191]59\centering
60\includegraphics[height=40mm]{asus_mb}
[204]61\end{exampleblock}
[191]62\column{2.5in}
[204]63\begin{block}{}
[191]64\begin{itemize}
65\item les éléments vitaux (PC)
66\begin{itemize}
67\item \textcolor{red}{CPU}
68\item \textcolor{green}{Mémoire}
69\item \textcolor{blue}{Bus}
70\item clavier
71\item carte graphique
72\end{itemize}
[204]73\pause
[191]74\item le reste
75\begin{itemize}
76\item mulot et autres rongeurs
77\item disques durs
78\item carte son
79\item \ldots
80\end{itemize}
81\end{itemize}
[204]82\end{block}
[191]83\end{columns}
84\end{frame}
85
86\begin{frame}[fragile]
87\frametitle{Fonctionnement général}
[204]88\begin{block}{Roles de chacun}
[191]89\begin{itemize}
90\item \textcolor{red}{CPU} (Central processor unit)
91\begin{itemize}
92\item fait les calculs
93\item presque pas de mémoire (registres)
94\end{itemize}
[204]95\pause
[191]96\item \textcolor{green}{Mémoire}
97\begin{itemize}
98\item sert à stocker les données
99\item est moins rapide que le CPU (rapport \verb+~+ 1/3)
100\end{itemize}
[204]101\pause
[191]102\item \textcolor{blue}{Bus}
103\begin{itemize}
104\item sur la carte mère
105\item transporte les données entre les différents composants
106\end{itemize}
107\end{itemize}
[204]108\end{block}
[191]109\end{frame}
110
111\subsection{LES UNIX}
112
113\begin{frame}
114\frametitle{la grande famille des UNIX}
[204]115\begin{block}{Définition \href{http://fr.wikipedia.org/wiki/UNIX}{Wikipédia}}
[191]116\emph{
117UNIX est le nom d'un système d'exploitation multitâche et multi-utilisateur créé en 1969,
118conceptuellement ouvert et fondé sur une approche par laquelle il offre de nombreux petits
119outils chacun dotés d'une mission spécifique.}
[204]120\end{block}
121\pause
[191]122\vfill
123
[204]124\begin{block}{Les grandes lignes:}
[191]125
126\begin{itemize}
127\item mulitâche préemptif
128\item multiutilisateurs (donc gestion de droit)
129\item multisessions
130\item tout est fichier
131\end{itemize}
[204]132\end{block}
[191]133\end{frame}
134
135\begin{frame}
136\frametitle{Vite une Norme !}
[204]137\begin{block}{Exemples d'UNIX:}
[191]138
139\begin{itemize}
140\item GNU/Linux
141\item *BSD (Net, Free, Open, \ldots)
142\item MacOS X (est un BSD, d'Apple)
143\item Digital UNIX (de Digital)
144\item Solaris (de Sun)
145\item AIX (de IBM)
146\item \ldots
147\end{itemize}
[204]148\end{block}
[191]149\vfill
[204]150\pause
151\begin{block}{Norme POSIX:}
[191]152standard de fonctionnement et commandes (IEEE).
[204]153\end{block}
[191]154\end{frame}
155
[204]156\subsection{GNU/Linux}
157
[191]158\begin{frame}
[201]159\frametitle{GNU/Linux}
160\begin{block}{Contenu du système}
161\begin{itemize}
[204]162\item Linux: le noyau lui même (\href{http://www.kernel.org}{kernel.org})
[212]163\item des applis éparpillées sur internet
[201]164\end{itemize}
165\end{block}
[204]166\pause
[201]167\begin{block}{Les distributions}
[204]168\textbf{Ensemble cohérent noyau/applications}
[201]169
170\begin{itemize}
171\item Redhat: Mandriva Suse Centos \ldots
172\item Debian: ubuntu
173\item gentoo
174\item slackware
175\item \ldots
176\end{itemize}
177\end{block}
178\end{frame}
179
180\begin{frame}
[202]181\frametitle{De l'ordinateur à l'utilisateur}
[191]182\begin{columns}[c]
[202]183\column{2in}
[191]184\centering
185\includegraphics[height=40mm]{process}
186\column{2.5in}
[212]187\begin{block}{Rôle du kernel}
[191]188\begin{itemize}
189\item gérer le matériel
190\item donner le temps CPU aux applications
191\item vérifier les droits d'accès
192\item assurer l'intégrité du système
193\end{itemize}
194\end{block}
195\end{columns}
196\end{frame}
197
198\section{Les fichiers}
199
[212]200\subsection{Systèmes de fichiers}
201
202\begin{frame}[fragile]
203\frametitle{Vue globale}
204\begin{exampleblock}{tree  / -L 2 -d}
205\tiny
206\listinginput[5]{1}{tree.txt}
207\end{exampleblock}
208\end{frame}
209
210\begin{frame}[fragile]
211\frametitle{Organisation globale}
212\begin{block}{L'emplacement des fichiers}
213\begin{tabular}{ll}
214\verb+/home+&les données utilisateurs\\
215\verb+/etc+&fichiers de configuration\\
216\verb+/bin+, \verb+/usr/bin+&les executables utilisateur\\
217\verb+/sbin+, \verb+/usr/sbin+&idem, pour root\\
218\verb+/lib+, \verb+/usr/lib+&les librairies\\
219\verb+/usr/share+&les données statiques des programmes\\
220\verb+/usr/include+&les fichiers .h (C)\\
221\verb+/var+&les données variables (spool, etc...)\\
222\verb+/tmp+, \verb+/var/tmp+&données temporaires\\
223\verb+/opt+&espace pour les apps. propriétaires\\
224\end{tabular}
225\end{block}
226\end{frame}
227
228\begin{frame}[fragile]
229\frametitle{Organisation globale (2)}
230\begin{block}{Système de fichiers spéciaux}
231\begin{tabular}{ll}
232\verb+/dev+&les fichiers de périphériques\\
233\verb+/proc+&représentation temp réelle du système\\
234\verb+/sys+&configuration du noyau, informations sur le matériel\\
235\end{tabular}
236\end{block}
237\pause
238\vfill
239\begin{alertblock}{le FHS}
240Le Filesystem Hierarchy Standard normalise l'empacement des fichiers
241\end{alertblock}
242\end{frame}
243
244\begin{frame}[fragile]
245\frametitle{principe}
246\begin{block}{le montage}
247Le système de fichiers est stocké sur un support (disque, fichier, cdrom, \ldots)
248
249Le noyau le fait apparaitre dans un répertoire.
250\end{block}
251\vfill
252\begin{exampleblock}{la commande mount}
253\begin{verbatim}
254[olivier@andromede unix]$ mount
255/dev/sda3 on / type ext3 (rw,noatime)
256/dev/sda8 on /home type ext3 (rw,noatime)
257[...]
258virgo:/home/data on /mnt/disk type nfs
259    (ro,addr=192.168.76.1)
260\end{verbatim}
261\end{exampleblock}
262\end{frame}
263
[191]264\subsection{Les fichiers}
265
266\begin{frame}[fragile]
267\frametitle{Nom de fichiers}
268
269\begin{block}{Accès aux fichiers}
270\begin{itemize}
271\item le séparateur est \verb+/+
[204]272\item plusieurs \verb+/+ n'en font qu'un
[212]273\item la longueur maximale d'un chemin est de 1024 (POSIX)
274\item tous les caractères sont permis sauf \verb+/+ et \emph{NULL}
[191]275\end{itemize}
276\end{block}
[206]277\vfill
[204]278\begin{alertblock}{On évitera cependant}
[191]279\begin{itemize}
[204]280\item l'espace (qu'il faut échaper sur la ligne de commande)
[191]281\item \verb+-+ (surtout en premier, option en ligne de commande)
[204]282\item ce qui ne se tape pas au clavier
283\item les accents (problème d'encodage)
[191]284\end{itemize}
285\end{alertblock}
[206]286\end{frame}
[191]287
[212]288\begin{block}{les différents types}
289\begin{itemize}
290\item les simples fichiers (-)
291\item les répertoires (d)
292\pause
293\item les liens symboliques (l)
294\pause
295\item les fichiers de périphérique (c ou b)
296\pause
297\item les fifo (tubes nommés, p)
298\pause
299\item les sockets (=)
300\end{itemize}
301\end{block}
302\end{frame}
303
[206]304\begin{frame}[fragile]
305\frametitle{. et ..}
306\begin{block}{chaque dossier contient:}
307\begin{itemize}
308\item \verb+.+ le répertoire lui même
309\item \verb+..+ le parent
310\end{itemize}
311\end{block}
312\vfill
313\pause
314\begin{alertblock}{trop de ..}
315\verb+/..+ pointe sur \verb+/+
316
317\begin{verbatim}
318$ ls ../../../../../../etc/passwd
319../../../../../../etc/passwd
320\end{verbatim}
321
322On rebondit sur \verb+/+ et on redescend dans \verb+/etc/passwd+.
323\end{alertblock}
[191]324\end{frame}
325
326\begin{frame}[fragile]
[206]327\frametitle{Fichiers temporaires}
328\begin{block}{Un fichier qu'on ne va pas garder, mais:}
329\begin{itemize}
330\item il ne doit pas exister
331\pause
332\item nom aléatoire (écrasement basé sur un lien symbolique)
333\pause
334\item le placer au bon endroit
335\end{itemize}
336\pause
337\vfill
338\textbf{en pratique}
339\begin{itemize}
340\item shell: mktemp
341\item C: mkstemp
342\item Perl: module File::Temp
343\end{itemize}
344\end{block}
345\pause
346\vfill
347\begin{exampleblock}{}
348\small
349\listinginput[1]{1}{temp.sh}
350\end{exampleblock}
351\end{frame}
352
353\begin{frame}[fragile]
[191]354\frametitle{L'inode}
355
[204]356\begin{exampleblock}{Le fichier est matérialisé par une inode}
[191]357{\small\begin{verbatim}
358[olivier@andromede unix]$ ls -li unix.tex
3596160386 -rw-r--r-- 1 olivier olivier 3049 17:30 unix.tex
360\end{verbatim}
361}
[204]362\end{exampleblock}
[191]363
[204]364\begin{block}{L'inode contient}
[191]365\begin{itemize}
366\item un numéro (6160386)
367\item des métadata
368\begin{itemize}
369\item taille (3049)
370\item propriétaires / droits d'accès
[204]371\item dates: d'accès (atime), création (ctime), modification (mtime)
[191]372\end{itemize}
373\item éventuellement un contenu
374\end{itemize}
[204]375\end{block}
376\pause
377\begin{alertblock}{}
378Créer un fichier créer l'inode\\
379Effacer un fichier efface l'inode (si plus référencée)
[191]380\end{alertblock}
381\end{frame}
382
383\begin{frame}[fragile]
[212]384\frametitle{existence d'un fichier}
[191]385\begin{block}{un fichier existe tant que}
386\begin{itemize}
387\item l'inode est référencée par un nom (lien hard)
388\item l'inode est ouverte
389\end{itemize}
390\end{block}
[204]391\pause
392\vfill
[191]393\begin{exampleblock}{liens hard}
394{\small\begin{verbatim}
395[olivier@andromede unix]$ ln fichier1 fichier2
396[olivier@andromede unix]$ ls -li fichier*
3976160393 -rw-r--r-- 2 olivier olivier 1101 19:54 fichier1
3986160393 -rw-r--r-- 2 olivier olivier 1101 19:54 fichier2
399[olivier@andromede unix]$ rm -f fichier1
400[olivier@andromede unix]$ ls -li fichier*
4016160393 -rw-r--r-- 1 olivier olivier 1101 19:54 fichier2
402\end{verbatim}
403}
404\end{exampleblock}
405\end{frame}
406
407\begin{frame}[fragile]
408\begin{exampleblock}{deleteopen.pl}
409\frametitle{existance d'un fichier}
410\listinginput[2]{1}{deleteopen.pl}
411\end{exampleblock}
[205]412\pause
413\begin{block}{Conséquences:}
[191]414\begin{itemize}
415\item le fichier n'est accessible que par l'application
416\item si l'application quitte: l'espace disque est récupéré
[205]417\item la fermeture du descripteur entraine l'effacement du fichier
[191]418\end{itemize}
[205]419\pause
[191]420{\small\begin{verbatim}
421perl 23536 ol 3w REG  8,7  0  49065 /tmp/opened (deleted)
422\end{verbatim}
423}
424Utile pour les fichiers temporaires.
425\end{block}
426\end{frame}
427
428\begin{frame}[fragile]
[204]429\begin{alertblock}{quand ctime dépasse mtime}
430Copie en préservant les métadata:
431{\small\begin{verbatim}
432[olivier@andromede unix]$ cp -a unix.tex unix2.tex
433\end{verbatim}
434}
[205]435\pause
[204]436Le fichier vient d'être créé:
437{\small\begin{verbatim}
438[olivier@andromede unix]$ ls -l --time=c unix2.tex
439-rw-r--r-- 1 olivier olivier 3049 18:47 unix2.tex
440\end{verbatim}
441}
[205]442\pause
[204]443Pourtant la date de modification est antérieur:
444{\small\begin{verbatim}
445[olivier@andromede unix]$ ls -l  unix2.tex
446-rw-r--r-- 1 olivier olivier 3049 17:30 unix2.tex
447\end{verbatim}
448}
449\end{alertblock}
450\end{frame}
451
452\begin{frame}[fragile]
453\frametitle{les types de fichiers}
[205]454\begin{exampleblock}{ls -l}
[204]455- \emph{rw-r--r-- 1 olivier olivier 3049 17:30 unix2.tex}
[205]456\end{exampleblock}
[204]457
458\begin{frame}[fragile]
[191]459\frametitle{les fichiers à trous (sparse files)}
[203]460\begin{block}{théorie}
461\begin{itemize}
462\item certaines données n'existent pas
463\item les trous ne prennent pas de place
464\item le système renvoient des 0 en cas de lecture
[212]465\item le fichier peut être plus gros que le système de fichiers
[203]466\end{itemize}
467\end{block}
[205]468\pause
[208]469\vfill
[203]470\begin{block}{utilisation ?}
[212]471Chaque fois que des données seront allouées à des emplacements dans le fichier:
[203]472\begin{itemize}
[212]473\item disques virtuels
474\item bases de données
[203]475\end{itemize}
476\end{block}
[191]477\end{frame}
478
479\begin{frame}[fragile]
[203]480\frametitle{fichiers à trous: exemple}
481\begin{exampleblock}{sparce.c}
482\begin{small}
483\listinginput{1}{sparse.c}
484
485\begin{verbatim}
486[olivier@andromede unix]$ ls -ls sparsed
4878 -rw-rw-r-- 1 olivier olivier 1048582 02:57 sparsed
488\end{verbatim}
489\end{small}
490\end{exampleblock}
491\end{frame}
492
493\begin{frame}[fragile]
[191]494\frametitle{Fichier de périphérique}
495\begin{block}{2 types}
496\begin{itemize}
497\item block (b)
498\item caractères (c)
499\end{itemize}
500\end{block}
[205]501\pause
[191]502\begin{exampleblock}{Tout est fichier}
503\begin{verbatim}
504brw-rw---- 1 nanardon cdwriter 11, 0 12:26 /dev/sr0
505\end{verbatim}
506
507C'est le premier lecteur CDROM SCSI (SATA en réalité)
508
[205]509\pause
[191]510Je peux le lire comme un fichier:
511\begin{verbatim}
[208]512$ dd if=/dev/sr0 bs=1024 count=20 | wc
[191]51320+0 enregistrements lus
51420+0 enregistrements écrits
51520480 octets (20 kB) copiés, 0,803619 s, 25,5 kB/s
516      0       0   20480
517\end{verbatim}
518\end{exampleblock}
519\end{frame}
520
521\begin{frame}[fragile]
522\frametitle{les fifos}
523\begin{exampleblock}{Première console:}
524\begin{verbatim}
[208]525$ mkfifo /tmp/fifo
526$ cat /etc/passwd > /tmp/fifo
[191]527\end{verbatim}
528\end{exampleblock}
[205]529\pause
[206]530\vfill
[191]531\begin{exampleblock}{Deuxième console:}
532\begin{verbatim}
[208]533$ grep root < /tmp/fifo
[191]534root:x:0:0:root:/root:/bin/bash
535\end{verbatim}
536\end{exampleblock}
[205]537\pause
[206]538\vfill
[191]539\begin{block}{Cet exemple simple revient à}
540\begin{verbatim}
541cat /etc/passwd | grep root
542\end{verbatim}
543\end{block}
544\end{frame}
545
[206]546\section{Les processus}
[191]547
548\subsection{le temps CPU}
549
550\begin{frame}
551\frametitle{scheduler préemptif}
552\begin{alertblock}{préemptif ?}
[206]553Seul le noyau décide du temps CPU aloué !
[191]554\end{alertblock}
[206]555\pause
556\vfill
[191]557\begin{block}{Le scheduler}
558Le scheduler est appelé à interval régulier (plusieurs centaintes de fois par seconde) pour donner du temps
559CPU à l'application sauf si:
560\begin{itemize}
561\item l'application ne demande pas de temps CPU (sleep)
562\item est en attente d'une réponse matériel (IO wait)
563\end{itemize}
564Le temps CPU est donné en fonction de la priorité
565\end{block}
566\end{frame}
567
[206]568\subsection{La ram}
[191]569
570\begin{frame}
571\frametitle{La RAM}
572\begin{block}{le contenu}
573\begin{itemize}
574\item Mémoire vérouillée:
575\begin{itemize}
576\item le BIOS (programme interne du PC)
577\item mémoire du matériel
578\item le code et données du noyau
579\end{itemize}
[206]580\pause
[191]581\item Mémoire haute (swappable):
582\begin{itemize}
583\item code des applications
584\item données des applications
585\end{itemize}
[206]586\pause
[191]587\item Mémoire vive libre:
588\begin{itemize}
589\item buffers
590\item cache (disque)
591\end{itemize}
[208]592\pause
[191]593\item swap (sur disque, très lente)
594\end{itemize}
595\end{block}
[206]596\end{frame}
[191]597
[206]598\begin{frame}
599\frametitle{Gestion}
600
601\begin{block}{la swap ?}
602Extension sur disque de la mémoire.
603\pause
604
605Elle sert:
606\begin{itemize}
607\item quand la mémoire vive est pleine
608\item pour mettre de coté des données peu utilisées
609\end{itemize}
610
611Mémoire disponible = mémoire vive + swap
612\end{block}
613\pause
614\vfill
[191]615\begin{alertblock}{}
[206]616Un système qui swap \textbf{un peu} n'est pas surchargé !
[191]617\end{alertblock}
[206]618\vfill
619\pause
620\begin{block}{La Ram est virtuelle}
621De par les aller retour RAM-SWAP, et la fragmentation, le système virutalize
622les adresses allouées.
623\end{block}
[191]624\end{frame}
625
626\begin{frame}[fragile]
627\frametitle{Allocation par segment}
628\begin{exampleblock}{Un très mauvais code}
629\listinginput{1}{nosegfault.c}
630Et ça ne plante pas !
631\end{exampleblock}
[207]632\pause
633\vfill
[191]634\begin{alertblock}{Explication}
635Le système n'alloue pas des octets mais des segments
636
637Le système n'intervient que si l'application sort du segment !
638\end{alertblock}
639\end{frame}
640
[192]641\begin{frame}[fragile]
642\frametitle{Mémoire à crédit}
[208]643
644\begin{exampleblock}{malloc.c}
645\small
646\listinginput{1}{malloc.c}
647\end{exampleblock}
[207]648\begin{columns}
649\column{2.5in}
[208]650\pause
[192]651\begin{block}{sortie formatée}
652\begin{tabular}{|c|c|c|}
653\hline
654Mem virtuel&Mem résidente\\
655\hline
656978116&332\\
657\hline
658\hline
659978116&976888\\
660\hline
661\end{tabular}
662\end{block}
[208]663\column{2in}
664\pause
665\begin{block}{malloc est une promesse}
666\begin{itemize}
667\item malloc promet la ram
668\item la ram n'est allouée qu'à l'écriture
669\end{itemize}
670\end{block}
[207]671\end{columns}
672
[192]673\end{frame}
674
[195]675\subsection{plusieurs processus: sur 1 ordinateur}
676
677\begin{frame}
678\frametitle{fork()}
679\begin{block}{la fourchette}
680Permet à un processus de se dupliquer, et de donner naissance à un processus "fils" \textbf{indépendant}\\
681
682\centering
683\includegraphics[height=15mm]{fork}
684\end{block}
[208]685\pause
[195]686\begin{columns}
[208]687\column{2.5in}
[195]688\begin{block}{motivation}
689\begin{itemize}
690\item excution parallèle
691\item perte de privilège de fils
692\item préserver l'environnement du père
693\item serveur: remettre le père en attente
694\end{itemize}
695\end{block}
[208]696\pause
[195]697\column{2in}
698\begin{block}{pros \& cons}
699\begin{itemize}
700\item existe sur tout les UNIX (glibc)
701\item simple
702\item pas de communication
703\end{itemize}
704\end{block}
705\end{columns}
706\end{frame}
707
708\begin{frame}[fragile]
709\frametitle{fork et la RAM}
710\begin{columns}
711\column{2in}
712\tiny
713\begin{exampleblock}{fork.c}
714\listinginput[5]{1}{fork.c}
715\end{exampleblock}
716\column{2.5in}
[208]717\pause
718\begin{block}{Ram utilisée}
[195]719\begin{tabular}{|l|c|}
720\hline
721&mem utilisée\\
722\hline
723\hline
724Avant allocation&1687848\\
725\hline
726Après allocation&2664948\\
727\hline
728Après fork()&2666332\\
729\hline
730\end{tabular}
[208]731\end{block}
[195]732\end{columns}
733\end{frame}
734
[201]735\begin{frame}[fragile]
[195]736\frametitle{les threads}
737\begin{block}{Sépare un processus en deux}
738
739\begin{itemize}
740\item partage de la mémoire
741\begin{itemize}
742\item tout n'est pas forcément partagé
743\item gestion de lock pour les écriture
744\end{itemize}
745\item le fonctionnement ressemble à fork mais
746\begin{itemize}
[208]747\item programmation et gestion différentes
[195]748\item complexe mais éfficace
749\end{itemize}
750\end{itemize}
751\end{block}
[208]752\pause
[201]753\begin{alertblock}{Linux: libpthread (glibc) POSIX}
[195]754Je ne garantie pas que tout les UNIX fournissent le support des threads
755\end{alertblock}
[208]756\pause
[201]757\begin{exampleblock}{}
758\small
759\begin{verbatim}
760[olivier@andromede unix]$ ps aux | grep transcode
761PID %CPU %MEM    VSZ   RSS  TIME  COMMAND
7623477  124  1.3 119972 41344 36:32 transcode
763\end{verbatim}
764\end{exampleblock}
[196]765\end{frame}
[195]766
[196]767\subsection{Communication inter-processus}
768
769\begin{frame}[fragile]
770\frametitle{Pipe}
771\begin{block}{points à retenir}
772\begin{itemize}
[208]773\item flux de donnée continu unique
[196]774\item sens unique
775\item bloquants
776\end{itemize}
777\end{block}
[208]778\pause
779\vfill
[196]780\begin{block}{Utilisation}
781\begin{itemize}
782\item \verb+fork()+/\verb+pipe()+ (\verb+p1 | p2+)
783\item avec tube nommé (\verb+open++\verb+write+ / \verb+open++\verb+read+)
784\end{itemize}
785\end{block}
[195]786\end{frame}
787
[196]788\begin{frame}
[208]789\frametitle{IPC/SHM, la boite aux lettres système}
[196]790\begin{block}{fonctions}
791\begin{itemize}
792\item file d'attente de message
793\item zone de mémoire partagée
794\end{itemize}
795\end{block}
[208]796\pause
797\vfill
[196]798\begin{block}{+ et -}
799\begin{itemize}
800\item relativement simple
801\item très performant
802\item taille allouable limitée (protection du kernel, configurable)
803\item protection des données par gestion de droit
804\end{itemize}
805\end{block}
[208]806\pause
807\vfill
808\begin{block}{La doc (pour le C)}
809\textbf{man}
810shmat, shmdt, shmop, shm\_overview,
811shmctl, shmget, shm\_open, shm\_unlink
812\end{block}
[196]813\end{frame}
814
815\begin{frame}
816\frametitle{Socket, Client/Serveur}
[197]817
818\begin{block}{principe}
819\begin{itemize}
820\item un serveur attends une connection
821\item un client se connecte
822\item les deux échangent des données
823\end{itemize}
824\end{block}
[208]825\pause
826\vfill
[196]827\begin{block}{modes}
828\begin{itemize}
829\item écoute sur le réseau
830\begin{itemize}
831\item definir un port d'écoute
832\item savoir quelle(s) machine(s) contacter
833\item communication inter-machines
834\item problème de latence
835\end{itemize}
[208]836\pause
837\item écoute sur un socket (fichier de type \ldots)
[196]838\begin{itemize}
839\item communication locale
840\item restriction d'accès par gestion de droit
841\end{itemize}
842\end{itemize}
843\end{block}
844\end{frame}
[198]845
846\section{Executables: format}
847
848\subsection{Code exécutable}
[199]849
[198]850\begin{frame}
[199]851\frametitle{la logique}
[201]852\begin{columns}
853\column{2in}
854\includegraphics[height=40mm]{compil}
855\column{2.5in}
[198]856\begin{block}{un quoi ?}
857\begin{itemize}
858\item données formatées (format ELF ces jours-ci)
[208]859\pause
[198]860\item executable (ou presque) par le processeur
[208]861\pause
[198]862\item contient des objets:
863\begin{itemize}
864\item des variables (globales)
865\item des fonctions
866\item d'autres objets à trouver
867\end{itemize}
868\end{itemize}
869\end{block}
[201]870\end{columns}
[198]871\end{frame}
872
[201]873\subsection{Bibliothèques}
[198]874
[201]875\begin{frame}
[208]876\frametitle{Le standard}
[201]877\begin{block}{Normallement un programme fournit}
878\begin{itemize}
879\item foo.h: l'entête pour la compilation
[208]880\pause
[201]881\item libfoo.so.1: la librairie utilisée, versionnée
[208]882\pause
[201]883\item libfoo.so: (lien) pour l'éditeur de lien
[208]884\pause
[201]885\item libfoo.a: la version statique
886\end{itemize}
887\end{block}
[208]888\pause
889\vfill
[201]890\begin{block}{le point sur les dynamiques}
891\begin{itemize}
892\item avantages:
893\begin{itemize}
894\item les maj sont répercutés sans recompilation des applis
895\item factorisation du code dans la RAM et sur le disque
896\end{itemize}
[208]897\pause
[201]898\item inconvénients
899\begin{itemize}
900\item doit être disponible lors de l'éxecution
901\end{itemize}
902\end{itemize}
903\end{block}
904\end{frame}
905
[199]906\begin{frame}[fragile]
[201]907\frametitle{Trouver les dynamiques}
908\begin{block}{la recherche}
909\begin{itemize}
910\item codé dans l'executable (\emph{rpath})
[208]911\pause
[201]912\item codé en dur: \verb+/lib(64)+, \verb+/usr/lib(64)+
[208]913\pause
914\item indiqués dans \verb+/etc/ld.so.conf+
[201]915\end{itemize}
916\end{block}
[208]917\pause
918\vfill
[201]919\begin{exampleblock}{ldd}
920\begin{small}
[199]921\begin{verbatim}
[201]922[olivier@andromede unix]$ ldd /bin/rm
923        linux-gate.so.1 =(0xffffe000)
924        libc.so.6 => /lib/i686/libc.so.6 (0xb7ee3000)
925        /lib/ld-linux.so.2 (0xb8064000)
[199]926\end{verbatim}
[201]927\end{small}
[199]928\end{exampleblock}
[208]929\pause
930\vfill
[201]931\begin{alertblock}{linux-gate.so.1}
932Code injecté directement par le kernel, ignorez le !
933\end{alertblock}
[199]934\end{frame}
[198]935
[201]936\begin{frame}[fragile]
937\frametitle{l'exemple: la librairie}
938\begin{exampleblock}{libsmall.h}
939\small
940\listinginput[1]{1}{libsmall.h}
941\end{exampleblock}
942\begin{exampleblock}{libsmall.c}
943\small
944\listinginput[1]{1}{libsmall.c}
945\end{exampleblock}
[208]946\pause
[201]947\vfill
948\begin{block}{la version statique}
949\begin{verbatim}
950gcc -c libsmall.o libsmall.c
951ar rcs libsmall.a libsmall.o
952\end{verbatim}
953\end{block}
[208]954\pause
[201]955\begin{block}{la version dynamique}
956\begin{verbatim}
957gcc -c libsmall.o libsmall.c
958gcc -shared -o libsmall.so libsmall.o
959\end{verbatim}
960\end{block}
961\end{frame}
962
963\begin{frame}[fragile]
[208]964\frametitle{l'exemple: le programme}
[201]965\begin{exampleblock}{small.c}
966\small
967\listinginput[1]{1}{small.c}
968\end{exampleblock}
[208]969\pause
[201]970\vfill
971\begin{block}{la version statique}
972\begin{verbatim}
973gcc -c -o small.o small.c
974gcc -o small.static libsmall.a small.o
975\end{verbatim}
976\end{block}
[208]977\pause
[201]978\begin{block}{la version dynamique}
979\begin{verbatim}
980gcc -c -o small.o libsmall.c
981gcc -o small.dyn -L. -lsmall small.o
982    -Wl,-rpath=$(pwd) # $(PWD) pour le chemin courant
983\end{verbatim}
984\end{block}
985\end{frame}
986
987\begin{frame}
988\frametitle{Et puis il y a \emph{dlopen()}}
989
990\begin{alertblock}{le mode standard dynamique}
991Un code lié à une bibliothèque ne fonctionnera jamais sans.
992\end{alertblock}
[208]993\pause
994\vfill
[201]995\begin{block}{les deux clefs:}
996\begin{itemize}
997\item \emph{dlopen()} charge une bibliotèque
998\item \emph{dlsym()} va chercher les fonctions
999\end{itemize}
1000\end{block}
[208]1001\pause
1002\vfill
[201]1003\begin{block}{exemple d'utilisation}
1004\begin{itemize}
1005\item pour étendre les fonctionnalités d'une appli (perl, python, apache)
1006\item pour eviter de charger du code inutilement
1007\end{itemize}
1008\end{block}
1009\end{frame}
1010
[198]1011\section{X11}
1012
[201]1013\begin{frame}
1014\frametitle{Histoire}
1015\begin{block}{}
1016\begin{itemize}
1017\item \textbf{1984 création par le MIT}
1018\item X est le successeur de W (sur system V)
1019\item 1985 ajout de la couleur (DEC VAXstation)
1020\item 1986 X10R2, X10R3, X10R4
1021\item 1987 X11, 1988 X11R2, 1991 X11R5
1022\item \textbf{1992 création de XFree86 (utilisé par Linux)}
1023\item 1999 X11R6.5
1024\item 2004 Xorg se sépare de XFree86 (pb de license)
1025\item \textbf{depuis tout les UNIX libres utilisent Xorg}
1026\end{itemize}
1027\end{block}
[208]1028\pause
1029\vfill
[201]1030\begin{alertblock}{X ça pue !}
1031Oui, c'est le prix de la compatibilité\ldots
1032\end{alertblock}
1033\end{frame}
1034
1035\begin{frame}
1036\frametitle{X: serveur d'affichage}
1037\begin{columns}
1038\column{2in}
1039\begin{block}{}
1040\begin{itemize}
1041\item gestionnaire de matériel
1042\begin{itemize}
1043\item carte graphique
1044\item ecran
1045\item clavier
1046\item souris (et autres rongeurs)
1047\end{itemize}
[208]1048\pause
[201]1049\item protocol d'affichage (reseau)
[208]1050\pause
[201]1051\item \textbf{serveur d'affichage}
1052\end{itemize}
1053\end{block}
1054\column{2.5in}
[208]1055\pause
1056\begin{exampleblock}{le serveur X, c'est ça:}
[201]1057\centering
1058\includegraphics[height=40mm]{x}
1059\end{exampleblock}
1060\end{columns}
1061\end{frame}
1062
1063\begin{frame}
1064\frametitle{Applications X11}
1065\begin{columns}
1066\column{2.5in}
1067\begin{block}{}
1068Une application X11 se connecte au serveur X,
1069et demande un affichage.
1070\end{block}
1071\column{2in}
[208]1072\pause
[201]1073\begin{exampleblock}{}
1074\centering
1075\includegraphics[height=30mm]{x-mplayer-capcv}
1076\end{exampleblock}
1077\end{columns}
1078\pause
1079\vfill
1080\begin{columns}
1081\column{2.5in}
1082\begin{block}{le Window Manager}
1083\begin{itemize}
1084\item application X11
[208]1085\item il créé les fenetres
1086\item fourni un menu (éventuellement)
[201]1087\end{itemize}
1088\end{block}
1089\begin{alertblock}{}
1090KDE, GNOME, XFCE: envirronements de bureau
1091\end{alertblock}
1092\column{2in}
[208]1093\pause
[201]1094\begin{exampleblock}{}
1095\centering
1096\includegraphics[height=30mm]{x-mplayer-capcv-twm}
1097\end{exampleblock}
1098\end{columns}
1099\end{frame}
1100
1101\begin{frame}
1102\frametitle{X11: résumé}
1103\begin{exampleblock}{}
1104\centering
1105\includegraphics[height=60mm]{x-resume}
1106\end{exampleblock}
1107\end{frame}
1108
[208]1109\section*{Fin}
1110
1111\begin{frame}{Des questions}
1112\center{
1113\hfill
1114\includegraphics{150px-Tux}
1115\hfill
1116}
1117\end{frame}
1118
[191]1119\end{document}
Note: See TracBrowser for help on using the repository browser.