source: tags/unix/20081113/unix.tex @ 216

Last change on this file since 216 was 215, checked in by nanardon, 15 years ago
  • typo
File size: 25.1 KB
Line 
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
50\section{Préambule}
51
52\subsection{L'Ordinateur}
53
54\begin{frame}
55\frametitle{Principaux composants}
56\begin{columns}[c]
57\column{2in}
58\begin{exampleblock}{ASUS AV7333}
59\centering
60\includegraphics[height=40mm]{asus_mb}
61\end{exampleblock}
62\column{2.5in}
63\begin{block}{}
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}
73\pause
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}
82\end{block}
83\end{columns}
84\end{frame}
85
86\begin{frame}[fragile]
87\frametitle{Fonctionnement général}
88\begin{block}{Roles de chacun}
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}
95\pause
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}
101\pause
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}
108\end{block}
109\end{frame}
110
111\subsection{LES UNIX}
112
113\begin{frame}
114\frametitle{la grande famille des UNIX}
115\begin{block}{Définition \href{http://fr.wikipedia.org/wiki/UNIX}{Wikipédia}}
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.}
120\end{block}
121\pause
122\vfill
123
124\begin{block}{Les grandes lignes:}
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}
132\end{block}
133\end{frame}
134
135\begin{frame}
136\frametitle{Vite une Norme !}
137\begin{block}{Exemples d'UNIX:}
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}
148\end{block}
149\vfill
150\pause
151\begin{block}{Norme POSIX:}
152standard de fonctionnement et commandes (IEEE).
153\end{block}
154\end{frame}
155
156\subsection{GNU/Linux}
157
158\begin{frame}
159\frametitle{GNU/Linux}
160\begin{block}{Contenu du système}
161\begin{itemize}
162\item Linux: le noyau lui même (\href{http://www.kernel.org}{kernel.org})
163\item des applis éparpillées sur internet
164\end{itemize}
165\end{block}
166\pause
167\begin{block}{Les distributions}
168\textbf{Ensemble cohérent noyau/applications}
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}
181\frametitle{De l'ordinateur à l'utilisateur}
182\begin{columns}[c]
183\column{2in}
184\centering
185\includegraphics[height=40mm]{process}
186\column{2.5in}
187\begin{block}{Rôle du kernel}
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
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\\
217\verb+/sbin+, \verb+/usr/sbin+&idem, réservés à 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
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+/+
272\item plusieurs \verb+/+ n'en font qu'un
273\item la longueur maximale d'un chemin est de 1024 octets (POSIX)
274\item tous les caractères sont permis sauf \verb+/+ et \emph{NULL}
275\end{itemize}
276\end{block}
277\vfill
278\begin{alertblock}{On évitera cependant}
279\begin{itemize}
280\item l'espace (qu'il faut échaper sur la ligne de commande)
281\item \verb+-+ (surtout en premier, option en ligne de commande)
282\item ce qui ne se tape pas au clavier
283\item les accents (problème d'encodage)
284\end{itemize}
285\end{alertblock}
286\end{frame}
287
288\begin{frame}[fragile]
289\frametitle{les types de fichiers}
290\begin{exampleblock}{ls -l}
291- \emph{rw-r--r-- 1 olivier olivier 3049 17:30 unix2.tex}
292\end{exampleblock}
293
294\begin{block}{les différents types}
295\begin{itemize}
296\item les simples fichiers (-)
297\item les répertoires (d)
298\pause
299\item les liens symboliques (l)
300\pause
301\item les fichiers de périphérique (c ou b)
302\pause
303\item les fifo (tubes nommés, p)
304\pause
305\item les sockets (=)
306\end{itemize}
307\end{block}
308\end{frame}
309
310\begin{frame}[fragile]
311\frametitle{. et ..}
312\begin{block}{chaque répertoire contient:}
313\begin{itemize}
314\item \verb+.+ le répertoire lui même
315\item \verb+..+ son répertoire parent
316\end{itemize}
317\end{block}
318\vfill
319\pause
320\begin{alertblock}{trop de ..}
321\verb+/..+ pointe sur \verb+/+
322
323\begin{verbatim}
324$ ls ../../../../../../etc/passwd
325../../../../../../etc/passwd
326\end{verbatim}
327
328On rebondit sur \verb+/+ et on redescend dans \verb+/etc/passwd+.
329\end{alertblock}
330\end{frame}
331
332\begin{frame}[fragile]
333\frametitle{L'inode}
334
335\begin{exampleblock}{Le fichier est matérialisé par une inode}
336{\small\begin{verbatim}
337[olivier@andromede unix]$ ls -li unix.tex
3386160386 -rw-r--r-- 1 olivier olivier 3049 17:30 unix.tex
339\end{verbatim}
340}
341\end{exampleblock}
342
343\begin{block}{L'inode contient}
344\begin{itemize}
345\item un numéro (6160386)
346\item des métadata
347\begin{itemize}
348\item taille (3049)
349\item propriétaires / droits d'accès
350\item dates: d'accès (atime), création (ctime), modification (mtime)
351\end{itemize}
352\item éventuellement un contenu
353\end{itemize}
354\end{block}
355\pause
356\begin{alertblock}{}
357Créer un fichier créer l'inode\\
358Effacer un fichier efface l'inode (si plus référencée)
359\end{alertblock}
360\end{frame}
361
362\begin{frame}[fragile]
363\begin{alertblock}{quand ctime dépasse mtime}
364Copie en préservant les métadata:
365{\small\begin{verbatim}
366[olivier@andromede unix]$ cp -a unix.tex unix2.tex
367\end{verbatim}
368}
369\pause
370Le fichier vient d'être créé:
371{\small\begin{verbatim}
372[olivier@andromede unix]$ ls -l --time=c unix2.tex
373-rw-r--r-- 1 olivier olivier 3049 18:47 unix2.tex
374\end{verbatim}
375}
376\pause
377Pourtant la date de modification est antérieur:
378{\small\begin{verbatim}
379[olivier@andromede unix]$ ls -l  unix2.tex
380-rw-r--r-- 1 olivier olivier 3049 17:30 unix2.tex
381\end{verbatim}
382}
383\end{alertblock}
384\end{frame}
385
386\begin{frame}[fragile]
387\frametitle{existence d'un fichier}
388\begin{block}{un fichier existe tant que}
389\begin{itemize}
390\item l'inode est référencée par un nom (lien hard)
391\item l'inode est ouverte
392\end{itemize}
393\end{block}
394\pause
395\vfill
396\begin{exampleblock}{liens hard}
397{\small\begin{verbatim}
398[olivier@andromede unix]$ ln fichier1 fichier2
399[olivier@andromede unix]$ ls -li fichier*
4006160393 -rw-r--r-- 2 olivier olivier 1101 19:54 fichier1
4016160393 -rw-r--r-- 2 olivier olivier 1101 19:54 fichier2
402[olivier@andromede unix]$ rm -f fichier1
403[olivier@andromede unix]$ ls -li fichier*
4046160393 -rw-r--r-- 1 olivier olivier 1101 19:54 fichier2
405\end{verbatim}
406}
407\end{exampleblock}
408\end{frame}
409
410\begin{frame}[fragile]
411\begin{exampleblock}{deleteopen.pl}
412\frametitle{existance d'un fichier}
413\listinginput[2]{1}{deleteopen.pl}
414\end{exampleblock}
415\pause
416\begin{block}{Conséquences:}
417\begin{itemize}
418\item le fichier n'est accessible que par l'application
419\item si l'application quitte: l'espace disque est récupéré
420\item la fermeture du descripteur entraine l'effacement du fichier
421\end{itemize}
422\pause
423{\small\begin{verbatim}
424perl 23536 ol 3w REG  8,7  0  49065 /tmp/opened (deleted)
425\end{verbatim}
426}
427Utile pour les fichiers temporaires.
428\end{block}
429\end{frame}
430
431\begin{frame}[fragile]
432\frametitle{Fichiers temporaires}
433\begin{block}{Un fichier qu'on ne va pas garder, mais:}
434\begin{itemize}
435\item il ne doit pas exister
436\pause
437\item nom aléatoire (écrasement basé sur un lien symbolique)
438\pause
439\item le placer au bon endroit
440\end{itemize}
441\pause
442\vfill
443\textbf{en pratique}
444\begin{itemize}
445\item shell: mktemp
446\item C: mkstemp
447\item Perl: module File::Temp
448\end{itemize}
449\end{block}
450\pause
451\vfill
452\begin{exampleblock}{}
453\small
454\listinginput[1]{1}{temp.sh}
455\end{exampleblock}
456\end{frame}
457
458\begin{frame}[fragile]
459\frametitle{les fichiers à trous (sparse files)}
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
465\item le fichier peut être plus gros que le système de fichiers
466\end{itemize}
467\end{block}
468\pause
469\vfill
470\begin{block}{utilisation ?}
471Chaque fois que des données seront allouées à des emplacements dans le fichier:
472\begin{itemize}
473\item disques virtuels
474\item bases de données
475\end{itemize}
476\end{block}
477\end{frame}
478
479\begin{frame}[fragile]
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]
494\frametitle{Liens symboliques}
495\begin{block}{Fichier qui pointe sur un autre:}
496\begin{itemize}
497\item gérés le système
498\item il ne contient que le nom de l'élément pointé
499\begin{itemize}
500\pause
501\item l'élément pointer peut être n'importe quoi
502\item l'élément peut ne pas existé (lien cassé)
503\end{itemize}
504\pause
505\item les actions s'appliquent à l'élément pointé sauf:
506\begin{itemize}
507\item ls/rm
508\item les appels systèmes prévus
509\end{itemize}
510\end{itemize}
511\end{block}
512\pause
513\begin{exampleblock}{exemple}
514\tiny
515\begin{verbatim}
516$ ln -s  fichier lien
517$ ls -l lien
518lrwxrwxrwx 1 olivier olivier 7 19:13 lien -> fichier
519$ ls -l lien fichier
520ls: ne peut accéder fichier: Aucun fichier ou dossier de ce type
521lrwxrwxrwx 1 olivier olivier 7 19:13 lien -> fichier
522$ echo 'coucou' > lien
523$ ls -l lien fichier
524-rw-rw-r-- 1 olivier olivier 7 19:14 fichier
525lrwxrwxrwx 1 olivier olivier 7 19:13 lien -> fichier
526\end{verbatim}
527\end{exampleblock}
528\end{frame}
529
530\begin{frame}[fragile]
531\frametitle{Fichier de périphérique}
532\begin{block}{2 types}
533\begin{itemize}
534\item block (b)
535\item caractères (c)
536\end{itemize}
537\end{block}
538\pause
539\begin{exampleblock}{Tout est fichier}
540\begin{verbatim}
541brw-rw---- 1 nanardon cdwriter 11, 0 12:26 /dev/sr0
542\end{verbatim}
543
544C'est le premier lecteur CDROM SCSI (SATA en réalité)
545
546\pause
547Je peux le lire comme un fichier:
548\begin{verbatim}
549$ dd if=/dev/sr0 bs=1024 count=20 | wc
55020+0 enregistrements lus
55120+0 enregistrements écrits
55220480 octets (20 kB) copiés, 0,803619 s, 25,5 kB/s
553      0       0   20480
554\end{verbatim}
555\end{exampleblock}
556\end{frame}
557
558\begin{frame}[fragile]
559\frametitle{les fifos}
560\begin{exampleblock}{Première console:}
561\begin{verbatim}
562$ mkfifo /tmp/fifo
563$ cat /etc/passwd > /tmp/fifo
564\end{verbatim}
565\end{exampleblock}
566\pause
567\vfill
568\begin{exampleblock}{Deuxième console:}
569\begin{verbatim}
570$ grep root < /tmp/fifo
571root:x:0:0:root:/root:/bin/bash
572\end{verbatim}
573\end{exampleblock}
574\pause
575\vfill
576\begin{block}{Cet exemple simple revient à}
577\begin{verbatim}
578cat /etc/passwd | grep root
579\end{verbatim}
580\end{block}
581\end{frame}
582
583\section{Les processus}
584
585\subsection{le temps CPU}
586
587\begin{frame}
588\frametitle{scheduler préemptif}
589\begin{alertblock}{préemptif ?}
590Seul le noyau décide du temps CPU aloué !
591\end{alertblock}
592\pause
593\vfill
594\begin{block}{Le scheduler}
595Le scheduler est appelé à interval régulier (plusieurs centaintes de fois par seconde) pour donner du temps
596CPU à l'application sauf si:
597\begin{itemize}
598\item l'application ne demande pas de temps CPU (sleep)
599\item est en attente d'une réponse matériel (IO wait)
600\end{itemize}
601Le temps CPU est donné en fonction de la priorité
602\end{block}
603\end{frame}
604
605\subsection{La ram}
606
607\begin{frame}
608\frametitle{La RAM}
609\begin{block}{le contenu}
610\begin{itemize}
611\item Mémoire vérouillée:
612\begin{itemize}
613\item le BIOS (programme interne du PC)
614\item mémoire du matériel
615\item le code et données du noyau
616\end{itemize}
617\pause
618\item Mémoire haute (swappable):
619\begin{itemize}
620\item code des applications
621\item données des applications
622\end{itemize}
623\pause
624\item Mémoire vive libre:
625\begin{itemize}
626\item buffers
627\item cache (disque)
628\end{itemize}
629\pause
630\item swap (sur disque, très lente)
631\end{itemize}
632\end{block}
633\end{frame}
634
635\begin{frame}
636\frametitle{Gestion}
637
638\begin{block}{la swap ?}
639Extension sur disque de la mémoire.
640\pause
641
642Elle sert:
643\begin{itemize}
644\item quand la mémoire vive est pleine
645\item pour mettre de coté des données peu utilisées
646\end{itemize}
647
648Mémoire disponible = mémoire vive + swap
649\end{block}
650\pause
651\vfill
652\begin{alertblock}{}
653Un système qui swap \textbf{un peu} n'est pas surchargé !
654\end{alertblock}
655\vfill
656\pause
657\begin{block}{La Ram est virtuelle}
658De par les aller retour RAM-SWAP, et la fragmentation, le système virutalize
659les adresses allouées.
660\end{block}
661\end{frame}
662
663\begin{frame}[fragile]
664\frametitle{Allocation par segment}
665\begin{exampleblock}{Un très mauvais code}
666\listinginput{1}{nosegfault.c}
667Et ça ne plante pas !
668\end{exampleblock}
669\pause
670\vfill
671\begin{alertblock}{Explication}
672Le système n'alloue pas des octets mais des segments
673
674Le système n'intervient que si l'application sort du segment !
675\end{alertblock}
676\end{frame}
677
678\begin{frame}[fragile]
679\frametitle{Mémoire à crédit}
680
681\begin{exampleblock}{malloc.c}
682\small
683\listinginput{1}{malloc.c}
684\end{exampleblock}
685\begin{columns}
686\column{2.5in}
687\pause
688\begin{block}{sortie formatée}
689\begin{tabular}{|c|c|c|}
690\hline
691Mem virtuel&Mem résidente\\
692\hline
693978116&332\\
694\hline
695\hline
696978116&976888\\
697\hline
698\end{tabular}
699\end{block}
700\column{2in}
701\pause
702\begin{block}{malloc est une promesse}
703\begin{itemize}
704\item malloc promet la ram
705\item la ram n'est allouée qu'à l'écriture
706\end{itemize}
707\end{block}
708\end{columns}
709
710\end{frame}
711
712\subsection{plusieurs processus: sur 1 ordinateur}
713
714\begin{frame}
715\frametitle{fork()}
716\begin{block}{la fourchette}
717Permet à un processus de se dupliquer, et de donner naissance à un processus "fils" \textbf{indépendant}\\
718
719\centering
720\includegraphics[height=15mm]{fork}
721\end{block}
722\pause
723\begin{columns}
724\column{2.5in}
725\begin{block}{motivation}
726\begin{itemize}
727\item excution parallèle
728\item perte de privilège de fils
729\item préserver l'environnement du père
730\item serveur: remettre le père en attente
731\end{itemize}
732\end{block}
733\pause
734\column{2in}
735\begin{block}{pros \& cons}
736\begin{itemize}
737\item existe sur tout les UNIX (glibc)
738\item simple
739\item pas de communication
740\end{itemize}
741\end{block}
742\end{columns}
743\end{frame}
744
745\begin{frame}[fragile]
746\frametitle{fork et la RAM}
747\begin{columns}
748\column{2in}
749\tiny
750\begin{exampleblock}{fork.c}
751\listinginput[5]{1}{fork.c}
752\end{exampleblock}
753\column{2.5in}
754\pause
755\begin{block}{Ram utilisée}
756\begin{tabular}{|l|c|}
757\hline
758&mem utilisée\\
759\hline
760\hline
761Avant allocation&1687848\\
762\hline
763Après allocation&2664948\\
764\hline
765Après fork()&2666332\\
766\hline
767\end{tabular}
768\end{block}
769\end{columns}
770\end{frame}
771
772\begin{frame}[fragile]
773\frametitle{les threads}
774\begin{block}{Sépare un processus en deux}
775
776\begin{itemize}
777\item partage de la mémoire
778\begin{itemize}
779\item tout n'est pas forcément partagé
780\item gestion de lock pour les écriture
781\end{itemize}
782\item le fonctionnement ressemble à fork mais
783\begin{itemize}
784\item programmation et gestion différentes
785\item complexe mais éfficace
786\end{itemize}
787\end{itemize}
788\end{block}
789\pause
790\begin{alertblock}{Linux: libpthread (glibc) POSIX}
791Je ne garantie pas que tout les UNIX fournissent le support des threads
792\end{alertblock}
793\pause
794\begin{exampleblock}{}
795\small
796\begin{verbatim}
797[olivier@andromede unix]$ ps aux | grep transcode
798PID %CPU %MEM    VSZ   RSS  TIME  COMMAND
7993477  124  1.3 119972 41344 36:32 transcode
800\end{verbatim}
801\end{exampleblock}
802\end{frame}
803
804\subsection{Communication inter-processus}
805
806\begin{frame}[fragile]
807\frametitle{Pipe}
808\begin{block}{points à retenir}
809\begin{itemize}
810\item flux de donnée continu unique
811\item sens unique
812\item bloquants
813\end{itemize}
814\end{block}
815\pause
816\vfill
817\begin{block}{Utilisation}
818\begin{itemize}
819\item \verb+fork()+/\verb+pipe()+ (\verb+p1 | p2+)
820\item avec tube nommé (\verb+open++\verb+write+ / \verb+open++\verb+read+)
821\end{itemize}
822\end{block}
823\end{frame}
824
825\begin{frame}
826\frametitle{IPC/SHM, la boite aux lettres système}
827\begin{block}{fonctions}
828\begin{itemize}
829\item file d'attente de message
830\item zone de mémoire partagée
831\end{itemize}
832\end{block}
833\pause
834\vfill
835\begin{block}{+ et -}
836\begin{itemize}
837\item relativement simple
838\item très performant
839\item taille allouable limitée (protection du kernel, configurable)
840\item protection des données par gestion de droit
841\end{itemize}
842\end{block}
843\pause
844\vfill
845\begin{block}{La doc (pour le C)}
846\textbf{man}
847shmat, shmdt, shmop, shm\_overview,
848shmctl, shmget, shm\_open, shm\_unlink
849\end{block}
850\end{frame}
851
852\begin{frame}
853\frametitle{Socket, Client/Serveur}
854
855\begin{block}{principe}
856\begin{itemize}
857\item un serveur attends une connection
858\item un client se connecte
859\item les deux échangent des données
860\end{itemize}
861\end{block}
862\pause
863\vfill
864\begin{block}{modes}
865\begin{itemize}
866\item écoute sur le réseau
867\begin{itemize}
868\item definir un port d'écoute
869\item savoir quelle(s) machine(s) contacter
870\item communication inter-machines
871\item problème de latence
872\end{itemize}
873\pause
874\item écoute sur un socket (fichier de type \ldots)
875\begin{itemize}
876\item communication locale
877\item restriction d'accès par gestion de droit
878\end{itemize}
879\end{itemize}
880\end{block}
881\end{frame}
882
883\section{Executables: format}
884
885\subsection{Code exécutable}
886
887\begin{frame}
888\frametitle{la logique}
889\begin{columns}
890\column{2in}
891\includegraphics[height=40mm]{compil}
892\column{2.5in}
893\begin{block}{un quoi ?}
894\begin{itemize}
895\item données formatées (format ELF ces jours-ci)
896\pause
897\item executable (ou presque) par le processeur
898\pause
899\item contient des objets:
900\begin{itemize}
901\item des variables (globales)
902\item des fonctions
903\item d'autres objets à trouver
904\end{itemize}
905\end{itemize}
906\end{block}
907\end{columns}
908\end{frame}
909
910\subsection{Bibliothèques}
911
912\begin{frame}
913\frametitle{Le standard}
914\begin{block}{Normallement un programme fournit}
915\begin{itemize}
916\item foo.h: l'entête pour la compilation
917\pause
918\item libfoo.so.1: la librairie utilisée, versionnée
919\pause
920\item libfoo.so: (lien) pour l'éditeur de lien
921\pause
922\item libfoo.a: la version statique
923\end{itemize}
924\end{block}
925\pause
926\vfill
927\begin{block}{le point sur les dynamiques}
928\begin{itemize}
929\item avantages:
930\begin{itemize}
931\item les maj sont répercutés sans recompilation des applis
932\item factorisation du code dans la RAM et sur le disque
933\end{itemize}
934\pause
935\item inconvénients
936\begin{itemize}
937\item doit être disponible lors de l'éxecution
938\end{itemize}
939\end{itemize}
940\end{block}
941\end{frame}
942
943\begin{frame}[fragile]
944\frametitle{Trouver les dynamiques}
945\begin{block}{la recherche}
946\begin{itemize}
947\item codé dans l'executable (\emph{rpath})
948\pause
949\item codé en dur: \verb+/lib(64)+, \verb+/usr/lib(64)+
950\pause
951\item indiqués dans \verb+/etc/ld.so.conf+
952\end{itemize}
953\end{block}
954\pause
955\vfill
956\begin{exampleblock}{ldd}
957\begin{small}
958\begin{verbatim}
959[olivier@andromede unix]$ ldd /bin/rm
960        linux-gate.so.1 =>  (0xffffe000)
961        libc.so.6 => /lib/i686/libc.so.6 (0xb7ee3000)
962        /lib/ld-linux.so.2 (0xb8064000)
963\end{verbatim}
964\end{small}
965\end{exampleblock}
966\pause
967\vfill
968\begin{alertblock}{linux-gate.so.1}
969Code injecté directement par le kernel, ignorez le !
970\end{alertblock}
971\end{frame}
972
973\begin{frame}[fragile]
974\frametitle{l'exemple: la librairie}
975\begin{exampleblock}{libsmall.h}
976\small
977\listinginput[1]{1}{libsmall.h}
978\end{exampleblock}
979\begin{exampleblock}{libsmall.c}
980\small
981\listinginput[1]{1}{libsmall.c}
982\end{exampleblock}
983\pause
984\vfill
985\begin{block}{la version statique}
986\begin{verbatim}
987gcc -c libsmall.o libsmall.c
988ar rcs libsmall.a libsmall.o
989\end{verbatim}
990\end{block}
991\pause
992\begin{block}{la version dynamique}
993\begin{verbatim}
994gcc -c libsmall.o libsmall.c
995gcc -shared -o libsmall.so libsmall.o
996\end{verbatim}
997\end{block}
998\end{frame}
999
1000\begin{frame}[fragile]
1001\frametitle{l'exemple: le programme}
1002\begin{exampleblock}{small.c}
1003\small
1004\listinginput[1]{1}{small.c}
1005\end{exampleblock}
1006\pause
1007\vfill
1008\begin{block}{la version statique}
1009\begin{verbatim}
1010gcc -c -o small.o small.c
1011gcc -o small.static libsmall.a small.o
1012\end{verbatim}
1013\end{block}
1014\pause
1015\begin{block}{la version dynamique}
1016\begin{verbatim}
1017gcc -c -o small.o libsmall.c
1018gcc -o small.dyn -L. -lsmall small.o
1019    -Wl,-rpath=$(pwd) # $(PWD) pour le chemin courant
1020\end{verbatim}
1021\end{block}
1022\end{frame}
1023
1024\begin{frame}
1025\frametitle{Et puis il y a \emph{dlopen()}}
1026
1027\begin{alertblock}{le mode standard dynamique}
1028Un code lié à une bibliothèque ne fonctionnera jamais sans.
1029\end{alertblock}
1030\pause
1031\vfill
1032\begin{block}{les deux clefs:}
1033\begin{itemize}
1034\item \emph{dlopen()} charge une bibliotèque
1035\item \emph{dlsym()} va chercher les fonctions
1036\end{itemize}
1037\end{block}
1038\pause
1039\vfill
1040\begin{block}{exemple d'utilisation}
1041\begin{itemize}
1042\item pour étendre les fonctionnalités d'une appli (perl, python, apache)
1043\item pour eviter de charger du code inutilement
1044\end{itemize}
1045\end{block}
1046\end{frame}
1047
1048\section{X11}
1049
1050\begin{frame}
1051\frametitle{Histoire}
1052\begin{block}{}
1053\begin{itemize}
1054\item \textbf{1984 création par le MIT}
1055\item X est le successeur de W (sur system V)
1056\item 1985 ajout de la couleur (DEC VAXstation)
1057\item 1986 X10R2, X10R3, X10R4
1058\item 1987 X11, 1988 X11R2, 1991 X11R5
1059\item \textbf{1992 création de XFree86 (utilisé par Linux)}
1060\item 1999 X11R6.5
1061\item 2004 Xorg se sépare de XFree86 (pb de licence)
1062\item \textbf{depuis tout les UNIX libres utilisent Xorg}
1063\end{itemize}
1064\end{block}
1065\pause
1066\vfill
1067\begin{alertblock}{X ça pue !}
1068Oui, c'est le prix de la compatibilité\ldots
1069\end{alertblock}
1070\end{frame}
1071
1072\begin{frame}
1073\frametitle{X: serveur d'affichage}
1074\begin{columns}
1075\column{2in}
1076\begin{block}{}
1077\begin{itemize}
1078\item gestionnaire de matériel
1079\begin{itemize}
1080\item carte graphique
1081\item ecran
1082\item clavier
1083\item souris (et autres rongeurs)
1084\end{itemize}
1085\pause
1086\item protocol d'affichage (reseau)
1087\pause
1088\item \textbf{serveur d'affichage}
1089\end{itemize}
1090\end{block}
1091\column{2.5in}
1092\pause
1093\begin{exampleblock}{le serveur X, c'est ça:}
1094\centering
1095\includegraphics[height=40mm]{x}
1096\end{exampleblock}
1097\end{columns}
1098\end{frame}
1099
1100\begin{frame}
1101\frametitle{Applications X11}
1102\begin{columns}
1103\column{2.5in}
1104\begin{block}{}
1105Une application X11 se connecte au serveur X,
1106et demande un affichage.
1107\end{block}
1108\column{2in}
1109\pause
1110\begin{exampleblock}{}
1111\centering
1112\includegraphics[height=30mm]{x-mplayer-capcv}
1113\end{exampleblock}
1114\end{columns}
1115\pause
1116\vfill
1117\begin{columns}
1118\column{2.5in}
1119\begin{block}{le Window Manager}
1120\begin{itemize}
1121\item application X11
1122\item il créé les fenetres
1123\item fourni un menu (éventuellement)
1124\end{itemize}
1125\end{block}
1126\begin{alertblock}{}
1127KDE, GNOME, XFCE: envirronements de bureau
1128\end{alertblock}
1129\column{2in}
1130\pause
1131\begin{exampleblock}{}
1132\centering
1133\includegraphics[height=30mm]{x-mplayer-capcv-twm}
1134\end{exampleblock}
1135\end{columns}
1136\end{frame}
1137
1138\begin{frame}
1139\frametitle{X11: résumé}
1140\begin{exampleblock}{}
1141\centering
1142\includegraphics[height=60mm]{x-resume}
1143\end{exampleblock}
1144\end{frame}
1145
1146\section*{Fin}
1147
1148\begin{frame}{Des questions}
1149\center{
1150\hfill
1151\includegraphics{150px-Tux}
1152\hfill
1153}
1154\end{frame}
1155
1156\end{document}
Note: See TracBrowser for help on using the repository browser.