# R3.05 # Programmation système 2024 Pomme Pompeani CC-BY-SA-NC --- ## Plan de la séance - Qu'est-ce qu'on a vu - Qu'est-ce qu'il vous reste à découvrir --- # Qu'est-ce qu'on a vu Note: Chaque slide → pause pour questions ! ---- ## Introduction aux systèmes d'exploitation - Exemples - Vue générale d'Unix - Rôles d'un OS - User-space / Kernel-space ---- ## Appels système - Toute communication avec l'OS se fait par des *appels système* - Correspond à appeler une fonction dans Linux - Appel système demande au CPU de changer de contexte → **coûteux** ---- ## Fichiers - "Tout est fichier" sous Unix - Fichier ouvert = *file descriptor* - 0 = stdin - 1 = stdout - 2 = stderr - 3 = premier fichier ouvert - 4 = ... - Fichier ouvert = `FILE *` - Toutes les fonctions qui commencent par `f`. ---- ## Fichiers | Action | File descriptor | `FILE *` | | --------- | ------- | ------- | | Ouverture | `open`, `fdopen` |
`fopen`
| | Fermeture | `close` |
`fclose`
| | Lecture | `read` | `fread`,
`fgets`
,
`fgetc`
| | Écriture | `write`, `dprintf` | `fwrite`, `printf`,
`fprintf`
, `fputc`,
`fflush`
| ---- ## Fichiers - Les opérations sur des `FILE *` sont *buffer*isées (*buffer* → tampon): - Quand on appelle `fprintf` *(par exemple)* - Les données sont mises de côté dans un tampon - Puis écrites (`write`) pour de vrai : - Quand le tampon est plein - Quand on appelle `fflush` ---- ## Fichiers - Les opérations sur des `FILE *` sont *buffer*isées (*buffer* → tampon): - Quand on appelle `fgets` *(par exemple)* - Si le tampon est vide, on le remplit par un appel à `read` - Si le tampon n'est pas vide, on lit dedans - → Réduction du nombre d'appels système ---- ## Sockets - Une socket "serveur" qui permet d'accepter de nouvelles connexions - Une socket bidirectionnelle qui permet d'échanger des données - Créée par un `accept` sur une socket serveur (server-side) - Créee par un `connect` à un serveur (client-side) - File descriptor, donc on peut faire des `read`/`write` dessus - Possible d'obtenir un `FILE *` avec `fdopen` ---- ## Sockets - Types de connexions : - **Unix Domain** → la socket serveur est associée à un fichier local - ex: `/var/run/docker.sock` - **TCP** → la socket serveur est associée à un port TCP - **UDP** → la socket serveur est associée à un port UDP ---- ## Création de processus - Appel système `fork` - "Clone" le programme actuel - Retourne le pid de l'enfant/clone quand on est dans le parent - Retourne `0` quand on est dans l'enfant/clone ---- ## Création de processus - Appel système `wait` - Bloque jusqu'à la mort d'un processus enfant ---- ## Création de processus - Appel système `execve` - Remplace le programme actuel par un nouveau programme - Combiné avec fork, permet à un programme de lancer un autre programme ---- ## Création de threads - Appel système `clone` - Pas utilisé directement - Librairie `pthread` (POSIX threads) - `pthread_create` → créer un thread qui va exécuter une fonction - `pthread_join` → bloquer jusqu'à la fin d'un thread ---- ## Mutex - Permet de s'assurer qu'une **section critique** du code n'est exécutée que par un thread à la fois - Limite l'accès concurrent à des **ressources partagées** (fichiers...) - 2 états : *locked*, *unlocked* - `pthread_mutex_init` - `pthread_mutex_lock` - `pthread_mutex_unlock` - `pthread_mutex_destroy` ---- ## Sémaphore - Si le mutex est un booléen (`locked/unlocked`) - Alors le sémaphore est un integer (`0/1/2/3/...`) - `sem_init` - `sem_wait` - `sem_post` - `sem_destroy` ---- ## Signaux - Messages pour annoncer un changement d'état du programme - Actions par défaut : ignoré / mort du processus / mise en pause - Quelques signaux : - Demande d'arrêt : `SIGINT`/`SIGTERM` - Arrêt forcé : `SIGKILL` 💀 - Stop/Continue : `SIGSTOP`/`SIGCONT` ---- ## Signaux - Appel système : `sigaction` - remplace l'action par défaut par une nouvelle fonction - Appel système : `kill` - Envoie un signal à un processus (via son PID) ---- ## Terminal - Dans un terminal s'exécute un shell - `bash` est le shell par défaut - D'autres existent (`zsh`, `fish`, `xonsh`, `nushell`, ...) ---- ## Terminal - Commandes de base - `cd`, `ls` - `cat`, `grep`, `cut` - `man`, `less` Note: J'aurais aimé aller plus loin ---- ## Terminal - Concepts - Redirections : `<`, `>`, `>>` - Pipes : `|` ---- ## `/proc` - Filesystem "virtuel" - Ne correspond pas à des "vrais" fichiers sur le disque - Permet d'avoir des informations sur les programmes en cours d'exécution ---- ## `/sys` - Filesystem "virtuel" - Permet d'accéder à des ressources matérielles - Luminosité de l'écran - Bluetooth - Carte graphique - Son - Batterie - Ports USB - etc --- # Qu'est-ce qu'il vous reste à découvrir Note: Ce que je n'ai pas eu le temps / les capacités de faire ---- ## Mémoire partagée - Appel système : `mmap` - Il est possible de partager de larges blocs de mémoire entre plusieurs programmes ---- ## Mémoire partagée - Possible de mapper un fichier en mémoire - **(+)** Meilleure performance : Plus d'appels système nécessaires pour accéder à une partie du fichier - **(-)** Utilisation de la RAM : Si le fichier pèse 10Go, 10Go de RAM sont utilisés d'un coup - **(-)** Concurrence : Si deux processus/threads écrivent en même temps, ce sera encore plus 💩 ---- ## Pipes - `|` - Appel système : `pipe` - Vu en shell mais pas en C ---- ## Fonctionnement de la mémoire - Pages - Fautes de page ---- ## Fonctionnement du CPU - L1 Cache - Code assembleur ---- ## Langage C - Librairies externes - Directives Préprocesseur - Makefile ---- ## Concurrence dans d'autres langages - Comment on fait plusieurs choses à la fois dans d'autres langages ? - Threads en Java - Async en Javascript - Threads et Async en Rust - Green Threads (Goroutines) en Go - 🤡 en Python ---- ## Fonctionnalités "modernes" de Linux Note: Ce qu'on n'apprend pas dans ce cours mais qui est intéressant de connaitre l'existence ---- ## Appels système asynchrones - **aio** (Asynchronous I/O) - Appels systèmes non bloquants - `aio_read` - `aio_write` - Permet de ne pas "bloquer" dès qu'on fait de l'I/O → Moins de threads - Beaucoup de limitations - Appels systèmes toujours aussi couteux ---- ## Appels système asynchrones - **io_uring** - Utilisation d'espaces mémoire partagés entre le kernel et le programme - Une *ring* où l'on dépose des `structs` qui correspondent à des appels systèmes - Une *ring* où l'on reçoit les réponses de Linux à ces appels systèmes - Plus d'appels système → beaucoup plus performant - Architecture du programme très différente - Utile pour des programmes très intensifs en I/O ---- ## cgroups - Control Groups - Permet de limiter l'accès aux ressources à des programmes - Ressources : - Temps CPU - Espace RAM - Accès au filesystem - Accès à `/proc` - Accès aux infos sur les autres programmes ---- ## cgroups - Géré par `/sys/kernel/cgroups` - Fondation de toutes les technologies de conteneurisation - SystemD - LXC - Docker - Kubernetes - ... Note: Docker sous Windows → Linux VM ---- ## Administration Linux Note: Avant d'etre dev, je suis admin sys Travaille au quotidien sur des terminaux Sur des machines Linux ---- ## Gestion des users et des droits - Droits sur les fichiers - Droits des processus - rwxrwxrwx ---- ## Installation et mises à jour - Programme dépend de la distribution Linux - Debian / Ubuntu : `apt`/`apt-get` - `apt install`, `apt update`, `apt upgrade` - Arch : `pacman` - Red Hat / Fedora : `dnf` - Alpine : `pkg` - NixOS : `nix` - Android : `apk` ---- ## `systemd` - PID 1, `init`, 1er programme - Lance tous les autres programmes ---- ## `systemd` - Démarrage, arrêt de services - `systemctl start docker` - `systemctl stop postgresql` - `systemctl restart NetworkManager` ---- ## `systemd` - Création, configuration des services - `/etc/systemd/system/postgresql.service` - Directives de base : - `ExecStart` - `After` - Directives de sécurité : - `ReadOnlyPaths` - `NoNewPrivileges` ---- ## `systemd` - Analyse de l'état des services - `systemctl status postgresql` - Lecture des logs - `journalctl -u postgresql` ---- ## Autres ordonnanceurs - Docker - Kubernetes - LXC ---- ## Services ---- ## SSH - Permet de se connecter en terminal à distance ---- ## Serveurs web - Permet de mettre en ligne des sites web - nginx - apache - caddy - traefik - ... ---- ## Bases de données - Permet de stocker des données de manière ordonnée - PostgreSQL - MySQL / MariaDB - MongoDB - Redis - ... ---- ## Logiciels de sécurité et monitoring - fail2ban - reaction Note: Instant auto-promo ! Prof à temps partiel Aussi admin sys à temps partiel Aussi dév principale de reaction sur temps libre Subvention de NLnet, organisme européen, pour travailler sur reaction pendant un an ---- ## Web apps - Nextcloud - Etherpad - HedgeDoc - Mattermost - Matrix - Mastodon - ... --- ## Conclusion perso - Première vraie expérience en tant que prof - Aurait aimé aller plus loin sur plein de trucs - Questionnaire anonyme après le contrôle - Cours de Docker en S4