Index: /trunk/unix/Makefile
===================================================================
--- /trunk/unix/Makefile	(revision 191)
+++ /trunk/unix/Makefile	(revision 191)
@@ -0,0 +1,72 @@
+# $Id: Makefile 187 2008-09-05 02:43:56Z nanardon $
+
+.SUFFIXES: .dvi .pdf .eps .fig .png .jpg
+
+# unix
+
+unix_TEX = \
+    unix.tex
+
+unix_INCLUDES = \
+
+unix_EXAMPLES = \
+	deleteopen.pl \
+	nosegfault.c \
+
+unix_IMAGESJPG= \
+
+unix_IMAGESPNG= \
+	asus_mb.png \
+	process.png \
+
+unix_FIGURES= \
+
+unix_IMAGES= $(unix_IMAGESJPG) $(unix_IMAGESPNG)
+
+unix_DEPS = Makefile \
+	$(unix_INCLUDES) \
+	$(unix_EXAMPLES) \
+	$(unix_FIGURES) \
+	$(unix_IMAGES) \
+
+unix_DVI = $(unix_TEX:.tex=.dvi)
+unix_PDF = $(unix_TEX:.tex=.pdf)
+unix_EPS = $(unix_FIGEPS) $(unix_PNGEPS) $(unix_JPGEPS)
+unix_FIGEPS = $(unix_FIGURES:.fig=.eps) 
+unix_PNGEPS = $(unix_IMAGESPNG:.png=.eps)
+unix_JPGEPS = $(unix_IMAGESJPG:.jpg=.eps)
+
+# Everything
+ALL_PDF = $(unix_PDF)
+ALL_DVI = $(unix_DVI)
+
+all: pdf
+
+pdf: $(ALL_PDF)
+
+dvi: $(ALL_DVI)
+
+unix.pdf: $(unix_TEX) $(unix_DEPS)
+	pdflatex -halt-on-error $< && pdflatex -halt-on-error $< 
+
+unix.dvi: $(unix_TEX) $(unix_DEPS)
+	latex -halt-on-error $< && latex -halt-on-error $< 
+
+%.eps: %.fig
+	fig2dev -L eps  $< $@
+
+%.png: %.dia
+	dia -e $@ $<
+
+.png.eps:
+	convert $< $@
+
+.jpg.eps:
+	convert $< $@
+
+clean:
+	rm -f $(FIGEPS)
+	rm -f $(ALL_DVI)
+	rm -f $(ALL_PDF)
+
+.PHONY: pdf dvi clean all
Index: /trunk/unix/deleteopen.pl
===================================================================
--- /trunk/unix/deleteopen.pl	(revision 191)
+++ /trunk/unix/deleteopen.pl	(revision 191)
@@ -0,0 +1,4 @@
+open(my $handle, '>', '/tmp/opened');
+unlink('/tmp/opened');
+<STDIN>;
+close($handle);
Index: /trunk/unix/nosegfault.c
===================================================================
--- /trunk/unix/nosegfault.c	(revision 191)
+++ /trunk/unix/nosegfault.c	(revision 191)
@@ -0,0 +1,6 @@
+#include <string.h>
+int main(void) {
+    char * cp = malloc(10);
+    char * buf = malloc(1);
+    strncpy(cp, buf, 3);
+}
Index: /trunk/unix/unix.tex
===================================================================
--- /trunk/unix/unix.tex	(revision 191)
+++ /trunk/unix/unix.tex	(revision 191)
@@ -0,0 +1,464 @@
+% $Id: perl.tex 183 2008-09-04 23:55:50Z nanardon $
+\documentclass[notes]{beamer}
+\usepackage[frenchb]{babel}
+\usepackage[T1]{fontenc}
+\usepackage{moreverb}
+\usepackage{graphicx}
+\usepackage{listings}
+\usepackage{color}
+
+\mode<presentation>
+{
+  \definecolor{beamerstructure}{RGB}{143,79,112}
+  \definecolor{sidebackground}{RGB}{230,242,250}
+  \color{beamerstructure}
+  \usetheme[secheader]{Madrid}
+  \usepackage{times}
+  \userightsidebarcolortemplate{\color{sidebackground}}
+  \beamertemplateballitem
+}
+
+\AtBeginSection[]
+{
+\begin{frame}<beamer>
+    \frametitle{Plan}
+    \tableofcontents[currentsection,hideothersubsections]
+\end{frame}
+}
+
+\AtBeginSubsection[]
+{
+\begin{frame}<beamer>
+    \frametitle{}
+    \tableofcontents[sectionstyle=show/hide,subsectionstyle=show/shaded/hide]
+\end{frame}
+}
+
+\title{UNIX/Linux}
+\subtitle{Jouer avec le système}
+\author{Olivier Thauvin}
+\date{\today}
+
+\begin{document}
+
+\frame{\titlepage}
+
+\begin{frame}
+\tableofcontents[hideallsubsections]
+\end{frame}
+
+\section{L'Ordinateur}
+
+\subsection{Anatomie}
+
+\begin{frame}
+\frametitle{Principaux composants}
+\begin{columns}[c]
+\column{2.5in}
+\centering
+\includegraphics[height=40mm]{asus_mb}
+
+\column{2.5in}
+\begin{itemize}
+\item les éléments vitaux (PC)
+\begin{itemize}
+\item \textcolor{red}{CPU}
+\item \textcolor{green}{Mémoire}
+\item \textcolor{blue}{Bus}
+\item clavier
+\item carte graphique
+\end{itemize}
+\item le reste
+\begin{itemize}
+\item mulot et autres rongeurs
+\item disques durs
+\item carte son
+\item \ldots
+\end{itemize}
+\end{itemize}
+\end{columns}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Fonctionnement général}
+\begin{itemize}
+\item \textcolor{red}{CPU} (Central processor unit)
+\begin{itemize}
+\item fait les calculs
+\item presque pas de mémoire (registres)
+\end{itemize}
+\item \textcolor{green}{Mémoire}
+\begin{itemize}
+\item sert à stocker les données
+\item est moins rapide que le CPU (rapport \verb+~+ 1/3)
+\end{itemize}
+\item \textcolor{blue}{Bus}
+\begin{itemize}
+\item sur la carte mère
+\item transporte les données entre les différents composants
+\end{itemize}
+\end{itemize}
+\end{frame}
+
+\section{UNIX}
+
+\subsection{LES UNIX}
+
+\begin{frame}
+\frametitle{la grande famille des UNIX}
+\emph{
+UNIX est le nom d'un système d'exploitation multitâche et multi-utilisateur créé en 1969,
+conceptuellement ouvert et fondé sur une approche par laquelle il offre de nombreux petits
+outils chacun dotés d'une mission spécifique.}
+
+Définition \href{http://fr.wikipedia.org/wiki/UNIX}{Wikipédia}
+\vfill
+
+\textbf{Les grandes lignes:}
+
+\begin{itemize}
+\item mulitâche préemptif
+\item multiutilisateurs (donc gestion de droit)
+\item multisessions
+\item tout est fichier
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{Vite une Norme !}
+\textbf{Exemples d'UNIX:}
+
+\begin{itemize}
+\item GNU/Linux
+\item *BSD (Net, Free, Open, \ldots)
+\item MacOS X (est un BSD, d'Apple)
+\item Digital UNIX (de Digital)
+\item Solaris (de Sun)
+\item AIX (de IBM)
+\item \ldots
+\end{itemize}
+\vfill
+
+\textbf{Norme POSIX:}
+standard de fonctionnement et commandes (IEEE).
+\end{frame}
+
+\begin{frame}
+\frametitle{De l'ordi à l'utilisateur}
+\begin{columns}[c]
+\column{2.5in}
+\centering
+\includegraphics[height=40mm]{process}
+\column{2.5in}
+\begin{block}{Role du kernel}
+\begin{itemize}
+\item gérer le matériel
+\item donner le temps CPU aux applications
+\item vérifier les droits d'accès
+\item assurer l'intégrité du système
+\end{itemize}
+\end{block}
+\end{columns}
+\end{frame}
+
+\section{Les fichiers}
+
+\subsection{Les fichiers}
+
+\begin{frame}[fragile]
+\frametitle{Nom de fichiers}
+
+\begin{block}{Accès aux fichiers}
+\begin{itemize}
+\item le séparateur est \verb+/+
+\item plusieurs \verb+/+ ne font qu'un
+\item la longueur maximal d'un chemin est de 1024 (POSIX)
+\item tout les caractère sont permis sauf \verb+/+ et \emph{NULL}
+\end{itemize}
+\end{block}
+
+\begin{alertblock}{On évitera}
+\begin{itemize}
+\item l'espace
+\item \verb+-+ (surtout en premier, option en ligne de commande)
+\item ce qui ne se tape au clavier
+\item les accents
+\end{itemize}
+\end{alertblock}
+
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{L'inode}
+
+Le fichier est matérialisé par une inode:
+
+{\small\begin{verbatim}
+[olivier@andromede unix]$ ls -li unix.tex
+6160386 -rw-r--r-- 1 olivier olivier 3049 17:30 unix.tex
+\end{verbatim}
+}
+
+\begin{itemize}
+\item un numéro (6160386)
+\item un type
+\item des métadata
+\begin{itemize}
+\item taille (3049)
+\item propriétaires / droits d'accès
+\item date d'accès (access time)
+\item date de création \textbf{de l'inode} (creation time)
+\item date de dernière modification (modification time)
+\item \ldots
+\end{itemize}
+\item éventuellement un contenu
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+\begin{alertblock}{quand ctime dépasse mtime}
+Copie en préservant les métadata:
+{\small\begin{verbatim}
+[olivier@andromede unix]$ cp -a unix.tex unix2.tex
+\end{verbatim}
+}
+Le fichier vient d'être créé:
+{\small\begin{verbatim}
+[olivier@andromede unix]$ ls -l --time=c unix2.tex
+-rw-r--r-- 1 olivier olivier 3049 18:47 unix2.tex
+\end{verbatim}
+}
+Pourtant la date de modification est antérieur:
+{\small\begin{verbatim}
+[olivier@andromede unix]$ ls -l  unix2.tex
+-rw-r--r-- 1 olivier olivier 3049 17:30 unix2.tex
+\end{verbatim}
+}
+\end{alertblock}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{les types de fichiers}
+
+- \emph{rw-r--r-- 1 olivier olivier 3049 17:30 unix2.tex}
+
+\begin{itemize}
+\item les simples fichiers (-)
+\item les répertoires (d)
+\item les liens symboliques (l)
+\item les fichiers de périphérique (c ou b)
+\item les fifo (tubes nommés, p)
+\item les sockets (=)
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{existance d'un fichier}
+\begin{block}{un fichier existe tant que}
+\begin{itemize}
+\item l'inode est référencée par un nom (lien hard)
+\item l'inode est ouverte
+\end{itemize}
+\end{block}
+
+\begin{exampleblock}{liens hard}
+{\small\begin{verbatim}
+[olivier@andromede unix]$ ln fichier1 fichier2
+[olivier@andromede unix]$ ls -li fichier*
+6160393 -rw-r--r-- 2 olivier olivier 1101 19:54 fichier1
+6160393 -rw-r--r-- 2 olivier olivier 1101 19:54 fichier2
+[olivier@andromede unix]$ rm -f fichier1
+[olivier@andromede unix]$ ls -li fichier*
+6160393 -rw-r--r-- 1 olivier olivier 1101 19:54 fichier2
+\end{verbatim}
+}
+\end{exampleblock}
+\end{frame}
+
+\begin{frame}[fragile]
+\begin{exampleblock}{deleteopen.pl}
+\frametitle{existance d'un fichier}
+\listinginput[2]{1}{deleteopen.pl}
+\end{exampleblock}
+
+\begin{block}{}
+\begin{itemize}
+\item le fichier n'est accessible que par l'application
+\item si l'application quitte: l'espace disque est récupéré
+\item la fermeture du descripteur entraine la fin du fichier
+\end{itemize}
+{\small\begin{verbatim}
+perl 23536 ol 3w REG  8,7  0  49065 /tmp/opened (deleted)
+\end{verbatim}
+}
+Utile pour les fichiers temporaires.
+\end{block}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{les fichiers à trous (sparse files)}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Fichier de périphérique}
+\begin{block}{2 types}
+\begin{itemize}
+\item block (b)
+\item caractères (c)
+\end{itemize}
+\end{block}
+
+\begin{exampleblock}{Tout est fichier}
+\begin{verbatim}
+brw-rw---- 1 nanardon cdwriter 11, 0 12:26 /dev/sr0
+\end{verbatim}
+
+C'est le premier lecteur CDROM SCSI (SATA en réalité)
+
+Je peux le lire comme un fichier:
+\begin{verbatim}
+[nanardon@virgo ~]$ dd if=/dev/sr0 bs=1024 count=20 | wc
+20+0 enregistrements lus
+20+0 enregistrements écrits
+20480 octets (20 kB) copiés, 0,803619 s, 25,5 kB/s
+      0       0   20480
+\end{verbatim}
+\end{exampleblock}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{les fifos}
+\begin{exampleblock}{Première console:}
+\begin{verbatim}
+[olivier@andromede unix]$ mkfifo /tmp/fifo
+[olivier@andromede unix]$ cat /etc/passwd > /tmp/fifo
+\end{verbatim}
+\end{exampleblock}
+
+\begin{exampleblock}{Deuxième console:}
+\begin{verbatim}
+[olivier@andromede ~]$ grep root < /tmp/fifo
+root:x:0:0:root:/root:/bin/bash
+\end{verbatim}
+\end{exampleblock}
+
+\begin{block}{Cet exemple simple revient à}
+\begin{verbatim}
+cat /etc/passwd | grep root
+\end{verbatim}
+\end{block}
+\end{frame}
+
+\subsection{Systèmes de fichiers}
+
+\begin{frame}[fragile]
+\frametitle{principe}
+\begin{block}{le montage}
+\begin{itemize}
+\item une méthode d'accès
+\item une structure arborescente
+\item on le fait apparaitre dans un répertoire existant
+\end{itemize}
+\end{block}
+
+\begin{exampleblock}{la commande mount}
+\begin{verbatim}
+[olivier@andromede unix]$ mount
+/dev/sda3 on / type ext3 (rw,noatime)
+/dev/sda8 on /home type ext3 (rw,noatime)
+[...]
+virgo:/home/data on /mnt/disk type nfs (ro,addr=192.168.76.1)
+\end{verbatim}
+\end{exampleblock}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Organisation globale}
+\begin{block}{}
+\begin{tabular}{ll}
+\verb+/etc+&fichiers de configuration\\
+\verb+/bin+, \verb+/usr/bin+&les executables utilisateur\\
+\verb+/sbin+, \verb+/usr/sbin+&idem, pour root\\
+\verb+/lib+, \verb+/usr/lib+&les librairies\\
+\verb+/usr/share+&les données statiques des programmes\\
+\verb+/usr/include+&les fichiers .h (C)\\
+\verb+/var+&les données variables (spool, etc...)\\
+\verb+/tmp+, \verb+/var/tmp+&données temporaires\\
+\verb+/opt+&espace pour les apps. propriétaires\\
+\verb+/proc+, \verb+/sys+&représentation temp réelle du système\\
+\end{tabular}
+\end{block}
+
+\begin{alertblock}{le FHS}
+Le Filesystem Hierarchy Standard normalise l'empacement des fichiers
+\end{alertblock}
+\end{frame}
+
+
+\section{les processus}
+
+\subsection{le temps CPU}
+
+\begin{frame}
+\frametitle{scheduler préemptif}
+\begin{alertblock}{préemptif ?}
+Seul le noyau décide du temps CPU alouer !
+\end{alertblock}
+
+\begin{block}{Le scheduler}
+Le scheduler est appelé à interval régulier (plusieurs centaintes de fois par seconde) pour donner du temps
+CPU à l'application sauf si:
+\begin{itemize}
+\item l'application ne demande pas de temps CPU (sleep)
+\item est en attente d'une réponse matériel (IO wait)
+\end{itemize}
+Le temps CPU est donné en fonction de la priorité
+\end{block}
+\end{frame}
+
+\subsection{la ram}
+
+\begin{frame}
+\frametitle{La RAM}
+\begin{block}{le contenu}
+\begin{itemize}
+\item Mémoire vérouillée:
+\begin{itemize}
+\item le BIOS (programme interne du PC)
+\item mémoire du matériel
+\item le code et données du noyau
+\end{itemize}
+\item Mémoire haute (swappable):
+\begin{itemize}
+\item code des applications
+\item données des applications
+\end{itemize}
+\item Mémoire vive libre:
+\begin{itemize}
+\item buffers
+\item cache (disque)
+\end{itemize}
+\item swap (sur disque, très lente)
+\end{itemize}
+\end{block}
+
+\begin{alertblock}{}
+Un système qui swap un peu n'est pas surchargé !
+\end{alertblock}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Allocation par segment}
+\begin{exampleblock}{Un très mauvais code}
+\listinginput{1}{nosegfault.c}
+Et ça ne plante pas !
+\end{exampleblock}
+
+\begin{alertblock}{Explication}
+Le système n'alloue pas des octets mais des segments
+
+Le système n'intervient que si l'application sort du segment !
+\end{alertblock}
+\end{frame}
+
+\end{document}
